diff --git a/src/conference.cpp b/src/conference.cpp index 3556979e2d0134004fdfec0e04b327fe3679a680..1fd0a86039a9b07dab6969e2495c57a1eab049b9 100644 --- a/src/conference.cpp +++ b/src/conference.cpp @@ -532,7 +532,6 @@ Conference::sendConferenceInfos() } } - auto confInfo = getConfInfoHostUri("", ""); createSinks(confInfo); @@ -580,13 +579,14 @@ void Conference::remove(const std::string& participant_id) { if (participants_.erase(participant_id)) { -#ifdef ENABLE_VIDEO if (auto call = getCall(participant_id)) { + participantsMuted_.erase(std::string(string_remove_suffix(call->getPeerNumber(), '@'))); +#ifdef ENABLE_VIDEO call->exitConference(); if (call->isPeerRecording()) call->peerRecording(false); - } #endif // ENABLE_VIDEO + } } } diff --git a/test/unitTest/actors/alice-bob-carla.yml b/test/unitTest/actors/alice-bob-carla-davi.yml similarity index 85% rename from test/unitTest/actors/alice-bob-carla.yml rename to test/unitTest/actors/alice-bob-carla-davi.yml index 732f4102ecc9ee2cef682f731c41371ef22cce01..522bd75f070caf6d0d869107027e70fa04a8a4a6 100644 --- a/test/unitTest/actors/alice-bob-carla.yml +++ b/test/unitTest/actors/alice-bob-carla-davi.yml @@ -18,3 +18,7 @@ accounts: carla: displayName: CARLA alias: CARLA + + davi: + displayName: DAVI + alias: DAVI diff --git a/test/unitTest/call/conference.cpp b/test/unitTest/call/conference.cpp index efaad83c69e26efa74b09aa7112d86c8aab7c08a..1b12ad9e6ba8feef6fff7d41ffebe2fa16a5d13e 100644 --- a/test/unitTest/call/conference.cpp +++ b/test/unitTest/call/conference.cpp @@ -72,21 +72,25 @@ private: void testModeratorMuteUpdateParticipantsInfos(); void testAudioVideoMutedStates(); void testCreateParticipantsSinks(); + void testMuteStatusAfterRemove(); CPPUNIT_TEST_SUITE(ConferenceTest); CPPUNIT_TEST(testGetConference); CPPUNIT_TEST(testModeratorMuteUpdateParticipantsInfos); CPPUNIT_TEST(testAudioVideoMutedStates); CPPUNIT_TEST(testCreateParticipantsSinks); + CPPUNIT_TEST(testMuteStatusAfterRemove); CPPUNIT_TEST_SUITE_END(); // Common parts std::string aliceId; std::string bobId; std::string carlaId; + std::string daviId; std::string confId {}; CallData bobCall {}; CallData carlaCall {}; + CallData daviCall {}; std::mutex mtx; std::unique_lock<std::mutex> lk {mtx}; @@ -102,20 +106,22 @@ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(ConferenceTest, ConferenceTest::name()); void ConferenceTest::setUp() { - auto actors = load_actors_and_wait_for_announcement("actors/alice-bob-carla.yml"); + auto actors = load_actors_and_wait_for_announcement("actors/alice-bob-carla-davi.yml"); aliceId = actors["alice"]; bobId = actors["bob"]; carlaId = actors["carla"]; + daviId = actors["davi"]; bobCall.reset(); carlaCall.reset(); + daviCall.reset(); confId = {}; } void ConferenceTest::tearDown() { - wait_for_removal_of({aliceId, bobId, carlaId}); + wait_for_removal_of({aliceId, bobId, carlaId, daviId}); } void @@ -124,9 +130,11 @@ ConferenceTest::registerSignalHandlers() auto aliceAccount = Manager::instance().getAccount<JamiAccount>(aliceId); auto bobAccount = Manager::instance().getAccount<JamiAccount>(bobId); auto carlaAccount = Manager::instance().getAccount<JamiAccount>(carlaId); + auto daviAccount = Manager::instance().getAccount<JamiAccount>(daviId); auto aliceUri = aliceAccount->getUsername(); auto bobUri = bobAccount->getUsername(); auto carlaUri = carlaAccount->getUsername(); + auto daviUri = daviAccount->getUsername(); std::map<std::string, std::shared_ptr<DRing::CallbackWrapperBase>> confHandlers; // Watch signals @@ -139,6 +147,8 @@ ConferenceTest::registerSignalHandlers() bobCall.callId = callId; } else if (accountId == carlaId) { carlaCall.callId = callId; + } else if (accountId == daviId) { + daviCall.callId = callId; } cv.notify_one(); })); @@ -148,6 +158,8 @@ ConferenceTest::registerSignalHandlers() bobCall.state = state; else if (carlaCall.callId == callId) carlaCall.state = state; + else if (daviCall.callId == callId) + daviCall.state = state; cv.notify_one(); })); confHandlers.insert(DRing::exportable_callback<DRing::CallSignal::ConferenceCreated>( @@ -169,6 +181,8 @@ ConferenceTest::registerSignalHandlers() bobCall.moderatorMuted = infos.at("audioModeratorMuted") == "true"; } else if (infos.at("uri").find(carlaUri) != std::string::npos) { carlaCall.moderatorMuted = infos.at("audioModeratorMuted") == "true"; + } else if (infos.at("uri").find(daviUri) != std::string::npos) { + daviCall.moderatorMuted = infos.at("audioModeratorMuted") == "true"; } } cv.notify_one(); @@ -213,7 +227,7 @@ ConferenceTest::hangupConference() JAMI_INFO("Stop conference"); Manager::instance().hangupConference(confId); CPPUNIT_ASSERT(cv.wait_for(lk, std::chrono::seconds(30), [&] { - return carlaCall.state == "OVER" && bobCall.state == "OVER" && confId.empty(); + return bobCall.state == "OVER" && carlaCall.state == "OVER" && confId.empty(); })); std::this_thread::sleep_for(std::chrono::seconds(10)); } @@ -325,23 +339,72 @@ ConferenceTest::testCreateParticipantsSinks() auto infos = Manager::instance().getConferenceInfos(confId); - CPPUNIT_ASSERT( - cv.wait_for(lk, std::chrono::seconds(5), [&] { - bool sinksStatus = true; - for (auto& info : infos) { - if (info["uri"] == bobUri) { - sinksStatus &= (Manager::instance().getSinkClient(info["sinkId"]) != nullptr); - } else if (info["uri"] == carlaUri) { - sinksStatus &= (Manager::instance().getSinkClient(info["sinkId"]) != nullptr); - } + CPPUNIT_ASSERT(cv.wait_for(lk, std::chrono::seconds(5), [&] { + bool sinksStatus = true; + for (auto& info : infos) { + if (info["uri"] == bobUri) { + sinksStatus &= (Manager::instance().getSinkClient(info["sinkId"]) != nullptr); + } else if (info["uri"] == carlaUri) { + sinksStatus &= (Manager::instance().getSinkClient(info["sinkId"]) != nullptr); } - return sinksStatus; - })); + } + return sinksStatus; + })); hangupConference(); DRing::unregisterSignalHandlers(); } + +void +ConferenceTest::testMuteStatusAfterRemove() +{ + registerSignalHandlers(); + + auto aliceAccount = Manager::instance().getAccount<JamiAccount>(aliceId); + auto bobAccount = Manager::instance().getAccount<JamiAccount>(bobId); + auto bobUri = bobAccount->getUsername(); + auto daviAccount = Manager::instance().getAccount<JamiAccount>(daviId); + auto daviUri = daviAccount->getUsername(); + + startConference(); + + JAMI_INFO("Start call between Alice and Davi"); + auto call1 = aliceAccount->newOutgoingCall(daviUri); + CPPUNIT_ASSERT( + cv.wait_for(lk, std::chrono::seconds(20), [&] { return !daviCall.callId.empty(); })); + Manager::instance().answerCall(daviCall.callId); + CPPUNIT_ASSERT( + cv.wait_for(lk, std::chrono::seconds(20), [&] { return daviCall.state == "CURRENT"; })); + Manager::instance().addParticipant(daviCall.callId, confId); + + Manager::instance().muteParticipant(confId, daviUri, true); + CPPUNIT_ASSERT( + cv.wait_for(lk, std::chrono::seconds(5), [&] { return daviCall.moderatorMuted.load(); })); + + Manager::instance().hangupCall(daviCall.callId); + CPPUNIT_ASSERT( + cv.wait_for(lk, std::chrono::seconds(20), [&] { return daviCall.state == "OVER"; })); + daviCall.reset(); + + auto call2 = aliceAccount->newOutgoingCall(daviUri); + CPPUNIT_ASSERT( + cv.wait_for(lk, std::chrono::seconds(20), [&] { return !daviCall.callId.empty(); })); + Manager::instance().answerCall(daviCall.callId); + CPPUNIT_ASSERT( + cv.wait_for(lk, std::chrono::seconds(20), [&] { return daviCall.state == "CURRENT"; })); + Manager::instance().addParticipant(daviCall.callId, confId); + + CPPUNIT_ASSERT( + cv.wait_for(lk, std::chrono::seconds(5), [&] { return !daviCall.moderatorMuted.load(); })); + + Manager::instance().hangupCall(daviCall.callId); + CPPUNIT_ASSERT( + cv.wait_for(lk, std::chrono::seconds(20), [&] { return daviCall.state == "OVER"; })); + hangupConference(); + + DRing::unregisterSignalHandlers(); +} } // namespace test } // namespace jami diff --git a/test/unitTest/conversation/conversation.cpp b/test/unitTest/conversation/conversation.cpp index 2afb3cd6d03854a5a25484d769a19ac46745d72f..858f20e290930b0b18c47bac9453571af4f5e843 100644 --- a/test/unitTest/conversation/conversation.cpp +++ b/test/unitTest/conversation/conversation.cpp @@ -232,7 +232,7 @@ ConversationTest::setUp() if (not Manager::instance().initialized) CPPUNIT_ASSERT(DRing::start("jami-sample.yml")); - auto actors = load_actors("actors/alice-bob-carla.yml"); + auto actors = load_actors("actors/alice-bob-carla-davi.yml"); aliceId = actors["alice"]; bobId = actors["bob"]; carlaId = actors["carla"]; diff --git a/test/unitTest/fileTransfer/fileTransfer.cpp b/test/unitTest/fileTransfer/fileTransfer.cpp index 658e0a527708ca69951733eee0b1e25f1227f086..06cc30c91d81ecbda9186c3b4793c3b6f7864f9c 100644 --- a/test/unitTest/fileTransfer/fileTransfer.cpp +++ b/test/unitTest/fileTransfer/fileTransfer.cpp @@ -113,7 +113,7 @@ FileTransferTest::compare(const std::string& fileA, const std::string& fileB) co void FileTransferTest::setUp() { - auto actors = load_actors_and_wait_for_announcement("actors/alice-bob-carla.yml"); + auto actors = load_actors_and_wait_for_announcement("actors/alice-bob-carla-davi.yml"); aliceId = actors["alice"]; bobId = actors["bob"]; carlaId = actors["carla"];