From 04d6d83ba480ee900fe51a030fb11cac99fc5033 Mon Sep 17 00:00:00 2001
From: Carsten Patzke <carsten.patzke@desy.de>
Date: Fri, 17 Apr 2020 22:15:21 +0200
Subject: [PATCH] [Fabric] Strengthen the tests by allowing RecvAny to timeout
 (for valgrind)

---
 .../automatic/asapo_fabric/parallel_data_transfer.cpp  |  6 +++++-
 tests/automatic/asapo_fabric/simple_data_transfer.cpp  |  6 +++++-
 tests/automatic/asapo_fabric/timeout_test.cpp          |  7 ++++++-
 tests/automatic/asapo_fabric/wrong_memory_info.cpp     | 10 ++++++++--
 4 files changed, 24 insertions(+), 5 deletions(-)

diff --git a/tests/automatic/asapo_fabric/parallel_data_transfer.cpp b/tests/automatic/asapo_fabric/parallel_data_transfer.cpp
index fc99295ef..aa8b34547 100644
--- a/tests/automatic/asapo_fabric/parallel_data_transfer.cpp
+++ b/tests/automatic/asapo_fabric/parallel_data_transfer.cpp
@@ -30,7 +30,11 @@ void ServerChildThread(FabricServer* server, std::atomic<int>* serverTotalReques
 
         FabricAddress clientAddress;
         FabricMessageId messageId;
-        server->RecvAny(&clientAddress, &messageId, &request, sizeof(request), &err);
+        // In order to run the tests more stable. Otherwise a timeout could occurred with valgrind
+        int tries = 0;
+        do {
+            server->RecvAny(&clientAddress, &messageId, &request, sizeof(request), &err);
+        } while (err == IOErrorTemplates::kTimeout && tries++ < 2);
         M_AssertEq(nullptr, err, "server->RecvAny");
         M_AssertEq("Hello World", request.message);
         M_AssertEq(messageId / kEachInstanceRuns, request.data_id); // is client index
diff --git a/tests/automatic/asapo_fabric/simple_data_transfer.cpp b/tests/automatic/asapo_fabric/simple_data_transfer.cpp
index 5c35f5a2c..d5e4d9bda 100644
--- a/tests/automatic/asapo_fabric/simple_data_transfer.cpp
+++ b/tests/automatic/asapo_fabric/simple_data_transfer.cpp
@@ -35,7 +35,11 @@ void ServerMasterThread(const std::string& hostname, uint16_t port, char* expect
 
                 FabricAddress clientAddress;
                 FabricMessageId messageId;
-                server->RecvAny(&clientAddress, &messageId, &request, sizeof(request), &err);
+                // In order to run the tests more stable. Otherwise a timeout could occurred with valgrind
+                int tries = 0;
+                do {
+                    server->RecvAny(&clientAddress, &messageId, &request, sizeof(request), &err);
+                } while (err == IOErrorTemplates::kTimeout && tries++ < 2);
                 M_AssertEq(nullptr, err, "server->RecvAny");
                 M_AssertEq(123 + instanceRuns, messageId);
                 M_AssertEq("Hello World", request.message);
diff --git a/tests/automatic/asapo_fabric/timeout_test.cpp b/tests/automatic/asapo_fabric/timeout_test.cpp
index 0e2ab643b..d71ea1c3a 100644
--- a/tests/automatic/asapo_fabric/timeout_test.cpp
+++ b/tests/automatic/asapo_fabric/timeout_test.cpp
@@ -29,7 +29,12 @@ void ServerMasterThread(const std::string& hostname, uint16_t port) {
         int dummyBuffer;
         FabricAddress clientAddress;
         FabricMessageId messageId;
-        server->RecvAny(&clientAddress, &messageId, &dummyBuffer, sizeof(dummyBuffer), &err);
+
+        // In order to run the tests more stable. Otherwise a timeout could occurred with valgrind
+        int tries = 0;
+        do {
+            server->RecvAny(&clientAddress, &messageId, &dummyBuffer, sizeof(dummyBuffer), &err);
+        } while (err == IOErrorTemplates::kTimeout && tries++ < 2);
         M_AssertEq(nullptr, err, "server->RecvAny");
 
         server->Send(clientAddress, messageId, &dummyBuffer, sizeof(dummyBuffer), &err);
diff --git a/tests/automatic/asapo_fabric/wrong_memory_info.cpp b/tests/automatic/asapo_fabric/wrong_memory_info.cpp
index f94fc6c65..76988ddc4 100644
--- a/tests/automatic/asapo_fabric/wrong_memory_info.cpp
+++ b/tests/automatic/asapo_fabric/wrong_memory_info.cpp
@@ -47,7 +47,10 @@ void ServerMasterThread(const std::string& hostname, uint16_t port) {
     M_AssertEq(nullptr, err, "server->Send(1)");
 
     // Simulate correct memory details
-    server->RecvAny(&clientAddress, &messageId, &request, sizeof(request), &err);
+    int tries = 0;
+    do {
+        server->RecvAny(&clientAddress, &messageId, &request, sizeof(request), &err);
+    } while (err == IOErrorTemplates::kTimeout && tries++ < 2);
     M_AssertEq(nullptr, err, "server->RecvAny(2)");
     M_AssertEq(2, messageId);
     server->RdmaWrite(clientAddress, (MemoryRegionDetails*)&request.substream, rdmaBuffer.get(), kRdmaSize, &err);
@@ -57,7 +60,10 @@ void ServerMasterThread(const std::string& hostname, uint16_t port) {
 
     // Simulate old (unregistered) memory details
     GenericRequestHeader request2{};
-    server->RecvAny(&clientAddress, &messageId, &request2, sizeof(request2), &err);
+    tries = 0;
+    do {
+        server->RecvAny(&clientAddress, &messageId, &request2, sizeof(request2), &err);
+    } while (err == IOErrorTemplates::kTimeout && tries++ < 2);
     M_AssertEq(nullptr, err, "server->RecvAny(3)");
     M_AssertEq(3, messageId);
     server->RdmaWrite(clientAddress, (MemoryRegionDetails*)&request.substream, rdmaBuffer.get(), kRdmaSize, &err);
-- 
GitLab