Bladeren bron

UA_Server_addNamespace can now handle duplicate namespace URI, relates #584

Stasik0 9 jaren geleden
bovenliggende
commit
a659f0f31f
3 gewijzigde bestanden met toevoegingen van 57 en 0 verwijderingen
  1. 6 0
      src/server/ua_server.c
  2. 4 0
      tests/CMakeLists.txt
  3. 47 0
      tests/check_server_userspace.c

+ 6 - 0
src/server/ua_server.c

@@ -86,6 +86,12 @@ UA_Server_addExternalNamespace(UA_Server *server,
 #endif /* UA_ENABLE_EXTERNAL_NAMESPACES*/
 
 static UA_UInt16 addNamespaceInternal(UA_Server *server, UA_String *name) {
+    //check if the namespace already exists in the server's namespace array
+    for(UA_UInt16 i=0;i<server->namespacesSize;i++){
+        if(UA_String_equal(name, &(server->namespaces[i])))
+            return i;
+    }
+    //the namespace URI did not match - add a new namespace to the namsepace array
 	server->namespaces = UA_realloc(server->namespaces,
 		sizeof(UA_String) * (server->namespacesSize + 1));
 	UA_String_copy(name, &(server->namespaces[server->namespacesSize]));

+ 4 - 0
tests/CMakeLists.txt

@@ -57,6 +57,10 @@ add_executable(check_session check_session.c $<TARGET_OBJECTS:open62541-object>)
 target_link_libraries(check_session ${LIBS})
 add_test(session ${CMAKE_CURRENT_BINARY_DIR}/check_session)
 
+add_executable(check_server_userspace check_server_userspace.c $<TARGET_OBJECTS:open62541-object>)
+target_link_libraries(check_server_userspace ${LIBS})
+add_test(check_server_userspace ${CMAKE_CURRENT_BINARY_DIR}/check_server_userspace)
+
 # add_executable(check_startup check_startup.c)
 # target_link_libraries(check_startup ${LIBS})
 # add_test(startup ${CMAKE_CURRENT_BINARY_DIR}/check_startup)

+ 47 - 0
tests/check_server_userspace.c

@@ -0,0 +1,47 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "ua_types.h"
+#include "ua_config_standard.h"
+#include "check.h"
+
+START_TEST(Server_addNamespace_ShallWork)
+{
+    UA_ServerConfig config = UA_ServerConfig_standard;
+    UA_Server *server = UA_Server_new(config);
+
+    UA_UInt16 a = UA_Server_addNamespace(server, "http://nameOfNamespace");
+    UA_UInt16 b = UA_Server_addNamespace(server, "http://nameOfNamespace");
+    UA_UInt16 c = UA_Server_addNamespace(server, "http://nameOfNamespace2");
+
+    ck_assert_uint_gt(a, 0);
+    ck_assert_uint_eq(a,b);
+    ck_assert_uint_ne(a,c);
+}
+END_TEST
+
+static Suite* testSuite_ServerUserspace(void) {
+	Suite *s = suite_create("ServerUserspace");
+	TCase *tc_core = tcase_create("Core");
+	tcase_add_test(tc_core, Server_addNamespace_ShallWork);
+
+	suite_add_tcase(s,tc_core);
+	return s;
+}
+
+int main(void) {
+	int number_failed = 0;
+
+	Suite *s;
+	SRunner *sr;
+
+	s = testSuite_ServerUserspace();
+	sr = srunner_create(s);
+	srunner_run_all(sr,CK_NORMAL);
+	number_failed += srunner_ntests_failed(sr);
+	srunner_free(sr);
+
+	return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
+}
+
+