Преглед на файлове

Apply mutex wrapper to check_subscription_events

Ari преди 6 години
родител
ревизия
3ca64fe180
променени са 1 файла, в които са добавени 41 реда и са изтрити 8 реда
  1. 41 8
      tests/server/check_subscription_events.c

+ 41 - 8
tests/server/check_subscription_events.c

@@ -19,6 +19,7 @@ static UA_Server *server;
 static UA_ServerConfig *config;
 static UA_Boolean *running;
 static THREAD_HANDLE server_thread;
+static MUTEX_HANDLE serverMutex;
 
 UA_Client *client;
 
@@ -146,14 +147,26 @@ removeSubscription(void) {
     UA_DeleteSubscriptionsResponse_deleteMembers(&deleteSubscriptionsResponse);
 }
 
+static void serverMutexLock(void) {
+    ck_assert_uint_eq(MUTEX_LOCK(serverMutex), true);
+}
+
+static void serverMutexUnlock(void) {
+    ck_assert_uint_eq(MUTEX_UNLOCK(serverMutex), true);
+}
+
 THREAD_CALLBACK(serverloop) {
-    while (*running)
+    while (*running) {
+        serverMutexLock();
         UA_Server_run_iterate(server, true);
+        serverMutexUnlock();
+    }
     return 0;
 }
 
 static void
 setup(void) {
+    ck_assert_uint_eq(MUTEX_INIT(serverMutex), true);
     running = UA_Boolean_new();
     *running = true;
     config = UA_ServerConfig_new_default();
@@ -168,6 +181,7 @@ setup(void) {
     UA_StatusCode retval = UA_Client_connect(client, "opc.tcp://localhost:4840");
     ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
     setupSubscription();
+    UA_comboSleep((UA_UInt32) publishingInterval + 100);
 }
 
 static void
@@ -183,12 +197,23 @@ teardown(void) {
 
     UA_Client_disconnect(client);
     UA_Client_delete(client);
+    ck_assert_uint_eq(MUTEX_DESTROY(serverMutex), true);
+}
+
+static UA_StatusCode triggerEventLocked(const UA_NodeId eventNodeId, const UA_NodeId origin,
+                                        UA_ByteString *outEventId, const UA_Boolean deleteEventNode) {
+    serverMutexLock();
+    UA_StatusCode retval = UA_Server_triggerEvent(server, eventNodeId, origin, outEventId, deleteEventNode);
+    serverMutexUnlock();
+    return retval;
 }
 
 static UA_StatusCode
 eventSetup(UA_NodeId *eventNodeId) {
     UA_StatusCode retval;
+    serverMutexLock();
     retval = UA_Server_createEvent(server, eventType, eventNodeId);
+    serverMutexUnlock();
     ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
     // add a severity to the event
     UA_Variant value;
@@ -203,19 +228,27 @@ eventSetup(UA_NodeId *eventNodeId) {
     bp.relativePath.elementsSize = 1;
     bp.relativePath.elements = &rpe;
     rpe.targetName = UA_QUALIFIEDNAME(0, "Severity");
+    serverMutexLock();
     UA_BrowsePathResult bpr = UA_Server_translateBrowsePathToNodeIds(server, &bp);
+    serverMutexUnlock();
     // number with no special meaning
     UA_UInt16 eventSeverity = 1000;
     UA_Variant_setScalar(&value, &eventSeverity, &UA_TYPES[UA_TYPES_UINT16]);
+    serverMutexLock();
     UA_Server_writeValue(server, bpr.targets[0].targetId.nodeId, value);
+    serverMutexUnlock();
     UA_BrowsePathResult_deleteMembers(&bpr);
 
     //add a message to the event
     rpe.targetName = UA_QUALIFIEDNAME(0, "Message");
+    serverMutexLock();
     bpr = UA_Server_translateBrowsePathToNodeIds(server, &bp);
+    serverMutexUnlock();
     UA_LocalizedText message = UA_LOCALIZEDTEXT("en-US", "Generated Event");
     UA_Variant_setScalar(&value, &message, &UA_TYPES[UA_TYPES_LOCALIZEDTEXT]);
+    serverMutexLock();
     UA_Server_writeValue(server, bpr.targets[0].targetId.nodeId, value);
+    serverMutexUnlock();
     UA_BrowsePathResult_deleteMembers(&bpr);
 
     return retval;
@@ -256,7 +289,7 @@ START_TEST(generateEvents) {
     ck_assert_uint_eq(createResult.statusCode, UA_STATUSCODE_GOOD);
     monitoredItemId = createResult.monitoredItemId;
     // trigger the event
-    retval = UA_Server_triggerEvent(server, eventNodeId, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER), NULL, UA_TRUE);
+    retval = triggerEventLocked(eventNodeId, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER), NULL, UA_TRUE);
     ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
 
     // let the client fetch the event and check if the correct values were received
@@ -342,8 +375,8 @@ START_TEST(uppropagation) {
     ck_assert_uint_eq(createResult.statusCode, UA_STATUSCODE_GOOD);
     monitoredItemId = createResult.monitoredItemId;
     // trigger the event on a child of server, using namespaces in this case (no reason in particular)
-    retval = UA_Server_triggerEvent(server, eventNodeId, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_NAMESPACES), NULL,
-                                    UA_TRUE);
+    retval = triggerEventLocked(eventNodeId, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_NAMESPACES), NULL,
+                                UA_TRUE);
     ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
 
     // let the client fetch the event and check if the correct values were received
@@ -400,9 +433,9 @@ START_TEST(eventOverflow) {
     UA_NodeId eventNodeId;
     UA_StatusCode retval = eventSetup(&eventNodeId);
     ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-    retval = UA_Server_triggerEvent(server, eventNodeId, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER), NULL, UA_FALSE);
+    retval = triggerEventLocked(eventNodeId, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER), NULL, UA_FALSE);
     ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-    retval = UA_Server_triggerEvent(server, eventNodeId, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER), NULL, UA_TRUE);
+    retval = triggerEventLocked(eventNodeId, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER), NULL, UA_TRUE);
     ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
 
     // fetch the events, ensure both the overflow and the original event are received
@@ -489,9 +522,9 @@ START_TEST(eventStressing) {
     UA_NodeId eventNodeId;
     UA_StatusCode retval = eventSetup(&eventNodeId);
     ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-    for(size_t i = 0; i < 50; i++) {
+    for(size_t i = 0; i < 20; i++) {
         for(size_t j = 0; j < 5; j++) {
-            retval = UA_Server_triggerEvent(server, eventNodeId,
+            retval = triggerEventLocked(eventNodeId,
                                             UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER), NULL, UA_FALSE);
             ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
         }