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