fix(server) add missing HasInterface reference (#4681)

If a BaseObjectType object with a HasInterface reference is instantiated
from a model, the HasInterface reference is missing.
This commit is contained in:
basyskom-jvoe 2021-11-18 10:13:02 +01:00 committed by GitHub
parent da71b04979
commit 331a7e3bb5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 68 additions and 5 deletions

View File

@ -679,6 +679,7 @@ copyChild(UA_Server *server, UA_Session *session,
} else {
UA_ReferenceTypeSet_init(&reftypes_skipped);
}
reftypes_skipped = UA_ReferenceTypeSet_union(reftypes_skipped, UA_REFTYPESET(UA_REFERENCETYPEINDEX_HASINTERFACE));
UA_Node_deleteReferencesSubset(node, &reftypes_skipped);
/* Add the node to the nodestore */

View File

@ -141,6 +141,57 @@ START_TEST(check_interface_instantiation) {
ck_assert(found == true);
UA_BrowseResult_clear(&br);
UA_RelativePathElement_init(&el);
el.referenceTypeId = UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT);
el.targetName = UA_QUALIFIEDNAME(2, (char *)"BaseObjectWithInterface");
bp.relativePath.elements = ⪙
bpr = UA_Server_translateBrowsePathToNodeIds(server, &bp);
ck_assert_int_eq(bpr.statusCode, UA_STATUSCODE_GOOD);
ck_assert_int_eq(bpr.targetsSize, 1);
const UA_NodeId baseObjectWithInterfaceId = bpr.targets->targetId.nodeId;
UA_BrowsePathResult_clear(&bpr);
bd.nodeId = baseObjectWithInterfaceId;
bd.resultMask = UA_BROWSERESULTMASK_ALL;
bd.browseDirection = UA_BROWSEDIRECTION_FORWARD;
bd.referenceTypeId = UA_NODEID_NUMERIC(0, UA_NS0ID_REFERENCES);
bd.includeSubtypes = UA_TRUE;
bd.nodeClassMask = 0xFFFFFFFF;
br = UA_Server_browse(server, 1000, &bd);
ck_assert_int_eq(br.statusCode, UA_STATUSCODE_GOOD);
ck_assert_int_gt(br.referencesSize, 0);
found = false;
for (size_t i = 0; i < br.referencesSize; ++i) {
UA_NodeId expectedRef = UA_NODEID_NUMERIC(0, UA_NS0ID_HASINTERFACE);
UA_NodeId expectedId = UA_NODEID_NUMERIC(2, 1005);
if (UA_NodeId_equal(&br.references[i].referenceTypeId, &expectedRef) &&
UA_NodeId_equal(&br.references[i].nodeId.nodeId, &expectedId))
{
found = true;
break;
}
}
ck_assert(found == true);
found = false;
for (size_t i = 0; i < br.referencesSize; ++i) {
UA_NodeId expectedRef = UA_NODEID_NUMERIC(0, UA_NS0ID_HASPROPERTY);
UA_QualifiedName expectedName = UA_QUALIFIEDNAME(2, (char *)"MyOtherInterfaceProperty");
if (UA_NodeId_equal(&br.references[i].referenceTypeId, &expectedRef) &&
UA_QualifiedName_equal(&br.references[i].browseName, &expectedName))
{
found = true;
break;
}
}
ck_assert(found == true);
} END_TEST
int main(void) {

View File

@ -24,23 +24,24 @@
</Aliases>
<Extensions>
<Extension>
<ua:ModelInfo Tool="UaModeler" Hash="QC0H4teuLnB95dz5UaKEmw==" Version="1.6.5"/>
<ua:ModelInfo Tool="UaModeler" Hash="EnbWjmGunr/glm0Z6NGB4w==" Version="1.6.5"/>
</Extension>
</Extensions>
<UAObjectType NodeId="ns=1;i=1005" BrowseName="1:MyOtherInterface">
<DisplayName>MyOtherInterface</DisplayName>
<References>
<Reference ReferenceType="HasInterface" IsForward="false">ns=1;i=1004</Reference>
<Reference ReferenceType="HasSubtype" IsForward="false">i=17602</Reference>
<Reference ReferenceType="HasProperty">ns=1;i=6010</Reference>
<Reference ReferenceType="HasInterface" IsForward="false">ns=1;i=1004</Reference>
<Reference ReferenceType="HasInterface" IsForward="false">ns=1;i=5003</Reference>
</References>
</UAObjectType>
<UAVariable DataType="Double" ParentNodeId="ns=1;i=1005" NodeId="ns=1;i=6010" BrowseName="1:MyOtherInterfaceProperty" AccessLevel="3">
<DisplayName>MyOtherInterfaceProperty</DisplayName>
<References>
<Reference ReferenceType="HasModellingRule">i=78</Reference>
<Reference ReferenceType="HasTypeDefinition">i=68</Reference>
<Reference ReferenceType="HasProperty" IsForward="false">ns=1;i=1005</Reference>
<Reference ReferenceType="HasTypeDefinition">i=68</Reference>
</References>
</UAVariable>
<UAObjectType NodeId="ns=1;i=1002" BrowseName="1:MyTestInterface">
@ -54,9 +55,9 @@
<UAVariable DataType="Double" ParentNodeId="ns=1;i=1002" NodeId="ns=1;i=6001" BrowseName="1:Interface1Property" AccessLevel="3">
<DisplayName>Interface1Property</DisplayName>
<References>
<Reference ReferenceType="HasProperty" IsForward="false">ns=1;i=1002</Reference>
<Reference ReferenceType="HasModellingRule">i=78</Reference>
<Reference ReferenceType="HasTypeDefinition">i=68</Reference>
<Reference ReferenceType="HasProperty" IsForward="false">ns=1;i=1002</Reference>
</References>
</UAVariable>
<UAObjectType IsAbstract="true" NodeId="ns=1;i=1003" BrowseName="1:MyBaseObjectType">
@ -78,17 +79,27 @@
<DisplayName>MyTestObjectProperty</DisplayName>
<References>
<Reference ReferenceType="HasModellingRule">i=78</Reference>
<Reference ReferenceType="HasTypeDefinition">i=68</Reference>
<Reference ReferenceType="HasProperty" IsForward="false">ns=1;i=1004</Reference>
<Reference ReferenceType="HasTypeDefinition">i=68</Reference>
</References>
</UAVariable>
<UAObjectType NodeId="ns=1;i=1006" BrowseName="1:TopLevelObjectType">
<DisplayName>TopLevelObjectType</DisplayName>
<References>
<Reference ReferenceType="HasComponent">ns=1;i=5003</Reference>
<Reference ReferenceType="HasComponent">ns=1;i=5002</Reference>
<Reference ReferenceType="HasSubtype" IsForward="false">i=58</Reference>
</References>
</UAObjectType>
<UAObject ParentNodeId="ns=1;i=1006" NodeId="ns=1;i=5003" BrowseName="1:BaseObjectWithInterface">
<DisplayName>BaseObjectWithInterface</DisplayName>
<References>
<Reference ReferenceType="HasTypeDefinition">i=58</Reference>
<Reference ReferenceType="HasModellingRule">i=78</Reference>
<Reference ReferenceType="HasComponent" IsForward="false">ns=1;i=1006</Reference>
<Reference ReferenceType="HasInterface">ns=1;i=1005</Reference>
</References>
</UAObject>
<UAObject ParentNodeId="ns=1;i=1006" NodeId="ns=1;i=5002" BrowseName="1:ObjectWithInterfaces">
<DisplayName>ObjectWithInterfaces</DisplayName>
<References>