/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include #include #include #include #include #include #include #include "ua_client.h" #include "ua_config_standard.h" #include "ua_network_tcp.h" #include "check.h" // set register timeout to 1 second so we are able to test it. #define registerTimeout 1 // cleanup is only triggered every 10 seconds, thus wait a bit longer to check #define checkWait registerTimeout + 11 UA_Server *server_lds; UA_Boolean *running_lds; UA_ServerNetworkLayer nl_lds; pthread_t server_thread_lds; static void * serverloop_lds(void *_) { while(*running_lds) UA_Server_run_iterate(server_lds, true); return NULL; } static void setup_lds(void) { // start LDS server running_lds = UA_Boolean_new(); *running_lds = true; UA_ServerConfig config_lds = UA_ServerConfig_standard; config_lds.applicationDescription.applicationType = UA_APPLICATIONTYPE_DISCOVERYSERVER; config_lds.applicationDescription.applicationUri = UA_String_fromChars("open62541.test.local_discovery_server"); config_lds.discoveryCleanupTimeout = registerTimeout; nl_lds = UA_ServerNetworkLayerTCP(UA_ConnectionConfig_standard, 4840); config_lds.networkLayers = &nl_lds; config_lds.networkLayersSize = 1; server_lds = UA_Server_new(config_lds); UA_Server_run_startup(server_lds); pthread_create(&server_thread_lds, NULL, serverloop_lds, NULL); } static void teardown_lds(void) { *running_lds = false; pthread_join(server_thread_lds, NULL); UA_Server_run_shutdown(server_lds); UA_Boolean_delete(running_lds); UA_String_deleteMembers(&server_lds->config.applicationDescription.applicationUri); UA_Server_delete(server_lds); nl_lds.deleteMembers(&nl_lds); } UA_Server *server_register; UA_Boolean *running_register; UA_ServerNetworkLayer nl_register; pthread_t server_thread_register; static void * serverloop_register(void *_) { while(*running_register) UA_Server_run_iterate(server_register, true); return NULL; } static void setup_register(void) { // start LDS server running_register = UA_Boolean_new(); *running_register = true; UA_ServerConfig config_register = UA_ServerConfig_standard; config_register.applicationDescription.applicationUri = UA_String_fromChars("open62541.test.server_register"); nl_register = UA_ServerNetworkLayerTCP(UA_ConnectionConfig_standard, 16664); config_register.networkLayers = &nl_register; config_register.networkLayersSize = 1; server_register = UA_Server_new(config_register); UA_Server_run_startup(server_register); pthread_create(&server_thread_register, NULL, serverloop_register, NULL); } static void teardown_register(void) { *running_register = false; pthread_join(server_thread_register, NULL); UA_Server_run_shutdown(server_register); UA_Boolean_delete(running_register); UA_String_deleteMembers(&server_register->config.applicationDescription.applicationUri); UA_Server_delete(server_register); nl_register.deleteMembers(&nl_register); } START_TEST(Server_register) { UA_StatusCode retval = UA_Server_register_discovery(server_register, "opc.tcp://localhost:4840", NULL); ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD); } END_TEST START_TEST(Server_unregister) { UA_StatusCode retval = UA_Server_unregister_discovery(server_register, "opc.tcp://localhost:4840"); ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD); } END_TEST static UA_StatusCode FindServers(const char* discoveryServerUrl, size_t* registeredServerSize, UA_ApplicationDescription** registeredServers, const char* filterUri, const char* filterLocale) { UA_Client *client = UA_Client_new(UA_ClientConfig_standard); UA_StatusCode retval = UA_Client_connect(client, discoveryServerUrl); if(retval != UA_STATUSCODE_GOOD) { UA_Client_delete(client); return retval; } UA_FindServersRequest request; UA_FindServersRequest_init(&request); if (filterUri) { request.serverUrisSize = 1; request.serverUris = UA_malloc(sizeof(UA_String)); request.serverUris[0] = UA_String_fromChars(filterUri); } if (filterLocale) { request.localeIdsSize = 1; request.localeIds = UA_malloc(sizeof(UA_String)); request.localeIds[0] = UA_String_fromChars(filterLocale); } // now send the request UA_FindServersResponse response; UA_FindServersResponse_init(&response); __UA_Client_Service(client, &request, &UA_TYPES[UA_TYPES_FINDSERVERSREQUEST], &response, &UA_TYPES[UA_TYPES_FINDSERVERSRESPONSE]); if (filterUri) { UA_Array_delete(request.serverUris, request.serverUrisSize, &UA_TYPES[UA_TYPES_STRING]); } if (filterLocale) { UA_Array_delete(request.localeIds, request.localeIdsSize, &UA_TYPES[UA_TYPES_STRING]); } if(response.responseHeader.serviceResult != UA_STATUSCODE_GOOD) { UA_FindServersResponse_deleteMembers(&response); UA_Client_disconnect(client); UA_Client_delete(client); ck_abort_msg("FindServers failed with statuscode 0x%08x", response.responseHeader.serviceResult); } *registeredServerSize = response.serversSize; *registeredServers = (UA_ApplicationDescription*)UA_Array_new(response.serversSize, &UA_TYPES[UA_TYPES_APPLICATIONDESCRIPTION]); for(size_t i=0;i