|
@@ -103,6 +103,18 @@ START_TEST(callMethodAndObjectExistsButMethodHasWrongNodeClass) {
|
|
ck_assert_int_eq(result.statusCode, UA_STATUSCODE_BADNODECLASSINVALID);
|
|
ck_assert_int_eq(result.statusCode, UA_STATUSCODE_BADNODECLASSINVALID);
|
|
} END_TEST
|
|
} END_TEST
|
|
|
|
|
|
|
|
+START_TEST(callMethodOnUnrelatedObject) {
|
|
|
|
+ UA_CallMethodRequest callMethodRequest;
|
|
|
|
+ UA_CallMethodRequest_init(&callMethodRequest);
|
|
|
|
+ callMethodRequest.methodId = UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_GETMONITOREDITEMS);
|
|
|
|
+ callMethodRequest.objectId = UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER); // not connected via hasComponent
|
|
|
|
+
|
|
|
|
+ UA_CallMethodResult result;
|
|
|
|
+ UA_CallMethodResult_init(&result);
|
|
|
|
+ result = UA_Server_call(server, &callMethodRequest);
|
|
|
|
+ ck_assert_int_eq(result.statusCode, UA_STATUSCODE_BADMETHODINVALID);
|
|
|
|
+} END_TEST
|
|
|
|
+
|
|
START_TEST(callMethodAndObjectExistsButNoFunctionPointerAttached) {
|
|
START_TEST(callMethodAndObjectExistsButNoFunctionPointerAttached) {
|
|
UA_CallMethodRequest callMethodRequest;
|
|
UA_CallMethodRequest callMethodRequest;
|
|
UA_CallMethodRequest_init(&callMethodRequest);
|
|
UA_CallMethodRequest_init(&callMethodRequest);
|
|
@@ -127,6 +139,59 @@ START_TEST(callMethodNonExecutable) {
|
|
ck_assert_int_eq(result.statusCode, UA_STATUSCODE_BADNOTEXECUTABLE);
|
|
ck_assert_int_eq(result.statusCode, UA_STATUSCODE_BADNOTEXECUTABLE);
|
|
} END_TEST
|
|
} END_TEST
|
|
|
|
|
|
|
|
+START_TEST(callMethodWithMissingArguments) {
|
|
|
|
+ UA_CallMethodRequest callMethodRequest;
|
|
|
|
+ UA_CallMethodRequest_init(&callMethodRequest);
|
|
|
|
+ callMethodRequest.methodId = UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_GETMONITOREDITEMS);
|
|
|
|
+ callMethodRequest.objectId = UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER);
|
|
|
|
+
|
|
|
|
+ UA_CallMethodResult result;
|
|
|
|
+ UA_CallMethodResult_init(&result);
|
|
|
|
+ result = UA_Server_call(server, &callMethodRequest);
|
|
|
|
+ ck_assert_int_eq(result.statusCode, UA_STATUSCODE_BADARGUMENTSMISSING);
|
|
|
|
+} END_TEST
|
|
|
|
+
|
|
|
|
+START_TEST(callMethodWithTooManyArguments) {
|
|
|
|
+ UA_Variant inputArguments[2];
|
|
|
|
+ UA_Variant_init(&inputArguments[0]);
|
|
|
|
+ UA_Variant_init(&inputArguments[1]);
|
|
|
|
+
|
|
|
|
+ UA_CallMethodRequest callMethodRequest;
|
|
|
|
+ UA_CallMethodRequest_init(&callMethodRequest);
|
|
|
|
+ callMethodRequest.inputArgumentsSize = 2; // 1 would be correct
|
|
|
|
+ callMethodRequest.inputArguments = (UA_Variant*)&inputArguments;
|
|
|
|
+ callMethodRequest.methodId = UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_GETMONITOREDITEMS);
|
|
|
|
+ callMethodRequest.objectId = UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER);
|
|
|
|
+
|
|
|
|
+ UA_CallMethodResult result;
|
|
|
|
+ UA_CallMethodResult_init(&result);
|
|
|
|
+ result = UA_Server_call(server, &callMethodRequest);
|
|
|
|
+ ck_assert_int_eq(result.statusCode, UA_STATUSCODE_BADTOOMANYARGUMENTS);
|
|
|
|
+} END_TEST
|
|
|
|
+
|
|
|
|
+START_TEST(callMethodWithWronglyTypedArguments) {
|
|
|
|
+ UA_Variant inputArgument;
|
|
|
|
+ UA_Variant_init(&inputArgument);
|
|
|
|
+ UA_Double wrongType = 1.0;
|
|
|
|
+ UA_Variant_setScalar(&inputArgument, &wrongType, &UA_TYPES[UA_TYPES_DOUBLE]); // UA_UInt32 would be correct
|
|
|
|
+
|
|
|
|
+ UA_CallMethodRequest callMethodRequest;
|
|
|
|
+ UA_CallMethodRequest_init(&callMethodRequest);
|
|
|
|
+ callMethodRequest.inputArgumentsSize = 1;
|
|
|
|
+ callMethodRequest.inputArguments = &inputArgument;
|
|
|
|
+ callMethodRequest.methodId = UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_GETMONITOREDITEMS);
|
|
|
|
+ callMethodRequest.objectId = UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER);
|
|
|
|
+
|
|
|
|
+ UA_CallMethodResult result;
|
|
|
|
+ UA_CallMethodResult_init(&result);
|
|
|
|
+ result = UA_Server_call(server, &callMethodRequest);
|
|
|
|
+
|
|
|
|
+ ck_assert_int_eq(result.inputArgumentResults[0], UA_STATUSCODE_BADTYPEMISMATCH);
|
|
|
|
+ ck_assert_int_eq(result.statusCode, UA_STATUSCODE_BADINVALIDARGUMENT);
|
|
|
|
+
|
|
|
|
+ UA_Array_delete(result.inputArgumentResults, result.inputArgumentResultsSize, &UA_TYPES[UA_TYPES_STATUSCODE]);
|
|
|
|
+} END_TEST
|
|
|
|
+
|
|
int main(void) {
|
|
int main(void) {
|
|
Suite *s = suite_create("services_call");
|
|
Suite *s = suite_create("services_call");
|
|
|
|
|
|
@@ -136,7 +201,11 @@ int main(void) {
|
|
tcase_add_test(tc_call, callKnownMethodOnUnknownObject);
|
|
tcase_add_test(tc_call, callKnownMethodOnUnknownObject);
|
|
tcase_add_test(tc_call, callMethodAndObjectExistsButMethodHasWrongNodeClass);
|
|
tcase_add_test(tc_call, callMethodAndObjectExistsButMethodHasWrongNodeClass);
|
|
tcase_add_test(tc_call, callMethodAndObjectExistsButNoFunctionPointerAttached);
|
|
tcase_add_test(tc_call, callMethodAndObjectExistsButNoFunctionPointerAttached);
|
|
- tcase_add_test(tc_call, callMethodNonExecutable);;
|
|
|
|
|
|
+ tcase_add_test(tc_call, callMethodNonExecutable);
|
|
|
|
+ tcase_add_test(tc_call, callMethodOnUnrelatedObject);
|
|
|
|
+ tcase_add_test(tc_call, callMethodWithMissingArguments);
|
|
|
|
+ tcase_add_test(tc_call, callMethodWithTooManyArguments);
|
|
|
|
+ tcase_add_test(tc_call, callMethodWithWronglyTypedArguments);
|
|
suite_add_tcase(s, tc_call);
|
|
suite_add_tcase(s, tc_call);
|
|
|
|
|
|
SRunner *sr = srunner_create(s);
|
|
SRunner *sr = srunner_create(s);
|