Browse Source

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

Chris Iatrou 9 years ago
parent
commit
b104a13190
3 changed files with 67 additions and 27 deletions
  1. 1 1
      examples/client.c
  2. 5 5
      src/server/ua_services_attribute.c
  3. 61 21
      tests/check_services_attributes.c

+ 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)