Browse Source

finish more test cases in the compliance tool

Julius Pfrommer 10 years ago
parent
commit
29c926cecf
4 changed files with 32 additions and 27 deletions
  1. 1 1
      CMakeLists.txt
  2. 6 6
      src/server/ua_server.c
  3. 20 16
      src/server/ua_services_view.c
  4. 5 4
      src/ua_types.c

+ 1 - 1
CMakeLists.txt

@@ -12,7 +12,7 @@ add_definitions(-DOPEN62541_VERSION_PATCH=${open62541_VERSION_PATCH})
 set(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake")
 
 # Set default build type.
-if (NOT CMAKE_BUILD_TYPE)
+if(NOT CMAKE_BUILD_TYPE)
     message(STATUS "CMAKE_BUILD_TYPE not given; setting to 'RelWithDebInfo'.")
     set(CMAKE_BUILD_TYPE "RelWithDebInfo" CACHE STRING "Choose the type of build." FORCE)
 endif()

+ 6 - 6
src/server/ua_server.c

@@ -617,8 +617,6 @@ UA_Server * UA_Server_new(void) {
    UA_Server_addNode(server, (UA_Node*)servernode,
 		   &UA_EXPANDEDNODEID_STATIC(0, UA_NS0ID_OBJECTSFOLDER),
 		   &UA_NODEID_STATIC(0, UA_NS0ID_ORGANIZES));
-   ADDREFERENCE(UA_NODEID_STATIC(0, UA_NS0ID_SERVER), UA_NODEID_STATIC(0, UA_NS0ID_HASPROPERTY),
-		   UA_EXPANDEDNODEID_STATIC(0, UA_NS0ID_SERVER_SERVERARRAY));
 
    UA_VariableNode *namespaceArray = UA_VariableNode_new();
    copyNames((UA_Node*)namespaceArray, "NamespaceArray");
@@ -638,8 +636,9 @@ UA_Server * UA_Server_new(void) {
    UA_Server_addNode(server, (UA_Node*)namespaceArray,
 		   &UA_EXPANDEDNODEID_STATIC(0, UA_NS0ID_SERVER),
 		   &UA_NODEID_STATIC(0, UA_NS0ID_HASPROPERTY));
-   ADDREFERENCE(UA_NODEID_STATIC(0, UA_NS0ID_SERVER_NAMESPACEARRAY), UA_NODEID_STATIC(0, UA_NS0ID_HASTYPEDEFINITION),
-		   UA_EXPANDEDNODEID_STATIC(0, UA_NS0ID_PROPERTYTYPE));
+   ADDREFERENCE(UA_NODEID_STATIC(0, UA_NS0ID_SERVER_NAMESPACEARRAY),
+                UA_NODEID_STATIC(0, UA_NS0ID_HASTYPEDEFINITION),
+                UA_EXPANDEDNODEID_STATIC(0, UA_NS0ID_PROPERTYTYPE));
 
    UA_VariableNode *serverArray = UA_VariableNode_new();
    copyNames((UA_Node*)serverArray, "ServerArray");
@@ -656,8 +655,9 @@ UA_Server * UA_Server_new(void) {
    UA_Server_addNode(server, (UA_Node*)serverArray,
  		   &UA_EXPANDEDNODEID_STATIC(0, UA_NS0ID_SERVER),
  		   &UA_NODEID_STATIC(0, UA_NS0ID_HASPROPERTY));
-   ADDREFERENCE(UA_NODEID_STATIC(0, UA_NS0ID_SERVER_SERVERARRAY), UA_NODEID_STATIC(0, UA_NS0ID_HASTYPEDEFINITION),
- 		   UA_EXPANDEDNODEID_STATIC(0, UA_NS0ID_PROPERTYTYPE));
+   ADDREFERENCE(UA_NODEID_STATIC(0, UA_NS0ID_SERVER_SERVERARRAY),
+                UA_NODEID_STATIC(0, UA_NS0ID_HASTYPEDEFINITION),
+                UA_EXPANDEDNODEID_STATIC(0, UA_NS0ID_PROPERTYTYPE));
 
    UA_ObjectNode *servercapablities = UA_ObjectNode_new();
    copyNames((UA_Node*)servercapablities, "ServerCapabilities");

+ 20 - 16
src/server/ua_services_view.c

@@ -91,8 +91,8 @@ findsubtypes(UA_NodeStore *ns, const UA_NodeId *root, UA_NodeId **reftypes, size
     size_t last = 0; // where is the last element in the array?
     do {
         const UA_Node *node = UA_NodeStore_get(ns, &results[index]);
-        if(!node)
-            break;
+        if(!node || node->nodeClass != UA_NODECLASS_REFERENCETYPE)
+            continue;
         for(UA_Int32 i = 0; i < node->referencesSize; i++) {
             if(node->references[i].referenceTypeId.identifier.numeric != UA_NS0ID_HASSUBTYPE ||
                node->references[i].isInverse == UA_TRUE)
@@ -104,6 +104,7 @@ findsubtypes(UA_NodeStore *ns, const UA_NodeId *root, UA_NodeId **reftypes, size
                     retval = UA_STATUSCODE_BADOUTOFMEMORY;
                     break;
                 }
+                results = new_results;
                 results_size *= 2;
             }
 
@@ -137,7 +138,8 @@ browse(UA_NodeStore *ns, const UA_BrowseDescription *descr, UA_UInt32 maxrefs, U
     UA_Boolean all_refs = UA_NodeId_isNull(&descr->referenceTypeId);
     if(!all_refs) {
         if(descr->includeSubtypes) {
-            result->statusCode = findsubtypes(ns, &descr->referenceTypeId, &relevant_refs, &relevant_refs_size);
+            result->statusCode = findsubtypes(ns, &descr->referenceTypeId,
+                                              &relevant_refs, &relevant_refs_size);
             if(result->statusCode != UA_STATUSCODE_GOOD)
                 return;
         } else {
@@ -175,7 +177,8 @@ browse(UA_NodeStore *ns, const UA_BrowseDescription *descr, UA_UInt32 maxrefs, U
         if(!current)
             continue;
 
-        UA_StatusCode retval = fillrefdescr(ns, current, &node->references[i], descr->resultMask, &result->references[count]);
+        UA_StatusCode retval = fillrefdescr(ns, current, &node->references[i],
+                                            descr->resultMask, &result->references[count]);
         UA_NodeStore_release(current);
 
         if(retval) {
@@ -249,8 +252,9 @@ void Service_Browse(UA_Server *server, UA_Session *session, const UA_BrowseReque
 /***********************/
 
 static UA_StatusCode
-walkBrowsePath(UA_Server *server, UA_Session *session, const UA_Node *node, const UA_RelativePath *path, UA_Int32 pathindex,
-               UA_BrowsePathTarget **targets, UA_Int32 *targets_size, UA_Int32 *target_count)
+walkBrowsePath(UA_Server *server, UA_Session *session, const UA_Node *node, const UA_RelativePath *path,
+               UA_Int32 pathindex, UA_BrowsePathTarget **targets, UA_Int32 *targets_size,
+               UA_Int32 *target_count)
 {
     const UA_RelativePathElement *elem = &path->elements[pathindex];
     if(elem->targetName.name.length == -1)
@@ -326,6 +330,11 @@ walkBrowsePath(UA_Server *server, UA_Session *session, const UA_Node *node, cons
 
 static void translateBrowsePath(UA_Server *server, UA_Session *session, const UA_BrowsePath *path,
                                 UA_BrowsePathResult *result) {
+    if(path->relativePath.elementsSize <= 0) {
+        result->statusCode = UA_STATUSCODE_BADNOTHINGTODO;
+        return;
+    }
+        
     UA_Int32 arraySize = 10;
     result->targets = UA_malloc(sizeof(UA_BrowsePathTarget) * arraySize);
     if(!result->targets) {
@@ -337,23 +346,18 @@ static void translateBrowsePath(UA_Server *server, UA_Session *session, const UA
     if(!firstNode) {
         result->statusCode = UA_STATUSCODE_BADNODEIDUNKNOWN;
         UA_free(result->targets);
+        result->targets = UA_NULL;
         return;
     }
-    if(path->relativePath.elementsSize > 0)
-        result->statusCode = walkBrowsePath(server, session, firstNode, &path->relativePath, 0,
-                                            &result->targets, &arraySize, &result->targetsSize);
-    else
-        result->statusCode = UA_STATUSCODE_BADNOTHINGTODO;
+    result->statusCode = walkBrowsePath(server, session, firstNode, &path->relativePath, 0,
+                                        &result->targets, &arraySize, &result->targetsSize);
     UA_NodeStore_release(firstNode);
+    if(result->targetsSize == 0 && result->statusCode == UA_STATUSCODE_GOOD)
+        result->statusCode = UA_STATUSCODE_BADNOMATCH;
     if(result->statusCode != UA_STATUSCODE_GOOD) {
         UA_Array_delete(result->targets, &UA_TYPES[UA_TYPES_BROWSEPATHTARGET], result->targetsSize);
         result->targets = UA_NULL;
         result->targetsSize = -1;
-    } else if(result->targetsSize == 0) {
-        result->statusCode = UA_STATUSCODE_BADNOMATCH;
-        UA_free(result->targets);
-        result->targets = UA_NULL;
-        result->targetsSize = -1;
     }
 }
 

+ 5 - 4
src/ua_types.c

@@ -395,7 +395,7 @@ UA_Boolean UA_NodeId_isNull(const UA_NodeId *p) {
         break;
 
     case UA_NODEIDTYPE_STRING:
-        if(p->namespaceIndex != 0 || p->identifier.string.length != 0)
+        if(p->namespaceIndex != 0 || p->identifier.string.length > 0)
             return UA_FALSE;
         break;
 
@@ -406,7 +406,7 @@ UA_Boolean UA_NodeId_isNull(const UA_NodeId *p) {
         break;
 
     case UA_NODEIDTYPE_BYTESTRING:
-        if(p->namespaceIndex != 0 || p->identifier.byteString.length != 0)
+        if(p->namespaceIndex != 0 || p->identifier.byteString.length > 0)
             return UA_FALSE;
         break;
 
@@ -644,8 +644,9 @@ UA_StatusCode UA_Variant_copyRange(const UA_Variant *src, UA_Variant *dst, const
     if(range.dimensionsSize != dims_count)
         return UA_STATUSCODE_BADINTERNALERROR;
     for(UA_Int32 i = 0; i < range.dimensionsSize; i++) {
-        if(range.dimensions[i].min > range.dimensions[i].max ||
-           range.dimensions[i].max > (UA_UInt32)dims[i])
+        if(range.dimensions[i].min > range.dimensions[i].max)
+            return UA_STATUSCODE_BADINDEXRANGEINVALID;
+        if(range.dimensions[i].max > (UA_UInt32)dims[i])
             return UA_STATUSCODE_BADINDEXRANGENODATA;
         count *= (range.dimensions[i].max - range.dimensions[i].min) + 1;
     }