From e5d95eb6d40facecd7169693567565b41c3c885b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20Blin?=
 <sebastien.blin@savoirfairelinux.com>
Date: Tue, 15 Jun 2021 16:40:34 -0400
Subject: [PATCH] test: fix testMemberJoinsNoBadFile by waiting for join before
 copying

Change-Id: I4e34411c6e362c2aca31337224b077f7674d73da
---
 test/unitTest/conversation/conversation.cpp | 66 +++++++++++++++------
 1 file changed, 48 insertions(+), 18 deletions(-)

diff --git a/test/unitTest/conversation/conversation.cpp b/test/unitTest/conversation/conversation.cpp
index 790d487255..904a45ed6d 100644
--- a/test/unitTest/conversation/conversation.cpp
+++ b/test/unitTest/conversation/conversation.cpp
@@ -1428,9 +1428,9 @@ ConversationTest::testBanDevice()
          voteMessageGenerated = false, bob2GetMessage = false, bobGetMessage = false;
     confHandlers.insert(
         DRing::exportable_callback<DRing::ConversationSignal::ConversationRequestReceived>(
-            [&](const std::string& /*accountId* /,
-                const std::string& /* conversationId * /,
-                std::map<std::string, std::string> /*metadatas* /) {
+            [&](const std::string&,
+                const std::string&,
+                std::map<std::string, std::string>) {
                 requestReceived = true;
                 cv.notify_one();
             }));
@@ -2182,9 +2182,7 @@ ConversationTest::testMemberCannotBanOther()
          carlaConnected = false;
     confHandlers.insert(
         DRing::exportable_callback<DRing::ConversationSignal::ConversationRequestReceived>(
-            [&](const std::string& accountId,
-                const std::string& /* conversationId */,
-                std::map<std::string, std::string> /*metadatas*/) {
+            [&](const std::string&, const std::string&, std::map<std::string, std::string>) {
                 requestReceived = true;
                 cv.notify_one();
             }));
@@ -3010,7 +3008,8 @@ ConversationTest::testMemberJoinsNoBadFile()
     std::unique_lock<std::mutex> lk {mtx};
     std::condition_variable cv;
     std::map<std::string, std::shared_ptr<DRing::CallbackWrapperBase>> confHandlers;
-    bool conversationReady = false, errorDetected = false, carlaConnected = false;
+    bool conversationReady = false, errorDetected = false, carlaConnected = false,
+         memberMessageGenerated = false;
     confHandlers.insert(DRing::exportable_callback<DRing::ConversationSignal::ConversationReady>(
         [&](const std::string& accountId, const std::string& /* conversationId */) {
             if (accountId == carlaId) {
@@ -3018,12 +3017,21 @@ ConversationTest::testMemberJoinsNoBadFile()
                 cv.notify_one();
             }
         }));
+    confHandlers.insert(DRing::exportable_callback<DRing::ConversationSignal::MessageReceived>(
+        [&](const std::string& accountId,
+            const std::string& conversationId,
+            std::map<std::string, std::string> message) {
+            if (accountId == aliceId && conversationId == convId && message["type"] == "member") {
+                memberMessageGenerated = true;
+                cv.notify_one();
+            }
+        }));
     confHandlers.insert(
         DRing::exportable_callback<DRing::ConfigurationSignal::VolatileDetailsChanged>(
             [&](const std::string&, const std::map<std::string, std::string>&) {
                 auto details = carlaAccount->getVolatileAccountDetails();
-                auto daemonStatus = details[DRing::Account::ConfProperties::Registration::STATUS];
-                if (daemonStatus == "REGISTERED") {
+                auto deviceAnnounced = details[DRing::Account::VolatileProperties::DEVICE_ANNOUNCED];
+                if (deviceAnnounced == "true") {
                     carlaConnected = true;
                     cv.notify_one();
                 }
@@ -3040,6 +3048,7 @@ ConversationTest::testMemberJoinsNoBadFile()
     DRing::registerSignalHandlers(confHandlers);
 
     aliceAccount->addConversationMember(convId, carlaUri, false);
+    CPPUNIT_ASSERT(cv.wait_for(lk, std::chrono::seconds(5), [&] { return memberMessageGenerated; }));
 
     // Cp conversations & convInfo
     auto repoPathAlice = fileutils::get_data_dir() + DIR_SEPARATOR_STR
@@ -3057,15 +3066,14 @@ ConversationTest::testMemberJoinsNoBadFile()
     // Accept for alice and makes different heads
     addFile(carlaAccount, convId, "BADFILE");
     ConversationRepository repo(carlaAccount, convId);
-    repo.join();
 
     // Start Carla, should merge and all messages should be there
-    Manager::instance().sendRegister(carlaId, true);
     carlaAccount->loadConversations(); // Because of the copy
+    Manager::instance().sendRegister(carlaId, true);
     CPPUNIT_ASSERT(cv.wait_for(lk, std::chrono::seconds(30), [&] { return carlaConnected; }));
 
-    carlaAccount->sendMessage(convId, "hi"s);
     errorDetected = false;
+    carlaAccount->sendMessage(convId, "hi"s);
 
     CPPUNIT_ASSERT(cv.wait_for(lk, std::chrono::seconds(60), [&] { return errorDetected; }));
     DRing::unregisterSignalHandlers();
@@ -3084,7 +3092,8 @@ ConversationTest::testMemberAddedNoCertificate()
     std::unique_lock<std::mutex> lk {mtx};
     std::condition_variable cv;
     std::map<std::string, std::shared_ptr<DRing::CallbackWrapperBase>> confHandlers;
-    bool conversationReady = false, errorDetected = false, carlaConnected = false;
+    bool conversationReady = false, errorDetected = false, carlaConnected = false,
+         memberMessageGenerated = false;
     confHandlers.insert(DRing::exportable_callback<DRing::ConversationSignal::ConversationReady>(
         [&](const std::string& accountId, const std::string& /* conversationId */) {
             if (accountId == carlaId) {
@@ -3092,12 +3101,21 @@ ConversationTest::testMemberAddedNoCertificate()
                 cv.notify_one();
             }
         }));
+    confHandlers.insert(DRing::exportable_callback<DRing::ConversationSignal::MessageReceived>(
+        [&](const std::string& accountId,
+            const std::string& conversationId,
+            std::map<std::string, std::string> message) {
+            if (accountId == aliceId && conversationId == convId && message["type"] == "member") {
+                memberMessageGenerated = true;
+                cv.notify_one();
+            }
+        }));
     confHandlers.insert(
         DRing::exportable_callback<DRing::ConfigurationSignal::VolatileDetailsChanged>(
             [&](const std::string&, const std::map<std::string, std::string>&) {
                 auto details = carlaAccount->getVolatileAccountDetails();
-                auto daemonStatus = details[DRing::Account::ConfProperties::Registration::STATUS];
-                if (daemonStatus == "REGISTERED") {
+                auto deviceAnnounced = details[DRing::Account::VolatileProperties::DEVICE_ANNOUNCED];
+                if (deviceAnnounced == "true") {
                     carlaConnected = true;
                     cv.notify_one();
                 }
@@ -3114,6 +3132,7 @@ ConversationTest::testMemberAddedNoCertificate()
     DRing::registerSignalHandlers(confHandlers);
 
     aliceAccount->addConversationMember(convId, carlaUri, false);
+    CPPUNIT_ASSERT(cv.wait_for(lk, std::chrono::seconds(5), [&] { return memberMessageGenerated; }));
 
     // Cp conversations & convInfo
     auto repoPathAlice = fileutils::get_data_dir() + DIR_SEPARATOR_STR
@@ -3167,7 +3186,8 @@ ConversationTest::testMemberJoinsInviteRemoved()
     std::unique_lock<std::mutex> lk {mtx};
     std::condition_variable cv;
     std::map<std::string, std::shared_ptr<DRing::CallbackWrapperBase>> confHandlers;
-    bool conversationReady = false, errorDetected = false, carlaConnected = false;
+    bool conversationReady = false, errorDetected = false, carlaConnected = false,
+         memberMessageGenerated = false;
     confHandlers.insert(DRing::exportable_callback<DRing::ConversationSignal::ConversationReady>(
         [&](const std::string& accountId, const std::string& /* conversationId */) {
             if (accountId == carlaId) {
@@ -3175,12 +3195,21 @@ ConversationTest::testMemberJoinsInviteRemoved()
                 cv.notify_one();
             }
         }));
+    confHandlers.insert(DRing::exportable_callback<DRing::ConversationSignal::MessageReceived>(
+        [&](const std::string& accountId,
+            const std::string& conversationId,
+            std::map<std::string, std::string> message) {
+            if (accountId == aliceId && conversationId == convId && message["type"] == "member") {
+                memberMessageGenerated = true;
+                cv.notify_one();
+            }
+        }));
     confHandlers.insert(
         DRing::exportable_callback<DRing::ConfigurationSignal::VolatileDetailsChanged>(
             [&](const std::string&, const std::map<std::string, std::string>&) {
                 auto details = carlaAccount->getVolatileAccountDetails();
-                auto daemonStatus = details[DRing::Account::ConfProperties::Registration::STATUS];
-                if (daemonStatus == "REGISTERED") {
+                auto deviceAnnounced = details[DRing::Account::VolatileProperties::DEVICE_ANNOUNCED];
+                if (deviceAnnounced == "true") {
                     carlaConnected = true;
                     cv.notify_one();
                 }
@@ -3197,6 +3226,7 @@ ConversationTest::testMemberJoinsInviteRemoved()
     DRing::registerSignalHandlers(confHandlers);
 
     aliceAccount->addConversationMember(convId, carlaUri, false);
+    CPPUNIT_ASSERT(cv.wait_for(lk, std::chrono::seconds(5), [&] { return memberMessageGenerated; }));
 
     // Cp conversations & convInfo
     auto repoPathAlice = fileutils::get_data_dir() + DIR_SEPARATOR_STR
-- 
GitLab