diff --git a/backends/open62541/src/DataTypeImporter.c b/backends/open62541/src/DataTypeImporter.c index a71d110e..0a5b78fa 100644 --- a/backends/open62541/src/DataTypeImporter.c +++ b/backends/open62541/src/DataTypeImporter.c @@ -212,8 +212,8 @@ static void setPaddingMemsize(UA_DataType *type, } else { - // add the switchfield to the padding of the first datatype member - if (type->typeKind == UA_DATATYPEKIND_UNION && tm == type->members) + // add the switchfield to the padding of all datatype members + if (type->typeKind == UA_DATATYPEKIND_UNION) { #ifdef USE_MEMBERTYPE_INDEX tm->padding = (UA_Byte)sizeof(UA_Int32); diff --git a/backends/open62541/tests/dataTypeImport/union.bsd b/backends/open62541/tests/dataTypeImport/union.bsd index 9c26b3f0..a5bbc52c 100644 --- a/backends/open62541/tests/dataTypeImport/union.bsd +++ b/backends/open62541/tests/dataTypeImport/union.bsd @@ -10,4 +10,4 @@ - \ No newline at end of file + diff --git a/backends/open62541/tests/dataTypeImport/union.csv b/backends/open62541/tests/dataTypeImport/union.csv index 83d2c3ef..61dbb74a 100644 --- a/backends/open62541/tests/dataTypeImport/union.csv +++ b/backends/open62541/tests/dataTypeImport/union.csv @@ -22,3 +22,5 @@ Server_Namespaces_http___yourorganisation_org_union__StaticNumericNodeIdRange,60 Server_Namespaces_http___yourorganisation_org_union__StaticStringNodeIdPattern,6013,Variable TypeDictionary_BinarySchema_MyUnion,6014,Variable TypeDictionary_XmlSchema_MyUnion,6015,Variable +Union_Field1,6018,Variable +Union_Field2,6021,Variable diff --git a/backends/open62541/tests/dataTypeImport/union.xml b/backends/open62541/tests/dataTypeImport/union.xml index 94208430..3fe8df3e 100644 --- a/backends/open62541/tests/dataTypeImport/union.xml +++ b/backends/open62541/tests/dataTypeImport/union.xml @@ -16,6 +16,7 @@ i=12 i=13 i=15 + i=35 i=38 i=39 i=40 @@ -24,10 +25,11 @@ i=47 i=256 i=291 + ns=1;i=3003 - + @@ -272,6 +274,46 @@ ns=1;i=5004 + + Union_Field1 + + i=63 + i=85 + + + + + ns=1;i=5006 + + + + 1 + 70000 + + + + + + + Union_Field2 + + i=63 + i=85 + + + + + ns=1;i=5006 + + + + 2 + -1000 + + + + + Default Binary diff --git a/backends/open62541/tests/dataTypeImport/union2.c b/backends/open62541/tests/dataTypeImport/union2.c index 548fba61..40d31d7f 100644 --- a/backends/open62541/tests/dataTypeImport/union2.c +++ b/backends/open62541/tests/dataTypeImport/union2.c @@ -56,12 +56,42 @@ START_TEST(compareUnion) } END_TEST +START_TEST(readUnionValue) +{ + UA_Variant var; + UA_Variant_init(&var); + + UA_StatusCode status = + UA_Server_readValue(server, UA_NODEID_NUMERIC(2, 6018), &var); + ck_assert(status == UA_STATUSCODE_GOOD); + + UA_MyUnion u; + u = *(UA_MyUnion*)var.data; + + ck_assert(u.switchField==UA_MYUNIONSWITCH_X); + ck_assert_int_eq(u.fields.x, 70000); + + UA_Variant_clear(&var); + + status = + UA_Server_readValue(server, UA_NODEID_NUMERIC(2, 6021), &var); + ck_assert(status == UA_STATUSCODE_GOOD); + + u = *(UA_MyUnion *)var.data; + + ck_assert(u.switchField == UA_MYUNIONSWITCH_Y); + ck_assert_int_eq(u.fields.y, -1000); + UA_Variant_clear(&var); +} +END_TEST + static Suite *testSuite_Client(void) { Suite *s = suite_create("datatype Import"); TCase *tc_server = tcase_create("server nodeset import"); tcase_add_unchecked_fixture(tc_server, setup, teardown); tcase_add_test(tc_server, compareUnion); + tcase_add_test(tc_server, readUnionValue); suite_add_tcase(s, tc_server); return s; } diff --git a/backends/open62541/tests/testHelper.h b/backends/open62541/tests/testHelper.h index f3c33219..0febcbe2 100644 --- a/backends/open62541/tests/testHelper.h +++ b/backends/open62541/tests/testHelper.h @@ -84,10 +84,6 @@ void typesAreMatching(const UA_DataType *t1, const UA_DataType *t2, const UA_Dat ck_assert(!strcmp(t1->typeName, t2->typeName)); size_t cnt =0; UA_UInt32 mSize = t1->membersSize; - if (t1->typeKind == UA_DATATYPEKIND_UNION) - { - mSize--; - } for(const UA_DataTypeMember* m = t1->members; m!=t1->members+mSize; m++) { memberTypeMatching(m, &t2->members[cnt], generatedTypes, customTypes);