Procházet zdrojové kódy

Fixed failing unit test for attributes (most are now writable) along with several real type mistakes in setAttributeValue and writeValue.

Chris Iatrou před 10 roky
rodič
revize
b104a13190

+ 1 - 1
examples/client.c

@@ -5,7 +5,7 @@
 # include "networklayer_tcp.h"
 # include "logger_stdout.h"
 # include "ua_types_encoding_binary.h"
-#include "ua_nodes.h"
+#include "server/ua_nodes.h"
 #else
 # include "open62541.h"
 # include <string.h>

+ 5 - 5
src/server/ua_services_attribute.c

@@ -460,11 +460,11 @@ UA_StatusCode writeValue(UA_Server *server, UA_WriteValue *wvalue) {
           done = UA_TRUE;
           break;
         case UA_ATTRIBUTEID_DISPLAYNAME:
-          SETATTRIBUTE_IF_DATATYPE_IS(UINT32)
+          SETATTRIBUTE_IF_DATATYPE_IS(LOCALIZEDTEXT)
           done = UA_TRUE;
           break;
         case UA_ATTRIBUTEID_DESCRIPTION:
-          SETATTRIBUTE_IF_DATATYPE_IS(UINT32)
+          SETATTRIBUTE_IF_DATATYPE_IS(LOCALIZEDTEXT)
           done = UA_TRUE;
           break;
         case UA_ATTRIBUTEID_WRITEMASK:
@@ -484,7 +484,7 @@ UA_StatusCode writeValue(UA_Server *server, UA_WriteValue *wvalue) {
           done = UA_TRUE;
           break;
         case UA_ATTRIBUTEID_INVERSENAME:
-          SETATTRIBUTE_IF_DATATYPE_IS(UINT32)
+          SETATTRIBUTE_IF_DATATYPE_IS(LOCALIZEDTEXT)
           done = UA_TRUE;
           break;
         case UA_ATTRIBUTEID_CONTAINSNOLOOPS:
@@ -524,7 +524,7 @@ UA_StatusCode writeValue(UA_Server *server, UA_WriteValue *wvalue) {
           done = UA_TRUE;
           break;
         case UA_ATTRIBUTEID_USEREXECUTABLE:
-          SETATTRIBUTE_IF_DATATYPE_IS(LOCALIZEDTEXT)
+          SETATTRIBUTE_IF_DATATYPE_IS(BOOLEAN)
           done = UA_TRUE;
           break;
         // The value logic implemented by jpfr is far more advanced that that in the userspace, so we use that
@@ -627,7 +627,7 @@ UA_StatusCode writeValue(UA_Server *server, UA_WriteValue *wvalue) {
         case UA_ATTRIBUTEID_NODECLASS:
         case UA_ATTRIBUTEID_DATATYPE:
         default:
-            retval = UA_STATUSCODE_BADATTRIBUTEIDINVALID;
+            retval = UA_STATUSCODE_BADWRITENOTSUPPORTED;
             break;
         }
 

+ 61 - 21
tests/check_services_attributes.c

@@ -12,7 +12,6 @@
 #include "ua_util.h"
 #include "server/ua_server_internal.h"
 
-
 //#include "server/ua_services_attribute.c"
 
 #ifdef UA_MULTITHREADING
@@ -668,14 +667,16 @@ START_TEST(WriteSingleAttributeNodeclass)
 START_TEST(WriteSingleAttributeBrowseName)
 	{
 		UA_Server *server = makeTestSequence();
-
+		
 		UA_WriteValue wValue;
 		UA_WriteValue_init(&wValue);
+		UA_QualifiedName testValue = UA_QUALIFIEDNAME(1, "the.answer");
+		UA_Variant_setScalarCopy(&wValue.value.value, &testValue, &UA_TYPES[UA_TYPES_QUALIFIEDNAME]);
 		wValue.nodeId = UA_NODEID_STRING(1, "the.answer");
 		wValue.attributeId = UA_ATTRIBUTEID_BROWSENAME;
 		wValue.value.hasValue = UA_TRUE;
 		UA_StatusCode retval = writeValue(server, &wValue);
-		ck_assert_int_eq(retval, UA_STATUSCODE_BADWRITENOTSUPPORTED);
+		ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
 	}END_TEST
 
 START_TEST(WriteSingleAttributeDisplayName)
@@ -684,11 +685,13 @@ START_TEST(WriteSingleAttributeDisplayName)
 
 		UA_WriteValue wValue;
 		UA_WriteValue_init(&wValue);
+		UA_LocalizedText testValue = UA_LOCALIZEDTEXT("en_EN", "the.answer");
+		UA_Variant_setScalarCopy(&wValue.value.value, &testValue, &UA_TYPES[UA_TYPES_LOCALIZEDTEXT]);
+		wValue.value.hasValue = UA_TRUE;
 		wValue.nodeId = UA_NODEID_STRING(1, "the.answer");
 		wValue.attributeId = UA_ATTRIBUTEID_DISPLAYNAME;
-		wValue.value.hasValue = UA_TRUE;
 		UA_StatusCode retval = writeValue(server, &wValue);
-		ck_assert_int_eq(retval, UA_STATUSCODE_BADWRITENOTSUPPORTED);
+		ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
 	}END_TEST
 
 START_TEST(WriteSingleAttributeDescription)
@@ -697,11 +700,15 @@ START_TEST(WriteSingleAttributeDescription)
 
 		UA_WriteValue wValue;
 		UA_WriteValue_init(&wValue);
+		UA_LocalizedText testValue = UA_LOCALIZEDTEXT("en_EN", "the.answer");
+		UA_Variant_setScalarCopy(&wValue.value.value, &testValue, &UA_TYPES[UA_TYPES_LOCALIZEDTEXT]);
+		wValue.value.hasValue = UA_TRUE;
+		wValue.nodeId = UA_NODEID_STRING(1, "the.answer");
 		wValue.nodeId = UA_NODEID_STRING(1, "the.answer");
 		wValue.attributeId = UA_ATTRIBUTEID_DESCRIPTION;
 		wValue.value.hasValue = UA_TRUE;
 		UA_StatusCode retval = writeValue(server, &wValue);
-		ck_assert_int_eq(retval, UA_STATUSCODE_BADWRITENOTSUPPORTED);
+		ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
 	}END_TEST
 
 START_TEST(WriteSingleAttributeWriteMask)
@@ -710,11 +717,14 @@ START_TEST(WriteSingleAttributeWriteMask)
 
 		UA_WriteValue wValue;
 		UA_WriteValue_init(&wValue);
+		UA_Int32 testValue = 0;
+		UA_Variant_setScalarCopy(&wValue.value.value, &testValue, &UA_TYPES[UA_TYPES_UINT32]);
+		wValue.nodeId = UA_NODEID_STRING(1, "the.answer");
 		wValue.nodeId = UA_NODEID_STRING(1, "the.answer");
 		wValue.attributeId = UA_ATTRIBUTEID_WRITEMASK;
 		wValue.value.hasValue = UA_TRUE;
 		UA_StatusCode retval = writeValue(server, &wValue);
-		ck_assert_int_eq(retval, UA_STATUSCODE_BADWRITENOTSUPPORTED);
+		ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
 	}END_TEST
 
 START_TEST(WriteSingleAttributeUserWriteMask)
@@ -723,11 +733,13 @@ START_TEST(WriteSingleAttributeUserWriteMask)
 
 		UA_WriteValue wValue;
 		UA_WriteValue_init(&wValue);
+		UA_Int32 testValue = 0;
+		UA_Variant_setScalarCopy(&wValue.value.value, &testValue, &UA_TYPES[UA_TYPES_UINT32]);
 		wValue.nodeId = UA_NODEID_STRING(1, "the.answer");
 		wValue.attributeId = UA_ATTRIBUTEID_USERWRITEMASK;
 		wValue.value.hasValue = UA_TRUE;
 		UA_StatusCode retval = writeValue(server, &wValue);
-		ck_assert_int_eq(retval, UA_STATUSCODE_BADWRITENOTSUPPORTED);
+		ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
 	}END_TEST
 
 START_TEST(WriteSingleAttributeIsAbstract)
@@ -736,11 +748,13 @@ START_TEST(WriteSingleAttributeIsAbstract)
 
 		UA_WriteValue wValue;
 		UA_WriteValue_init(&wValue);
+		UA_Boolean testValue = UA_TRUE;
+		UA_Variant_setScalarCopy(&wValue.value.value, &testValue, &UA_TYPES[UA_TYPES_BOOLEAN]);
 		wValue.nodeId = UA_NODEID_STRING(1, "the.answer");
 		wValue.attributeId = UA_ATTRIBUTEID_ISABSTRACT;
 		wValue.value.hasValue = UA_TRUE;
 		UA_StatusCode retval = writeValue(server, &wValue);
-		ck_assert_int_eq(retval, UA_STATUSCODE_BADWRITENOTSUPPORTED);
+		ck_assert_int_eq(retval, UA_STATUSCODE_BADNODECLASSINVALID);
 	}END_TEST
 
 START_TEST(WriteSingleAttributeSymmetric)
@@ -749,11 +763,13 @@ START_TEST(WriteSingleAttributeSymmetric)
 
 		UA_WriteValue wValue;
 		UA_WriteValue_init(&wValue);
+		UA_Boolean testValue = UA_TRUE;
+		UA_Variant_setScalarCopy(&wValue.value.value, &testValue, &UA_TYPES[UA_TYPES_BOOLEAN]);
 		wValue.nodeId = UA_NODEID_STRING(1, "the.answer");
 		wValue.attributeId = UA_ATTRIBUTEID_SYMMETRIC;
 		wValue.value.hasValue = UA_TRUE;
 		UA_StatusCode retval = writeValue(server, &wValue);
-		ck_assert_int_eq(retval, UA_STATUSCODE_BADWRITENOTSUPPORTED);
+		ck_assert_int_eq(retval, UA_STATUSCODE_BADNODECLASSINVALID);
 	}END_TEST
 
 START_TEST(WriteSingleAttributeInverseName)
@@ -762,11 +778,13 @@ START_TEST(WriteSingleAttributeInverseName)
 
 		UA_WriteValue wValue;
 		UA_WriteValue_init(&wValue);
+		UA_LocalizedText testValue = UA_LOCALIZEDTEXT("en_US", "not.the.answer");
+		UA_Variant_setScalarCopy(&wValue.value.value, &testValue, &UA_TYPES[UA_TYPES_LOCALIZEDTEXT]);
 		wValue.nodeId = UA_NODEID_STRING(1, "the.answer");
 		wValue.attributeId = UA_ATTRIBUTEID_INVERSENAME;
 		wValue.value.hasValue = UA_TRUE;
 		UA_StatusCode retval = writeValue(server, &wValue);
-		ck_assert_int_eq(retval, UA_STATUSCODE_BADWRITENOTSUPPORTED);
+		ck_assert_int_eq(retval, UA_STATUSCODE_BADNODECLASSINVALID);
 	}END_TEST
 
 START_TEST(WriteSingleAttributeContainsNoLoops)
@@ -775,11 +793,13 @@ START_TEST(WriteSingleAttributeContainsNoLoops)
 
 		UA_WriteValue wValue;
 		UA_WriteValue_init(&wValue);
+		UA_Boolean testValue = UA_TRUE;
+		UA_Variant_setScalarCopy(&wValue.value.value, &testValue, &UA_TYPES[UA_TYPES_BOOLEAN]);
 		wValue.nodeId = UA_NODEID_STRING(1, "the.answer");
 		wValue.attributeId = UA_ATTRIBUTEID_CONTAINSNOLOOPS;
 		wValue.value.hasValue = UA_TRUE;
 		UA_StatusCode retval = writeValue(server, &wValue);
-		ck_assert_int_eq(retval, UA_STATUSCODE_BADWRITENOTSUPPORTED);
+		ck_assert_int_eq(retval, UA_STATUSCODE_BADNODECLASSINVALID);
 	}END_TEST
 
 START_TEST(WriteSingleAttributeEventNotifier)
@@ -788,11 +808,13 @@ START_TEST(WriteSingleAttributeEventNotifier)
 
 		UA_WriteValue wValue;
 		UA_WriteValue_init(&wValue);
+		UA_Byte testValue = 0;
+		UA_Variant_setScalarCopy(&wValue.value.value, &testValue, &UA_TYPES[UA_TYPES_BYTE]);
 		wValue.nodeId = UA_NODEID_STRING(1, "the.answer");
 		wValue.attributeId = UA_ATTRIBUTEID_EVENTNOTIFIER;
 		wValue.value.hasValue = UA_TRUE;
 		UA_StatusCode retval = writeValue(server, &wValue);
-		ck_assert_int_eq(retval, UA_STATUSCODE_BADWRITENOTSUPPORTED);
+		ck_assert_int_eq(retval, UA_STATUSCODE_BADNODECLASSINVALID);
 	}END_TEST
 
 
@@ -854,11 +876,14 @@ START_TEST(WriteSingleAttributeValueRank)
 
 		UA_WriteValue wValue;
 		UA_WriteValue_init(&wValue);
+		UA_Int32 testValue = -1;
+		UA_Variant_setScalarCopy(&wValue.value.value, &testValue, &UA_TYPES[UA_TYPES_INT32]);
 		wValue.nodeId = UA_NODEID_STRING(1, "the.answer");
 		wValue.attributeId = UA_ATTRIBUTEID_VALUERANK;
 		wValue.value.hasValue = UA_TRUE;
 		UA_StatusCode retval = writeValue(server, &wValue);
-		ck_assert_int_eq(retval, UA_STATUSCODE_BADWRITENOTSUPPORTED);
+		// Returns attributeInvalid, since variant/value may be writable
+		ck_assert_int_eq(retval, UA_STATUSCODE_BADATTRIBUTEIDINVALID);
 	}END_TEST
 
 START_TEST(WriteSingleAttributeArrayDimensions)
@@ -867,11 +892,14 @@ START_TEST(WriteSingleAttributeArrayDimensions)
 
 		UA_WriteValue wValue;
 		UA_WriteValue_init(&wValue);
+		UA_Int32 testValue[] = {-1,-1,-1};
+		UA_Variant_setArrayCopy(&wValue.value.value, &testValue, 3, &UA_TYPES[UA_TYPES_INT32]);
 		wValue.nodeId = UA_NODEID_STRING(1, "the.answer");
 		wValue.attributeId = UA_ATTRIBUTEID_ARRAYDIMENSIONS;
 		wValue.value.hasValue = UA_TRUE;
 		UA_StatusCode retval = writeValue(server, &wValue);
-		ck_assert_int_eq(retval, UA_STATUSCODE_BADWRITENOTSUPPORTED);
+		// Returns attributeInvalid, since variant/value may be writable
+		ck_assert_int_eq(retval, UA_STATUSCODE_BADATTRIBUTEIDINVALID);
 	}END_TEST
 
 START_TEST(WriteSingleAttributeAccessLevel)
@@ -880,11 +908,13 @@ START_TEST(WriteSingleAttributeAccessLevel)
 
 		UA_WriteValue wValue;
 		UA_WriteValue_init(&wValue);
+		UA_UInt32 testValue = 0;
+		UA_Variant_setScalarCopy(&wValue.value.value, &testValue, &UA_TYPES[UA_TYPES_UINT32]);
 		wValue.nodeId = UA_NODEID_STRING(1, "the.answer");
 		wValue.attributeId = UA_ATTRIBUTEID_ACCESSLEVEL;
 		wValue.value.hasValue = UA_TRUE;
 		UA_StatusCode retval = writeValue(server, &wValue);
-		ck_assert_int_eq(retval, UA_STATUSCODE_BADWRITENOTSUPPORTED);
+		ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
 	}END_TEST
 
 START_TEST(WriteSingleAttributeUserAccessLevel)
@@ -893,11 +923,13 @@ START_TEST(WriteSingleAttributeUserAccessLevel)
 
 		UA_WriteValue wValue;
 		UA_WriteValue_init(&wValue);
+		UA_UInt32 testValue = 0;
+		UA_Variant_setScalarCopy(&wValue.value.value, &testValue, &UA_TYPES[UA_TYPES_UINT32]);
 		wValue.nodeId = UA_NODEID_STRING(1, "the.answer");
 		wValue.attributeId = UA_ATTRIBUTEID_USERACCESSLEVEL;
 		wValue.value.hasValue = UA_TRUE;
 		UA_StatusCode retval = writeValue(server, &wValue);
-		ck_assert_int_eq(retval, UA_STATUSCODE_BADWRITENOTSUPPORTED);
+		ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
 	}END_TEST
 
 START_TEST(WriteSingleAttributeMinimumSamplingInterval)
@@ -906,11 +938,13 @@ START_TEST(WriteSingleAttributeMinimumSamplingInterval)
 
 		UA_WriteValue wValue;
 		UA_WriteValue_init(&wValue);
+		UA_Double testValue = 0.0;
+		UA_Variant_setScalarCopy(&wValue.value.value, &testValue, &UA_TYPES[UA_TYPES_DOUBLE]);
 		wValue.nodeId = UA_NODEID_STRING(1, "the.answer");
 		wValue.attributeId = UA_ATTRIBUTEID_MINIMUMSAMPLINGINTERVAL;
 		wValue.value.hasValue = UA_TRUE;
 		UA_StatusCode retval = writeValue(server, &wValue);
-		ck_assert_int_eq(retval, UA_STATUSCODE_BADWRITENOTSUPPORTED);
+		ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
 	}END_TEST
 
 START_TEST(WriteSingleAttributeHistorizing)
@@ -919,11 +953,13 @@ START_TEST(WriteSingleAttributeHistorizing)
 
 		UA_WriteValue wValue;
 		UA_WriteValue_init(&wValue);
+		UA_Boolean testValue = UA_TRUE;
+		UA_Variant_setScalarCopy(&wValue.value.value, &testValue, &UA_TYPES[UA_TYPES_BOOLEAN]);
 		wValue.nodeId = UA_NODEID_STRING(1, "the.answer");
 		wValue.attributeId = UA_ATTRIBUTEID_HISTORIZING;
 		wValue.value.hasValue = UA_TRUE;
 		UA_StatusCode retval = writeValue(server, &wValue);
-		ck_assert_int_eq(retval, UA_STATUSCODE_BADWRITENOTSUPPORTED);
+		ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
 	}END_TEST
 
 START_TEST(WriteSingleAttributeExecutable)
@@ -932,11 +968,13 @@ START_TEST(WriteSingleAttributeExecutable)
 
 		UA_WriteValue wValue;
 		UA_WriteValue_init(&wValue);
+		UA_Boolean testValue = UA_TRUE;
+		UA_Variant_setScalarCopy(&wValue.value.value, &testValue, &UA_TYPES[UA_TYPES_BOOLEAN]);
 		wValue.nodeId = UA_NODEID_STRING(1, "the.answer");
 		wValue.attributeId = UA_ATTRIBUTEID_EXECUTABLE;
 		wValue.value.hasValue = UA_TRUE;
 		UA_StatusCode retval = writeValue(server, &wValue);
-		ck_assert_int_eq(retval, UA_STATUSCODE_BADWRITENOTSUPPORTED);
+		ck_assert_int_eq(retval, UA_STATUSCODE_BADNODECLASSINVALID);
 	}END_TEST
 
 START_TEST(WriteSingleAttributeUserExecutable)
@@ -945,11 +983,13 @@ START_TEST(WriteSingleAttributeUserExecutable)
 
 		UA_WriteValue wValue;
 		UA_WriteValue_init(&wValue);
+		UA_Boolean testValue = UA_TRUE;
+		UA_Variant_setScalarCopy(&wValue.value.value, &testValue, &UA_TYPES[UA_TYPES_BOOLEAN]);
 		wValue.nodeId = UA_NODEID_STRING(1, "the.answer");
 		wValue.attributeId = UA_ATTRIBUTEID_USEREXECUTABLE;
 		wValue.value.hasValue = UA_TRUE;
 		UA_StatusCode retval = writeValue(server, &wValue);
-		ck_assert_int_eq(retval, UA_STATUSCODE_BADWRITENOTSUPPORTED);
+		ck_assert_int_eq(retval, UA_STATUSCODE_BADNODECLASSINVALID);
 	}END_TEST
 
 START_TEST(WriteSingleAttributeNoValue)