浏览代码

added some namespace tests and found out that nsid matters

never believe in comments...
Leon Urbas 10 年之前
父节点
当前提交
01cccc3eb2
共有 2 个文件被更改,包括 115 次插入35 次删除
  1. 39 35
      examples/src/xml2ns0.c
  2. 76 0
      tests/check_namespace.c

+ 39 - 35
examples/src/xml2ns0.c

@@ -24,50 +24,54 @@ char* buildNumber = "999-" __DATE__ "-001" ;
 	dst.data = (UA_Byte*) src; \
 } while(0)
 
-void sam_attach(Namespace *ns,UA_Int32 ns0id,UA_Int32 type, void* p) {
+void sam_attach(Namespace *ns,UA_UInt32 ns0id,UA_Int32 type, void* p) {
 	Namespace_Entry_Lock* lock;
 	UA_NodeId nodeid;
 	nodeid.namespace = ns->namespaceId;
 	nodeid.identifier.numeric = ns0id;
 	nodeid.encodingByte = UA_NODEIDTYPE_FOURBYTE;
 	const UA_Node* result;
-	Namespace_get(ns,&nodeid,&result,&lock);
-
-	printf("asked for node with nodeId={i=%d}, got node with nodeId={i=%d},",ns0id, result->nodeId.identifier.numeric);
-	UA_String_printf("BrowseName=",&(result->browseName.name));
-
-	if (result->nodeClass == UA_NODECLASS_VARIABLE) {
-		UA_VariableNode* variable = (UA_VariableNode*) result;
-		if (variable->dataType.identifier.numeric == UA_[type].ns0Id) {
-			variable->value.arrayLength = 1;
-			if (variable->value.data == UA_NULL) {
-				UA_alloc((void**)&(variable->value.data), sizeof(void*));
-				variable->value.data[0] = UA_NULL;
-			}
-			if (UA_NodeId_isBuiltinType(&variable->dataType)) {
-				variable->value.data[0] = p;
-			} else {
-				if (variable->value.vt->ns0Id != UA_EXTENSIONOBJECT_NS0) {
-					printf("nodeId for id=%d, type=%d\n should be an extension object", ns0id, type);
-				} else {
-					if (variable->value.data[0] == UA_NULL) {
-						UA_alloc((void**)&(variable->value.data[0]), sizeof(UA_ExtensionObject));
+	UA_Int32 retval;
+	if ((retval = Namespace_get(ns,&nodeid,&result,&lock)) == UA_SUCCESS) {
+		if (result->nodeId.identifier.numeric == ns0id) {
+			if (result->nodeClass == UA_NODECLASS_VARIABLE) {
+				UA_VariableNode* variable = (UA_VariableNode*) result;
+				if (variable->dataType.identifier.numeric == UA_[type].ns0Id) {
+					variable->value.arrayLength = 1;
+					if (variable->value.data == UA_NULL) {
+						UA_alloc((void**)&(variable->value.data), sizeof(void*));
+						variable->value.data[0] = UA_NULL;
+					}
+					if (UA_NodeId_isBuiltinType(&variable->dataType)) {
+						variable->value.data[0] = p;
+					} else {
+						if (variable->value.vt->ns0Id != UA_EXTENSIONOBJECT_NS0) {
+							printf("nodeId for id=%d, type=%d\n should be an extension object", ns0id, type);
+						} else {
+							if (variable->value.data[0] == UA_NULL) {
+								UA_alloc((void**)&(variable->value.data[0]), sizeof(UA_ExtensionObject));
+							}
+							UA_ExtensionObject* eo = (UA_ExtensionObject*) variable->value.data[0];
+							eo->typeId = variable->dataType;
+							eo->encoding = UA_EXTENSIONOBJECT_ENCODINGMASK_BODYISBYTESTRING;
+							// FIXME: This code is valid for ns0 and numeric identifiers only
+							eo->body.length = UA_[UA_ns0ToVTableIndex(variable->dataType.identifier.numeric)].memSize;
+							eo->body.data = p;
+						}
 					}
-					UA_ExtensionObject* eo = (UA_ExtensionObject*) variable->value.data[0];
-					eo->typeId = variable->dataType;
-					eo->encoding = UA_EXTENSIONOBJECT_ENCODINGMASK_BODYISBYTESTRING;
-					// FIXME: This code is valid for ns0 and numeric identifiers only
-					eo->body.length = UA_[UA_ns0ToVTableIndex(variable->dataType.identifier.numeric)].memSize;
-					eo->body.data = p;
+				} else {
+					printf("wrong datatype for id=%d, expected=%d, retrieved=%d\n", ns0id, UA_[type].ns0Id, variable->dataType.identifier.numeric);
 				}
+			} else {
+				perror("Namespace_getWritable returned wrong node class");
 			}
 		} else {
-			printf("wrong datatype for id=%d, expected=%d, retrieved=%d\n", ns0id, UA_[type].ns0Id, variable->dataType.identifier.numeric);
+			printf("retrieving node={i=%d} returned node={i=%d}\n", ns0id, result->nodeId.identifier.numeric);
 		}
+		Namespace_Entry_Lock_release(lock);
 	} else {
-		perror("Namespace_getWritable returned wrong node class");
+		printf("retrieving node={i=%d} returned error code %d\n",ns0id,retval);
 	}
-	Namespace_Entry_Lock_release(lock);
 }
 
 void sam_init(Namespace* ns) {
@@ -185,7 +189,7 @@ int main() {
 	XML_Stack s;
 	XML_Stack_init(&s, "ROOT");
 	UA_NodeSet n;
-	UA_NodeSet_init(&n, 99); // we don't really need the nsid here
+	UA_NodeSet_init(&n, 0);
 	XML_Stack_addChildHandler(&s, "UANodeSet", strlen("UANodeSet"), (XML_decoder) UA_NodeSet_decodeXML, UA_INVALIDTYPE, &n);
 
 	XML_Parser parser = XML_ParserCreate(NULL);
@@ -224,10 +228,10 @@ int main() {
 		retval |= UAX_NodeId_encodeBinary(n.ns,&nodeid,&pos,&buffer);
 	}
 	UA_DateTime tEnd = UA_DateTime_now();
-	// tStart, tEnd count in 100 ns steps = 10 µs
-	UA_Double tDelta = ( tEnd - tStart ) / ( 10.0 * i);
+	// tStart, tEnd count in 100 ns steps, so 10 steps = 1 µs
+	UA_Double tDelta = ( tEnd - tStart ) / ( 10.0 * i );
 
-	printf("encode server node %d times: time/enc=%f us, retval=%d\n",i, tDelta, retval);
+	printf("encode server node %d times, retval=%d: time/enc=%f us, enc/s=%f\n",i, retval, tDelta, 1.0E6 / tDelta);
 	DBG(buffer.length=pos);
 	DBG(UA_ByteString_printx(", result=", &buffer));
 

+ 76 - 0
tests/check_namespace.c

@@ -58,6 +58,77 @@ START_TEST(findNodeInNamespaceWithTwoEntries) {
 }
 END_TEST
 
+START_TEST(findNodeInNamespaceWithSeveralEntries) {
+	// given
+	Namespace *ns;
+	Namespace_new(&ns, 512, 99);
+	UA_Node* n1; createNode(&n1,0,2253); Namespace_insert(ns,n1);
+	UA_Node* n2; createNode(&n2,0,2255); Namespace_insert(ns,n2);
+	UA_Node* n3; createNode(&n3,0,2257); Namespace_insert(ns,n3);
+	UA_Node* n4; createNode(&n4,0,2200); Namespace_insert(ns,n4);
+	UA_Node* n5; createNode(&n5,0,1); Namespace_insert(ns,n5);
+	UA_Node* n6; createNode(&n6,0,12); Namespace_insert(ns,n6);
+
+	const UA_Node* nr = UA_NULL;
+	Namespace_Entry_Lock* nl = UA_NULL;
+	UA_Int32 retval;
+	// when
+	retval = Namespace_get(ns,&(n3->nodeId),&nr,&nl);
+	// then
+	ck_assert_int_eq(retval, UA_SUCCESS);
+	ck_assert_ptr_eq(nr,n3);
+	// finally
+	Namespace_delete(ns);
+}
+END_TEST
+
+START_TEST(findNodeInExpandedNamespace) {
+	// given
+	Namespace *ns;
+	Namespace_new(&ns, 10, 99);
+	UA_Node* n;
+	for (UA_Int32 i=0; i<200; i++) {
+		createNode(&n,0,i); Namespace_insert(ns,n);
+	}
+	const UA_Node* nr = UA_NULL;
+	Namespace_Entry_Lock* nl = UA_NULL;
+	UA_Int32 retval;
+	// when
+	createNode(&n,0,25);
+	retval = Namespace_get(ns,&(n->nodeId),&nr,&nl);
+	// then
+	ck_assert_int_eq(retval, UA_SUCCESS);
+	ck_assert_int_eq(nr->nodeId.identifier.numeric,n->nodeId.identifier.numeric);
+	// finally
+	UA_free(n);
+	Namespace_delete(ns);
+}
+END_TEST
+
+START_TEST(failToFindNonExistantNodeInNamespaceWithSeveralEntries) {
+	// given
+	Namespace *ns;
+	Namespace_new(&ns, 512, 99);
+	UA_Node* n1; createNode(&n1,0,2253); Namespace_insert(ns,n1);
+	UA_Node* n2; createNode(&n2,0,2255); Namespace_insert(ns,n2);
+	UA_Node* n3; createNode(&n3,0,2257); Namespace_insert(ns,n3);
+	UA_Node* n4; createNode(&n4,0,2200); Namespace_insert(ns,n4);
+	UA_Node* n5; createNode(&n5,0,1); Namespace_insert(ns,n5);
+	UA_Node* n6; createNode(&n6,0,12);
+
+	const UA_Node* nr = UA_NULL;
+	Namespace_Entry_Lock* nl = UA_NULL;
+	UA_Int32 retval;
+	// when
+	retval = Namespace_get(ns,&(n6->nodeId),&nr,&nl);
+	// then
+	ck_assert_int_ne(retval, UA_SUCCESS);
+	// finally
+	UA_free(n6);
+	Namespace_delete(ns);
+}
+END_TEST
+
 Suite * namespace_suite (void) {
 	Suite *s = suite_create ("Namespace");
 
@@ -65,9 +136,14 @@ Suite * namespace_suite (void) {
 	tcase_add_test (tc_cd, test_Namespace);
 	suite_add_tcase (s, tc_cd);
 
+
+
 	TCase* tc_find = tcase_create ("Find");
 	tcase_add_test (tc_find, findNodeInNamespaceWithSingleEntry);
 	tcase_add_test (tc_find, findNodeInNamespaceWithTwoEntries);
+	tcase_add_test (tc_find, findNodeInNamespaceWithSeveralEntries);
+	tcase_add_test (tc_find, findNodeInExpandedNamespace);
+	tcase_add_test (tc_find, failToFindNonExistantNodeInNamespaceWithSeveralEntries);
 	suite_add_tcase (s, tc_find);
 
 	return s;