fix unit tests
Change-Id: Icb783f3fc6a91c0d31b4a32ec9c805f8f27fdf66
diff --git a/tests/connectionManager.cpp b/tests/connectionManager.cpp
index ab42744..ef843ef 100644
--- a/tests/connectionManager.cpp
+++ b/tests/connectionManager.cpp
@@ -14,21 +14,40 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
+#include <iostream>
+#include <filesystem>
+
+#include <opendht/log.h>
+
#include <cppunit/TestAssert.h>
#include <cppunit/TestFixture.h>
#include <cppunit/extensions/HelperMacros.h>
+#include <asio/executor_work_guard.hpp>
+#include <asio/io_context.hpp>
+
#include <condition_variable>
#include "connectionmanager.h"
#include "multiplexed_socket.h"
#include "test_runner.h"
+#include "certstore.h"
using namespace std::literals::chrono_literals;
namespace dhtnet {
namespace test {
+struct ConnectionHandler {
+ dht::crypto::Identity id;
+ std::shared_ptr<Logger> logger;
+ std::shared_ptr<tls::CertificateStore> certStore;
+ std::shared_ptr<dht::DhtRunner> dht;
+ std::shared_ptr<ConnectionManager> connectionManager;
+ std::shared_ptr<asio::io_context> ioContext;
+ std::thread ioContextRunner;
+};
+
class ConnectionManagerTest : public CppUnit::TestFixture
{
public:
@@ -38,84 +57,174 @@
void setUp();
void tearDown();
- std::string aliceId;
- std::string bobId;
+ std::unique_ptr<ConnectionHandler> alice;
+ std::unique_ptr<ConnectionHandler> bob;
+ //std::string aliceId;
+ //std::string bobId;
+//Create a lock to be used in the test units
+ std::mutex mtx;
+ std::shared_ptr<asio::io_context> ioContext;
+ std::thread ioContextRunner;
+ std::shared_ptr<Logger> logger;
+ std::unique_ptr<IceTransportFactory> factory;
private:
- void testConnectDevice();
- void testAcceptConnection();
- void testMultipleChannels();
- void testMultipleChannelsOneDeclined();
- void testMultipleChannelsSameName();
- void testDeclineConnection();
- void testSendReceiveData();
- void testAcceptsICERequest();
- void testDeclineICERequest();
- void testChannelRcvShutdown();
- void testChannelSenderShutdown();
- void testCloseConnectionWith();
- void testShutdownCallbacks();
- void testFloodSocket();
- void testDestroyWhileSending();
- void testIsConnecting();
- void testCanSendBeacon();
- void testCannotSendBeacon();
- void testConnectivityChangeTriggerBeacon();
- void testOnNoBeaconTriggersShutdown();
- void testShutdownWhileNegotiating();
+
+ std::unique_ptr<ConnectionHandler> setupHandler(const std::string& name);
+
+ void testConnectDevice();
+ // void testAcceptConnection();
+ // void testMultipleChannels();
+ // void testMultipleChannelsOneDeclined();
+ // void testMultipleChannelsSameName();
+ // void testDeclineConnection();
+ // void testSendReceiveData();
+ // void testAcceptsICERequest();
+ // void testDeclineICERequest();
+ // void testChannelRcvShutdown();
+ // void testChannelSenderShutdown();
+ // void testCloseConnectionWith();
+ // void testShutdownCallbacks();
+ // void testFloodSocket();
+ // void testDestroyWhileSending();
+ // void testIsConnecting();
+ // void testCanSendBeacon();
+ // void testCannotSendBeacon();
+ // void testConnectivityChangeTriggerBeacon();
+ // void testOnNoBeaconTriggersShutdown();
+ // void testShutdownWhileNegotiating();
CPPUNIT_TEST_SUITE(ConnectionManagerTest);
- CPPUNIT_TEST(testConnectDevice);
- CPPUNIT_TEST(testAcceptConnection);
- CPPUNIT_TEST(testMultipleChannels);
- CPPUNIT_TEST(testMultipleChannelsOneDeclined);
- CPPUNIT_TEST(testMultipleChannelsSameName);
- CPPUNIT_TEST(testDeclineConnection);
- CPPUNIT_TEST(testSendReceiveData);
- CPPUNIT_TEST(testAcceptsICERequest);
- CPPUNIT_TEST(testDeclineICERequest);
- CPPUNIT_TEST(testChannelRcvShutdown);
- CPPUNIT_TEST(testChannelSenderShutdown);
- CPPUNIT_TEST(testCloseConnectionWith);
- CPPUNIT_TEST(testShutdownCallbacks);
- CPPUNIT_TEST(testFloodSocket);
- CPPUNIT_TEST(testDestroyWhileSending);
- CPPUNIT_TEST(testIsConnecting);
- CPPUNIT_TEST(testCanSendBeacon);
- CPPUNIT_TEST(testCannotSendBeacon);
- CPPUNIT_TEST(testConnectivityChangeTriggerBeacon);
- CPPUNIT_TEST(testOnNoBeaconTriggersShutdown);
- CPPUNIT_TEST(testShutdownWhileNegotiating);
+
+ // CPPUNIT_TEST(testAcceptsICERequest);
+ // CPPUNIT_TEST(testDeclineICERequest);
+
+ CPPUNIT_TEST(testConnectDevice);
+
+ // CPPUNIT_TEST(testIsConnecting);
+
+ // CPPUNIT_TEST(testAcceptConnection);
+ // CPPUNIT_TEST(testDeclineConnection);
+
+ // CPPUNIT_TEST(testMultipleChannels);
+ // CPPUNIT_TEST(testMultipleChannelsOneDeclined);
+ // CPPUNIT_TEST(testMultipleChannelsSameName);
+
+ // CPPUNIT_TEST(testSendReceiveData);
+
+ // CPPUNIT_TEST(testChannelRcvShutdown);
+ // CPPUNIT_TEST(testChannelSenderShutdown);
+
+ // CPPUNIT_TEST(testCloseConnectionWith);
+ // CPPUNIT_TEST(testShutdownCallbacks);
+ // CPPUNIT_TEST(testFloodSocket);
+ // CPPUNIT_TEST(testDestroyWhileSending);
+
+ // CPPUNIT_TEST(testCanSendBeacon);
+ // CPPUNIT_TEST(testCannotSendBeacon);
+ // CPPUNIT_TEST(testConnectivityChangeTriggerBeacon);
+ // CPPUNIT_TEST(testOnNoBeaconTriggersShutdown);
+ // CPPUNIT_TEST(testShutdownWhileNegotiating);
CPPUNIT_TEST_SUITE_END();
};
CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(ConnectionManagerTest, ConnectionManagerTest::name());
+std::unique_ptr<ConnectionHandler>
+ConnectionManagerTest::setupHandler(const std::string& name) {
+ auto h = std::make_unique<ConnectionHandler>();
+ h->id = dht::crypto::generateIdentity(name);
+ h->logger = logger;
+ h->certStore = std::make_shared<tls::CertificateStore>(name, h->logger);
+ h->ioContext = std::make_shared<asio::io_context>();
+ h->ioContextRunner = std::thread([context = h->ioContext]() {
+ try {
+ auto work = asio::make_work_guard(*context);
+ context->run();
+ } catch (const std::exception& ex) {
+ //print the error;
+ }
+ });
+
+ dht::DhtRunner::Config dhtConfig;
+ dhtConfig.dht_config.id = h->id;
+ dhtConfig.threaded = true;
+
+ dht::DhtRunner::Context dhtContext;
+ dhtContext.certificateStore = [c=h->certStore](const dht::InfoHash& pk_id) {
+ std::vector<std::shared_ptr<dht::crypto::Certificate>> ret;
+ if (auto cert = c->getCertificate(pk_id.toString()))
+ ret.emplace_back(std::move(cert));
+ return ret;
+ };
+ dhtContext.logger = h->logger;
+
+ h->dht = std::make_shared<dht::DhtRunner>();
+ h->dht->run(dhtConfig, std::move(dhtContext));
+ h->dht->bootstrap("127.0.0.1:3355");
+
+ auto config = std::make_shared<ConnectionManager::Config>();
+ config->dht = h->dht;
+ config->id = h->id;
+ config->ioContext = h->ioContext;
+ config->factory = factory.get();
+ config->logger = logger;
+ config->certStore = h->certStore.get();
+
+ std::filesystem::path currentPath = std::filesystem::current_path();
+ std::filesystem::path tempDirPath = currentPath / "temp";
+
+ config->cachePath = tempDirPath.string();
+
+ h->connectionManager = std::make_shared<ConnectionManager>(config);
+ h->connectionManager->onICERequest([](const DeviceId&) {
+ return true;
+ });
+
+ return h;
+}
+
void
ConnectionManagerTest::setUp()
{
- /*auto actors = load_actors_and_wait_for_announcement("actors/alice-bob.yml");
- aliceId = actors["alice"];
- bobId = actors["bob"];
-
- // Pin certificate from one to another certstore (because we do not perform any DHT operation in this test)
- auto aliceAccount = Manager::instance().getAccount<JamiAccount>(aliceId);
- auto bobAccount = Manager::instance().getAccount<JamiAccount>(bobId);
- bobAccount->certStore().pinCertificate(aliceAccount->identity().second);
- aliceAccount->certStore().pinCertificate(bobAccount->identity().second);*/
+ logger = dht::log::getStdLogger();
+ ioContext = std::make_shared<asio::io_context>();
+ ioContextRunner = std::thread([context = ioContext]() {
+ try {
+ auto work = asio::make_work_guard(*context);
+ context->run();
+ } catch (const std::exception& ex) {
+ //print the error;
+ }
+ });
+ factory = std::make_unique<IceTransportFactory>();
+ alice = setupHandler("alice");
+ bob = setupHandler("bob");
}
+/*
+ auto identifier = bobId.first->getPublicKey().getLongId();
+ auto identifier = bobId.second->getLongId();
+ auto identifier = bobId.second->getPublicKey().getLongId();
+*/
+
+
void
ConnectionManagerTest::tearDown()
{
- //wait_for_removal_of({aliceId, bobId});
+ //wait_for_removal_of({aliceId, bobId}); //?????????????????????????????????
+ ioContext->stop();
+ if (ioContextRunner.joinable())
+ ioContextRunner.join();
}
+/*
void
ConnectionManagerTest::testConnectDevice()
{
- /*auto aliceAccount = Manager::instance().getAccount<JamiAccount>(aliceId);
+ auto aliceAccount = Manager::instance().getAccount<JamiAccount>(aliceId);
auto bobAccount = Manager::instance().getAccount<JamiAccount>(bobId);
+
auto bobDeviceId = DeviceId(std::string(bobAccount->currentDeviceId()));
bobAccount->connectionManager().onICERequest([](const DeviceId&) { return true; });
@@ -144,1130 +253,1733 @@
}
cv.notify_one();
});
+
CPPUNIT_ASSERT(cvReceive.wait_for(lk, 60s, [&] { return successfullyReceive; }));
- CPPUNIT_ASSERT(cv.wait_for(lk, 60s, [&] { return successfullyConnected; }));*/
-}
-
-void
-ConnectionManagerTest::testAcceptConnection()
-{
- /*auto aliceAccount = Manager::instance().getAccount<JamiAccount>(aliceId);
- auto bobAccount = Manager::instance().getAccount<JamiAccount>(bobId);
- auto bobDeviceId = DeviceId(std::string(bobAccount->currentDeviceId()));
-
- bobAccount->connectionManager().onICERequest([](const DeviceId&) { return true; });
- aliceAccount->connectionManager().onICERequest([](const DeviceId&) { return true; });
-
- std::mutex mtx;
- std::unique_lock<std::mutex> lk {mtx};
- std::condition_variable cv;
- bool successfullyConnected = false;
- bool successfullyReceive = false;
- bool receiverConnected = false;
-
- bobAccount->connectionManager().onChannelRequest(
- [&successfullyReceive](const std::shared_ptr<dht::crypto::Certificate>&,
- const std::string& name) {
- successfullyReceive = name == "git://*";
- return true;
- });
-
- bobAccount->connectionManager().onConnectionReady(
- [&receiverConnected](const DeviceId&,
- const std::string& name,
- std::shared_ptr<ChannelSocket> socket) {
- receiverConnected = socket && (name == "git://*");
- });
-
- aliceAccount->connectionManager().connectDevice(bobDeviceId,
- "git://*",
- [&](std::shared_ptr<ChannelSocket> socket,
- const DeviceId&) {
- if (socket) {
- successfullyConnected = true;
- }
- cv.notify_one();
- });
-
- CPPUNIT_ASSERT(cv.wait_for(lk, 60s, [&] {
- return successfullyReceive && successfullyConnected && receiverConnected;
- }));*/
-}
-
-void
-ConnectionManagerTest::testMultipleChannels()
-{
- /*auto aliceAccount = Manager::instance().getAccount<JamiAccount>(aliceId);
- auto bobAccount = Manager::instance().getAccount<JamiAccount>(bobId);
- auto bobDeviceId = DeviceId(std::string(bobAccount->currentDeviceId()));
-
- bobAccount->connectionManager().onICERequest([](const DeviceId&) { return true; });
- aliceAccount->connectionManager().onICERequest([](const DeviceId&) { return true; });
-
- std::mutex mtx;
- std::unique_lock<std::mutex> lk {mtx};
- std::condition_variable cv;
- bool successfullyConnected = false;
- bool successfullyConnected2 = false;
- int receiverConnected = 0;
-
- bobAccount->connectionManager().onChannelRequest(
- [](const std::shared_ptr<dht::crypto::Certificate>&, const std::string&) { return true; });
-
- bobAccount->connectionManager().onConnectionReady(
- [&receiverConnected](const DeviceId&,
- const std::string&,
- std::shared_ptr<ChannelSocket> socket) {
- if (socket)
- receiverConnected += 1;
- });
-
- aliceAccount->connectionManager().connectDevice(bobDeviceId,
- "git://*",
- [&](std::shared_ptr<ChannelSocket> socket,
- const DeviceId&) {
- if (socket) {
- successfullyConnected = true;
- }
- cv.notify_one();
- });
-
- aliceAccount->connectionManager().connectDevice(bobDeviceId,
- "sip://*",
- [&](std::shared_ptr<ChannelSocket> socket,
- const DeviceId&) {
- if (socket) {
- successfullyConnected2 = true;
- }
- cv.notify_one();
- });
-
- CPPUNIT_ASSERT(cv.wait_for(lk, 60s, [&] {
- return successfullyConnected && successfullyConnected2 && receiverConnected == 2;
- }));
- CPPUNIT_ASSERT(aliceAccount->connectionManager().activeSockets() == 1);*/
-}
-
-void
-ConnectionManagerTest::testMultipleChannelsOneDeclined()
-{
- /*auto aliceAccount = Manager::instance().getAccount<JamiAccount>(aliceId);
- auto bobAccount = Manager::instance().getAccount<JamiAccount>(bobId);
- auto bobDeviceId = DeviceId(std::string(bobAccount->currentDeviceId()));
-
- bobAccount->connectionManager().onICERequest([](const DeviceId&) { return true; });
- aliceAccount->connectionManager().onICERequest([](const DeviceId&) { return true; });
-
- std::mutex mtx;
- std::unique_lock<std::mutex> lk {mtx};
- std::condition_variable cv;
- bool successfullyNotConnected = false;
- bool successfullyConnected2 = false;
- int receiverConnected = 0;
-
- bobAccount->connectionManager().onChannelRequest(
- [](const std::shared_ptr<dht::crypto::Certificate>&, const std::string& name) {
- if (name == "git://*")
- return false;
- return true;
- });
-
- bobAccount->connectionManager().onConnectionReady(
- [&](const DeviceId&, const std::string&, std::shared_ptr<ChannelSocket> socket) {
- if (socket)
- receiverConnected += 1;
- cv.notify_one();
- });
-
- aliceAccount->connectionManager().connectDevice(bobDeviceId,
- "git://*",
- [&](std::shared_ptr<ChannelSocket> socket,
- const DeviceId&) {
- if (!socket)
- successfullyNotConnected = true;
- cv.notify_one();
- });
-
- aliceAccount->connectionManager().connectDevice(bobDeviceId,
- "sip://*",
- [&](std::shared_ptr<ChannelSocket> socket,
- const DeviceId&) {
- if (socket)
- successfullyConnected2 = true;
- cv.notify_one();
- });
-
- CPPUNIT_ASSERT(cv.wait_for(lk, 60s, [&] {
- return successfullyNotConnected && successfullyConnected2 && receiverConnected == 1;
- }));
- CPPUNIT_ASSERT(aliceAccount->connectionManager().activeSockets() == 1);*/
-}
-
-void
-ConnectionManagerTest::testMultipleChannelsSameName()
-{
- /*auto aliceAccount = Manager::instance().getAccount<JamiAccount>(aliceId);
- auto bobAccount = Manager::instance().getAccount<JamiAccount>(bobId);
- auto bobDeviceId = DeviceId(std::string(bobAccount->currentDeviceId()));
-
- bobAccount->connectionManager().onICERequest([](const DeviceId&) { return true; });
- aliceAccount->connectionManager().onICERequest([](const DeviceId&) { return true; });
-
- std::mutex mtx;
- std::unique_lock<std::mutex> lk {mtx};
- std::condition_variable cv;
- bool successfullyConnected = false;
- bool successfullyConnected2 = false;
- int receiverConnected = 0;
-
- bobAccount->connectionManager().onChannelRequest(
- [](const std::shared_ptr<dht::crypto::Certificate>&, const std::string&) { return true; });
-
- bobAccount->connectionManager().onConnectionReady(
- [&receiverConnected](const DeviceId&,
- const std::string&,
- std::shared_ptr<ChannelSocket> socket) {
- if (socket)
- receiverConnected += 1;
- });
-
- aliceAccount->connectionManager().connectDevice(bobDeviceId,
- "git://*",
- [&](std::shared_ptr<ChannelSocket> socket,
- const DeviceId&) {
- if (socket) {
- successfullyConnected = true;
- }
- cv.notify_one();
- });
-
- // We can open two sockets with the same name, it will be two different channel
- aliceAccount->connectionManager().connectDevice(bobDeviceId,
- "git://*",
- [&](std::shared_ptr<ChannelSocket> socket,
- const DeviceId&) {
- if (socket) {
- successfullyConnected2 = true;
- }
- cv.notify_one();
- });
-
- CPPUNIT_ASSERT(cv.wait_for(lk, 60s, [&] {
- return successfullyConnected && successfullyConnected2 && receiverConnected == 2;
- }));*/
-}
-
-void
-ConnectionManagerTest::testSendReceiveData()
-{
- /*auto aliceAccount = Manager::instance().getAccount<JamiAccount>(aliceId);
- auto bobAccount = Manager::instance().getAccount<JamiAccount>(bobId);
- auto bobDeviceId = DeviceId(std::string(bobAccount->currentDeviceId()));
-
- bobAccount->connectionManager().onICERequest([](const DeviceId&) { return true; });
- aliceAccount->connectionManager().onICERequest([](const DeviceId&) { return true; });
-
- std::mutex mtx;
- std::unique_lock<std::mutex> lk {mtx};
- std::condition_variable cv;
- std::atomic_int events(0);
- bool successfullyConnected = false, successfullyConnected2 = false, successfullyReceive = false,
- receiverConnected = false;
- const uint8_t buf_other[] = {0x64, 0x65, 0x66, 0x67};
- const uint8_t buf_test[] = {0x68, 0x69, 0x70, 0x71};
- bool dataOk = false, dataOk2 = false;
-
- bobAccount->connectionManager().onChannelRequest(
- [&successfullyReceive](const std::shared_ptr<dht::crypto::Certificate>&,
- const std::string&) {
- successfullyReceive = true;
- return true;
- });
-
- bobAccount->connectionManager().onConnectionReady(
- [&](const DeviceId&, const std::string& name, std::shared_ptr<ChannelSocket> socket) {
- if (socket && (name == "test" || name == "other")) {
- receiverConnected = true;
- std::error_code ec;
- auto res = socket->waitForData(std::chrono::milliseconds(5000), ec);
- if (res == 4) {
- uint8_t buf[4];
- socket->read(&buf[0], 4, ec);
- if (name == "test")
- dataOk = std::equal(std::begin(buf), std::end(buf), std::begin(buf_test));
- else
- dataOk2 = std::equal(std::begin(buf), std::end(buf), std::begin(buf_other));
- events++;
- cv.notify_one();
- }
- }
- });
-
- aliceAccount->connectionManager().connectDevice(bobDeviceId,
- "test",
- [&](std::shared_ptr<ChannelSocket> socket,
- const DeviceId&) {
- if (socket) {
- successfullyConnected = true;
- std::error_code ec;
- socket->write(&buf_test[0], 4, ec);
- }
- events++;
- cv.notify_one();
- });
-
- aliceAccount->connectionManager().connectDevice(bobDeviceId,
- "other",
- [&](std::shared_ptr<ChannelSocket> socket,
- const DeviceId&) {
- if (socket) {
- successfullyConnected2 = true;
- std::error_code ec;
- socket->write(&buf_other[0], 4, ec);
- }
- events++;
- cv.notify_one();
- });
-
- CPPUNIT_ASSERT(cv.wait_for(lk, 60s, [&] {
- return events == 4 && successfullyReceive && successfullyConnected && successfullyConnected2
- && dataOk && dataOk2;
- }));*/
-}
-
-void
-ConnectionManagerTest::testDeclineConnection()
-{
- /*auto aliceAccount = Manager::instance().getAccount<JamiAccount>(aliceId);
- auto bobAccount = Manager::instance().getAccount<JamiAccount>(bobId);
- auto bobDeviceId = DeviceId(std::string(bobAccount->currentDeviceId()));
-
- bobAccount->connectionManager().onICERequest([](const DeviceId&) { return true; });
- aliceAccount->connectionManager().onICERequest([](const DeviceId&) { return true; });
-
- std::mutex mtx;
- std::unique_lock<std::mutex> lk {mtx};
- std::condition_variable cv;
- bool successfullyConnected = false;
- bool successfullyReceive = false;
- bool receiverConnected = false;
-
- bobAccount->connectionManager().onChannelRequest(
- [&successfullyReceive](const std::shared_ptr<dht::crypto::Certificate>&,
- const std::string&) {
- successfullyReceive = true;
- return false;
- });
-
- bobAccount->connectionManager().onConnectionReady(
- [&receiverConnected](const DeviceId&,
- const std::string&,
- std::shared_ptr<ChannelSocket> socket) {
- if (socket)
- receiverConnected = true;
- });
-
- aliceAccount->connectionManager().connectDevice(bobDeviceId,
- "git://*",
- [&](std::shared_ptr<ChannelSocket> socket,
- const DeviceId&) {
- if (socket) {
- successfullyConnected = true;
- }
- cv.notify_one();
- });
- cv.wait_for(lk, 30s);
- CPPUNIT_ASSERT(successfullyReceive);
- CPPUNIT_ASSERT(!successfullyConnected);
- CPPUNIT_ASSERT(!receiverConnected);*/
-}
-
-void
-ConnectionManagerTest::testAcceptsICERequest()
-{
- /*auto aliceAccount = Manager::instance().getAccount<JamiAccount>(aliceId);
- auto bobAccount = Manager::instance().getAccount<JamiAccount>(bobId);
- auto bobDeviceId = DeviceId(std::string(bobAccount->currentDeviceId()));
-
- aliceAccount->connectionManager().onICERequest([](const DeviceId&) { return true; });
-
- std::mutex mtx;
- std::unique_lock<std::mutex> lk {mtx};
- std::condition_variable cv;
- bool successfullyConnected = false;
- bool successfullyReceive = false;
- bool receiverConnected = false;
-
- bobAccount->connectionManager().onChannelRequest(
- [](const std::shared_ptr<dht::crypto::Certificate>&, const std::string&) { return true; });
- bobAccount->connectionManager().onICERequest([&](const DeviceId&) {
- successfullyReceive = true;
- return true;
- });
-
- bobAccount->connectionManager().onConnectionReady(
- [&receiverConnected](const DeviceId&,
- const std::string& name,
- std::shared_ptr<ChannelSocket> socket) {
- receiverConnected = socket && (name == "git://*");
- });
-
- aliceAccount->connectionManager().connectDevice(bobDeviceId,
- "git://*",
- [&](std::shared_ptr<ChannelSocket> socket,
- const DeviceId&) {
- if (socket) {
- successfullyConnected = true;
- }
- cv.notify_one();
- });
-
- CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&] {
- return successfullyReceive && successfullyConnected && receiverConnected;
- }));*/
-}
-
-void
-ConnectionManagerTest::testDeclineICERequest()
-{
- /*auto aliceAccount = Manager::instance().getAccount<JamiAccount>(aliceId);
- auto bobAccount = Manager::instance().getAccount<JamiAccount>(bobId);
- auto bobDeviceId = DeviceId(std::string(bobAccount->currentDeviceId()));
-
- aliceAccount->connectionManager().onICERequest([](const DeviceId&) { return true; });
-
- std::mutex mtx;
- std::unique_lock<std::mutex> lk {mtx};
- std::condition_variable cv;
- bool successfullyConnected = false;
- bool successfullyReceive = false;
- bool receiverConnected = false;
-
- bobAccount->connectionManager().onChannelRequest(
- [](const std::shared_ptr<dht::crypto::Certificate>&, const std::string&) { return true; });
- bobAccount->connectionManager().onICERequest([&](const DeviceId&) {
- successfullyReceive = true;
- return false;
- });
-
- bobAccount->connectionManager().onConnectionReady(
- [&receiverConnected](const DeviceId&,
- const std::string& name,
- std::shared_ptr<ChannelSocket> socket) {
- receiverConnected = socket && (name == "git://*");
- });
-
- aliceAccount->connectionManager().connectDevice(bobDeviceId,
- "git://*",
- [&](std::shared_ptr<ChannelSocket> socket,
- const DeviceId&) {
- if (socket) {
- successfullyConnected = true;
- }
- cv.notify_one();
- });
-
- cv.wait_for(lk, 30s);
- CPPUNIT_ASSERT(successfullyReceive);
- CPPUNIT_ASSERT(!receiverConnected);
- CPPUNIT_ASSERT(!successfullyConnected);*/
-}
-
-void
-ConnectionManagerTest::testChannelRcvShutdown()
-{
- /*auto aliceAccount = Manager::instance().getAccount<JamiAccount>(aliceId);
- auto bobAccount = Manager::instance().getAccount<JamiAccount>(bobId);
- auto bobDeviceId = DeviceId(std::string(bobAccount->currentDeviceId()));
-
- bobAccount->connectionManager().onICERequest([](const DeviceId&) { return true; });
- aliceAccount->connectionManager().onICERequest([](const DeviceId&) { return true; });
-
- std::mutex mtx;
- std::unique_lock<std::mutex> lk {mtx};
- std::condition_variable cv;
- bool successfullyConnected = false;
- bool shutdownReceived = false;
-
- std::shared_ptr<ChannelSocket> bobSock;
-
- bobAccount->connectionManager().onChannelRequest(
- [](const std::shared_ptr<dht::crypto::Certificate>&, const std::string&) { return true; });
-
- bobAccount->connectionManager().onConnectionReady(
- [&](const DeviceId& did, const std::string& name, std::shared_ptr<ChannelSocket> socket) {
- if (socket && name == "git://*" && did != bobDeviceId) {
- bobSock = socket;
- cv.notify_one();
- }
- });
-
- aliceAccount->connectionManager().connectDevice(bobDeviceId,
- "git://*",
- [&](std::shared_ptr<ChannelSocket> socket,
- const DeviceId&) {
- if (socket) {
- socket->onShutdown([&] {
- shutdownReceived = true;
- cv.notify_one();
- });
- successfullyConnected = true;
- cv.notify_one();
- }
- });
-
- CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&] { return bobSock && successfullyConnected; }));
- bobSock->shutdown();
- CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&] { return shutdownReceived; }));*/
-}
-
-void
-ConnectionManagerTest::testChannelSenderShutdown()
-{
- /*auto aliceAccount = Manager::instance().getAccount<JamiAccount>(aliceId);
- auto bobAccount = Manager::instance().getAccount<JamiAccount>(bobId);
- auto bobDeviceId = DeviceId(std::string(bobAccount->currentDeviceId()));
-
- bobAccount->connectionManager().onICERequest([](const DeviceId&) { return true; });
- aliceAccount->connectionManager().onICERequest([](const DeviceId&) { return true; });
-
- std::mutex mtx;
- std::unique_lock<std::mutex> lk {mtx};
- std::condition_variable rcv, scv;
- bool successfullyConnected = false;
- bool successfullyReceive = false;
- bool receiverConnected = false;
- bool shutdownReceived = false;
-
- bobAccount->connectionManager().onChannelRequest(
- [&successfullyReceive](const std::shared_ptr<dht::crypto::Certificate>&,
- const std::string& name) {
- successfullyReceive = name == "git://*";
- return true;
- });
-
- bobAccount->connectionManager().onConnectionReady(
- [&](const DeviceId&, const std::string& name, std::shared_ptr<ChannelSocket> socket) {
- if (socket) {
- socket->onShutdown([&] {
- shutdownReceived = true;
- scv.notify_one();
- });
- }
- receiverConnected = socket && (name == "git://*");
- });
-
- aliceAccount->connectionManager().connectDevice(bobDeviceId,
- "git://*",
- [&](std::shared_ptr<ChannelSocket> socket,
- const DeviceId&) {
- if (socket) {
- successfullyConnected = true;
- rcv.notify_one();
- socket->shutdown();
- }
- });
-
- rcv.wait_for(lk, 30s);
- scv.wait_for(lk, 30s);
- CPPUNIT_ASSERT(shutdownReceived);
- CPPUNIT_ASSERT(successfullyReceive);
- CPPUNIT_ASSERT(successfullyConnected);
- CPPUNIT_ASSERT(receiverConnected);*/
-}
-
-void
-ConnectionManagerTest::testCloseConnectionWith()
-{
- /*auto aliceAccount = Manager::instance().getAccount<JamiAccount>(aliceId);
- auto bobAccount = Manager::instance().getAccount<JamiAccount>(bobId);
- auto bobDeviceId = DeviceId(std::string(bobAccount->currentDeviceId()));
- auto bobUri = bobAccount->getUsername();
-
- bobAccount->connectionManager().onICERequest([](const DeviceId&) { return true; });
- aliceAccount->connectionManager().onICERequest([](const DeviceId&) { return true; });
-
- std::mutex mtx;
- std::unique_lock<std::mutex> lk {mtx};
- std::condition_variable rcv, scv;
- std::atomic_int events(0);
- bool successfullyConnected = false;
- bool successfullyReceive = false;
- bool receiverConnected = false;
-
- bobAccount->connectionManager().onChannelRequest(
- [&successfullyReceive](const std::shared_ptr<dht::crypto::Certificate>&,
- const std::string& name) {
- successfullyReceive = name == "git://*";
- return true;
- });
-
- bobAccount->connectionManager().onConnectionReady(
- [&](const DeviceId&, const std::string& name, std::shared_ptr<ChannelSocket> socket) {
- if (socket) {
- socket->onShutdown([&] {
- events += 1;
- scv.notify_one();
- });
- }
- receiverConnected = socket && (name == "git://*");
- });
-
- aliceAccount->connectionManager().connectDevice(bobDeviceId,
- "git://*",
- [&](std::shared_ptr<ChannelSocket> socket,
- const DeviceId&) {
- if (socket) {
- socket->onShutdown([&] {
- events += 1;
- scv.notify_one();
- });
- successfullyConnected = true;
- rcv.notify_one();
- }
- });
-
- rcv.wait_for(lk, 30s);
- // This should trigger onShutdown
- aliceAccount->connectionManager().closeConnectionsWith(bobUri);
- CPPUNIT_ASSERT(scv.wait_for(lk, 60s, [&] {
- return events == 2 && successfullyReceive && successfullyConnected && receiverConnected;
- }));*/
-}
-
-void
-ConnectionManagerTest::testShutdownCallbacks()
-{
- /*auto aliceAccount = Manager::instance().getAccount<JamiAccount>(aliceId);
- auto bobAccount = Manager::instance().getAccount<JamiAccount>(bobId);
- auto bobDeviceId = DeviceId(std::string(bobAccount->currentDeviceId()));
- auto aliceUri = aliceAccount->getUsername();
-
- bobAccount->connectionManager().onICERequest([](const DeviceId&) { return true; });
- aliceAccount->connectionManager().onICERequest([](const DeviceId&) { return true; });
-
- std::mutex mtx;
- std::unique_lock<std::mutex> lk {mtx};
- std::condition_variable rcv, chan2cv;
- bool successfullyConnected = false;
- bool successfullyReceive = false;
- bool receiverConnected = false;
-
- bobAccount->connectionManager().onChannelRequest(
- [&successfullyReceive, &chan2cv](const std::shared_ptr<dht::crypto::Certificate>&,
- const std::string& name) {
- if (name == "1") {
- successfullyReceive = true;
- } else {
- chan2cv.notify_one();
- // Do not return directly. Let the connection be closed
- std::this_thread::sleep_for(10s);
- }
- return true;
- });
-
- bobAccount->connectionManager().onConnectionReady(
- [&](const DeviceId&, const std::string& name, std::shared_ptr<ChannelSocket> socket) {
- receiverConnected = socket && (name == "1");
- });
-
- aliceAccount->connectionManager().connectDevice(bobDeviceId,
- "1",
- [&](std::shared_ptr<ChannelSocket> socket,
- const DeviceId&) {
- if (socket) {
- successfullyConnected = true;
- rcv.notify_one();
- }
- });
- // Connect first channel. This will initiate a mx sock
- CPPUNIT_ASSERT(rcv.wait_for(lk, 30s, [&] {
- return successfullyReceive && successfullyConnected && receiverConnected;
- }));
-
- // Connect another channel, but close the connection
- bool channel2NotConnected = false;
- aliceAccount->connectionManager().connectDevice(bobDeviceId,
- "2",
- [&](std::shared_ptr<ChannelSocket> socket,
- const DeviceId&) {
- channel2NotConnected = !socket;
- rcv.notify_one();
- });
- chan2cv.wait_for(lk, 30s);
-
- // This should trigger onShutdown for second callback
- bobAccount->connectionManager().closeConnectionsWith(aliceUri);
- CPPUNIT_ASSERT(rcv.wait_for(lk, 30s, [&] { return channel2NotConnected; }));*/
-}
-
-void
-ConnectionManagerTest::testFloodSocket()
-{
- /*auto aliceAccount = Manager::instance().getAccount<JamiAccount>(aliceId);
- auto bobAccount = Manager::instance().getAccount<JamiAccount>(bobId);
- auto bobDeviceId = DeviceId(std::string(bobAccount->currentDeviceId()));
- bobAccount->connectionManager().onICERequest([](const DeviceId&) { return true; });
- aliceAccount->connectionManager().onICERequest([](const DeviceId&) { return true; });
- std::mutex mtx;
- std::unique_lock<std::mutex> lk {mtx};
- std::condition_variable cv;
- bool successfullyConnected = false;
- bool successfullyReceive = false;
- bool receiverConnected = false;
- std::shared_ptr<ChannelSocket> rcvSock1, rcvSock2, rcvSock3, sendSock, sendSock2, sendSock3;
- bobAccount->connectionManager().onChannelRequest(
- [&successfullyReceive](const std::shared_ptr<dht::crypto::Certificate>&,
- const std::string& name) {
- successfullyReceive = name == "1";
- return true;
- });
- bobAccount->connectionManager().onConnectionReady(
- [&](const DeviceId&, const std::string& name, std::shared_ptr<ChannelSocket> socket) {
- receiverConnected = socket != nullptr;
- if (name == "1")
- rcvSock1 = socket;
- else if (name == "2")
- rcvSock2 = socket;
- else if (name == "3")
- rcvSock3 = socket;
- });
- aliceAccount->connectionManager().connectDevice(bobDeviceId,
- "1",
- [&](std::shared_ptr<ChannelSocket> socket,
- const DeviceId&) {
- if (socket) {
- sendSock = socket;
- successfullyConnected = true;
- }
- cv.notify_one();
- });
- CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&] {
- return successfullyReceive && successfullyConnected && receiverConnected;
- }));
- CPPUNIT_ASSERT(receiverConnected);
- successfullyConnected = false;
- receiverConnected = false;
- aliceAccount->connectionManager().connectDevice(bobDeviceId,
- "2",
- [&](std::shared_ptr<ChannelSocket> socket,
- const DeviceId&) {
- if (socket) {
- sendSock2 = socket;
- successfullyConnected = true;
- }
- cv.notify_one();
- });
- CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&] { return successfullyConnected && receiverConnected; }));
- successfullyConnected = false;
- receiverConnected = false;
- aliceAccount->connectionManager().connectDevice(bobDeviceId,
- "3",
- [&](std::shared_ptr<ChannelSocket> socket,
- const DeviceId&) {
- if (socket) {
- sendSock3 = socket;
- successfullyConnected = true;
- }
- cv.notify_one();
- });
- CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&] { return successfullyConnected && receiverConnected; }));
- std::mutex mtxRcv {};
- std::string alphabet, shouldRcv, rcv1, rcv2, rcv3;
- for (int i = 0; i < 100; ++i)
- alphabet += "QWERTYUIOPASDFGHJKLZXCVBNM";
- rcvSock1->setOnRecv([&](const uint8_t* buf, size_t len) {
- rcv1 += std::string(buf, buf + len);
- return len;
- });
- rcvSock2->setOnRecv([&](const uint8_t* buf, size_t len) {
- rcv2 += std::string(buf, buf + len);
- return len;
- });
- rcvSock3->setOnRecv([&](const uint8_t* buf, size_t len) {
- rcv3 += std::string(buf, buf + len);
- return len;
- });
- for (uint64_t i = 0; i < alphabet.size(); ++i) {
- auto send = std::string(8000, alphabet[i]);
- shouldRcv += send;
- std::error_code ec;
- sendSock->write(reinterpret_cast<unsigned char*>(send.data()), send.size(), ec);
- sendSock2->write(reinterpret_cast<unsigned char*>(send.data()), send.size(), ec);
- sendSock3->write(reinterpret_cast<unsigned char*>(send.data()), send.size(), ec);
- CPPUNIT_ASSERT(!ec);
- }
- CPPUNIT_ASSERT(cv.wait_for(lk, 60s, [&] {
- return shouldRcv == rcv1 && shouldRcv == rcv2 && shouldRcv == rcv3;
- }));*/
-}
-
-void
-ConnectionManagerTest::testDestroyWhileSending()
-{
- // Same as test before, but destroy the accounts while sending.
- // This test if a segfault occurs
- /*auto aliceAccount = Manager::instance().getAccount<JamiAccount>(aliceId);
- auto bobAccount = Manager::instance().getAccount<JamiAccount>(bobId);
- auto bobDeviceId = DeviceId(std::string(bobAccount->currentDeviceId()));
- bobAccount->connectionManager().onICERequest([](const DeviceId&) { return true; });
- aliceAccount->connectionManager().onICERequest([](const DeviceId&) { return true; });
- std::mutex mtx;
- std::unique_lock<std::mutex> lk {mtx};
- std::condition_variable cv;
- bool successfullyConnected = false;
- bool successfullyReceive = false;
- bool receiverConnected = false;
- std::shared_ptr<ChannelSocket> rcvSock1, rcvSock2, rcvSock3, sendSock, sendSock2, sendSock3;
- bobAccount->connectionManager().onChannelRequest(
- [&successfullyReceive](const std::shared_ptr<dht::crypto::Certificate>&,
- const std::string& name) {
- successfullyReceive = name == "1";
- return true;
- });
- bobAccount->connectionManager().onConnectionReady(
- [&](const DeviceId&, const std::string& name, std::shared_ptr<ChannelSocket> socket) {
- receiverConnected = socket != nullptr;
- if (name == "1")
- rcvSock1 = socket;
- else if (name == "2")
- rcvSock2 = socket;
- else if (name == "3")
- rcvSock3 = socket;
- });
- aliceAccount->connectionManager().connectDevice(bobDeviceId,
- "1",
- [&](std::shared_ptr<ChannelSocket> socket,
- const DeviceId&) {
- if (socket) {
- sendSock = socket;
- successfullyConnected = true;
- }
- cv.notify_one();
- });
- CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&] {
- return successfullyReceive && successfullyConnected && receiverConnected;
- }));
- successfullyConnected = false;
- receiverConnected = false;
- aliceAccount->connectionManager().connectDevice(bobDeviceId,
- "2",
- [&](std::shared_ptr<ChannelSocket> socket,
- const DeviceId&) {
- if (socket) {
- sendSock2 = socket;
- successfullyConnected = true;
- }
- cv.notify_one();
- });
- CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&] { return successfullyConnected && receiverConnected; }));
- successfullyConnected = false;
- receiverConnected = false;
- aliceAccount->connectionManager().connectDevice(bobDeviceId,
- "3",
- [&](std::shared_ptr<ChannelSocket> socket,
- const DeviceId&) {
- if (socket) {
- sendSock3 = socket;
- successfullyConnected = true;
- }
- cv.notify_one();
- });
- CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&] { return successfullyConnected && receiverConnected; }));
- std::mutex mtxRcv {};
- std::string alphabet;
- for (int i = 0; i < 100; ++i)
- alphabet += "QWERTYUIOPASDFGHJKLZXCVBNM";
- rcvSock1->setOnRecv([&](const uint8_t*, size_t len) { return len; });
- rcvSock2->setOnRecv([&](const uint8_t*, size_t len) { return len; });
- rcvSock3->setOnRecv([&](const uint8_t*, size_t len) { return len; });
- for (uint64_t i = 0; i < alphabet.size(); ++i) {
- auto send = std::string(8000, alphabet[i]);
- std::error_code ec;
- sendSock->write(reinterpret_cast<unsigned char*>(send.data()), send.size(), ec);
- sendSock2->write(reinterpret_cast<unsigned char*>(send.data()), send.size(), ec);
- sendSock3->write(reinterpret_cast<unsigned char*>(send.data()), send.size(), ec);
- CPPUNIT_ASSERT(!ec);
- }*/
-
- // No need to wait, immediately destroy, no segfault must occurs
-}
-
-void
-ConnectionManagerTest::testIsConnecting()
-{
- /*auto aliceAccount = Manager::instance().getAccount<JamiAccount>(aliceId);
- auto bobAccount = Manager::instance().getAccount<JamiAccount>(bobId);
- auto bobDeviceId = DeviceId(std::string(bobAccount->currentDeviceId()));
-
- bobAccount->connectionManager().onICERequest([](const DeviceId&) { return true; });
- aliceAccount->connectionManager().onICERequest([](const DeviceId&) { return true; });
-
- std::mutex mtx;
- std::unique_lock<std::mutex> lk {mtx};
- std::condition_variable cv;
- bool successfullyConnected = false, successfullyReceive = false;
-
- bobAccount->connectionManager().onChannelRequest(
- [&](const std::shared_ptr<dht::crypto::Certificate>&, const std::string&) {
- successfullyReceive = true;
- cv.notify_one();
- std::this_thread::sleep_for(2s);
- return true;
- });
-
- CPPUNIT_ASSERT(!aliceAccount->connectionManager().isConnecting(bobDeviceId, "sip"));
- aliceAccount->connectionManager().connectDevice(bobDeviceId,
- "sip",
- [&](std::shared_ptr<ChannelSocket> socket,
- const DeviceId&) {
- if (socket) {
- successfullyConnected = true;
- }
- cv.notify_one();
- });
- // connectDevice is full async, so isConnecting will be true after a few ms.
- CPPUNIT_ASSERT(cv.wait_for(lk, 60s, [&] { return successfullyReceive; }));
- CPPUNIT_ASSERT(aliceAccount->connectionManager().isConnecting(bobDeviceId, "sip"));
CPPUNIT_ASSERT(cv.wait_for(lk, 60s, [&] { return successfullyConnected; }));
- std::this_thread::sleep_for(
- std::chrono::milliseconds(100)); // Just to wait for the callback to finish
- CPPUNIT_ASSERT(!aliceAccount->connectionManager().isConnecting(bobDeviceId, "sip"));*/
+
+
}
+*/
void
-ConnectionManagerTest::testCanSendBeacon()
+ConnectionManagerTest::testConnectDevice()
{
- /*auto aliceAccount = Manager::instance().getAccount<JamiAccount>(aliceId);
- auto bobAccount = Manager::instance().getAccount<JamiAccount>(bobId);
- auto bobDeviceId = DeviceId(std::string(bobAccount->currentDeviceId()));
+ std::unique_lock<std::mutex> lock {mtx};
+ std::condition_variable bobConVar;
+ bool isBobRecvChanlReq = false;
- bobAccount->connectionManager().onICERequest([](const DeviceId&) { return true; });
- aliceAccount->connectionManager().onICERequest([](const DeviceId&) { return true; });
+ alice->connectionManager->onDhtConnected(alice->id.first->getPublicKey());
+ bob->connectionManager->onDhtConnected(bob->id.first->getPublicKey());
- std::mutex mtx;
- std::unique_lock<std::mutex> lk {mtx};
- std::condition_variable cv;
- bool successfullyConnected = false;
+ bob->connectionManager->onChannelRequest([&isBobRecvChanlReq, &bobConVar]
+ (const std::shared_ptr<dht::crypto::Certificate>&, const std::string& name)
+ {
+ isBobRecvChanlReq = name == "dumyName";
+ bobConVar.notify_one();
+ return true;
+ });
- std::shared_ptr<MultiplexedSocket> aliceSocket, bobSocket;
- bobAccount->connectionManager().onChannelRequest(
- [&](const std::shared_ptr<dht::crypto::Certificate>&, const std::string&) { return true; });
- bobAccount->connectionManager().onConnectionReady(
- [&](const DeviceId&, const std::string&, std::shared_ptr<ChannelSocket> socket) {
- if (socket && socket->name() == "sip")
- bobSocket = socket->underlyingSocket();
- cv.notify_one();
- });
+ std::condition_variable alicConVar;
+ bool isAlicConnected = false;
+ auto conctDevicCalBack = [&](std::shared_ptr<ChannelSocket> socket, const DeviceId&) {
+ if (socket) { isAlicConnected = true; }
+ alicConVar.notify_one();
+ };
- aliceAccount->connectionManager().connectDevice(bobDeviceId,
- "sip",
- [&](std::shared_ptr<ChannelSocket> socket,
- const DeviceId&) {
- if (socket) {
- aliceSocket = socket->underlyingSocket();
- successfullyConnected = true;
- }
- cv.notify_one();
- });
- // connectDevice is full async, so isConnecting will be true after a few ms.
- CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&] { return aliceSocket && bobSocket && successfullyConnected; }));
- CPPUNIT_ASSERT(aliceSocket->canSendBeacon());
+ alice->connectionManager->connectDevice(bob->id.second, "dumyName", conctDevicCalBack);
- // Because onConnectionReady is true before version is sent, we can wait a bit
- // before canSendBeacon is true.
- auto start = std::chrono::steady_clock::now();
- auto aliceCanSendBeacon = false;
- auto bobCanSendBeacon = false;
- do {
- aliceCanSendBeacon = aliceSocket->canSendBeacon();
- bobCanSendBeacon = bobSocket->canSendBeacon();
- if (!bobCanSendBeacon || !aliceCanSendBeacon)
- std::this_thread::sleep_for(1s);
- } while ((not bobCanSendBeacon or not aliceCanSendBeacon)
- and std::chrono::steady_clock::now() - start < 5s);
-
- CPPUNIT_ASSERT(bobCanSendBeacon && aliceCanSendBeacon);*/
+ //Step 4: to check if Alice connected to Bob?
+ CPPUNIT_ASSERT(alicConVar.wait_for(lock, 60s, [&] { return isAlicConnected; }));
}
-void
-ConnectionManagerTest::testCannotSendBeacon()
-{
- /*auto aliceAccount = Manager::instance().getAccount<JamiAccount>(aliceId);
- auto bobAccount = Manager::instance().getAccount<JamiAccount>(bobId);
- auto bobDeviceId = DeviceId(std::string(bobAccount->currentDeviceId()));
- bobAccount->connectionManager().onICERequest([](const DeviceId&) { return true; });
- aliceAccount->connectionManager().onICERequest([](const DeviceId&) { return true; });
- std::mutex mtx;
- std::unique_lock<std::mutex> lk {mtx};
- std::condition_variable cv;
- bool successfullyConnected = false;
+// /*
+// void
+// ConnectionManagerTest::testAcceptConnection()
+// {
+// auto aliceAccount = Manager::instance().getAccount<JamiAccount>(aliceId);
+// auto bobAccount = Manager::instance().getAccount<JamiAccount>(bobId);
+// auto bobDeviceId = DeviceId(std::string(bobAccount->currentDeviceId()));
- std::shared_ptr<MultiplexedSocket> aliceSocket, bobSocket;
- bobAccount->connectionManager().onChannelRequest(
- [&](const std::shared_ptr<dht::crypto::Certificate>&, const std::string&) { return true; });
- bobAccount->connectionManager().onConnectionReady(
- [&](const DeviceId&, const std::string&, std::shared_ptr<ChannelSocket> socket) {
- if (socket && socket->name() == "sip")
- bobSocket = socket->underlyingSocket();
- cv.notify_one();
- });
+// bobAccount->connectionManager().onICERequest([](const DeviceId&) { return true; });
+// aliceAccount->connectionManager().onICERequest([](const DeviceId&) { return true; });
- aliceAccount->connectionManager().connectDevice(bobDeviceId,
- "sip",
- [&](std::shared_ptr<ChannelSocket> socket,
- const DeviceId&) {
- if (socket) {
- aliceSocket = socket->underlyingSocket();
- successfullyConnected = true;
- }
- cv.notify_one();
- });
- // connectDevice is full async, so isConnecting will be true after a few ms.
- CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&] { return aliceSocket && bobSocket; }));
+// std::mutex mtx;
+// std::unique_lock<std::mutex> lk {mtx};
+// std::condition_variable cv;
+// bool successfullyConnected = false;
+// bool successfullyReceive = false;
+// bool receiverConnected = false;
- int version = 1412;
- bobSocket->setOnVersionCb([&](auto v) {
- version = v;
- cv.notify_one();
- });
- aliceSocket->setVersion(0);
- aliceSocket->sendVersion();
- CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&] { return version == 0; }));
- CPPUNIT_ASSERT(!bobSocket->canSendBeacon());*/
-}
+// bobAccount->connectionManager().onChannelRequest(
+// [&successfullyReceive](const std::shared_ptr<dht::crypto::Certificate>&,
+// const std::string& name) {
+// successfullyReceive = name == "git://*";
+// return true;
+// });
-void
-ConnectionManagerTest::testConnectivityChangeTriggerBeacon()
-{
- /*auto aliceAccount = Manager::instance().getAccount<JamiAccount>(aliceId);
- auto bobAccount = Manager::instance().getAccount<JamiAccount>(bobId);
- auto bobDeviceId = DeviceId(std::string(bobAccount->currentDeviceId()));
+// bobAccount->connectionManager().onConnectionReady(
+// [&receiverConnected](const DeviceId&,
+// const std::string& name,
+// std::shared_ptr<ChannelSocket> socket) {
+// receiverConnected = socket && (name == "git://*");
+// });
- bobAccount->connectionManager().onICERequest([](const DeviceId&) { return true; });
- aliceAccount->connectionManager().onICERequest([](const DeviceId&) { return true; });
+// aliceAccount->connectionManager().connectDevice(bobDeviceId,
+// "git://*",
+// [&](std::shared_ptr<ChannelSocket> socket,
+// const DeviceId&) {
+// if (socket) {
+// successfullyConnected = true;
+// }
+// cv.notify_one();
+// });
- std::mutex mtx;
- std::unique_lock<std::mutex> lk {mtx};
- std::condition_variable cv;
- bool successfullyConnected = false;
+// CPPUNIT_ASSERT(cv.wait_for(lk, 60s, [&] {
+// return successfullyReceive && successfullyConnected && receiverConnected;
+// }));
+// }
+// */
+// void
+// ConnectionManagerTest::testAcceptConnection()
+// {
- std::shared_ptr<MultiplexedSocket> aliceSocket, bobSocket;
- bobAccount->connectionManager().onChannelRequest(
- [&](const std::shared_ptr<dht::crypto::Certificate>&, const std::string&) { return true; });
- bobAccount->connectionManager().onConnectionReady(
- [&](const DeviceId&, const std::string&, std::shared_ptr<ChannelSocket> socket) {
- if (socket && socket->name() == "sip")
- bobSocket = socket->underlyingSocket();
- cv.notify_one();
- });
+// std::condition_variable cv;
+// bool successfullyConnected = false;
+// bool successfullyReceive = false;
- aliceAccount->connectionManager().connectDevice(bobDeviceId,
- "sip",
- [&](std::shared_ptr<ChannelSocket> socket,
- const DeviceId&) {
- if (socket) {
- aliceSocket = socket->underlyingSocket();
- successfullyConnected = true;
- }
- cv.notify_one();
- });
- // connectDevice is full async, so isConnecting will be true after a few ms.
- CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&] { return aliceSocket && bobSocket; }));
+// auto chanlReqCalBack = [&successfullyReceive]
+// (const std::shared_ptr<dht::crypto::Certificate>&, const std::string& name)
+// {
+// successfullyReceive = name == "dumyname";
+// return true;
+// };
- bool hasRequest = false;
- bobSocket->setOnBeaconCb([&](auto p) {
- if (p)
- hasRequest = true;
- cv.notify_one();
- });
- aliceAccount->connectionManager().connectivityChanged();
- CPPUNIT_ASSERT(cv.wait_for(lk, 10s, [&] { return hasRequest; }));*/
-}
+// bobConMngr.onChannelRequest(chanlReqCalBack);
-void
-ConnectionManagerTest::testOnNoBeaconTriggersShutdown()
-{
- /*auto aliceAccount = Manager::instance().getAccount<JamiAccount>(aliceId);
- auto bobAccount = Manager::instance().getAccount<JamiAccount>(bobId);
- auto bobDeviceId = DeviceId(std::string(bobAccount->currentDeviceId()));
- bobAccount->connectionManager().onICERequest([](const DeviceId&) { return true; });
- aliceAccount->connectionManager().onICERequest([](const DeviceId&) { return true; });
- std::mutex mtx;
- std::unique_lock<std::mutex> lk {mtx};
- std::condition_variable cv;
- bool successfullyConnected = false;
+// bool receiverConnected = false;
- std::shared_ptr<MultiplexedSocket> aliceSocket, bobSocket;
- bobAccount->connectionManager().onChannelRequest(
- [&](const std::shared_ptr<dht::crypto::Certificate>&, const std::string&) { return true; });
- bobAccount->connectionManager().onConnectionReady(
- [&](const DeviceId&, const std::string&, std::shared_ptr<ChannelSocket> socket) {
- if (socket && socket->name() == "sip")
- bobSocket = socket->underlyingSocket();
- cv.notify_one();
- });
+// auto conctReadyCalBack =[&receiverConnected]
+// (const DeviceId& deviceId, const std::string& name, std::shared_ptr<ChannelSocket> socket)
+// {
+// receiverConnected = socket && (name == "dumyname");
+// };
+
+// bobConMngr.onConnectionReady(conctReadyCalBack);
- aliceAccount->connectionManager().connectDevice(bobDeviceId,
- "sip",
- [&](std::shared_ptr<ChannelSocket> socket,
- const DeviceId&) {
- if (socket) {
- aliceSocket = socket->underlyingSocket();
- successfullyConnected = true;
- }
- cv.notify_one();
- });
- // connectDevice is full async, so isConnecting will be true after a few ms.
- CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&] { return aliceSocket && bobSocket; }));
- bool isClosed = false;
- aliceSocket->onShutdown([&] {
- isClosed = true;
- cv.notify_one();
- });
- bobSocket->answerToBeacon(false);
- aliceAccount->connectionManager().connectivityChanged();
- CPPUNIT_ASSERT(cv.wait_for(lk, 10s, [&] { return isClosed; }));*/
-}
+// auto conctDevicCalBack =[&]
+// (std::shared_ptr<ChannelSocket> socket, const DeviceId&)
+// {
+// if (socket)
+// successfullyConnected = true;
+// cv.notify_one();
+// };
-void
-ConnectionManagerTest::testShutdownWhileNegotiating()
-{
- /*auto aliceAccount = Manager::instance().getAccount<JamiAccount>(aliceId);
- auto bobAccount = Manager::instance().getAccount<JamiAccount>(bobId);
- auto bobDeviceId = DeviceId(std::string(bobAccount->currentDeviceId()));
+// alicConMngr.connectDevice(bobDevicId, "dumyname", conctDevicCalBack);
- aliceAccount->connectionManager().onICERequest([](const DeviceId&) { return true; });
- std::mutex mtx;
- std::unique_lock<std::mutex> lk {mtx};
- std::condition_variable cv;
- bool successfullyReceive = false;
- bool notConnected = false;
- bobAccount->connectionManager().onICERequest([&](const DeviceId&) {
- successfullyReceive = true;
- cv.notify_one();
- return true;
- });
+// CPPUNIT_ASSERT(cv.wait_for(lk, 60s, [&] {
+// return successfullyReceive && successfullyConnected && receiverConnected;
+// }));
- aliceAccount->connectionManager().connectDevice(bobDeviceId,
- "git://*",
- [&](std::shared_ptr<ChannelSocket> socket,
- const DeviceId&) {
- notConnected = !socket;
- cv.notify_one();
- });
+// }
- CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&] { return successfullyReceive; }));
- Manager::instance().setAccountActive(aliceId, false, true);
- CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&] { return notConnected; }));*/
-}
+// /*
+// void
+// ConnectionManagerTest::testDeclineConnection()
+// {
+// auto aliceAccount = Manager::instance().getAccount<JamiAccount>(aliceId);
+// auto bobAccount = Manager::instance().getAccount<JamiAccount>(bobId);
+// auto bobDeviceId = DeviceId(std::string(bobAccount->currentDeviceId()));
+
+// bobAccount->connectionManager().onICERequest([](const DeviceId&) { return true; });
+// aliceAccount->connectionManager().onICERequest([](const DeviceId&) { return true; });
+
+// std::mutex mtx;
+// std::unique_lock<std::mutex> lk {mtx};
+// std::condition_variable cv;
+// bool successfullyConnected = false;
+// bool successfullyReceive = false;
+// bool receiverConnected = false;
+
+// bobAccount->connectionManager().onChannelRequest(
+// [&successfullyReceive](const std::shared_ptr<dht::crypto::Certificate>&,
+// const std::string&) {
+// successfullyReceive = true;
+// return false;
+// });
+
+// bobAccount->connectionManager().onConnectionReady(
+// [&receiverConnected](const DeviceId&,
+// const std::string&,
+// std::shared_ptr<ChannelSocket> socket) {
+// if (socket)
+// receiverConnected = true;
+// });
+
+// aliceAccount->connectionManager().connectDevice(bobDeviceId,
+// "git://*",
+// [&](std::shared_ptr<ChannelSocket> socket,
+// const DeviceId&) {
+// if (socket) {
+// successfullyConnected = true;
+// }
+// cv.notify_one();
+// });
+// cv.wait_for(lk, 30s);
+// CPPUNIT_ASSERT(successfullyReceive);
+// CPPUNIT_ASSERT(!successfullyConnected);
+// CPPUNIT_ASSERT(!receiverConnected);
+// }
+// */
+// void
+// ConnectionManagerTest::testDeclineConnection()
+// {
+
+// std::condition_variable cv;
+// bool successfullyConnected = false;
+// bool successfullyReceive = false;
+// bool receiverConnected = false;
+
+
+// auto chanlReqCalBack = [&successfullyReceive]
+// (const std::shared_ptr<dht::crypto::Certificate>&, const std::string&)
+// {
+// successfullyReceive = true;
+// return false; //this is the point??????????????????????????????????????????????????????
+// };
+
+// bobConMngr.onChannelRequest(chanlReqCalBack);
+
+
+// auto conctReadyCalBack =[&receiverConnected]
+// (const DeviceId&, const std::string&, std::shared_ptr<ChannelSocket> socket)
+// {
+// if (socket)
+// receiverConnected = true;
+// };
+
+// bobConMngr.onConnectionReady(conctReadyCalBack);
+
+
+// auto conctDevicCalBack =[&]
+// (std::shared_ptr<ChannelSocket> socket, const DeviceId&)
+// {
+// if (socket)
+// successfullyConnected = true;
+// cv.notify_one();
+// };
+
+
+// alicConMngr.connectDevice(bobDevicId, "dumyname", conctDevicCalBack);
+
+
+// cv.wait_for(lk, 30s);
+// CPPUNIT_ASSERT(successfullyReceive);
+// CPPUNIT_ASSERT(!successfullyConnected);
+// CPPUNIT_ASSERT(!receiverConnected);
+// }
+
+
+
+
+// /*
+// void
+// ConnectionManagerTest::testMultipleChannels()
+// {
+// auto aliceAccount = Manager::instance().getAccount<JamiAccount>(aliceId);
+// auto bobAccount = Manager::instance().getAccount<JamiAccount>(bobId);
+// auto bobDeviceId = DeviceId(std::string(bobAccount->currentDeviceId()));
+
+// bobAccount->connectionManager().onICERequest([](const DeviceId&) { return true; });
+// aliceAccount->connectionManager().onICERequest([](const DeviceId&) { return true; });
+
+// std::mutex mtx;
+// std::unique_lock<std::mutex> lk {mtx};
+// std::condition_variable cv;
+// bool successfullyConnected = false;
+// bool successfullyConnected2 = false;
+// int receiverConnected = 0;
+
+// bobAccount->connectionManager().onChannelRequest(
+// [](const std::shared_ptr<dht::crypto::Certificate>&, const std::string&) { return true; });
+
+// bobAccount->connectionManager().onConnectionReady(
+// [&receiverConnected](const DeviceId&,
+// const std::string&,
+// std::shared_ptr<ChannelSocket> socket) {
+// if (socket)
+// receiverConnected += 1;
+// });
+
+// aliceAccount->connectionManager().connectDevice(bobDeviceId,
+// "git://*",
+// [&](std::shared_ptr<ChannelSocket> socket,
+// const DeviceId&) {
+// if (socket) {
+// successfullyConnected = true;
+// }
+// cv.notify_one();
+// });
+
+// aliceAccount->connectionManager().connectDevice(bobDeviceId,
+// "sip://*",
+// [&](std::shared_ptr<ChannelSocket> socket,
+// const DeviceId&) {
+// if (socket) {
+// successfullyConnected2 = true;
+// }
+// cv.notify_one();
+// });
+
+// CPPUNIT_ASSERT(cv.wait_for(lk, 60s, [&] {
+// return successfullyConnected && successfullyConnected2 && receiverConnected == 2;
+// }));
+// CPPUNIT_ASSERT(aliceAccount->connectionManager().activeSockets() == 1);
+// }
+// */
+// void
+// ConnectionManagerTest::testMultipleChannels()
+// {
+// std::condition_variable cv;
+// bool successfullyConnected = false;
+// bool successfullyConnected2 = false;
+// int receiverConnected = 0;
+
+// auto chanlReqCalBack = []
+// (const std::shared_ptr<dht::crypto::Certificate>&, const std::string&)
+// {
+// return true;
+// };
+
+// bobConMngr.onChannelRequest(chanlReqCalBack);
+
+
+// auto conctReadyCalBack =[&receiverConnected]
+// (const DeviceId&, const std::string&, std::shared_ptr<ChannelSocket> socket)
+// {
+// if (socket)
+// receiverConnected += 1;
+// };
+
+// bobConMngr.onConnectionReady(conctReadyCalBack);
+
+
+// auto conctDevicCalBack =[&]
+// (std::shared_ptr<ChannelSocket> socket, const DeviceId&)
+// {
+// if (socket)
+// successfullyConnected = true;
+// cv.notify_one();
+// };
+
+// alicConMngr.connectDevice(bobDevicId, "git://*", conctDevicCalBack);
+
+
+// auto conctDevicCalBack =[&]
+// (std::shared_ptr<ChannelSocket> socket, const DeviceId&)
+// {
+// if (socket)
+// successfullyConnected2 = true;
+// cv.notify_one();
+// };
+
+// alicConMngr.connectDevice(bobDevicId, "sip://*", conctDevicCalBack);
+
+
+// CPPUNIT_ASSERT(cv.wait_for(lk, 60s, [&] {
+// return successfullyConnected && successfullyConnected2 && receiverConnected == 2;
+// }));
+// CPPUNIT_ASSERT(alicConMngr.activeSockets() == 1);
+// }
+
+// /*void
+// ConnectionManagerTest::testMultipleChannelsOneDeclined()
+// {
+// auto aliceAccount = Manager::instance().getAccount<JamiAccount>(aliceId);
+// auto bobAccount = Manager::instance().getAccount<JamiAccount>(bobId);
+// auto bobDeviceId = DeviceId(std::string(bobAccount->currentDeviceId()));
+
+// bobAccount->connectionManager().onICERequest([](const DeviceId&) { return true; });
+// aliceAccount->connectionManager().onICERequest([](const DeviceId&) { return true; });
+
+// std::mutex mtx;
+// std::unique_lock<std::mutex> lk {mtx};
+// std::condition_variable cv;
+// bool successfullyNotConnected = false;
+// bool successfullyConnected2 = false;
+// int receiverConnected = 0;
+
+// bobAccount->connectionManager().onChannelRequest(
+// [](const std::shared_ptr<dht::crypto::Certificate>&, const std::string& name) {
+// if (name == "git://*")
+// return false;
+// return true;
+// });
+
+// bobAccount->connectionManager().onConnectionReady(
+// [&](const DeviceId&, const std::string&, std::shared_ptr<ChannelSocket> socket) {
+// if (socket)
+// receiverConnected += 1;
+// cv.notify_one();
+// });
+
+// aliceAccount->connectionManager().connectDevice(bobDeviceId,
+// "git://*",
+// [&](std::shared_ptr<ChannelSocket> socket,
+// const DeviceId&) {
+// if (!socket)
+// successfullyNotConnected = true;
+// cv.notify_one();
+// });
+
+// aliceAccount->connectionManager().connectDevice(bobDeviceId,
+// "sip://*",
+// [&](std::shared_ptr<ChannelSocket> socket,
+// const DeviceId&) {
+// if (socket)
+// successfullyConnected2 = true;
+// cv.notify_one();
+// });
+
+// CPPUNIT_ASSERT(cv.wait_for(lk, 60s, [&] {
+// return successfullyNotConnected && successfullyConnected2 && receiverConnected == 1;
+// }));
+// CPPUNIT_ASSERT(aliceAccount->connectionManager().activeSockets() == 1);
+// }
+// */
+// void
+// ConnectionManagerTest::testMultipleChannelsOneDeclined()
+// {
+
+// std::condition_variable cv;
+// bool successfullyNotConnected = false;
+// bool successfullyConnected2 = false;
+// int receiverConnected = 0;
+
+
+// auto chanlReqCalBack = []
+// (const std::shared_ptr<dht::crypto::Certificate>&, const std::string& name)
+// {
+// if (name == "git://*")
+// return false;
+// return true;
+// };
+
+// bobConMngr.onChannelRequest(chanlReqCalBack);
+
+
+// auto conctReadyCalBack =[&receiverConnected]
+// (const DeviceId&, const std::string&, std::shared_ptr<ChannelSocket> socket)
+// {
+// if (socket)
+// receiverConnected += 1;
+// };
+
+// bobConMngr.onConnectionReady(conctReadyCalBack);
+
+
+// auto conctDevicCalBack =[&]
+// (std::shared_ptr<ChannelSocket> socket, const DeviceId&)
+// {
+// if (socket)
+// successfullyConnected = true;
+// cv.notify_one();
+// };
+
+// alicConMngr.connectDevice(bobDevicId, "git://*", conctDevicCalBack);
+
+
+// auto conctDevicCalBack =[&]
+// (std::shared_ptr<ChannelSocket> socket, const DeviceId&)
+// {
+// if (socket)
+// successfullyConnected2 = true;
+// cv.notify_one();
+// };
+
+// alicConMngr.connectDevice(bobDevicId, "sip://*", conctDevicCalBack);
+
+
+
+// CPPUNIT_ASSERT(cv.wait_for(lk, 60s, [&] {
+// return successfullyNotConnected && successfullyConnected2 && receiverConnected == 1;
+// }));
+// CPPUNIT_ASSERT(aliceAccount->connectionManager().activeSockets() == 1);
+// }
+
+// /*
+// void
+// ConnectionManagerTest::testMultipleChannelsSameName()
+// {
+// std::condition_variable cv;
+// bool successfullyConnected = false;
+// bool successfullyConnected2 = false;
+// int receiverConnected = 0;
+
+// bobAccount->connectionManager().onChannelRequest(
+// [](const std::shared_ptr<dht::crypto::Certificate>&, const std::string&) { return true; });
+
+// bobAccount->connectionManager().onConnectionReady(
+// [&receiverConnected](const DeviceId&,
+// const std::string&,
+// std::shared_ptr<ChannelSocket> socket) {
+// if (socket)
+// receiverConnected += 1;
+// });
+
+// aliceAccount->connectionManager().connectDevice(bobDeviceId,
+// "git://*",
+// [&](std::shared_ptr<ChannelSocket> socket,
+// const DeviceId&) {
+// if (socket) {
+// successfullyConnected = true;
+// }
+// cv.notify_one();
+// });
+
+// // We can open two sockets with the same name, it will be two different channel
+// aliceAccount->connectionManager().connectDevice(bobDeviceId,
+// "git://*",
+// [&](std::shared_ptr<ChannelSocket> socket,
+// const DeviceId&) {
+// if (socket) {
+// successfullyConnected2 = true;
+// }
+// cv.notify_one();
+// });
+
+// CPPUNIT_ASSERT(cv.wait_for(lk, 60s, [&] {
+// return successfullyConnected && successfullyConnected2 && receiverConnected == 2;
+// }));
+// }
+// */
+// void
+// ConnectionManagerTest::testMultipleChannelsSameName()
+// {
+// std::condition_variable cv;
+// bool successfullyConnected = false;
+// bool successfullyConnected2 = false;
+// int receiverConnected = 0;
+
+
+
+// auto chanlReqCalBack = []
+// (const std::shared_ptr<dht::crypto::Certificate>&, const std::string& name)
+// {
+// return true;
+// };
+
+// bobConMngr.onChannelRequest(chanlReqCalBack);
+
+
+// auto conctReadyCalBack =[&receiverConnected]
+// (const DeviceId&, const std::string&, std::shared_ptr<ChannelSocket> socket)
+// {
+// if (socket)
+// receiverConnected += 1;
+// };
+
+// bobConMngr.onConnectionReady(conctReadyCalBack);
+
+
+// auto conctDevicCalBack =[&]
+// (std::shared_ptr<ChannelSocket> socket, const DeviceId&)
+// {
+// if (socket)
+// successfullyConnected = true;
+// cv.notify_one();
+// };
+
+// alicConMngr.connectDevice(bobDevicId, "git://*", conctDevicCalBack);
+
+
+// auto conctDevicCalBack =[&]
+// (std::shared_ptr<ChannelSocket> socket, const DeviceId&)
+// {
+// if (socket)
+// successfullyConnected2 = true;
+// cv.notify_one();
+// };
+
+// alicConMngr.connectDevice(bobDevicId, "sip://*", conctDevicCalBack);
+
+
+// CPPUNIT_ASSERT(cv.wait_for(lk, 60s, [&] {
+// return successfullyConnected && successfullyConnected2 && receiverConnected == 2;
+// }));
+// }
+
+// //Explain this more
+// /*
+// void
+// ConnectionManagerTest::testSendReceiveData()
+// {
+// auto aliceAccount = Manager::instance().getAccount<JamiAccount>(aliceId);
+// auto bobAccount = Manager::instance().getAccount<JamiAccount>(bobId);
+// auto bobDeviceId = DeviceId(std::string(bobAccount->currentDeviceId()));
+
+// bobAccount->connectionManager().onICERequest([](const DeviceId&) { return true; });
+// aliceAccount->connectionManager().onICERequest([](const DeviceId&) { return true; });
+
+// std::mutex mtx;
+// std::unique_lock<std::mutex> lk {mtx};
+// std::condition_variable cv;
+// std::atomic_int events(0);
+// bool successfullyConnected = false, successfullyConnected2 = false, successfullyReceive = false,
+// receiverConnected = false;
+// const uint8_t buf_other[] = {0x64, 0x65, 0x66, 0x67};
+// const uint8_t buf_test[] = {0x68, 0x69, 0x70, 0x71};
+// bool dataOk = false, dataOk2 = false;
+
+// bobAccount->connectionManager().onChannelRequest(
+// [&successfullyReceive](const std::shared_ptr<dht::crypto::Certificate>&,
+// const std::string&) {
+// successfullyReceive = true;
+// return true;
+// });
+
+// bobAccount->connectionManager().onConnectionReady(
+// [&](const DeviceId&, const std::string& name, std::shared_ptr<ChannelSocket> socket) {
+// if (socket && (name == "test" || name == "other")) {
+// receiverConnected = true;
+// std::error_code ec;
+// auto res = socket->waitForData(std::chrono::milliseconds(5000), ec);
+// if (res == 4) {
+// uint8_t buf[4];
+// socket->read(&buf[0], 4, ec);
+// if (name == "test")
+// dataOk = std::equal(std::begin(buf), std::end(buf), std::begin(buf_test));
+// else
+// dataOk2 = std::equal(std::begin(buf), std::end(buf), std::begin(buf_other));
+// events++;
+// cv.notify_one();
+// }
+// }
+// });
+
+// aliceAccount->connectionManager().connectDevice(bobDeviceId,
+// "test",
+// [&](std::shared_ptr<ChannelSocket> socket,
+// const DeviceId&) {
+// if (socket) {
+// successfullyConnected = true;
+// std::error_code ec;
+// socket->write(&buf_test[0], 4, ec);
+// }
+// events++;
+// cv.notify_one();
+// });
+
+// aliceAccount->connectionManager().connectDevice(bobDeviceId,
+// "other",
+// [&](std::shared_ptr<ChannelSocket> socket,
+// const DeviceId&) {
+// if (socket) {
+// successfullyConnected2 = true;
+// std::error_code ec;
+// socket->write(&buf_other[0], 4, ec);
+// }
+// events++;
+// cv.notify_one();
+// });
+
+// CPPUNIT_ASSERT(cv.wait_for(lk, 60s, [&] {
+// return events == 4 && successfullyReceive && successfullyConnected && successfullyConnected2
+// && dataOk && dataOk2;
+// }));
+// }
+// */
+// void
+// ConnectionManagerTest::testSendReceiveData()
+// {
+
+// std::condition_variable cv;
+// std::atomic_int events(0);
+// bool successfullyConnected = false;
+// bool successfullyConnected2 = false;
+// bool successfullyReceive = false;
+// bool receiverConnected = false;
+
+// const uint8_t buf_other[] = {0x64, 0x65, 0x66, 0x67};
+// const uint8_t buf_test[] = {0x68, 0x69, 0x70, 0x71};
+// bool dataOk = false;
+// bool dataOk2 = false;
+
+
+// auto chanlReqCalBack = [&successfullyReceive]
+// (const std::shared_ptr<dht::crypto::Certificate>&, const std::string&)
+// {
+// successfullyReceive = true;
+// return true;
+// };
+
+// bobConMngr.onChannelRequest(chanlReqCalBack);
+
+
+// auto conctReadyCalBack =[&]
+// (const DeviceId&, const std::string& name, std::shared_ptr<ChannelSocket> socket)
+// {
+// if (socket && (name == "test" || name == "other")) {
+// receiverConnected = true;
+// std::error_code ec;
+// auto res = socket->waitForData(std::chrono::milliseconds(5000), ec);
+// if (res == 4) {
+// uint8_t buf[4];
+// socket->read(&buf[0], 4, ec);
+// if (name == "test")
+// dataOk = std::equal(std::begin(buf), std::end(buf), std::begin(buf_test));
+// else
+// dataOk2 = std::equal(std::begin(buf), std::end(buf), std::begin(buf_other));
+// events++;
+// cv.notify_one();
+// }
+// }
+// };
+
+// bobConMngr.onConnectionReady(conctReadyCalBack);
+
+
+// auto conctDevicCalBack =[&]
+// (std::shared_ptr<ChannelSocket> socket, const DeviceId&)
+// {
+// if (socket) {
+// successfullyConnected = true;
+// std::error_code ec;
+// socket->write(&buf_test[0], 4, ec);
+// }
+// events++;
+// cv.notify_one();
+// };
+
+
+// alicConMngr.connectDevice(bobDevicId, "test", conctDevicCalBack);
+
+
+// auto conctDevicCalBack2 = [&]
+// (std::shared_ptr<ChannelSocket> socket, const DeviceId&)
+// {
+// if (socket) {
+// successfullyConnected2 = true;
+// std::error_code ec;
+// socket->write(&buf_other[0], 4, ec);
+// }
+// events++;
+// cv.notify_one();
+// };
+
+// alicConMngr.connectDevice(bobDevicId, "other", conctDevicCalBack2);
+
+
+// CPPUNIT_ASSERT(cv.wait_for(lk, 60s, [&] {
+// return events == 4 && successfullyReceive && successfullyConnected && successfullyConnected2
+// && dataOk && dataOk2;
+// }));
+// }
+
+
+
+// /* void
+// ConnectionManagerTest::testAcceptsICERequest()
+// {
+// auto aliceAccount = Manager::instance().getAccount<JamiAccount>(aliceId);
+// auto bobAccount = Manager::instance().getAccount<JamiAccount>(bobId);
+// auto bobDeviceId = DeviceId(std::string(bobAccount->currentDeviceId()));
+
+// aliceAccount->connectionManager().onICERequest([](const DeviceId&) { return true; });
+
+// std::mutex mtx;
+// std::unique_lock<std::mutex> lk {mtx};
+// std::condition_variable cv;
+// bool successfullyConnected = false;
+// bool successfullyReceive = false;
+// bool receiverConnected = false;
+
+// bobAccount->connectionManager().onChannelRequest(
+// [](const std::shared_ptr<dht::crypto::Certificate>&, const std::string&) { return true; });
+// bobAccount->connectionManager().onICERequest([&](const DeviceId&) {
+// successfullyReceive = true;
+// return true;
+// });
+
+// bobAccount->connectionManager().onConnectionReady(
+// [&receiverConnected](const DeviceId&,
+// const std::string& name,
+// std::shared_ptr<ChannelSocket> socket) {
+// receiverConnected = socket && (name == "git://*");
+// });
+
+// aliceAccount->connectionManager().connectDevice(bobDeviceId,
+// "git://*",
+// [&](std::shared_ptr<ChannelSocket> socket,
+// const DeviceId&) {
+// if (socket) {
+// successfullyConnected = true;
+// }
+// cv.notify_one();
+// });
+
+// CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&] {
+// return successfullyReceive && successfullyConnected && receiverConnected;
+// }));
+// } */
+// void
+// ConnectionManagerTest::testAcceptsICERequest()
+// {
+
+// aliceAccount->connectionManager().onICERequest([](const DeviceId&) { return true; });
+
+// std::mutex mtx;
+// std::unique_lock<std::mutex> lk {mtx};
+// std::condition_variable cv;
+// bool successfullyConnected = false;
+// bool successfullyReceive = false;
+// bool receiverConnected = false;
+
+// bobAccount->connectionManager().onChannelRequest(
+// [](const std::shared_ptr<dht::crypto::Certificate>&, const std::string&) { return true; });
+
+// bobAccount->connectionManager().onICERequest([&](const DeviceId&) {
+// successfullyReceive = true;
+// return true;
+// });
+
+// bobAccount->connectionManager().onConnectionReady(
+// [&receiverConnected](const DeviceId&,
+// const std::string& name,
+// std::shared_ptr<ChannelSocket> socket) {
+// receiverConnected = socket && (name == "git://*");
+// });
+
+// aliceAccount->connectionManager().connectDevice(bobDeviceId,
+// "git://*",
+// [&](std::shared_ptr<ChannelSocket> socket,
+// const DeviceId&) {
+// if (socket) {
+// successfullyConnected = true;
+// }
+// cv.notify_one();
+// });
+
+// CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&] {
+// return successfullyReceive && successfullyConnected && receiverConnected;
+// }));
+// }
+
+// /* void
+// ConnectionManagerTest::testDeclineICERequest()
+// {
+// auto aliceAccount = Manager::instance().getAccount<JamiAccount>(aliceId);
+// auto bobAccount = Manager::instance().getAccount<JamiAccount>(bobId);
+// auto bobDeviceId = DeviceId(std::string(bobAccount->currentDeviceId()));
+
+// aliceAccount->connectionManager().onICERequest([](const DeviceId&) { return true; });
+
+// std::mutex mtx;
+// std::unique_lock<std::mutex> lk {mtx};
+// std::condition_variable cv;
+// bool successfullyConnected = false;
+// bool successfullyReceive = false;
+// bool receiverConnected = false;
+
+// bobAccount->connectionManager().onChannelRequest(
+// [](const std::shared_ptr<dht::crypto::Certificate>&, const std::string&) { return true; });
+// bobAccount->connectionManager().onICERequest([&](const DeviceId&) {
+// successfullyReceive = true;
+// return false;
+// });
+
+// bobAccount->connectionManager().onConnectionReady(
+// [&receiverConnected](const DeviceId&,
+// const std::string& name,
+// std::shared_ptr<ChannelSocket> socket) {
+// receiverConnected = socket && (name == "git://*");
+// });
+
+// aliceAccount->connectionManager().connectDevice(bobDeviceId,
+// "git://*",
+// [&](std::shared_ptr<ChannelSocket> socket,
+// const DeviceId&) {
+// if (socket) {
+// successfullyConnected = true;
+// }
+// cv.notify_one();
+// });
+
+// cv.wait_for(lk, 30s);
+// CPPUNIT_ASSERT(successfullyReceive);
+// CPPUNIT_ASSERT(!receiverConnected);
+// CPPUNIT_ASSERT(!successfullyConnected);
+// } */
+
+// //why you invoke other functions when you want to test ICErequest?
+// void
+// ConnectionManagerTest::testDeclineICERequest()
+// {
+
+// aliceAccount->connectionManager().onICERequest([](const DeviceId&) { return true; });
+
+
+// std::condition_variable cv;
+// bool successfullyConnected = false;
+// bool successfullyReceive = false;
+// bool receiverConnected = false;
+
+// bobAccount->connectionManager().onChannelRequest(
+// [](const std::shared_ptr<dht::crypto::Certificate>&, const std::string&) { return true; });
+
+// bobAccount->connectionManager().onICERequest([&](const DeviceId&) {
+// successfullyReceive = true;
+// return false; //???????????????????????? is this the point?
+// });
+
+// bobAccount->connectionManager().onConnectionReady(
+// [&receiverConnected](const DeviceId&,
+// const std::string& name,
+// std::shared_ptr<ChannelSocket> socket) {
+// receiverConnected = socket && (name == "git://*");
+// });
+
+// aliceAccount->connectionManager().connectDevice(bobDeviceId,
+// "git://*",
+// [&](std::shared_ptr<ChannelSocket> socket,
+// const DeviceId&) {
+// if (socket) {
+// successfullyConnected = true;
+// }
+// cv.notify_one();
+// });
+
+// cv.wait_for(lk, 30s);
+// CPPUNIT_ASSERT(successfullyReceive);
+// CPPUNIT_ASSERT(!receiverConnected);
+// CPPUNIT_ASSERT(!successfullyConnected);
+// }
+
+// //I think you testing something other than the current class!
+// /*
+// void
+// ConnectionManagerTest::testChannelRcvShutdown()
+// {
+// auto aliceAccount = Manager::instance().getAccount<JamiAccount>(aliceId);
+// auto bobAccount = Manager::instance().getAccount<JamiAccount>(bobId);
+// auto bobDeviceId = DeviceId(std::string(bobAccount->currentDeviceId()));
+
+// bobAccount->connectionManager().onICERequest([](const DeviceId&) { return true; });
+// aliceAccount->connectionManager().onICERequest([](const DeviceId&) { return true; });
+
+// std::mutex mtx;
+// std::unique_lock<std::mutex> lk {mtx};
+// std::condition_variable cv;
+// bool successfullyConnected = false;
+// bool shutdownReceived = false;
+
+// std::shared_ptr<ChannelSocket> bobSock;
+
+// bobAccount->connectionManager().onChannelRequest(
+// [](const std::shared_ptr<dht::crypto::Certificate>&, const std::string&) { return true; });
+
+// bobAccount->connectionManager().onConnectionReady(
+// [&](const DeviceId& did, const std::string& name, std::shared_ptr<ChannelSocket> socket) {
+// if (socket && name == "git://*" && did != bobDeviceId) {
+// bobSock = socket;
+// cv.notify_one();
+// }
+// });
+
+// aliceAccount->connectionManager().connectDevice(bobDeviceId,
+// "git://*",
+// [&](std::shared_ptr<ChannelSocket> socket,
+// const DeviceId&) {
+// if (socket) {
+// socket->onShutdown([&] {
+// shutdownReceived = true;
+// cv.notify_one();
+// });
+// successfullyConnected = true;
+// cv.notify_one();
+// }
+// });
+
+// CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&] { return bobSock && successfullyConnected; }));
+// bobSock->shutdown();
+// CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&] { return shutdownReceived; }));
+// }
+// */
+// void
+// ConnectionManagerTest::testChannelRcvShutdown()
+// {
+
+// std::condition_variable cv;
+// bool successfullyConnected = false;
+// bool shutdownReceived = false;
+
+// std::shared_ptr<ChannelSocket> bobSock;
+
+// bobAccount->connectionManager().onChannelRequest(
+// [](const std::shared_ptr<dht::crypto::Certificate>&, const std::string&) { return true; });
+
+// bobAccount->connectionManager().onConnectionReady(
+// [&](const DeviceId& did, const std::string& name, std::shared_ptr<ChannelSocket> socket) {
+// if (socket && name == "git://*" && did != bobDeviceId) {
+// bobSock = socket;
+// cv.notify_one();
+// }
+// });
+
+// aliceAccount->connectionManager().connectDevice(bobDeviceId,
+// "git://*",
+// [&](std::shared_ptr<ChannelSocket> socket,
+// const DeviceId&) {
+// if (socket) {
+// socket->onShutdown([&] {
+// shutdownReceived = true;
+// cv.notify_one();
+// });
+// successfullyConnected = true;
+// cv.notify_one();
+// }
+// });
+
+
+// CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&] { return bobSock && successfullyConnected; }));
+
+// bobSock->shutdown();
+
+// CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&] { return shutdownReceived; }));
+// }
+
+// //I think you testing something other than the current class!
+// void
+// ConnectionManagerTest::testChannelSenderShutdown()
+// {
+// auto aliceAccount = Manager::instance().getAccount<JamiAccount>(aliceId);
+// auto bobAccount = Manager::instance().getAccount<JamiAccount>(bobId);
+// auto bobDeviceId = DeviceId(std::string(bobAccount->currentDeviceId()));
+
+// bobAccount->connectionManager().onICERequest([](const DeviceId&) { return true; });
+// aliceAccount->connectionManager().onICERequest([](const DeviceId&) { return true; });
+
+// std::mutex mtx;
+// std::unique_lock<std::mutex> lk {mtx};
+// std::condition_variable rcv, scv;
+// bool successfullyConnected = false;
+// bool successfullyReceive = false;
+// bool receiverConnected = false;
+// bool shutdownReceived = false;
+
+// bobAccount->connectionManager().onChannelRequest(
+// [&successfullyReceive](const std::shared_ptr<dht::crypto::Certificate>&,
+// const std::string& name) {
+// successfullyReceive = name == "git://*";
+// return true;
+// });
+
+// bobAccount->connectionManager().onConnectionReady(
+// [&](const DeviceId&, const std::string& name, std::shared_ptr<ChannelSocket> socket) {
+// if (socket) {
+// socket->onShutdown([&] {
+// shutdownReceived = true;
+// scv.notify_one();
+// });
+// }
+// receiverConnected = socket && (name == "git://*");
+// });
+
+// aliceAccount->connectionManager().connectDevice(bobDeviceId,
+// "git://*",
+// [&](std::shared_ptr<ChannelSocket> socket,
+// const DeviceId&) {
+// if (socket) {
+// successfullyConnected = true;
+// rcv.notify_one();
+// socket->shutdown();
+// }
+// });
+
+// rcv.wait_for(lk, 30s);
+// scv.wait_for(lk, 30s);
+// CPPUNIT_ASSERT(shutdownReceived);
+// CPPUNIT_ASSERT(successfullyReceive);
+// CPPUNIT_ASSERT(successfullyConnected);
+// CPPUNIT_ASSERT(receiverConnected);
+// }
+
+// //how to get URI?
+// //The call back function has different logic. Also, there are cuncurrenct tasks here. Please explain them.
+// void
+// ConnectionManagerTest::testCloseConnectionWith()
+// {
+
+
+// auto bobUri = bobAccount->getUsername();
+
+// std::condition_variable rcv, scv;
+// std::atomic_int events(0);
+// bool successfullyConnected = false;
+// bool successfullyReceive = false;
+// bool receiverConnected = false;
+
+// auto chanlReqCalBack = [&successfullyReceive]
+// (const std::shared_ptr<dht::crypto::Certificate>&, const std::string& name)
+// {
+// successfullyReceive = name == "git://*";
+// return true;
+// };
+
+// bobConMngr.onChannelRequest(chanlReqCalBack);
+
+
+// auto conctReadyCalBack =[&]
+// (const DeviceId&, const std::string& name, std::shared_ptr<ChannelSocket> socket)
+// {
+// if (socket) {
+// socket->onShutdown([&] {
+// events += 1;// this is an atomic variable why not using atomic operation i.e event.fetch_add(1)
+// scv.notify_one();
+// });
+// }
+// receiverConnected = socket && (name == "git://*");
+// }
+
+// bobConMngr.onConnectionReady(conctReadyCalBack);
+
+
+// auto conctDevicCalBack =[&]
+// (std::shared_ptr<ChannelSocket> socket,const DeviceId&)
+// {
+// if (socket) {
+// socket->onShutdown([&] {
+// events += 1;
+// scv.notify_one();
+// });
+// successfullyConnected = true;
+// rcv.notify_one();
+// }
+// };
+
+// alicConMngr.connectDevice(bobDevicId, "git://*", conctDevicCalBack);
+
+
+// CPPUNIT_ASSERT(rcv.wait_for(lk, 60s, [&] {
+// return successfullyReceive && successfullyConnected && receiverConnected;
+// }));
+
+// // This should trigger onShutdown
+// alicConMngr.closeConnectionsWith(bobUri);
+
+// CPPUNIT_ASSERT(scv.wait_for(lk, 60s, [&] {
+// return events == 2;
+// }));
+// }
+
+// //explain algorithm
+// void
+// ConnectionManagerTest::testShutdownCallbacks()
+// {
+
+// auto aliceUri = aliceAccount->getUsername();
+
+// std::condition_variable rcv, chan2cv;
+// bool successfullyConnected = false;
+// bool successfullyReceive = false;
+// bool receiverConnected = false;
+
+// auto chanlReqCalBack = [&successfullyReceive, &chan2cv]
+// (const std::shared_ptr<dht::crypto::Certificate>&, const std::string& name)
+// {
+// if (name == "1") {
+// successfullyReceive = true;
+// } else {
+// chan2cv.notify_one();
+// // Do not return directly. Let the connection be closed
+// std::this_thread::sleep_for(10s);
+// }
+// return true;
+// };
+
+// bobConMngr.onChannelRequest(chanlReqCalBack);
+
+
+// auto conctReadyCalBack =[&]
+// (const DeviceId&, const std::string& name, std::shared_ptr<ChannelSocket> socket)
+// {
+// receiverConnected = socket && (name == "1");
+// };
+
+// bobConMngr.onConnectionReady(conctReadyCalBack);
+
+
+// auto conctDevicCalBack =[&]
+// (std::shared_ptr<ChannelSocket> socket, const DeviceId&)
+// {
+// if (socket) {
+// successfullyConnected = true;
+// rcv.notify_one();
+// }
+// };
+
+// alicConMngr.connectDevice(bobDeviceId, "1", conctDevicCalBack);
+
+
+// // Connect first channel. This will initiate a mx sock ?????????????????????????????????????????????????????
+// CPPUNIT_ASSERT(rcv.wait_for(lk, 30s, [&] {
+// return successfullyReceive && successfullyConnected && receiverConnected;
+// }));
+
+// // Connect another channel, but close the connection
+// bool channel2NotConnected = false;
+
+
+// auto conctDevicCalBack2 =[&]
+// (std::shared_ptr<ChannelSocket> socket, const DeviceId&)
+// {
+// channel2NotConnected = !socket;
+// rcv.notify_one();
+// };
+
+// alicConMngr.connectDevice(bobDeviceId, "2", conctDevicCalBack2);
+
+// chan2cv.wait_for(lk, 30s);
+
+// // This should trigger onShutdown for second callback
+// bobConMngr.closeConnectionsWith(aliceUri);
+// CPPUNIT_ASSERT(rcv.wait_for(lk, 30s, [&] { return channel2NotConnected; }));
+// }
+
+// //What is the story?
+// void
+// ConnectionManagerTest::testFloodSocket()
+// {
+// auto aliceAccount = Manager::instance().getAccount<JamiAccount>(aliceId);
+// auto bobAccount = Manager::instance().getAccount<JamiAccount>(bobId);
+// auto bobDeviceId = DeviceId(std::string(bobAccount->currentDeviceId()));
+// bobAccount->connectionManager().onICERequest([](const DeviceId&) { return true; });
+// aliceAccount->connectionManager().onICERequest([](const DeviceId&) { return true; });
+
+// std::mutex mtx;
+// std::unique_lock<std::mutex> lk {mtx};
+// std::condition_variable cv;
+// bool successfullyConnected = false;
+// bool successfullyReceive = false;
+// bool receiverConnected = false;
+// std::shared_ptr<ChannelSocket> rcvSock1, rcvSock2, rcvSock3, sendSock, sendSock2, sendSock3;
+
+// bobAccount->connectionManager().onChannelRequest(
+// [&successfullyReceive](const std::shared_ptr<dht::crypto::Certificate>&,
+// const std::string& name) {
+// successfullyReceive = name == "1";
+// return true;
+// });
+// bobAccount->connectionManager().onConnectionReady(
+// [&](const DeviceId&, const std::string& name, std::shared_ptr<ChannelSocket> socket) {
+// receiverConnected = socket != nullptr;
+// if (name == "1")
+// rcvSock1 = socket;
+// else if (name == "2")
+// rcvSock2 = socket;
+// else if (name == "3")
+// rcvSock3 = socket;
+// });
+// aliceAccount->connectionManager().connectDevice(bobDeviceId,
+// "1",
+// [&](std::shared_ptr<ChannelSocket> socket,
+// const DeviceId&) {
+// if (socket) {
+// sendSock = socket;
+// successfullyConnected = true;
+// }
+// cv.notify_one();
+// });
+// CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&] {
+// return successfullyReceive && successfullyConnected && receiverConnected;
+// }));
+// CPPUNIT_ASSERT(receiverConnected);
+// successfullyConnected = false;
+// receiverConnected = false;
+// aliceAccount->connectionManager().connectDevice(bobDeviceId,
+// "2",
+// [&](std::shared_ptr<ChannelSocket> socket,
+// const DeviceId&) {
+// if (socket) {
+// sendSock2 = socket;
+// successfullyConnected = true;
+// }
+// cv.notify_one();
+// });
+// CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&] { return successfullyConnected && receiverConnected; }));
+// successfullyConnected = false;
+// receiverConnected = false;
+// aliceAccount->connectionManager().connectDevice(bobDeviceId,
+// "3",
+// [&](std::shared_ptr<ChannelSocket> socket,
+// const DeviceId&) {
+// if (socket) {
+// sendSock3 = socket;
+// successfullyConnected = true;
+// }
+// cv.notify_one();
+// });
+// CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&] { return successfullyConnected && receiverConnected; }));
+
+// std::mutex mtxRcv {};
+// std::string alphabet, shouldRcv, rcv1, rcv2, rcv3;
+// for (int i = 0; i < 100; ++i)
+// alphabet += "QWERTYUIOPASDFGHJKLZXCVBNM";
+
+// // Qx8000
+// // Wx8000
+// // Ex8000
+// // ...
+// // Qx8000
+// // Wx8000
+// // Ex8000
+// // ... x 99
+// rcvSock1->setOnRecv([&](const uint8_t* buf, size_t len) {
+// rcv1 += std::string(buf, buf + len);
+// return len;
+// });
+// rcvSock2->setOnRecv([&](const uint8_t* buf, size_t len) {
+// rcv2 += std::string(buf, buf + len);
+// return len;
+// });
+// rcvSock3->setOnRecv([&](const uint8_t* buf, size_t len) {
+// rcv3 += std::string(buf, buf + len);
+// return len;
+// });
+// for (uint64_t i = 0; i < alphabet.size(); ++i) {
+// auto send = std::string(8000, alphabet[i]);
+// shouldRcv += send;
+// std::error_code ec;
+// sendSock->write(reinterpret_cast<unsigned char*>(send.data()), send.size(), ec);
+// sendSock2->write(reinterpret_cast<unsigned char*>(send.data()), send.size(), ec);
+// sendSock3->write(reinterpret_cast<unsigned char*>(send.data()), send.size(), ec);
+// CPPUNIT_ASSERT(!ec);
+// }
+// CPPUNIT_ASSERT(cv.wait_for(lk, 60s, [&] {
+// return shouldRcv == rcv1 && shouldRcv == rcv2 && shouldRcv == rcv3;
+// }));
+// }
+
+// void
+// ConnectionManagerTest::testDestroyWhileSending()
+// {
+// // Same as test before, but destroy the accounts while sending.
+// // This test if a segfault occurs
+// auto aliceAccount = Manager::instance().getAccount<JamiAccount>(aliceId);
+// auto bobAccount = Manager::instance().getAccount<JamiAccount>(bobId);
+// auto bobDeviceId = DeviceId(std::string(bobAccount->currentDeviceId()));
+// bobAccount->connectionManager().onICERequest([](const DeviceId&) { return true; });
+// aliceAccount->connectionManager().onICERequest([](const DeviceId&) { return true; });
+// std::mutex mtx;
+// std::unique_lock<std::mutex> lk {mtx};
+// std::condition_variable cv;
+// bool successfullyConnected = false;
+// bool successfullyReceive = false;
+// bool receiverConnected = false;
+// std::shared_ptr<ChannelSocket> rcvSock1, rcvSock2, rcvSock3, sendSock, sendSock2, sendSock3;
+// bobAccount->connectionManager().onChannelRequest(
+// [&successfullyReceive](const std::shared_ptr<dht::crypto::Certificate>&,
+// const std::string& name) {
+// successfullyReceive = name == "1";
+// return true;
+// });
+// bobAccount->connectionManager().onConnectionReady(
+// [&](const DeviceId&, const std::string& name, std::shared_ptr<ChannelSocket> socket) {
+// receiverConnected = socket != nullptr;
+// if (name == "1")
+// rcvSock1 = socket;
+// else if (name == "2")
+// rcvSock2 = socket;
+// else if (name == "3")
+// rcvSock3 = socket;
+// });
+// aliceAccount->connectionManager().connectDevice(bobDeviceId,
+// "1",
+// [&](std::shared_ptr<ChannelSocket> socket,
+// const DeviceId&) {
+// if (socket) {
+// sendSock = socket;
+// successfullyConnected = true;
+// }
+// cv.notify_one();
+// });
+// CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&] {
+// return successfullyReceive && successfullyConnected && receiverConnected;
+// }));
+// successfullyConnected = false;
+// receiverConnected = false;
+// aliceAccount->connectionManager().connectDevice(bobDeviceId,
+// "2",
+// [&](std::shared_ptr<ChannelSocket> socket,
+// const DeviceId&) {
+// if (socket) {
+// sendSock2 = socket;
+// successfullyConnected = true;
+// }
+// cv.notify_one();
+// });
+// CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&] { return successfullyConnected && receiverConnected; }));
+// successfullyConnected = false;
+// receiverConnected = false;
+// aliceAccount->connectionManager().connectDevice(bobDeviceId,
+// "3",
+// [&](std::shared_ptr<ChannelSocket> socket,
+// const DeviceId&) {
+// if (socket) {
+// sendSock3 = socket;
+// successfullyConnected = true;
+// }
+// cv.notify_one();
+// });
+// CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&] { return successfullyConnected && receiverConnected; }));
+// std::mutex mtxRcv {};
+// std::string alphabet;
+// for (int i = 0; i < 100; ++i)
+// alphabet += "QWERTYUIOPASDFGHJKLZXCVBNM";
+// rcvSock1->setOnRecv([&](const uint8_t*, size_t len) { return len; });
+// rcvSock2->setOnRecv([&](const uint8_t*, size_t len) { return len; });
+// rcvSock3->setOnRecv([&](const uint8_t*, size_t len) { return len; });
+// for (uint64_t i = 0; i < alphabet.size(); ++i) {
+// auto send = std::string(8000, alphabet[i]);
+// std::error_code ec;
+// sendSock->write(reinterpret_cast<unsigned char*>(send.data()), send.size(), ec);
+// sendSock2->write(reinterpret_cast<unsigned char*>(send.data()), send.size(), ec);
+// sendSock3->write(reinterpret_cast<unsigned char*>(send.data()), send.size(), ec);
+// CPPUNIT_ASSERT(!ec);
+// }
+
+
+
+// // No need to wait, immediately destroy, no segfault must occurs
+// }
+
+
+// //why you don't use this function in other test units to validate a test?
+// /*
+// void
+// ConnectionManagerTest::testIsConnecting()
+// {
+// auto aliceAccount = Manager::instance().getAccount<JamiAccount>(aliceId);
+// auto bobAccount = Manager::instance().getAccount<JamiAccount>(bobId);
+// auto bobDeviceId = DeviceId(std::string(bobAccount->currentDeviceId()));
+
+// bobAccount->connectionManager().onICERequest([](const DeviceId&) { return true; });
+// aliceAccount->connectionManager().onICERequest([](const DeviceId&) { return true; });
+
+// std::mutex mtx;
+// std::unique_lock<std::mutex> lk {mtx};
+// std::condition_variable cv;
+// bool successfullyConnected = false, successfullyReceive = false;
+
+// bobAccount->connectionManager().onChannelRequest(
+// [&](const std::shared_ptr<dht::crypto::Certificate>&, const std::string&) {
+// successfullyReceive = true;
+// cv.notify_one();
+// std::this_thread::sleep_for(2s);
+// return true;
+// });
+
+// CPPUNIT_ASSERT(!aliceAccount->connectionManager().isConnecting(bobDeviceId, "sip"));
+
+// aliceAccount->connectionManager().connectDevice(bobDeviceId,
+// "sip",
+// [&](std::shared_ptr<ChannelSocket> socket,
+// const DeviceId&) {
+// if (socket) {
+// successfullyConnected = true;
+// }
+// cv.notify_one();
+// });
+// // connectDevice is full async, so isConnecting will be true after a few ms.
+// CPPUNIT_ASSERT(cv.wait_for(lk, 60s, [&] { return successfullyReceive; }));
+// CPPUNIT_ASSERT(aliceAccount->connectionManager().isConnecting(bobDeviceId, "sip"));
+// CPPUNIT_ASSERT(cv.wait_for(lk, 60s, [&] { return successfullyConnected; }));
+// std::this_thread::sleep_for(
+// std::chrono::milliseconds(100)); // Just to wait for the callback to finish
+// CPPUNIT_ASSERT(!aliceAccount->connectionManager().isConnecting(bobDeviceId, "sip"));
+// }
+// */
+// void
+// ConnectionManagerTest::testIsConnecting()
+// {
+
+// std::condition_variable cv;
+// bool successfullyConnected = false;
+// bool successfullyReceive = false;
+
+// bobAccount->connectionManager().onChannelRequest(
+// [&](const std::shared_ptr<dht::crypto::Certificate>&, const std::string&) {
+// successfullyReceive = true;
+// cv.notify_one();
+// std::this_thread::sleep_for(2s);
+// return true;
+// });
+
+// CPPUNIT_ASSERT(!aliceAccount->connectionManager().isConnecting(bobDeviceId, "sip"));
+
+// aliceAccount->connectionManager().connectDevice(bobDeviceId,
+// "sip",
+// [&](std::shared_ptr<ChannelSocket> socket,
+// const DeviceId&) {
+// if (socket) {
+// successfullyConnected = true;
+// }
+// cv.notify_one();
+// });
+
+// // connectDevice is full async, so isConnecting will be true after a few ms.
+// CPPUNIT_ASSERT(cv.wait_for(lk, 60s, [&] { return successfullyReceive; }));
+// CPPUNIT_ASSERT(aliceAccount->connectionManager().isConnecting(bobDeviceId, "sip"));
+// CPPUNIT_ASSERT(cv.wait_for(lk, 60s, [&] { return successfullyConnected; }));
+// std::this_thread::sleep_for(
+// std::chrono::milliseconds(100)); // Just to wait for the callback to finish
+// CPPUNIT_ASSERT(!aliceAccount->connectionManager().isConnecting(bobDeviceId, "sip"));
+// }
+
+
+
+// void
+// ConnectionManagerTest::testCanSendBeacon()
+// {
+// auto aliceAccount = Manager::instance().getAccount<JamiAccount>(aliceId);
+// auto bobAccount = Manager::instance().getAccount<JamiAccount>(bobId);
+// auto bobDeviceId = DeviceId(std::string(bobAccount->currentDeviceId()));
+
+// bobAccount->connectionManager().onICERequest([](const DeviceId&) { return true; });
+// aliceAccount->connectionManager().onICERequest([](const DeviceId&) { return true; });
+
+// std::mutex mtx;
+// std::unique_lock<std::mutex> lk {mtx};
+// std::condition_variable cv;
+// bool successfullyConnected = false;
+
+// std::shared_ptr<MultiplexedSocket> aliceSocket, bobSocket;
+// bobAccount->connectionManager().onChannelRequest(
+// [&](const std::shared_ptr<dht::crypto::Certificate>&, const std::string&) { return true; });
+// bobAccount->connectionManager().onConnectionReady(
+// [&](const DeviceId&, const std::string&, std::shared_ptr<ChannelSocket> socket) {
+// if (socket && socket->name() == "sip")
+// bobSocket = socket->underlyingSocket();
+// cv.notify_one();
+// });
+
+// aliceAccount->connectionManager().connectDevice(bobDeviceId,
+// "sip",
+// [&](std::shared_ptr<ChannelSocket> socket,
+// const DeviceId&) {
+// if (socket) {
+// aliceSocket = socket->underlyingSocket();
+// successfullyConnected = true;
+// }
+// cv.notify_one();
+// });
+// // connectDevice is full async, so isConnecting will be true after a few ms.
+// CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&] { return aliceSocket && bobSocket && successfullyConnected; }));
+// CPPUNIT_ASSERT(aliceSocket->canSendBeacon());
+
+// // Because onConnectionReady is true before version is sent, we can wait a bit
+// // before canSendBeacon is true.
+// auto start = std::chrono::steady_clock::now();
+// auto aliceCanSendBeacon = false;
+// auto bobCanSendBeacon = false;
+// do {
+// aliceCanSendBeacon = aliceSocket->canSendBeacon();
+// bobCanSendBeacon = bobSocket->canSendBeacon();
+// if (!bobCanSendBeacon || !aliceCanSendBeacon)
+// std::this_thread::sleep_for(1s);
+// } while ((not bobCanSendBeacon or not aliceCanSendBeacon)
+// and std::chrono::steady_clock::now() - start < 5s);
+
+// CPPUNIT_ASSERT(bobCanSendBeacon && aliceCanSendBeacon);
+// }
+
+// void
+// ConnectionManagerTest::testCannotSendBeacon()
+// {
+// auto aliceAccount = Manager::instance().getAccount<JamiAccount>(aliceId);
+// auto bobAccount = Manager::instance().getAccount<JamiAccount>(bobId);
+// auto bobDeviceId = DeviceId(std::string(bobAccount->currentDeviceId()));
+
+// bobAccount->connectionManager().onICERequest([](const DeviceId&) { return true; });
+// aliceAccount->connectionManager().onICERequest([](const DeviceId&) { return true; });
+
+// std::mutex mtx;
+// std::unique_lock<std::mutex> lk {mtx};
+// std::condition_variable cv;
+// bool successfullyConnected = false;
+
+// std::shared_ptr<MultiplexedSocket> aliceSocket, bobSocket;
+// bobAccount->connectionManager().onChannelRequest(
+// [&](const std::shared_ptr<dht::crypto::Certificate>&, const std::string&) { return true; });
+// bobAccount->connectionManager().onConnectionReady(
+// [&](const DeviceId&, const std::string&, std::shared_ptr<ChannelSocket> socket) {
+// if (socket && socket->name() == "sip")
+// bobSocket = socket->underlyingSocket();
+// cv.notify_one();
+// });
+
+// aliceAccount->connectionManager().connectDevice(bobDeviceId,
+// "sip",
+// [&](std::shared_ptr<ChannelSocket> socket,
+// const DeviceId&) {
+// if (socket) {
+// aliceSocket = socket->underlyingSocket();
+// successfullyConnected = true;
+// }
+// cv.notify_one();
+// });
+// // connectDevice is full async, so isConnecting will be true after a few ms.
+// CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&] { return aliceSocket && bobSocket; }));
+
+// int version = 1412;
+// bobSocket->setOnVersionCb([&](auto v) {
+// version = v;
+// cv.notify_one();
+// });
+// aliceSocket->setVersion(0);
+// aliceSocket->sendVersion();
+// CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&] { return version == 0; }));
+// CPPUNIT_ASSERT(!bobSocket->canSendBeacon());
+// }
+
+// void
+// ConnectionManagerTest::testConnectivityChangeTriggerBeacon()
+// {
+// auto aliceAccount = Manager::instance().getAccount<JamiAccount>(aliceId);
+// auto bobAccount = Manager::instance().getAccount<JamiAccount>(bobId);
+// auto bobDeviceId = DeviceId(std::string(bobAccount->currentDeviceId()));
+
+// bobAccount->connectionManager().onICERequest([](const DeviceId&) { return true; });
+// aliceAccount->connectionManager().onICERequest([](const DeviceId&) { return true; });
+
+// std::mutex mtx;
+// std::unique_lock<std::mutex> lk {mtx};
+// std::condition_variable cv;
+// bool successfullyConnected = false;
+
+// std::shared_ptr<MultiplexedSocket> aliceSocket, bobSocket;
+// bobAccount->connectionManager().onChannelRequest(
+// [&](const std::shared_ptr<dht::crypto::Certificate>&, const std::string&) { return true; });
+// bobAccount->connectionManager().onConnectionReady(
+// [&](const DeviceId&, const std::string&, std::shared_ptr<ChannelSocket> socket) {
+// if (socket && socket->name() == "sip")
+// bobSocket = socket->underlyingSocket();
+// cv.notify_one();
+// });
+
+// aliceAccount->connectionManager().connectDevice(bobDeviceId,
+// "sip",
+// [&](std::shared_ptr<ChannelSocket> socket,
+// const DeviceId&) {
+// if (socket) {
+// aliceSocket = socket->underlyingSocket();
+// successfullyConnected = true;
+// }
+// cv.notify_one();
+// });
+// // connectDevice is full async, so isConnecting will be true after a few ms.
+// CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&] { return aliceSocket && bobSocket; }));
+
+// bool hasRequest = false;
+// bobSocket->setOnBeaconCb([&](auto p) {
+// if (p)
+// hasRequest = true;
+// cv.notify_one();
+// });
+// aliceAccount->connectionManager().connectivityChanged();
+// CPPUNIT_ASSERT(cv.wait_for(lk, 10s, [&] { return hasRequest; }));
+// }
+
+// void
+// ConnectionManagerTest::testOnNoBeaconTriggersShutdown()
+// {
+// auto aliceAccount = Manager::instance().getAccount<JamiAccount>(aliceId);
+// auto bobAccount = Manager::instance().getAccount<JamiAccount>(bobId);
+// auto bobDeviceId = DeviceId(std::string(bobAccount->currentDeviceId()));
+
+// bobAccount->connectionManager().onICERequest([](const DeviceId&) { return true; });
+// aliceAccount->connectionManager().onICERequest([](const DeviceId&) { return true; });
+
+// std::mutex mtx;
+// std::unique_lock<std::mutex> lk {mtx};
+// std::condition_variable cv;
+// bool successfullyConnected = false;
+
+// std::shared_ptr<MultiplexedSocket> aliceSocket, bobSocket;
+// bobAccount->connectionManager().onChannelRequest(
+// [&](const std::shared_ptr<dht::crypto::Certificate>&, const std::string&) { return true; });
+// bobAccount->connectionManager().onConnectionReady(
+// [&](const DeviceId&, const std::string&, std::shared_ptr<ChannelSocket> socket) {
+// if (socket && socket->name() == "sip")
+// bobSocket = socket->underlyingSocket();
+// cv.notify_one();
+// });
+
+// aliceAccount->connectionManager().connectDevice(bobDeviceId,
+// "sip",
+// [&](std::shared_ptr<ChannelSocket> socket,
+// const DeviceId&) {
+// if (socket) {
+// aliceSocket = socket->underlyingSocket();
+// successfullyConnected = true;
+// }
+// cv.notify_one();
+// });
+// // connectDevice is full async, so isConnecting will be true after a few ms.
+// CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&] { return aliceSocket && bobSocket; }));
+
+// bool isClosed = false;
+// aliceSocket->onShutdown([&] {
+// isClosed = true;
+// cv.notify_one();
+// });
+// bobSocket->answerToBeacon(false);
+// aliceAccount->connectionManager().connectivityChanged();
+// CPPUNIT_ASSERT(cv.wait_for(lk, 10s, [&] { return isClosed; }));*/
+// }
+
+
+
+// //why you didn't invoke on Channel request?
+// void
+// ConnectionManagerTest::testShutdownWhileNegotiating()
+// {
+
+// std::condition_variable cv;
+// bool successfullyReceive = false;
+// bool notConnected = false;
+
+// aliceAccount->connectionManager().onICERequest([](const DeviceId&) { return true; });
+
+// //Why???????????
+// bobAccount->connectionManager().onICERequest([&](const DeviceId&) {
+// successfullyReceive = true;
+// cv.notify_one();
+// return true;
+// });
+
+// aliceAccount->connectionManager().connectDevice(bobDeviceId,
+// "git://*",
+// [&](std::shared_ptr<ChannelSocket> socket,
+// const DeviceId&) {
+// notConnected = !socket;
+// cv.notify_one();
+// });
+
+// CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&] { return successfullyReceive; }));
+
+
+// aliceAccount->connectionManager().reset(); //use it but check it first
+// Manager::instance().setAccountActive(aliceId, false, true);//?????????????????????????????????????
+
+// CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&] { return notConnected; }));
+// }
} // namespace test
} // namespace dhtnet