conference: clean participant mute state after removing

Change-Id: I9af1b95b07217c8abe4887586000fae9990963ca
GitLab: #604
This commit is contained in:
agsantos
2021-08-04 16:59:44 -03:00
parent 3212ddf46d
commit e62830b3c6
5 changed files with 86 additions and 19 deletions

View File

@ -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
}
}
}

View File

@ -18,3 +18,7 @@ accounts:
carla:
displayName: CARLA
alias: CARLA
davi:
displayName: DAVI
alias: DAVI

View File

@ -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

View File

@ -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"];

View File

@ -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"];