Procházet zdrojové kódy

Add more tests to the "service - call" suite

Frank Meerkoetter před 6 roky
rodič
revize
c2e67e0064
1 změnil soubory, kde provedl 70 přidání a 1 odebrání
  1. 70 1
      tests/server/check_services_call.c

+ 70 - 1
tests/server/check_services_call.c

@@ -103,6 +103,18 @@ START_TEST(callMethodAndObjectExistsButMethodHasWrongNodeClass) {
     ck_assert_int_eq(result.statusCode, UA_STATUSCODE_BADNODECLASSINVALID);
 } 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) {
     UA_CallMethodRequest callMethodRequest;
     UA_CallMethodRequest_init(&callMethodRequest);
@@ -127,6 +139,59 @@ START_TEST(callMethodNonExecutable) {
     ck_assert_int_eq(result.statusCode, UA_STATUSCODE_BADNOTEXECUTABLE);
 } 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) {
     Suite *s = suite_create("services_call");
 
@@ -136,7 +201,11 @@ int main(void) {
     tcase_add_test(tc_call, callKnownMethodOnUnknownObject);
     tcase_add_test(tc_call, callMethodAndObjectExistsButMethodHasWrongNodeClass);
     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);
 
     SRunner *sr = srunner_create(s);