/* * conference-event-tester.cpp * Copyright (C) 2017 Belledonne Communications SARL * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include "conference/conference-listener.h" #include "conference/local-conference-event-handler-p.h" #include "conference/local-conference-p.h" #include "conference/local-conference.h" #include "conference/participant-p.h" #include "conference/remote-conference-event-handler-p.h" #include "liblinphone_tester.h" #include "linphone/core.h" #include "private.h" #include "tools/private-access.h" #include "tools/tester.h" using namespace LinphonePrivate; using namespace std; static const char *first_notify = \ " "\ " "\ " "\ " "\ " Agenda: This month's goals"\ " "\ " "\ " http://sharepoint/salesgroup/"\ " web-page"\ " "\ " "\ " "\ " "\ " "\ " 33"\ " "\ " "\ " "\ " "\ " Bob Hoskins"\ " "\ " "\ " Bob's Laptop"\ " disconnected"\ " departed"\ " "\ " 2005-03-04T20:00:00Z"\ " bad voice quality"\ " sip:mike@example.com"\ " "\ " "\ " "\ " main audio"\ " audio"\ " "\ " 432424"\ " sendrecv"\ " "\ " "\ " "\ " "\ " "\ " Alice"\ " "\ " admin"\ " participant"\ " "\ " "\ " "\ " connected"\ " dialed-out"\ " "\ " 2005-03-04T20:00:00Z"\ " sip:mike@example.com"\ " "\ " "\ " "\ " main audio"\ " audio"\ " "\ " 534232"\ " sendrecv"\ " "\ " "\ " "\ " connected"\ " dialed-out"\ " "\ " 2005-03-04T20:00:00Z"\ " sip:mike@example.com"\ " "\ " "\ " "\ " main audio"\ " audio"\ " "\ " 534232"\ " sendrecv"\ " "\ " "\ " "\ " "\ " "; static const char *participant_added_notify = \ " "\ " "\ " "\ " "\ " Agenda: This month's goals"\ " "\ " "\ " http://sharepoint/salesgroup/"\ " web-page"\ " "\ " "\ " "\ " "\ " "\ " 33"\ " "\ " "\ " "\ " "\ " Bob Hoskins"\ " "\ " "\ " Frank's Laptop"\ " disconnected"\ " departed"\ " "\ " 2005-03-04T20:00:00Z"\ " bad voice quality"\ " sip:mike@example.com"\ " "\ " "\ " "\ " main audio"\ " audio"\ " "\ " 432424"\ " sendrecv"\ " "\ " "\ " "\ " "\ " "; static const char *participant_not_added_notify = \ " "\ " "\ " "\ " "\ " Agenda: This month's goals"\ " "\ " "\ " http://sharepoint/salesgroup/"\ " web-page"\ " "\ " "\ " "\ " "\ " "\ " 33"\ " "\ " "\ " "\ " "\ " Bob Hoskins"\ " "\ " "\ " Frank's Laptop"\ " disconnected"\ " departed"\ " "\ " 2005-03-04T20:00:00Z"\ " bad voice quality"\ " sip:mike@example.com"\ " "\ " "\ " "\ " main audio"\ " audio"\ " "\ " 432424"\ " sendrecv"\ " "\ " "\ " "\ " "\ " "; static const char *participant_deleted_notify = \ " "\ " "\ " "\ " "\ " Agenda: This month's goals"\ " "\ " "\ " http://sharepoint/salesgroup/"\ " web-page"\ " "\ " "\ " "\ " "\ " "\ " 33"\ " "\ " "\ " "\ " "\ " Bob Hoskins"\ " "\ " "\ " Bob's Laptop"\ " disconnected"\ " departed"\ " "\ " 2005-03-04T20:00:00Z"\ " bad voice quality"\ " sip:mike@example.com"\ " "\ " "\ " "\ " main audio"\ " audio"\ " "\ " 432424"\ " sendrecv"\ " "\ " "\ " "\ " "\ " "; static const char *participant_admined_notify = \ " "\ " "\ " "\ " "\ " Agenda: This month's goals"\ " "\ " "\ " http://sharepoint/salesgroup/"\ " web-page"\ " "\ " "\ " "\ " "\ " "\ " 33"\ " "\ " "\ " "\ " "\ " Bob Hoskins"\ " "\ " participant"\ " admin"\ " "\ " "\ " "\ " Bob's Laptop"\ " disconnected"\ " departed"\ " "\ " 2005-03-04T20:00:00Z"\ " bad voice quality"\ " sip:mike@example.com"\ " "\ " "\ " "\ " main audio"\ " audio"\ " "\ " 432424"\ " sendrecv"\ " "\ " "\ " "\ " "\ " "; static const char *participant_unadmined_notify = \ " "\ " "\ " "\ " "\ " Agenda: This month's goals"\ " "\ " "\ " http://sharepoint/salesgroup/"\ " web-page"\ " "\ " "\ " "\ " "\ " "\ " 33"\ " "\ " "\ " "\ " "\ " Alice Hoskins"\ " "\ " participant"\ " "\ " "\ " "\ " Alice's Laptop"\ " disconnected"\ " departed"\ " "\ " 2005-03-04T20:00:00Z"\ " bad voice quality"\ " sip:mike@example.com"\ " "\ " "\ " "\ " main audio"\ " audio"\ " "\ " 432424"\ " sendrecv"\ " "\ " "\ " "\ " "\ " "; static const char *bobUri = "sip:bob@example.com"; static const char *aliceUri = "sip:alice@example.com"; static const char *frankUri = "sip:frank@example.com"; static const char *confUri = "sips:conf233@example.com"; L_ENABLE_ATTR_ACCESS(LocalConferencePrivate, unique_ptr, eventHandler); class ConferenceEventTester : public ConferenceListener { public: ConferenceEventTester (LinphoneCore *core, const Address &confAddr); ~ConferenceEventTester (); private: void onConferenceCreated (const Address &addr) override; void onConferenceTerminated (const Address &addr) override; void onParticipantAdded (time_t tm, const Address &addr) override; void onParticipantRemoved (time_t tm, const Address &addr) override; void onParticipantSetAdmin (time_t tm, const Address &addr, bool isAdmin) override; void onSubjectChanged (time_t tm, const string &subject) override; void onParticipantDeviceAdded (time_t tm, const Address &addr, const Address &gruu) override; void onParticipantDeviceRemoved (time_t tm, const Address &addr, const Address &gruu) override; public: RemoteConferenceEventHandler *handler; map participants; map participantDevices; string confSubject; }; ConferenceEventTester::ConferenceEventTester (LinphoneCore *core, const Address &confAddr) { handler = new RemoteConferenceEventHandler(core, this); } ConferenceEventTester::~ConferenceEventTester () { delete handler; } void ConferenceEventTester::onConferenceCreated (const Address &addr) {} void ConferenceEventTester::onConferenceTerminated (const Address &addr) {} void ConferenceEventTester::onParticipantAdded (time_t tm, const Address &addr) { participants.insert(pair(addr.asString(), FALSE)); participantDevices.insert(pair(addr.asString(), 0)); } void ConferenceEventTester::onParticipantRemoved (time_t tm, const Address &addr) { participants.erase(addr.asString()); participantDevices.erase(addr.asString()); } void ConferenceEventTester::onParticipantSetAdmin (time_t tm, const Address &addr, bool isAdmin) { auto it = participants.find(addr.asString()); if (it != participants.end()) it->second = isAdmin; } void ConferenceEventTester::onSubjectChanged(time_t tm, const string &subject) { confSubject = subject; } void ConferenceEventTester::onParticipantDeviceAdded (time_t tm, const Address &addr, const Address &gruu) { auto it = participantDevices.find(addr.asString()); if (it != participantDevices.end()) it->second++; } void ConferenceEventTester::onParticipantDeviceRemoved (time_t tm, const Address &addr, const Address &gruu) { auto it = participantDevices.find(addr.asString()); if (it != participantDevices.end() && it->second > 0) it->second--; } void first_notify_parsing() { LinphoneCoreManager *marie = linphone_core_manager_new("marie_rc"); LinphoneAddress *confAddress = linphone_core_interpret_url(marie->lc, confUri); char *confAddressStr = linphone_address_as_string(confAddress); Address addr(confAddressStr); bctbx_free(confAddressStr); linphone_address_unref(confAddress); ConferenceEventTester tester(marie->lc, addr); LinphoneAddress *bobAddr = linphone_core_interpret_url(marie->lc, bobUri); LinphoneAddress *aliceAddr = linphone_core_interpret_url(marie->lc, aliceUri); size_t size = strlen(first_notify) + strlen(confUri); char *notify = new char[size]; const_cast
(tester.handler->getConfAddress()) = addr; snprintf(notify, size, first_notify, confUri); tester.handler->notifyReceived(notify); delete[] notify; BC_ASSERT_STRING_EQUAL(tester.confSubject.c_str(), "Agenda: This month's goals"); BC_ASSERT_EQUAL(tester.participants.size(), 2, int, "%d"); BC_ASSERT_TRUE(tester.participants.find(linphone_address_as_string(bobAddr)) != tester.participants.end()); BC_ASSERT_TRUE(tester.participants.find(linphone_address_as_string(aliceAddr)) != tester.participants.end()); BC_ASSERT_TRUE(!tester.participants.find(linphone_address_as_string(bobAddr))->second); BC_ASSERT_TRUE(tester.participants.find(linphone_address_as_string(aliceAddr))->second); BC_ASSERT_EQUAL(tester.participantDevices.size(), 2, int, "%d"); BC_ASSERT_TRUE(tester.participantDevices.find(linphone_address_as_string(bobAddr)) != tester.participantDevices.end()); BC_ASSERT_TRUE(tester.participantDevices.find(linphone_address_as_string(aliceAddr)) != tester.participantDevices.end()); BC_ASSERT_EQUAL(tester.participantDevices.find(linphone_address_as_string(bobAddr))->second, 1, int, "%d"); BC_ASSERT_EQUAL(tester.participantDevices.find(linphone_address_as_string(aliceAddr))->second, 2, int, "%d"); linphone_address_unref(bobAddr); linphone_address_unref(aliceAddr); linphone_core_manager_destroy(marie); } void first_notify_parsing_wrong_conf() { LinphoneCoreManager *marie = linphone_core_manager_new("marie_rc"); LinphoneAddress *confAddress = linphone_core_interpret_url(marie->lc, "sips:conf322@example.com"); char *confAddressStr = linphone_address_as_string(confAddress); Address addr(confAddressStr); bctbx_free(confAddressStr); linphone_address_unref(confAddress); ConferenceEventTester tester(marie->lc, addr); LinphoneAddress *bobAddr = linphone_core_interpret_url(marie->lc, bobUri); LinphoneAddress *aliceAddr = linphone_core_interpret_url(marie->lc, aliceUri); size_t size = strlen(first_notify) + strlen(confUri); char *notify = new char[size]; const_cast
(tester.handler->getConfAddress()) = addr; snprintf(notify, size, first_notify, confUri); tester.handler->notifyReceived(notify); delete[] notify; BC_ASSERT_EQUAL(tester.participants.size(), 0, int, "%d"); BC_ASSERT_FALSE(tester.participants.find(linphone_address_as_string(bobAddr)) != tester.participants.end()); BC_ASSERT_FALSE(tester.participants.find(linphone_address_as_string(aliceAddr)) != tester.participants.end()); linphone_address_unref(bobAddr); linphone_address_unref(aliceAddr); linphone_core_manager_destroy(marie); } void participant_added_parsing() { LinphoneCoreManager *marie = linphone_core_manager_new("marie_rc"); LinphoneAddress *confAddress = linphone_core_interpret_url(marie->lc, confUri); char *confAddressStr = linphone_address_as_string(confAddress); Address addr(confAddressStr); bctbx_free(confAddressStr); linphone_address_unref(confAddress); ConferenceEventTester tester(marie->lc, addr); LinphoneAddress *bobAddr = linphone_core_interpret_url(marie->lc, bobUri); LinphoneAddress *aliceAddr = linphone_core_interpret_url(marie->lc, aliceUri); LinphoneAddress *frankAddr = linphone_core_interpret_url(marie->lc, frankUri); size_t size = strlen(first_notify) + strlen(confUri); char *notify = new char[size]; size_t size2 = strlen(participant_added_notify) + strlen(confUri); char *notify_added = new char[size2]; const_cast
(tester.handler->getConfAddress()) = addr; snprintf(notify, size, first_notify, confUri); tester.handler->notifyReceived(notify); delete[] notify; BC_ASSERT_EQUAL(tester.participants.size(), 2, int, "%d"); BC_ASSERT_EQUAL(tester.participantDevices.size(), 2, int, "%d"); BC_ASSERT_TRUE(tester.participants.find(linphone_address_as_string(bobAddr)) != tester.participants.end()); BC_ASSERT_TRUE(tester.participants.find(linphone_address_as_string(aliceAddr)) != tester.participants.end()); BC_ASSERT_TRUE(!tester.participants.find(linphone_address_as_string(bobAddr))->second); BC_ASSERT_TRUE(tester.participants.find(linphone_address_as_string(aliceAddr))->second); snprintf(notify_added, size2, participant_added_notify, confUri); tester.handler->notifyReceived(notify_added); delete[] notify_added; BC_ASSERT_EQUAL(tester.participants.size(), 3, int, "%d"); BC_ASSERT_EQUAL(tester.participantDevices.size(), 3, int, "%d"); BC_ASSERT_TRUE(tester.participants.find(linphone_address_as_string(frankAddr)) != tester.participants.end()); BC_ASSERT_TRUE(!tester.participants.find(linphone_address_as_string(frankAddr))->second); linphone_address_unref(bobAddr); linphone_address_unref(aliceAddr); linphone_address_unref(frankAddr); linphone_core_manager_destroy(marie); } void participant_not_added_parsing() { LinphoneCoreManager *marie = linphone_core_manager_new("marie_rc"); LinphoneAddress *confAddress = linphone_core_interpret_url(marie->lc, confUri); char *confAddressStr = linphone_address_as_string(confAddress); Address addr(confAddressStr); bctbx_free(confAddressStr); linphone_address_unref(confAddress); ConferenceEventTester tester(marie->lc, addr); LinphoneAddress *bobAddr = linphone_core_interpret_url(marie->lc, bobUri); LinphoneAddress *aliceAddr = linphone_core_interpret_url(marie->lc, aliceUri); LinphoneAddress *frankAddr = linphone_core_interpret_url(marie->lc, frankUri); size_t size = strlen(first_notify) + strlen(confUri); char *notify = new char[size]; size_t size2 = strlen(participant_not_added_notify) + strlen(confUri); char *notify_not_added = new char[size2]; const_cast
(tester.handler->getConfAddress()) = addr; snprintf(notify, size, first_notify, confUri); tester.handler->notifyReceived(notify); delete[] notify; BC_ASSERT_EQUAL(tester.participants.size(), 2, int, "%d"); BC_ASSERT_EQUAL(tester.participantDevices.size(), 2, int, "%d"); BC_ASSERT_TRUE(tester.participants.find(linphone_address_as_string(bobAddr)) != tester.participants.end()); BC_ASSERT_TRUE(tester.participants.find(linphone_address_as_string(aliceAddr)) != tester.participants.end()); BC_ASSERT_TRUE(!tester.participants.find(linphone_address_as_string(bobAddr))->second); BC_ASSERT_TRUE(tester.participants.find(linphone_address_as_string(aliceAddr))->second); snprintf(notify_not_added, size2, participant_not_added_notify, confUri); tester.handler->notifyReceived(notify_not_added); delete[] notify_not_added; BC_ASSERT_EQUAL(tester.participants.size(), 2, int, "%d"); BC_ASSERT_FALSE(tester.participants.find(linphone_address_as_string(frankAddr)) != tester.participants.end()); linphone_address_unref(bobAddr); linphone_address_unref(aliceAddr); linphone_address_unref(frankAddr); linphone_core_manager_destroy(marie); } void participant_deleted_parsing() { LinphoneCoreManager *marie = linphone_core_manager_new("marie_rc"); LinphoneAddress *confAddress = linphone_core_interpret_url(marie->lc, confUri); char *confAddressStr = linphone_address_as_string(confAddress); Address addr(confAddressStr); bctbx_free(confAddressStr); linphone_address_unref(confAddress); ConferenceEventTester tester(marie->lc, addr); LinphoneAddress *bobAddr = linphone_core_interpret_url(marie->lc, bobUri); LinphoneAddress *aliceAddr = linphone_core_interpret_url(marie->lc, aliceUri); size_t size = strlen(first_notify) + strlen(confUri); char *notify = new char[size]; size_t size2 = strlen(participant_deleted_notify) + strlen(confUri); char *notify_deleted = new char[size2]; const_cast
(tester.handler->getConfAddress()) = addr; snprintf(notify, size, first_notify, confUri); tester.handler->notifyReceived(notify); delete[] notify; BC_ASSERT_EQUAL(tester.participants.size(), 2, int, "%d"); BC_ASSERT_EQUAL(tester.participantDevices.size(), 2, int, "%d"); BC_ASSERT_TRUE(tester.participants.find(linphone_address_as_string(bobAddr)) != tester.participants.end()); BC_ASSERT_TRUE(tester.participants.find(linphone_address_as_string(aliceAddr)) != tester.participants.end()); BC_ASSERT_TRUE(!tester.participants.find(linphone_address_as_string(bobAddr))->second); BC_ASSERT_TRUE(tester.participants.find(linphone_address_as_string(aliceAddr))->second); snprintf(notify_deleted, size2, participant_deleted_notify, confUri); tester.handler->notifyReceived(notify_deleted); delete[] notify_deleted; BC_ASSERT_EQUAL(tester.participants.size(), 1, int, "%d"); BC_ASSERT_EQUAL(tester.participantDevices.size(), 1, int, "%d"); BC_ASSERT_FALSE(tester.participants.find(linphone_address_as_string(bobAddr)) != tester.participants.end()); linphone_address_unref(bobAddr); linphone_address_unref(aliceAddr); linphone_core_manager_destroy(marie); } void participant_admined_parsing() { LinphoneCoreManager *marie = linphone_core_manager_new("marie_rc"); LinphoneAddress *confAddress = linphone_core_interpret_url(marie->lc, confUri); char *confAddressStr = linphone_address_as_string(confAddress); Address addr(confAddressStr); bctbx_free(confAddressStr); linphone_address_unref(confAddress); ConferenceEventTester tester(marie->lc, addr); LinphoneAddress *bobAddr = linphone_core_interpret_url(marie->lc, bobUri); LinphoneAddress *aliceAddr = linphone_core_interpret_url(marie->lc, aliceUri); size_t size = strlen(first_notify) + strlen(confUri); char *notify = new char[size]; size_t size2 = strlen(participant_admined_notify) + strlen(confUri); char *notify_admined = new char[size2]; const_cast
(tester.handler->getConfAddress()) = addr; snprintf(notify, size, first_notify, confUri); tester.handler->notifyReceived(notify); delete[] notify; BC_ASSERT_EQUAL(tester.participants.size(), 2, int, "%d"); BC_ASSERT_TRUE(tester.participants.find(linphone_address_as_string(bobAddr)) != tester.participants.end()); BC_ASSERT_TRUE(tester.participants.find(linphone_address_as_string(aliceAddr)) != tester.participants.end()); BC_ASSERT_TRUE(!tester.participants.find(linphone_address_as_string(bobAddr))->second); BC_ASSERT_TRUE(tester.participants.find(linphone_address_as_string(aliceAddr))->second); snprintf(notify_admined, size2, participant_admined_notify, confUri); tester.handler->notifyReceived(notify_admined); delete[] notify_admined; BC_ASSERT_EQUAL(tester.participants.size(), 2, int, "%d"); BC_ASSERT_TRUE(tester.participants.find(linphone_address_as_string(bobAddr)) != tester.participants.end()); BC_ASSERT_TRUE(tester.participants.find(linphone_address_as_string(bobAddr))->second); linphone_address_unref(bobAddr); linphone_address_unref(aliceAddr); linphone_core_manager_destroy(marie); } void participant_unadmined_parsing() { LinphoneCoreManager *marie = linphone_core_manager_new("marie_rc"); LinphoneAddress *confAddress = linphone_core_interpret_url(marie->lc, confUri); char *confAddressStr = linphone_address_as_string(confAddress); Address addr(confAddressStr); bctbx_free(confAddressStr); linphone_address_unref(confAddress); ConferenceEventTester tester(marie->lc, addr); LinphoneAddress *bobAddr = linphone_core_interpret_url(marie->lc, bobUri); LinphoneAddress *aliceAddr = linphone_core_interpret_url(marie->lc, aliceUri); size_t size = strlen(first_notify) + strlen(confUri); char *notify = new char[size]; size_t size2 = strlen(participant_unadmined_notify) + strlen(confUri); char *notify_unadmined = new char[size2]; const_cast
(tester.handler->getConfAddress()) = addr; snprintf(notify, size, first_notify, confUri); tester.handler->notifyReceived(notify); delete[] notify; BC_ASSERT_EQUAL(tester.participants.size(), 2, int, "%d"); BC_ASSERT_TRUE(tester.participants.find(linphone_address_as_string(bobAddr)) != tester.participants.end()); BC_ASSERT_TRUE(tester.participants.find(linphone_address_as_string(aliceAddr)) != tester.participants.end()); BC_ASSERT_TRUE(!tester.participants.find(linphone_address_as_string(bobAddr))->second); BC_ASSERT_TRUE(tester.participants.find(linphone_address_as_string(aliceAddr))->second); snprintf(notify_unadmined, size2, participant_unadmined_notify, confUri); tester.handler->notifyReceived(notify_unadmined); delete[] notify_unadmined; BC_ASSERT_EQUAL(tester.participants.size(), 2, int, "%d"); BC_ASSERT_TRUE(tester.participants.find(linphone_address_as_string(aliceAddr)) != tester.participants.end()); BC_ASSERT_TRUE(!tester.participants.find(linphone_address_as_string(aliceAddr))->second); linphone_address_unref(bobAddr); linphone_address_unref(aliceAddr); linphone_core_manager_destroy(marie); } void send_first_notify() { LinphoneCoreManager *marie = linphone_core_manager_new("marie_rc"); LinphoneCoreManager *pauline = linphone_core_manager_new(transport_supported(LinphoneTransportTls) ? "pauline_rc" : "pauline_tcp_rc"); char *identityStr = linphone_address_as_string(pauline->identity); Address addr(identityStr); bctbx_free(identityStr); ConferenceEventTester tester(marie->lc, addr); LocalConference localConf(pauline->lc, addr); LinphoneAddress *cBobAddr = linphone_core_interpret_url(marie->lc, bobUri); char *bobAddrStr = linphone_address_as_string(cBobAddr); Address bobAddr(bobAddrStr); bctbx_free(bobAddrStr); linphone_address_unref(cBobAddr); LinphoneAddress *cAliceAddr = linphone_core_interpret_url(marie->lc, aliceUri); char *aliceAddrStr = linphone_address_as_string(cAliceAddr); Address aliceAddr(aliceAddrStr); bctbx_free(aliceAddrStr); linphone_address_unref(cAliceAddr); CallSessionParams params; localConf.addParticipant(bobAddr, ¶ms, false); localConf.addParticipant(aliceAddr, ¶ms, false); localConf.setSubject("A random test subject"); shared_ptr alice = localConf.findParticipant(aliceAddr); L_GET_PRIVATE(alice)->setAdmin(true); LocalConferenceEventHandlerPrivate *localHandlerPrivate = L_GET_PRIVATE( L_ATTR_GET(L_GET_PRIVATE(localConf), eventHandler) ); const_cast
(localConf.getConferenceAddress()) = addr; string notify = localHandlerPrivate->createNotifyFullState(); const_cast
(tester.handler->getConfAddress()) = addr; tester.handler->notifyReceived(notify); BC_ASSERT_STRING_EQUAL(tester.confSubject.c_str(), "A random test subject"); BC_ASSERT_EQUAL(tester.participants.size(), 2, int, "%d"); BC_ASSERT_TRUE(tester.participants.find(bobAddr.asString()) != tester.participants.end()); BC_ASSERT_TRUE(tester.participants.find(aliceAddr.asString()) != tester.participants.end()); BC_ASSERT_TRUE(!tester.participants.find(bobAddr.asString())->second); BC_ASSERT_TRUE(tester.participants.find(aliceAddr.asString())->second); linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); } void send_added_notify() { LinphoneCoreManager *marie = linphone_core_manager_new("marie_rc"); LinphoneCoreManager *pauline = linphone_core_manager_new(transport_supported(LinphoneTransportTls) ? "pauline_rc" : "pauline_tcp_rc"); char *identityStr = linphone_address_as_string(pauline->identity); Address addr(identityStr); bctbx_free(identityStr); ConferenceEventTester tester(marie->lc, addr); LocalConference localConf(pauline->lc, addr); LinphoneAddress *cBobAddr = linphone_core_interpret_url(marie->lc, bobUri); char *bobAddrStr = linphone_address_as_string(cBobAddr); Address bobAddr(bobAddrStr); bctbx_free(bobAddrStr); linphone_address_unref(cBobAddr); LinphoneAddress *cAliceAddr = linphone_core_interpret_url(marie->lc, aliceUri); char *aliceAddrStr = linphone_address_as_string(cAliceAddr); Address aliceAddr(aliceAddrStr); bctbx_free(aliceAddrStr); linphone_address_unref(cAliceAddr); LinphoneAddress *cFrankAddr = linphone_core_interpret_url(marie->lc, frankUri); char *frankAddrStr = linphone_address_as_string(cFrankAddr); Address frankAddr(frankAddrStr); bctbx_free(frankAddrStr); linphone_address_unref(cFrankAddr); CallSessionParams params; localConf.addParticipant(bobAddr, ¶ms, false); localConf.addParticipant(aliceAddr, ¶ms, false); shared_ptr alice = localConf.findParticipant(aliceAddr); L_GET_PRIVATE(alice)->setAdmin(true); LocalConferenceEventHandlerPrivate *localHandlerPrivate = L_GET_PRIVATE( L_ATTR_GET(L_GET_PRIVATE(localConf), eventHandler) ); const_cast
(localConf.getConferenceAddress()) = addr; string notify = localHandlerPrivate->createNotifyFullState(); const_cast
(tester.handler->getConfAddress()) = addr; tester.handler->notifyReceived(notify); BC_ASSERT_EQUAL(tester.participants.size(), 2, int, "%d"); BC_ASSERT_EQUAL(tester.participantDevices.size(), 2, int, "%d"); BC_ASSERT_TRUE(tester.participants.find(bobAddr.asString()) != tester.participants.end()); BC_ASSERT_TRUE(tester.participants.find(aliceAddr.asString()) != tester.participants.end()); BC_ASSERT_TRUE(!tester.participants.find(bobAddr.asString())->second); BC_ASSERT_TRUE(tester.participants.find(aliceAddr.asString())->second); notify = localHandlerPrivate->createNotifyParticipantAdded(frankAddr); tester.handler->notifyReceived(notify); BC_ASSERT_EQUAL(tester.participants.size(), 3, int, "%d"); BC_ASSERT_EQUAL(tester.participantDevices.size(), 3, int, "%d"); BC_ASSERT_TRUE(tester.participants.find(bobAddr.asString()) != tester.participants.end()); BC_ASSERT_TRUE(tester.participants.find(aliceAddr.asString()) != tester.participants.end()); BC_ASSERT_TRUE(tester.participants.find(frankAddr.asString()) != tester.participants.end()); BC_ASSERT_TRUE(!tester.participants.find(bobAddr.asString())->second); BC_ASSERT_TRUE(tester.participants.find(aliceAddr.asString())->second); BC_ASSERT_TRUE(!tester.participants.find(frankAddr.asString())->second); linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); } void send_removed_notify() { LinphoneCoreManager *marie = linphone_core_manager_new("marie_rc"); LinphoneCoreManager *pauline = linphone_core_manager_new(transport_supported(LinphoneTransportTls) ? "pauline_rc" : "pauline_tcp_rc"); char *identityStr = linphone_address_as_string(pauline->identity); Address addr(identityStr); bctbx_free(identityStr); ConferenceEventTester tester(marie->lc, addr); LocalConference localConf(pauline->lc, addr); LinphoneAddress *cBobAddr = linphone_core_interpret_url(marie->lc, bobUri); char *bobAddrStr = linphone_address_as_string(cBobAddr); Address bobAddr(bobAddrStr); bctbx_free(bobAddrStr); linphone_address_unref(cBobAddr); LinphoneAddress *cAliceAddr = linphone_core_interpret_url(marie->lc, aliceUri); char *aliceAddrStr = linphone_address_as_string(cAliceAddr); Address aliceAddr(aliceAddrStr); bctbx_free(aliceAddrStr); linphone_address_unref(cAliceAddr); CallSessionParams params; localConf.addParticipant(bobAddr, ¶ms, false); localConf.addParticipant(aliceAddr, ¶ms, false); shared_ptr alice = localConf.findParticipant(aliceAddr); L_GET_PRIVATE(alice)->setAdmin(true); LocalConferenceEventHandlerPrivate *localHandlerPrivate = L_GET_PRIVATE( L_ATTR_GET(L_GET_PRIVATE(localConf), eventHandler) ); const_cast
(localConf.getConferenceAddress()) = addr; string notify = localHandlerPrivate->createNotifyFullState(); const_cast
(tester.handler->getConfAddress()) = addr; tester.handler->notifyReceived(notify); BC_ASSERT_EQUAL(tester.participants.size(), 2, int, "%d"); BC_ASSERT_EQUAL(tester.participantDevices.size(), 2, int, "%d"); BC_ASSERT_TRUE(tester.participants.find(bobAddr.asString()) != tester.participants.end()); BC_ASSERT_TRUE(tester.participants.find(aliceAddr.asString()) != tester.participants.end()); BC_ASSERT_TRUE(!tester.participants.find(bobAddr.asString())->second); BC_ASSERT_TRUE(tester.participants.find(aliceAddr.asString())->second); notify = localHandlerPrivate->createNotifyParticipantRemoved(bobAddr); tester.handler->notifyReceived(notify); BC_ASSERT_EQUAL(tester.participants.size(), 1, int, "%d"); BC_ASSERT_EQUAL(tester.participantDevices.size(), 1, int, "%d"); BC_ASSERT_FALSE(tester.participants.find(bobAddr.asString()) != tester.participants.end()); BC_ASSERT_TRUE(tester.participants.find(aliceAddr.asString()) != tester.participants.end()); BC_ASSERT_TRUE(tester.participants.find(aliceAddr.asString())->second); linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); } void send_admined_notify() { LinphoneCoreManager *marie = linphone_core_manager_new("marie_rc"); LinphoneCoreManager *pauline = linphone_core_manager_new(transport_supported(LinphoneTransportTls) ? "pauline_rc" : "pauline_tcp_rc"); char *identityStr = linphone_address_as_string(pauline->identity); Address addr(identityStr); bctbx_free(identityStr); ConferenceEventTester tester(marie->lc, addr); LocalConference localConf(pauline->lc, addr); LinphoneAddress *cBobAddr = linphone_core_interpret_url(marie->lc, bobUri); char *bobAddrStr = linphone_address_as_string(cBobAddr); Address bobAddr(bobAddrStr); bctbx_free(bobAddrStr); linphone_address_unref(cBobAddr); LinphoneAddress *cAliceAddr = linphone_core_interpret_url(marie->lc, aliceUri); char *aliceAddrStr = linphone_address_as_string(cAliceAddr); Address aliceAddr(aliceAddrStr); bctbx_free(aliceAddrStr); linphone_address_unref(cAliceAddr); CallSessionParams params; localConf.addParticipant(bobAddr, ¶ms, false); localConf.addParticipant(aliceAddr, ¶ms, false); shared_ptr alice = localConf.findParticipant(aliceAddr); L_GET_PRIVATE(alice)->setAdmin(true); LocalConferenceEventHandlerPrivate *localHandlerPrivate = L_GET_PRIVATE( L_ATTR_GET(L_GET_PRIVATE(localConf), eventHandler) ); const_cast
(localConf.getConferenceAddress()) = addr; string notify = localHandlerPrivate->createNotifyFullState(); const_cast
(tester.handler->getConfAddress()) = addr; tester.handler->notifyReceived(notify); BC_ASSERT_EQUAL(tester.participants.size(), 2, int, "%d"); BC_ASSERT_TRUE(tester.participants.find(bobAddr.asString()) != tester.participants.end()); BC_ASSERT_TRUE(tester.participants.find(aliceAddr.asString()) != tester.participants.end()); BC_ASSERT_TRUE(!tester.participants.find(bobAddr.asString())->second); BC_ASSERT_TRUE(tester.participants.find(aliceAddr.asString())->second); notify = localHandlerPrivate->createNotifyParticipantAdmined(bobAddr, true); tester.handler->notifyReceived(notify); BC_ASSERT_EQUAL(tester.participants.size(), 2, int, "%d"); BC_ASSERT_TRUE(tester.participants.find(bobAddr.asString()) != tester.participants.end()); BC_ASSERT_TRUE(tester.participants.find(aliceAddr.asString()) != tester.participants.end()); BC_ASSERT_TRUE(tester.participants.find(aliceAddr.asString())->second); BC_ASSERT_TRUE(tester.participants.find(bobAddr.asString())->second); linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); } void send_unadmined_notify() { LinphoneCoreManager *marie = linphone_core_manager_new("marie_rc"); LinphoneCoreManager *pauline = linphone_core_manager_new(transport_supported(LinphoneTransportTls) ? "pauline_rc" : "pauline_tcp_rc"); char *identityStr = linphone_address_as_string(pauline->identity); Address addr(identityStr); bctbx_free(identityStr); ConferenceEventTester tester(marie->lc, addr); LocalConference localConf(pauline->lc, addr); LinphoneAddress *cBobAddr = linphone_core_interpret_url(marie->lc, bobUri); char *bobAddrStr = linphone_address_as_string(cBobAddr); Address bobAddr(bobAddrStr); bctbx_free(bobAddrStr); linphone_address_unref(cBobAddr); LinphoneAddress *cAliceAddr = linphone_core_interpret_url(marie->lc, aliceUri); char *aliceAddrStr = linphone_address_as_string(cAliceAddr); Address aliceAddr(aliceAddrStr); bctbx_free(aliceAddrStr); linphone_address_unref(cAliceAddr); CallSessionParams params; localConf.addParticipant(bobAddr, ¶ms, false); localConf.addParticipant(aliceAddr, ¶ms, false); shared_ptr alice = localConf.findParticipant(aliceAddr); L_GET_PRIVATE(alice)->setAdmin(true); LocalConferenceEventHandlerPrivate *localHandlerPrivate = L_GET_PRIVATE( L_ATTR_GET(L_GET_PRIVATE(localConf), eventHandler) ); const_cast
(localConf.getConferenceAddress()) = addr; string notify = localHandlerPrivate->createNotifyFullState(); const_cast
(tester.handler->getConfAddress()) = addr; tester.handler->notifyReceived(notify); BC_ASSERT_EQUAL(tester.participants.size(), 2, int, "%d"); BC_ASSERT_TRUE(tester.participants.find(bobAddr.asString()) != tester.participants.end()); BC_ASSERT_TRUE(tester.participants.find(aliceAddr.asString()) != tester.participants.end()); BC_ASSERT_TRUE(!tester.participants.find(bobAddr.asString())->second); BC_ASSERT_TRUE(tester.participants.find(aliceAddr.asString())->second); notify = localHandlerPrivate->createNotifyParticipantAdmined(aliceAddr, false); tester.handler->notifyReceived(notify); BC_ASSERT_EQUAL(tester.participants.size(), 2, int, "%d"); BC_ASSERT_TRUE(tester.participants.find(bobAddr.asString()) != tester.participants.end()); BC_ASSERT_TRUE(tester.participants.find(aliceAddr.asString()) != tester.participants.end()); BC_ASSERT_TRUE(!tester.participants.find(aliceAddr.asString())->second); BC_ASSERT_TRUE(!tester.participants.find(bobAddr.asString())->second); linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); } void send_subject_changed_notify () { LinphoneCoreManager *marie = linphone_core_manager_new("marie_rc"); LinphoneCoreManager *pauline = linphone_core_manager_new(transport_supported(LinphoneTransportTls) ? "pauline_rc" : "pauline_tcp_rc"); char *identityStr = linphone_address_as_string(pauline->identity); Address addr(identityStr); bctbx_free(identityStr); ConferenceEventTester tester(marie->lc, addr); LocalConference localConf(pauline->lc, addr); LinphoneAddress *cBobAddr = linphone_core_interpret_url(marie->lc, bobUri); char *bobAddrStr = linphone_address_as_string(cBobAddr); Address bobAddr(bobAddrStr); bctbx_free(bobAddrStr); linphone_address_unref(cBobAddr); LinphoneAddress *cAliceAddr = linphone_core_interpret_url(marie->lc, aliceUri); char *aliceAddrStr = linphone_address_as_string(cAliceAddr); Address aliceAddr(aliceAddrStr); bctbx_free(aliceAddrStr); linphone_address_unref(cAliceAddr); CallSessionParams params; localConf.addParticipant(bobAddr, ¶ms, false); localConf.addParticipant(aliceAddr, ¶ms, false); localConf.setSubject("A random test subject"); shared_ptr alice = localConf.findParticipant(aliceAddr); L_GET_PRIVATE(alice)->setAdmin(true); LocalConferenceEventHandlerPrivate *localHandlerPrivate = L_GET_PRIVATE( L_ATTR_GET(L_GET_PRIVATE(localConf), eventHandler) ); const_cast
(localConf.getConferenceAddress()) = addr; string notify = localHandlerPrivate->createNotifyFullState(); const_cast
(tester.handler->getConfAddress()) = addr; tester.handler->notifyReceived(notify); BC_ASSERT_STRING_EQUAL(tester.confSubject.c_str(), "A random test subject"); BC_ASSERT_EQUAL(tester.participants.size(), 2, int, "%d"); BC_ASSERT_EQUAL(L_GET_PRIVATE(tester.handler)->getLastNotify(), 1, int, "%d"); BC_ASSERT_EQUAL(localHandlerPrivate->getLastNotify(), 1, int, "%d"); BC_ASSERT_TRUE(tester.participants.find(bobAddr.asString()) != tester.participants.end()); BC_ASSERT_TRUE(tester.participants.find(aliceAddr.asString()) != tester.participants.end()); BC_ASSERT_TRUE(!tester.participants.find(bobAddr.asString())->second); BC_ASSERT_TRUE(tester.participants.find(aliceAddr.asString())->second); localConf.setSubject("Another random test subject..."); notify = localHandlerPrivate->createNotifySubjectChanged(); tester.handler->notifyReceived(notify); BC_ASSERT_STRING_EQUAL(tester.confSubject.c_str(), "Another random test subject..."); BC_ASSERT_EQUAL(tester.participants.size(), 2, int, "%d"); BC_ASSERT_EQUAL(L_GET_PRIVATE(tester.handler)->getLastNotify(), 2, int, "%d"); BC_ASSERT_EQUAL(localHandlerPrivate->getLastNotify(), 2, int, "%d"); BC_ASSERT_TRUE(tester.participants.find(bobAddr.asString()) != tester.participants.end()); BC_ASSERT_TRUE(tester.participants.find(aliceAddr.asString()) != tester.participants.end()); BC_ASSERT_TRUE(!tester.participants.find(bobAddr.asString())->second); BC_ASSERT_TRUE(tester.participants.find(aliceAddr.asString())->second); linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); } void send_device_added_notify() { LinphoneCoreManager *marie = linphone_core_manager_new("marie_rc"); LinphoneCoreManager *pauline = linphone_core_manager_new(transport_supported(LinphoneTransportTls) ? "pauline_rc" : "pauline_tcp_rc"); char *identityStr = linphone_address_as_string(pauline->identity); Address addr(identityStr); bctbx_free(identityStr); ConferenceEventTester tester(marie->lc, addr); LocalConference localConf(pauline->lc, addr); LinphoneAddress *cBobAddr = linphone_core_interpret_url(marie->lc, bobUri); char *bobAddrStr = linphone_address_as_string(cBobAddr); Address bobAddr(bobAddrStr); bctbx_free(bobAddrStr); linphone_address_unref(cBobAddr); LinphoneAddress *cAliceAddr = linphone_core_interpret_url(marie->lc, aliceUri); char *aliceAddrStr = linphone_address_as_string(cAliceAddr); Address aliceAddr(aliceAddrStr); bctbx_free(aliceAddrStr); linphone_address_unref(cAliceAddr); CallSessionParams params; localConf.addParticipant(bobAddr, ¶ms, false); localConf.addParticipant(aliceAddr, ¶ms, false); shared_ptr alice = localConf.findParticipant(aliceAddr); L_GET_PRIVATE(alice)->setAdmin(true); LocalConferenceEventHandlerPrivate *localHandlerPrivate = L_GET_PRIVATE( L_ATTR_GET(L_GET_PRIVATE(localConf), eventHandler) ); const_cast
(localConf.getConferenceAddress()) = addr; string notify = localHandlerPrivate->createNotifyFullState(); const_cast
(tester.handler->getConfAddress()) = addr; tester.handler->notifyReceived(notify); BC_ASSERT_EQUAL(tester.participantDevices.size(), 2, int, "%d"); BC_ASSERT_TRUE(tester.participantDevices.find(bobAddr.asString()) != tester.participantDevices.end()); BC_ASSERT_TRUE(tester.participantDevices.find(aliceAddr.asString()) != tester.participantDevices.end()); BC_ASSERT_EQUAL(tester.participantDevices.find(bobAddr.asString())->second, 0, int, "%d"); BC_ASSERT_EQUAL(tester.participantDevices.find(aliceAddr.asString())->second, 0, int, "%d"); notify = localHandlerPrivate->createNotifyParticipantDeviceAdded(aliceAddr, aliceAddr); tester.handler->notifyReceived(notify); BC_ASSERT_EQUAL(tester.participantDevices.size(), 2, int, "%d"); BC_ASSERT_TRUE(tester.participantDevices.find(bobAddr.asString()) != tester.participantDevices.end()); BC_ASSERT_TRUE(tester.participantDevices.find(aliceAddr.asString()) != tester.participantDevices.end()); BC_ASSERT_EQUAL(tester.participantDevices.find(bobAddr.asString())->second, 0, int, "%d"); BC_ASSERT_EQUAL(tester.participantDevices.find(aliceAddr.asString())->second, 1, int, "%d"); linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); } void send_device_removed_notify() { LinphoneCoreManager *marie = linphone_core_manager_new("marie_rc"); LinphoneCoreManager *pauline = linphone_core_manager_new(transport_supported(LinphoneTransportTls) ? "pauline_rc" : "pauline_tcp_rc"); char *identityStr = linphone_address_as_string(pauline->identity); Address addr(identityStr); bctbx_free(identityStr); ConferenceEventTester tester(marie->lc, addr); LocalConference localConf(pauline->lc, addr); LinphoneAddress *cBobAddr = linphone_core_interpret_url(marie->lc, bobUri); char *bobAddrStr = linphone_address_as_string(cBobAddr); Address bobAddr(bobAddrStr); bctbx_free(bobAddrStr); linphone_address_unref(cBobAddr); LinphoneAddress *cAliceAddr = linphone_core_interpret_url(marie->lc, aliceUri); char *aliceAddrStr = linphone_address_as_string(cAliceAddr); Address aliceAddr(aliceAddrStr); bctbx_free(aliceAddrStr); linphone_address_unref(cAliceAddr); CallSessionParams params; localConf.addParticipant(bobAddr, ¶ms, false); localConf.addParticipant(aliceAddr, ¶ms, false); localConf.setSubject("A random test subject"); shared_ptr alice = localConf.findParticipant(aliceAddr); L_GET_PRIVATE(alice)->setAdmin(true); LocalConferenceEventHandlerPrivate *localHandlerPrivate = L_GET_PRIVATE( L_ATTR_GET(L_GET_PRIVATE(localConf), eventHandler) ); const_cast
(localConf.getConferenceAddress()) = addr; string notify = localHandlerPrivate->createNotifyFullState(); const_cast
(tester.handler->getConfAddress()) = addr; tester.handler->notifyReceived(notify); BC_ASSERT_EQUAL(tester.participantDevices.size(), 2, int, "%d"); BC_ASSERT_TRUE(tester.participantDevices.find(bobAddr.asString()) != tester.participantDevices.end()); BC_ASSERT_TRUE(tester.participantDevices.find(aliceAddr.asString()) != tester.participantDevices.end()); BC_ASSERT_EQUAL(tester.participantDevices.find(bobAddr.asString())->second, 0, int, "%d"); BC_ASSERT_EQUAL(tester.participantDevices.find(aliceAddr.asString())->second, 0, int, "%d"); notify = localHandlerPrivate->createNotifyParticipantDeviceAdded(aliceAddr, aliceAddr); tester.handler->notifyReceived(notify); BC_ASSERT_EQUAL(tester.participantDevices.size(), 2, int, "%d"); BC_ASSERT_TRUE(tester.participantDevices.find(bobAddr.asString()) != tester.participantDevices.end()); BC_ASSERT_TRUE(tester.participantDevices.find(aliceAddr.asString()) != tester.participantDevices.end()); BC_ASSERT_EQUAL(tester.participantDevices.find(bobAddr.asString())->second, 0, int, "%d"); BC_ASSERT_EQUAL(tester.participantDevices.find(aliceAddr.asString())->second, 1, int, "%d"); notify = localHandlerPrivate->createNotifyParticipantDeviceRemoved(aliceAddr, aliceAddr); tester.handler->notifyReceived(notify); BC_ASSERT_EQUAL(tester.participantDevices.size(), 2, int, "%d"); BC_ASSERT_TRUE(tester.participantDevices.find(bobAddr.asString()) != tester.participantDevices.end()); BC_ASSERT_TRUE(tester.participantDevices.find(aliceAddr.asString()) != tester.participantDevices.end()); BC_ASSERT_EQUAL(tester.participantDevices.find(bobAddr.asString())->second, 0, int, "%d"); BC_ASSERT_EQUAL(tester.participantDevices.find(aliceAddr.asString())->second, 0, int, "%d"); notify = localHandlerPrivate->createNotifyParticipantDeviceRemoved(aliceAddr, aliceAddr); tester.handler->notifyReceived(notify); BC_ASSERT_EQUAL(tester.participantDevices.size(), 2, int, "%d"); BC_ASSERT_TRUE(tester.participantDevices.find(bobAddr.asString()) != tester.participantDevices.end()); BC_ASSERT_TRUE(tester.participantDevices.find(aliceAddr.asString()) != tester.participantDevices.end()); BC_ASSERT_EQUAL(tester.participantDevices.find(bobAddr.asString())->second, 0, int, "%d"); BC_ASSERT_EQUAL(tester.participantDevices.find(aliceAddr.asString())->second, 0, int, "%d"); linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); } test_t conference_event_tests[] = { TEST_NO_TAG("First notify parsing", first_notify_parsing), TEST_NO_TAG("First notify parsing wrong conf", first_notify_parsing_wrong_conf), TEST_NO_TAG("Participant added", participant_added_parsing), TEST_NO_TAG("Participant not added", participant_not_added_parsing), TEST_NO_TAG("Participant deleted", participant_deleted_parsing), TEST_NO_TAG("Participant admined", participant_admined_parsing), TEST_NO_TAG("Participant unadmined", participant_unadmined_parsing), TEST_NO_TAG("Send first notify", send_first_notify), TEST_NO_TAG("Send participant added notify", send_added_notify), TEST_NO_TAG("Send participant removed notify", send_removed_notify), TEST_NO_TAG("Send participant admined notify", send_admined_notify), TEST_NO_TAG("Send participant unadmined notify", send_unadmined_notify), TEST_NO_TAG("Send subject changed notify", send_subject_changed_notify), TEST_NO_TAG("Send device added notify", send_device_added_notify), TEST_NO_TAG("Send device removed notify", send_device_removed_notify) }; test_suite_t conference_event_test_suite = { "Conference event", nullptr, nullptr, liblinphone_tester_before_each, liblinphone_tester_after_each, sizeof(conference_event_tests) / sizeof(conference_event_tests[0]), conference_event_tests };