// NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/> // Copyright (C) 2010 Winch Gate Property Limited // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License as // published by the Free Software Foundation, either version 3 of the // License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. #ifndef UT_NET_MODULE #define UT_NET_MODULE #include <nel/misc/dynloadlib.h> #include <nel/misc/command.h> #include <nel/misc/path.h> #include <nel/net/module_common.h> #include <nel/net/module_manager.h> #include <nel/net/module.h> #include <nel/net/inet_address.h> #include <nel/net/module_socket.h> #include <nel/net/module_gateway.h> #include <nel/net/service.h> class CModuleType0 : public NLNET::CModuleBase { public: uint PingCount; uint ResponseReceived; set<NLNET::TModuleProxyPtr> ModuleType0; uint32 ModuleUpCalled; uint32 ModuleDownCalled; uint32 ProcessMessageCalled; uint32 SecurityUpdateCalled; CModuleType0() : PingCount(0), ResponseReceived(0) { ModuleUpCalled = 0; ModuleDownCalled = 0; ProcessMessageCalled = 0; SecurityUpdateCalled = 0; } std::string buildModuleManifest() const { return "CModuleType0"; } bool initModule(const NLNET::TParsedCommandLine ¶m) { bool ret = CModuleBase::initModule(param); if (param.getParam("FAIL") != NULL) return false; return ret; } void onServiceUp(const std::string &serviceName, NLNET::TServiceId serviceId) { } /// A nel layer 5 service has stopped. void onServiceDown(const std::string &serviceName, NLNET::TServiceId serviceId) { } void onModuleUpdate() { } /** The service main loop is terminating it job', all module will be * disconnected and removed after this callback. */ void onApplicationExit() { } void onModuleUp(NLNET::IModuleProxy *moduleProxy) { ModuleUpCalled++; if (moduleProxy->getModuleClassName() == getModuleClassName()) ModuleType0.insert(moduleProxy); } /** Called by a socket to inform this module that another * module has been deleted OR has been no more accessible (due to * some gateway disconnection). */ void onModuleDown(NLNET::IModuleProxy *moduleProxy) { ModuleDownCalled++; if (moduleProxy->getModuleClassName() == getModuleClassName()) ModuleType0.erase(moduleProxy); } bool onProcessModuleMessage(NLNET::IModuleProxy *senderModuleProxy, const NLNET::CMessage &message) { ProcessMessageCalled++; if (message.getName() == "DEBUG_MOD_PING") { PingCount++; return true; } else if (message.getName() == "HELLO") { NLNET::CMessage ping("DEBUG_MOD_PING"); senderModuleProxy->sendModuleMessage(this, NLNET::CMessage(ping)); senderModuleProxy->sendModuleMessage(this, NLNET::CMessage(ping)); { NLNET::CMessage resp; resp.setType("HELLO_RESP", NLNET::CMessage::Response); senderModuleProxy->sendModuleMessage(this, resp); } senderModuleProxy->sendModuleMessage(this, NLNET::CMessage(ping)); senderModuleProxy->sendModuleMessage(this, NLNET::CMessage(ping)); return true; } else if (message.getName() == "HELLO2") { // the response for the life, the universe and all other things... throw 42; return true; } return false; } void onModuleSecurityChange(NLNET::IModuleProxy *moduleProxy) { SecurityUpdateCalled++; } void onModuleSocketEvent(NLNET::IModuleSocket *moduleSocket, IModule::TModuleSocketEvent eventType) { } void startTaskA() { // start a task on module NLNET_START_MODULE_TASK(CModuleType0, taskA); } // test task A void taskA() { // use the first like me in the list nlassert(!ModuleType0.empty()); NLNET::TModuleProxyPtr proxy = *ModuleType0.begin(); NLNET::CMessage msg; msg.setType("HELLO", NLNET::CMessage::Request); NLNET::CMessage resp; invokeModuleOperation(proxy, msg, resp); nlassert(resp.getName() == "HELLO_RESP"); ResponseReceived++; } void startTaskB() { // start a task on module NLNET_START_MODULE_TASK(CModuleType0, taskB); } // test task B void taskB() { // use the first like me in the list nlassert(!ModuleType0.empty()); NLNET::TModuleProxyPtr proxy = *ModuleType0.begin(); NLNET::CMessage msg; msg.setType("HELLO2", NLNET::CMessage::Request); NLNET::CMessage resp; try { invokeModuleOperation(proxy, msg, resp); } catch(const IModule::EInvokeFailed &) { ResponseReceived++; } } }; NLNET_REGISTER_MODULE_FACTORY(CModuleType0, "ModuleType0"); // A module that doesn't support immediate dispatching class CModuleAsync : public CModuleType0 { public: bool isImmediateDispatchingSupported() const { return false; } }; NLNET_REGISTER_MODULE_FACTORY(CModuleAsync, "ModuleAsync"); enum TTestSecurityTypes { tst_type1, tst_type2, tst_type3, tst_type4, }; // security type 1 data : contains host gateway name struct TSecurityType1 : public NLNET::TSecurityData { string SecurityGatewayName; TSecurityType1(const TCtorParam ¶m) : NLNET::TSecurityData(param) { } void serial(NLMISC::CMemStream &s) { s.serial(SecurityGatewayName); } }; NLMISC_REGISTER_OBJECT(NLNET::TSecurityData, TSecurityType1, uint8, tst_type1); // security type 2 data : contains host gateway name and a predefined integer value struct TSecurityType2 : public NLNET::TSecurityData { string SecurityGatewayName; uint32 IntegerValue; TSecurityType2(const TCtorParam ¶m) : NLNET::TSecurityData(param) { IntegerValue = 0x12345678; } void serial(NLMISC::CMemStream &s) { s.serial(SecurityGatewayName); s.serial(IntegerValue); } }; NLMISC_REGISTER_OBJECT(NLNET::TSecurityData, TSecurityType2, uint8, tst_type2); // security type 3 data, same as type 1 struct TSecurityType3 : public NLNET::TSecurityData { string SecurityGatewayName; TSecurityType3(const TCtorParam ¶m) : NLNET::TSecurityData(param) { } void serial(NLMISC::CMemStream &s) { s.serial(SecurityGatewayName); } }; NLMISC_REGISTER_OBJECT(NLNET::TSecurityData, TSecurityType3, uint8, tst_type3); // security type 4 data, same as type 1 but not registered struct TSecurityType4 : public NLNET::TSecurityData { string SecurityGatewayName; TSecurityType4(const TCtorParam ¶m) : NLNET::TSecurityData(param) { } void serial(NLMISC::CMemStream &s) { s.serial(SecurityGatewayName); } }; /** a sample security plug-in that add type 1 security data to local modules, * type 2 security to foreign module, * and that remove received type 1 security from foreign module */ class CTestSecurity1 : public NLNET::CGatewaySecurity { public: CTestSecurity1(const TCtorParam ¶ms) : NLNET::CGatewaySecurity(params) {} virtual void onNewProxy(NLNET::IModuleProxy *proxy) { if (proxy->getGatewayRoute() == NULL) { // add a type 1 security TSecurityType1 *st1 = new TSecurityType1(NLNET::TSecurityData::TCtorParam(tst_type1)); st1->SecurityGatewayName = _Gateway->getFullyQualifiedGatewayName(); setSecurityData(proxy, st1); } else { // remove any type 1 data and set a type 2 data removeSecurityData(proxy, tst_type1); TSecurityType2 *st2 = new TSecurityType2(NLNET::TSecurityData::TCtorParam(tst_type2)); st2->SecurityGatewayName = _Gateway->getFullyQualifiedGatewayName(); setSecurityData(proxy, st2); } forceSecurityUpdate(proxy); } void onNewSecurityData(NLNET::CGatewayRoute *from, NLNET::IModuleProxy *proxy, NLNET::TSecurityData *firstSecurityData) { // replace the complete security set replaceAllSecurityDatas(proxy, firstSecurityData); // remove any type 1 data and set a type 2 data removeSecurityData(proxy, tst_type1); TSecurityType2 *st2 = new TSecurityType2(NLNET::TSecurityData::TCtorParam(tst_type2)); st2->SecurityGatewayName = _Gateway->getFullyQualifiedGatewayName(); setSecurityData(proxy, st2); // we don't need to update in this case (update is always done by gateway) } virtual void onDelete() { vector<NLNET::IModuleProxy*> proxies; _Gateway->getModuleProxyList(proxies); // remove any security data managed by this plug-in for (uint i=0; i<proxies.size(); ++i) { NLNET::IModuleProxy *proxy = proxies[i]; if (proxy->getFirstSecurityData() != NULL) { bool update = false; update |= removeSecurityData(proxy, tst_type1); update |= removeSecurityData(proxy, tst_type2); if (update) forceSecurityUpdate(proxy); } } } }; NLMISC_REGISTER_OBJECT(NLNET::CGatewaySecurity, CTestSecurity1, std::string, "TestSecurity1"); /** a sample security plug-in that add type 3 and type 4 security data to local modules, */ class CTestSecurity2 : public NLNET::CGatewaySecurity { public: CTestSecurity2(const TCtorParam ¶ms) : NLNET::CGatewaySecurity(params) {} virtual void onNewProxy(NLNET::IModuleProxy *proxy) { if (proxy->getGatewayRoute() == NULL) { // add a type 3 security TSecurityType3 *st3 = new TSecurityType3(NLNET::TSecurityData::TCtorParam(tst_type3)); st3->SecurityGatewayName = _Gateway->getFullyQualifiedGatewayName(); setSecurityData(proxy, st3); // add a type 4 security TSecurityType4 *st4 = new TSecurityType4(NLNET::TSecurityData::TCtorParam(tst_type4)); st4->SecurityGatewayName = _Gateway->getFullyQualifiedGatewayName(); setSecurityData(proxy, st4); forceSecurityUpdate(proxy); } } void onNewSecurityData(NLNET::CGatewayRoute *from, NLNET::IModuleProxy *proxy, NLNET::TSecurityData *firstSecurityData) { // replace the complete security set replaceAllSecurityDatas(proxy, firstSecurityData); } virtual void onDelete() { vector<NLNET::IModuleProxy*> proxies; _Gateway->getModuleProxyList(proxies); // remove any security data managed by this plug-in for (uint i=0; i<proxies.size(); ++i) { NLNET::IModuleProxy *proxy = proxies[i]; if (proxy->getGatewayRoute() == NULL) { removeSecurityData(proxy, tst_type3); removeSecurityData(proxy, tst_type4); forceSecurityUpdate(proxy); } } } }; NLMISC_REGISTER_OBJECT(NLNET::CGatewaySecurity, CTestSecurity2, std::string, "TestSecurity2"); // A module interceptor class CInterceptor : public NLNET::IModuleInterceptable { public: string Name; uint32 ModuleUpCalled; uint32 ModuleDownCalled; uint32 ProcessMessageCalled; uint32 SecurityUpdateCalled; CInterceptor(NLNET::IInterceptorRegistrar *registrar, const string &name) : Name(name) { NLNET::IModuleInterceptable::registerInterceptor(registrar), ModuleUpCalled = 0; ModuleDownCalled = 0; ProcessMessageCalled = 0; SecurityUpdateCalled = 0; } virtual std::string buildModuleManifest() const { return Name; } virtual void onModuleUp(NLNET::IModuleProxy *moduleProxy) { ModuleUpCalled++; } virtual void onModuleDown(NLNET::IModuleProxy *moduleProxy) { ModuleDownCalled++; } virtual bool onProcessModuleMessage(NLNET::IModuleProxy *senderModuleProxy, const NLNET::CMessage &message) { ProcessMessageCalled++; return false; } virtual void onModuleSecurityChange(NLNET::IModuleProxy *moduleProxy) { SecurityUpdateCalled++; } }; // Test suite for Modules class class CUTNetModule : public Test::Suite { string _WorkingPath; string _RestorePath; public: // utility to look for a specified proxy in a vector of proxy // return true if the proxy if found bool lookForModuleProxy(const vector<NLNET::IModuleProxy*> proxList, const std::string &modName) { for (uint i=0; i<proxList.size(); ++i) { if (proxList[i]->getModuleName().find(modName) == (proxList[i]->getModuleName().size() - modName.size())) return true; } return false; } NLNET::IModuleProxy *retrieveModuleProxy(NLNET::IModuleGateway *gw, const std::string &modName) { vector<NLNET::IModuleProxy*> proxList; gw->getModuleProxyList(proxList); for (uint i=0; i<proxList.size(); ++i) { if (proxList[i]->getModuleName().find(modName) == (proxList[i]->getModuleName().size() - modName.size())) return proxList[i]; } return NULL; } void setup() { _RestorePath = NLMISC::CPath::getCurrentPath(); NLMISC::CPath::setCurrentPath(_WorkingPath.c_str()); } void tear_down() { NLMISC::CPath::setCurrentPath(_RestorePath.c_str()); } CUTNetModule () { TEST_ADD(CUTNetModule::testModuleInitInfoParsing); TEST_ADD(CUTNetModule::testModuleInitInfoQuering); TEST_ADD(CUTNetModule::testModuleInitInfoBadParsing); TEST_ADD(CUTNetModule::localModuleFactory); //TEST_ADD(CUTNetModule::loadModuleLib); //TEST_ADD(CUTNetModule::createModule); //TEST_ADD(CUTNetModule::deleteModule); TEST_ADD(CUTNetModule::failedInit); //TEST_ADD(CUTNetModule::unloadModuleLib); TEST_ADD(CUTNetModule::createLocalGateway); TEST_ADD(CUTNetModule::plugLocalGateway); //TEST_ADD(CUTNetModule::moduleManagerCommands); TEST_ADD(CUTNetModule::gatewayTransportManagement); TEST_ADD(CUTNetModule::connectGateways); TEST_ADD(CUTNetModule::moduleDisclosure); TEST_ADD(CUTNetModule::moduleMessaging); TEST_ADD(CUTNetModule::localMessageQueing); TEST_ADD(CUTNetModule::uniqueNameGenerator); TEST_ADD(CUTNetModule::gwPlugUnplug); TEST_ADD(CUTNetModule::peerInvisible); TEST_ADD(CUTNetModule::firewalling); TEST_ADD(CUTNetModule::distanceAndConnectionLoop); TEST_ADD(CUTNetModule::securityPlugin); TEST_ADD(CUTNetModule::synchronousMessaging); TEST_ADD(CUTNetModule::layer3Autoconnect); TEST_ADD(CUTNetModule::interceptorTest); } void interceptorTest() { // Check that the interceptor system. // TODO : right now, there is no test of the security update call NLNET::IModuleManager &mm = NLNET::IModuleManager::getInstance(); NLMISC::CCommandRegistry &cr = NLMISC::CCommandRegistry::getInstance(); // create the modules NLNET::IModule *gw = mm.createModule("StandardGateway", "gw", ""); NLNET::IModule *mod = mm.createModule("ModuleType0", "mod", ""); NLNET::IModuleGateway *gGw = dynamic_cast<NLNET::IModuleGateway *>(gw); CModuleType0 *mod0 = dynamic_cast<CModuleType0*>(mod); TEST_ASSERT(gGw != NULL); TEST_ASSERT(mod0 != NULL); // create the interceptors and attach it to the mod0 CInterceptor *inter0 = new CInterceptor(mod, "Inter0"); CInterceptor *inter1 = new CInterceptor(mod, "Inter1"); // plug the modules cr.execute("gw.plug gw", NLMISC::InfoLog()); cr.execute("mod.plug gw", NLMISC::InfoLog()); // update the network for (uint i=0; i<5; ++i) { mm.updateModules(); NLMISC::nlSleep(40); } // send a message to the module fro; the gateway NLNET::CMessage msg("foo"); NLNET::IModuleProxy *modProx = retrieveModuleProxy(gGw, "mod"); TEST_ASSERT(modProx != NULL); modProx->sendModuleMessage(gw, msg); // update the network for (uint i=0; i<5; ++i) { mm.updateModules(); NLMISC::nlSleep(40); } // check the module manifest TEST_ASSERT(modProx->getModuleManifest() == "CModuleType0 Inter0 Inter1"); // unplug the modules cr.execute("gw.unplug gw", NLMISC::InfoLog()); cr.execute("mod.unplug gw", NLMISC::InfoLog()); // update the network for (uint i=0; i<5; ++i) { mm.updateModules(); NLMISC::nlSleep(40); } // now check that all methods have been called in that // module and in the two interceptors, // also check the manifest string content. TEST_ASSERT(mod0->ModuleUpCalled == 1); TEST_ASSERT(mod0->ModuleDownCalled == 1); TEST_ASSERT(mod0->ProcessMessageCalled == 1); // TEST_ASSERT(mod0->SecurityUpdateCalled); TEST_ASSERT(inter0->ModuleUpCalled == 1); TEST_ASSERT(inter0->ModuleDownCalled == 1); TEST_ASSERT(inter0->ProcessMessageCalled == 1); // TEST_ASSERT(inter0->SecurityUpdateCalled); TEST_ASSERT(inter1->ModuleUpCalled == 1); TEST_ASSERT(inter1->ModuleDownCalled == 1); TEST_ASSERT(inter1->ProcessMessageCalled == 1); // TEST_ASSERT(inter1->SecurityUpdateCalled); // delete the modules mm.deleteModule(gw); mm.deleteModule(mod); // delete the interceptors delete inter0; delete inter1; } void layer3Autoconnect() { // Check that layer 3 client can automatically reconnect in case of server // down/up // // We create two gateway, gw1 and gw2, plugged in themselves, then we create // a layer 3 client on gw1, update the network, then we create the layer 3 server // on gw2, update the network then check that module are connected. // // Then we close the L3 server on gw2, update the network, check that module // are diconnected and reopen the L3 server and recheck that module are connected. // // NLNET::IModuleManager &mm = NLNET::IModuleManager::getInstance(); NLMISC::CCommandRegistry &cr = NLMISC::CCommandRegistry::getInstance(); // create the modules NLNET::IModule *gw1 = mm.createModule("StandardGateway", "gw1", ""); NLNET::IModule *gw2 = mm.createModule("StandardGateway", "gw2", ""); NLNET::IModuleGateway *gGw1 = dynamic_cast<NLNET::IModuleGateway *>(gw1); NLNET::IModuleGateway *gGw2 = dynamic_cast<NLNET::IModuleGateway *>(gw2); // plug gateway in themselves cr.execute("gw1.plug gw1", NLMISC::InfoLog()); cr.execute("gw2.plug gw2", NLMISC::InfoLog()); // create the client transport cr.execute("gw1.transportAdd L3Client l3c", NLMISC::InfoLog()); cr.execute("gw1.transportCmd l3c(retryInterval=1)", NLMISC::InfoLog()); cr.execute("gw1.transportCmd l3c(connect addr=localhost:8062)", NLMISC::InfoLog()); // update the network for (uint i=0; i<5; ++i) { mm.updateModules(); NLMISC::nlSleep(40); } TEST_ASSERT(retrieveModuleProxy(gGw1, "gw2") == NULL); TEST_ASSERT(retrieveModuleProxy(gGw1, "gw2") == NULL); // open the server cr.execute("gw2.transportAdd L3Server l3s", NLMISC::InfoLog()); cr.execute("gw2.transportCmd l3s(open port=8062)", NLMISC::InfoLog()); // update the network (give more time because we must cover the Layer3 client reconnection timer) for (uint i=0; i<40; ++i) { mm.updateModules(); NLMISC::nlSleep(50); } // check module connectivity TEST_ASSERT(retrieveModuleProxy(gGw1, "gw2") != NULL); TEST_ASSERT(retrieveModuleProxy(gGw1, "gw2") != NULL); // exchange some message cr.execute("gw1.sendPing "+gw2->getModuleFullyQualifiedName(), NLMISC::InfoLog()); cr.execute("gw2.sendPing "+gw1->getModuleFullyQualifiedName(), NLMISC::InfoLog()); // update the network for (uint i=0; i<5; ++i) { mm.updateModules(); NLMISC::nlSleep(40); } // check the ping counter TEST_ASSERT(gGw1->getReceivedPingCount() == 1); TEST_ASSERT(gGw2->getReceivedPingCount() == 1); // flood a little with ping for (uint i=0; i<100; ++i) cr.execute("gw1.sendPing "+gw2->getModuleFullyQualifiedName(), NLMISC::InfoLog()); // close the server cr.execute("gw2.transportCmd l3s(close)", NLMISC::InfoLog()); // update the network for (uint i=0; i<5; ++i) { mm.updateModules(); NLMISC::nlSleep(40); } // test no connectivity TEST_ASSERT(retrieveModuleProxy(gGw1, "gw2") == NULL); TEST_ASSERT(retrieveModuleProxy(gGw2, "gw1") == NULL); // re-open the server cr.execute("gw2.transportCmd l3s(open port=8062)", NLMISC::InfoLog()); // update the network (give more time because we must cover the Layer3 client reconnection timer) for (uint i=0; i<40; ++i) { mm.updateModules(); NLMISC::nlSleep(50); } // check module connectivity TEST_ASSERT(retrieveModuleProxy(gGw1, "gw2") != NULL); TEST_ASSERT(retrieveModuleProxy(gGw2, "gw1") != NULL); // exchange some message cr.execute("gw1.sendPing "+gw2->getModuleFullyQualifiedName(), NLMISC::InfoLog()); cr.execute("gw2.sendPing "+gw1->getModuleFullyQualifiedName(), NLMISC::InfoLog()); // update the network for (uint i=0; i<5; ++i) { mm.updateModules(); NLMISC::nlSleep(40); } // check the ping counter TEST_ASSERT(gGw1->getReceivedPingCount() == 2); TEST_ASSERT(gGw2->getReceivedPingCount() == 2); // cleanup modules mm.deleteModule(gw1); mm.deleteModule(gw2); } void synchronousMessaging() { // check that the synchronous messaging is working // by using module task NLNET::IModuleManager &mm = NLNET::IModuleManager::getInstance(); NLMISC::CCommandRegistry &cr = NLMISC::CCommandRegistry::getInstance(); // create the modules NLNET::IModule *gw = mm.createModule("StandardGateway", "gw", ""); NLNET::IModule *m1 = mm.createModule("ModuleType0", "m1", ""); NLNET::IModule *m2 = mm.createModule("ModuleType0", "m2", ""); // plug the two modules in the gateway cr.execute("m1.plug gw", NLMISC::InfoLog()); cr.execute("m2.plug gw", NLMISC::InfoLog()); // update the network for (uint i=0; i<15; ++i) { mm.updateModules(); NLMISC::nlSleep(40); } CModuleType0 *mod1 = dynamic_cast<CModuleType0 *>(m1); // start a task on module 1 mod1->startTaskA(); // update the network for (uint i=0; i<5; ++i) { mm.updateModules(); NLMISC::nlSleep(40); } TEST_ASSERT(mod1->PingCount == 4); TEST_ASSERT(mod1->ResponseReceived == 1); // start a task on module 1 mod1->startTaskB(); // update the network for (uint i=0; i<5; ++i) { mm.updateModules(); NLMISC::nlSleep(40); } TEST_ASSERT(mod1->PingCount == 4); TEST_ASSERT(mod1->ResponseReceived == 2); mm.deleteModule(m1); mm.deleteModule(m2); mm.deleteModule(gw); } void securityPlugin() { // Check that security plug-in work well. // // We connect three gateway in series with the central gateway // using a security module that adds security data to // proxies : // For local proxies, it adds type 1 security data // For foreign proxies, it adds type 2 security data // for foreign proxies, it removes any type 1 security data found // // gw1 (l3c) -------- (l3s) gw2 (l3c) ------ (l3s) gw3 // ^ ^ // | | // SecurityPlugin2 SecurityPlugin1 // // After connecting and plugging-in each gateway into themselves, // we check the presence and content of the security datas. // then we remove the securityPlugin1 and check that all // security data have been removed, // Then, we re create the securityPlugin1 and recheck // then one again, we remove it and recheck. // // For the second part of the check, we create a security // plug-in 2 on gw1 that add 'type3' security data on // local plug-in. // We also plug the security plug-in 1 and then we check that // we have the correct security data NLNET::IModuleManager &mm = NLNET::IModuleManager::getInstance(); NLMISC::CCommandRegistry &cr = NLMISC::CCommandRegistry::getInstance(); NLNET::IModule *gw1, *gw2, *gw3; // create the modules gw1 = mm.createModule("StandardGateway", "gw1", ""); gw2 = mm.createModule("StandardGateway", "gw2", ""); gw3 = mm.createModule("StandardGateway", "gw3", ""); TEST_ASSERT(gw1 != NULL); TEST_ASSERT(gw2 != NULL); TEST_ASSERT(gw3 != NULL); // plug gateway in themselves NLNET::IModuleSocket *sGw1, *sGw2, *sGw3; sGw1 = mm.getModuleSocket("gw1"); sGw2 = mm.getModuleSocket("gw2"); sGw3 = mm.getModuleSocket("gw3"); TEST_ASSERT(sGw1 != NULL); TEST_ASSERT(sGw2 != NULL); TEST_ASSERT(sGw3 != NULL); gw1->plugModule(sGw1); gw2->plugModule(sGw2); gw3->plugModule(sGw3); string cmd; // create security plug-in cmd = "gw2.securityCreate TestSecurity1"; TEST_ASSERT(cr.execute(cmd, NLMISC::InfoLog())); // create the transports cmd = "gw1.transportAdd L3Client l3c"; TEST_ASSERT(cr.execute(cmd, NLMISC::InfoLog())); cmd = "gw2.transportAdd L3Client l3c"; TEST_ASSERT(cr.execute(cmd, NLMISC::InfoLog())); cmd = "gw2.transportAdd L3Server l3s"; TEST_ASSERT(cr.execute(cmd, NLMISC::InfoLog())); cmd = "gw3.transportAdd L3Server l3s"; TEST_ASSERT(cr.execute(cmd, NLMISC::InfoLog())); // connect transport cmd = "gw2.transportCmd l3s(open port=8062)"; TEST_ASSERT(cr.execute(cmd, NLMISC::InfoLog())); cmd = "gw3.transportCmd l3s(open port=8063)"; TEST_ASSERT(cr.execute(cmd, NLMISC::InfoLog())); cmd = "gw1.transportCmd l3c(connect addr=localhost:8062)"; TEST_ASSERT(cr.execute(cmd, NLMISC::InfoLog())); cmd = "gw2.transportCmd l3c(connect addr=localhost:8063)"; TEST_ASSERT(cr.execute(cmd, NLMISC::InfoLog())); for (uint retry = 0; retry < 2; ++retry) { if (retry > 0) { // recreate the security plug-in cmd = "gw2.securityCreate TestSecurity1"; TEST_ASSERT(cr.execute(cmd, NLMISC::InfoLog())); } // update the network for (uint i=0; i<15; ++i) { mm.updateModules(); NLMISC::nlSleep(40); } NLNET::IModuleGateway *gGw1, *gGw2, *gGw3; gGw1 = dynamic_cast<NLNET::IModuleGateway *>(gw1); TEST_ASSERT(gGw1 != NULL); gGw2 = dynamic_cast<NLNET::IModuleGateway *>(gw2); TEST_ASSERT(gGw2 != NULL); gGw3 = dynamic_cast<NLNET::IModuleGateway *>(gw3); TEST_ASSERT(gGw3 != NULL); // check security data NLNET::IModuleProxy *proxGw1_1, *proxGw2_1, *proxGw3_1; NLNET::IModuleProxy *proxGw1_2, *proxGw2_2, *proxGw3_2; NLNET::IModuleProxy *proxGw1_3, *proxGw2_3, *proxGw3_3; proxGw1_1 = retrieveModuleProxy(gGw1, "gw1"); proxGw2_1 = retrieveModuleProxy(gGw1, "gw2"); proxGw3_1 = retrieveModuleProxy(gGw1, "gw3"); proxGw1_2 = retrieveModuleProxy(gGw2, "gw1"); proxGw2_2 = retrieveModuleProxy(gGw2, "gw2"); proxGw3_2 = retrieveModuleProxy(gGw2, "gw3"); proxGw1_3 = retrieveModuleProxy(gGw3, "gw1"); proxGw2_3 = retrieveModuleProxy(gGw3, "gw2"); proxGw3_3 = retrieveModuleProxy(gGw3, "gw3"); TEST_ASSERT(proxGw1_1 != NULL); TEST_ASSERT(proxGw2_1 != NULL); TEST_ASSERT(proxGw3_1 != NULL); TEST_ASSERT(proxGw1_2 != NULL); TEST_ASSERT(proxGw2_2 != NULL); TEST_ASSERT(proxGw3_2 != NULL); TEST_ASSERT(proxGw1_3 != NULL); TEST_ASSERT(proxGw2_3 != NULL); TEST_ASSERT(proxGw3_3 != NULL); const NLNET::TSecurityData *ms; const TSecurityType1 *st1; const TSecurityType2 *st2; ms = proxGw1_1->getFirstSecurityData(); TEST_ASSERT(ms == NULL); ms = proxGw1_2->getFirstSecurityData(); TEST_ASSERT(ms != NULL); TEST_ASSERT(ms->DataTag == tst_type2); st2 = dynamic_cast<const TSecurityType2 *>(ms); TEST_ASSERT(st2 != NULL); TEST_ASSERT(st2->SecurityGatewayName == gw2->getModuleFullyQualifiedName()); TEST_ASSERT(st2->IntegerValue == 0x12345678); TEST_ASSERT(st2->NextItem == NULL); ms = proxGw1_3->getFirstSecurityData(); TEST_ASSERT(ms != NULL); TEST_ASSERT(ms->DataTag == tst_type2); st2 = dynamic_cast<const TSecurityType2 *>(ms); TEST_ASSERT(st2 != NULL); TEST_ASSERT(st2->SecurityGatewayName == gw2->getModuleFullyQualifiedName()); TEST_ASSERT(st2->IntegerValue == 0x12345678); TEST_ASSERT(st2->NextItem == NULL); ms = proxGw2_1->getFirstSecurityData(); TEST_ASSERT(ms != NULL); TEST_ASSERT(ms->DataTag == tst_type1); st1 = dynamic_cast<const TSecurityType1 *>(ms); TEST_ASSERT(st1 != NULL); TEST_ASSERT(st1->SecurityGatewayName == gw2->getModuleFullyQualifiedName()); TEST_ASSERT(st1->NextItem == NULL); ms = proxGw2_2->getFirstSecurityData(); TEST_ASSERT(ms != NULL); TEST_ASSERT(ms->DataTag == tst_type1); st1 = dynamic_cast<const TSecurityType1 *>(ms); TEST_ASSERT(st1 != NULL); TEST_ASSERT(st1->SecurityGatewayName == gw2->getModuleFullyQualifiedName()); TEST_ASSERT(st1->NextItem == NULL); ms = proxGw2_3->getFirstSecurityData(); TEST_ASSERT(ms != NULL); TEST_ASSERT(ms->DataTag == tst_type1); st1 = dynamic_cast<const TSecurityType1 *>(ms); TEST_ASSERT(st1 != NULL); TEST_ASSERT(st1->SecurityGatewayName == gw2->getModuleFullyQualifiedName()); TEST_ASSERT(st1->NextItem == NULL); ms = proxGw3_1->getFirstSecurityData(); TEST_ASSERT(ms != NULL); TEST_ASSERT(ms->DataTag == tst_type2); st2 = dynamic_cast<const TSecurityType2 *>(ms); TEST_ASSERT(st2 != NULL); TEST_ASSERT(st2->SecurityGatewayName == gw2->getModuleFullyQualifiedName()); TEST_ASSERT(st2->IntegerValue == 0x12345678); TEST_ASSERT(st2->NextItem == NULL); ms = proxGw3_2->getFirstSecurityData(); TEST_ASSERT(ms != NULL); TEST_ASSERT(ms->DataTag == tst_type2); st2 = dynamic_cast<const TSecurityType2 *>(ms); TEST_ASSERT(st2 != NULL); TEST_ASSERT(st2->SecurityGatewayName == gw2->getModuleFullyQualifiedName()); TEST_ASSERT(st2->IntegerValue == 0x12345678); TEST_ASSERT(st2->NextItem == NULL); ms = proxGw3_3->getFirstSecurityData(); TEST_ASSERT(ms == NULL); // remove the security plug-in // create security plug-in cmd = "gw2.securityRemove"; TEST_ASSERT(cr.execute(cmd, NLMISC::InfoLog())); // update the network for (uint i=0; i<15; ++i) { mm.updateModules(); NLMISC::nlSleep(40); } ms = proxGw1_1->getFirstSecurityData(); TEST_ASSERT(ms == NULL); ms = proxGw1_2->getFirstSecurityData(); TEST_ASSERT(ms == NULL); ms = proxGw1_3->getFirstSecurityData(); TEST_ASSERT(ms == NULL); ms = proxGw2_1->getFirstSecurityData(); TEST_ASSERT(ms == NULL); ms = proxGw2_2->getFirstSecurityData(); TEST_ASSERT(ms == NULL); ms = proxGw2_3->getFirstSecurityData(); TEST_ASSERT(ms == NULL); ms = proxGw3_1->getFirstSecurityData(); TEST_ASSERT(ms == NULL); ms = proxGw3_2->getFirstSecurityData(); TEST_ASSERT(ms == NULL); ms = proxGw3_3->getFirstSecurityData(); TEST_ASSERT(ms == NULL); } // part 2 // create the security plug-in cmd = "gw2.securityCreate TestSecurity1"; TEST_ASSERT(cr.execute(cmd, NLMISC::InfoLog())); cmd = "gw1.securityCreate TestSecurity2"; TEST_ASSERT(cr.execute(cmd, NLMISC::InfoLog())); // update the network for (uint i=0; i<15; ++i) { mm.updateModules(); NLMISC::nlSleep(40); } NLNET::IModuleGateway *gGw1, *gGw2, *gGw3; gGw1 = dynamic_cast<NLNET::IModuleGateway *>(gw1); TEST_ASSERT(gGw1 != NULL); gGw2 = dynamic_cast<NLNET::IModuleGateway *>(gw2); TEST_ASSERT(gGw2 != NULL); gGw3 = dynamic_cast<NLNET::IModuleGateway *>(gw3); TEST_ASSERT(gGw3 != NULL); // check security data NLNET::IModuleProxy *proxGw1_1, *proxGw2_1, *proxGw3_1; NLNET::IModuleProxy *proxGw1_2, *proxGw2_2, *proxGw3_2; NLNET::IModuleProxy *proxGw1_3, *proxGw2_3, *proxGw3_3; proxGw1_1 = retrieveModuleProxy(gGw1, "gw1"); proxGw2_1 = retrieveModuleProxy(gGw1, "gw2"); proxGw3_1 = retrieveModuleProxy(gGw1, "gw3"); proxGw1_2 = retrieveModuleProxy(gGw2, "gw1"); proxGw2_2 = retrieveModuleProxy(gGw2, "gw2"); proxGw3_2 = retrieveModuleProxy(gGw2, "gw3"); proxGw1_3 = retrieveModuleProxy(gGw3, "gw1"); proxGw2_3 = retrieveModuleProxy(gGw3, "gw2"); proxGw3_3 = retrieveModuleProxy(gGw3, "gw3"); TEST_ASSERT(proxGw1_1 != NULL); TEST_ASSERT(proxGw2_1 != NULL); TEST_ASSERT(proxGw3_1 != NULL); TEST_ASSERT(proxGw1_2 != NULL); TEST_ASSERT(proxGw2_2 != NULL); TEST_ASSERT(proxGw3_2 != NULL); TEST_ASSERT(proxGw1_3 != NULL); TEST_ASSERT(proxGw2_3 != NULL); TEST_ASSERT(proxGw3_3 != NULL); const NLNET::TSecurityData *ms; // const TSecurityType1 *st1; // const TSecurityType2 *st2; ms = proxGw1_1->findSecurityData(tst_type1); TEST_ASSERT(ms == NULL); ms = proxGw1_1->findSecurityData(tst_type2); TEST_ASSERT(ms == NULL); ms = proxGw1_1->findSecurityData(tst_type3); TEST_ASSERT(ms != NULL); ms = proxGw1_1->findSecurityData(tst_type4); TEST_ASSERT(ms != NULL); TEST_ASSERT(dynamic_cast<const TSecurityType4*>(ms) != NULL); ms = proxGw1_2->findSecurityData(tst_type1); TEST_ASSERT(ms == NULL); ms = proxGw1_2->findSecurityData(tst_type2); TEST_ASSERT(ms != NULL); ms = proxGw1_2->findSecurityData(tst_type3); TEST_ASSERT(ms != NULL); ms = proxGw1_2->findSecurityData(0xff); TEST_ASSERT(ms != NULL); TEST_ASSERT(dynamic_cast<const NLNET::TUnknownSecurityData*>(ms) != NULL); ms = proxGw1_3->findSecurityData(tst_type1); TEST_ASSERT(ms == NULL); ms = proxGw1_3->findSecurityData(tst_type2); TEST_ASSERT(ms != NULL); ms = proxGw1_3->findSecurityData(tst_type3); TEST_ASSERT(ms != NULL); ms = proxGw1_3->findSecurityData(0xff); TEST_ASSERT(ms != NULL); TEST_ASSERT(dynamic_cast<const NLNET::TUnknownSecurityData*>(ms) != NULL); ms = proxGw2_1->findSecurityData(tst_type1); TEST_ASSERT(ms != NULL); ms = proxGw2_1->findSecurityData(tst_type2); TEST_ASSERT(ms == NULL); ms = proxGw2_1->findSecurityData(tst_type3); TEST_ASSERT(ms == NULL); ms = proxGw2_1->findSecurityData(tst_type4); TEST_ASSERT(ms == NULL); ms = proxGw2_2->findSecurityData(tst_type1); TEST_ASSERT(ms != NULL); ms = proxGw2_2->findSecurityData(tst_type2); TEST_ASSERT(ms == NULL); ms = proxGw2_2->findSecurityData(tst_type3); TEST_ASSERT(ms == NULL); ms = proxGw2_2->findSecurityData(tst_type4); TEST_ASSERT(ms == NULL); ms = proxGw2_3->findSecurityData(tst_type1); TEST_ASSERT(ms != NULL); ms = proxGw2_3->findSecurityData(tst_type2); TEST_ASSERT(ms == NULL); ms = proxGw2_3->findSecurityData(tst_type3); TEST_ASSERT(ms == NULL); ms = proxGw2_3->findSecurityData(tst_type4); TEST_ASSERT(ms == NULL); ms = proxGw3_1->findSecurityData(tst_type1); TEST_ASSERT(ms == NULL); ms = proxGw3_1->findSecurityData(tst_type2); TEST_ASSERT(ms != NULL); ms = proxGw3_1->findSecurityData(tst_type3); TEST_ASSERT(ms == NULL); ms = proxGw3_1->findSecurityData(tst_type4); TEST_ASSERT(ms == NULL); ms = proxGw3_2->findSecurityData(tst_type1); TEST_ASSERT(ms == NULL); ms = proxGw3_2->findSecurityData(tst_type2); TEST_ASSERT(ms != NULL); ms = proxGw3_2->findSecurityData(tst_type3); TEST_ASSERT(ms == NULL); ms = proxGw3_2->findSecurityData(tst_type4); TEST_ASSERT(ms == NULL); ms = proxGw3_3->findSecurityData(tst_type1); TEST_ASSERT(ms == NULL); ms = proxGw3_3->findSecurityData(tst_type2); TEST_ASSERT(ms == NULL); ms = proxGw3_3->findSecurityData(tst_type3); TEST_ASSERT(ms == NULL); ms = proxGw3_3->findSecurityData(tst_type4); TEST_ASSERT(ms == NULL); // remove the security plug-in // create security plug-in cmd = "gw1.securityRemove"; TEST_ASSERT(cr.execute(cmd, NLMISC::InfoLog())); // update the network for (uint i=0; i<15; ++i) { mm.updateModules(); NLMISC::nlSleep(40); } ms = proxGw1_1->findSecurityData(tst_type1); TEST_ASSERT(ms == NULL); ms = proxGw1_1->findSecurityData(tst_type2); TEST_ASSERT(ms == NULL); ms = proxGw1_1->findSecurityData(tst_type3); TEST_ASSERT(ms == NULL); ms = proxGw1_1->findSecurityData(tst_type4); TEST_ASSERT(ms == NULL); ms = proxGw1_2->findSecurityData(tst_type1); TEST_ASSERT(ms == NULL); ms = proxGw1_2->findSecurityData(tst_type2); TEST_ASSERT(ms != NULL); ms = proxGw1_2->findSecurityData(tst_type3); TEST_ASSERT(ms == NULL); ms = proxGw1_2->findSecurityData(tst_type4); TEST_ASSERT(ms == NULL); ms = proxGw1_3->findSecurityData(tst_type1); TEST_ASSERT(ms == NULL); ms = proxGw1_3->findSecurityData(tst_type2); TEST_ASSERT(ms != NULL); ms = proxGw1_3->findSecurityData(tst_type3); TEST_ASSERT(ms == NULL); ms = proxGw1_3->findSecurityData(tst_type4); TEST_ASSERT(ms == NULL); ms = proxGw2_1->findSecurityData(tst_type1); TEST_ASSERT(ms != NULL); ms = proxGw2_1->findSecurityData(tst_type2); TEST_ASSERT(ms == NULL); ms = proxGw2_1->findSecurityData(tst_type3); TEST_ASSERT(ms == NULL); ms = proxGw2_1->findSecurityData(tst_type4); TEST_ASSERT(ms == NULL); ms = proxGw2_2->findSecurityData(tst_type1); TEST_ASSERT(ms != NULL); ms = proxGw2_2->findSecurityData(tst_type2); TEST_ASSERT(ms == NULL); ms = proxGw2_2->findSecurityData(tst_type3); TEST_ASSERT(ms == NULL); ms = proxGw2_2->findSecurityData(tst_type4); TEST_ASSERT(ms == NULL); ms = proxGw2_3->findSecurityData(tst_type1); TEST_ASSERT(ms != NULL); ms = proxGw2_3->findSecurityData(tst_type2); TEST_ASSERT(ms == NULL); ms = proxGw2_3->findSecurityData(tst_type3); TEST_ASSERT(ms == NULL); ms = proxGw2_3->findSecurityData(tst_type4); TEST_ASSERT(ms == NULL); ms = proxGw3_1->findSecurityData(tst_type1); TEST_ASSERT(ms == NULL); ms = proxGw3_1->findSecurityData(tst_type2); TEST_ASSERT(ms != NULL); ms = proxGw3_1->findSecurityData(tst_type3); TEST_ASSERT(ms == NULL); ms = proxGw3_1->findSecurityData(tst_type4); TEST_ASSERT(ms == NULL); ms = proxGw3_2->findSecurityData(tst_type1); TEST_ASSERT(ms == NULL); ms = proxGw3_2->findSecurityData(tst_type2); TEST_ASSERT(ms != NULL); ms = proxGw3_2->findSecurityData(tst_type3); TEST_ASSERT(ms == NULL); ms = proxGw3_2->findSecurityData(tst_type4); TEST_ASSERT(ms == NULL); ms = proxGw3_3->findSecurityData(tst_type1); TEST_ASSERT(ms == NULL); ms = proxGw3_3->findSecurityData(tst_type2); TEST_ASSERT(ms == NULL); ms = proxGw3_3->findSecurityData(tst_type3); TEST_ASSERT(ms == NULL); ms = proxGw3_3->findSecurityData(tst_type4); TEST_ASSERT(ms == NULL); // cleanup mm.deleteModule(gw1); mm.deleteModule(gw2); mm.deleteModule(gw3); } void distanceAndConnectionLoop() { // Check that we support a closed loop or multi connection // of gateway and that the gateway chooses the best // route to reach a module when more than one is possible // and that the distance is updated // // For this test, we use the following context: // three gateway (gw1, gw2, gw3), each having a layer 3 // server and client transport. // one gateway (gw4) having just a layer3 server // gw1 connects on gw2, gw2 connects on gw3, gw3 connects on gw4. // we check the module list and distance, then gw3 connects to gw1, closing // the loop. // we recheck module list and distance. // We then disconnect gw3 from gw1 and recheck module list and distance. // // Finally, we create a second connection from gw1 to gw2 and // recheck module list and distances // // /---<optional>---\ // (l3s) gw1 (l3c) (l3s) gw2 (l3c) ------ (l3s) gw3 (l3c) ------ (l3s) gw4 // | \----------------/ | // | | // | | // \------------------<optional>-----------------------------------/ // NLNET::IModuleManager &mm = NLNET::IModuleManager::getInstance(); NLMISC::CCommandRegistry &cr = NLMISC::CCommandRegistry::getInstance(); NLNET::IModule *gw1, *gw2, *gw3, *gw4; // create the modules gw1 = mm.createModule("StandardGateway", "gw1", ""); gw2 = mm.createModule("StandardGateway", "gw2", ""); gw3 = mm.createModule("StandardGateway", "gw3", ""); gw4 = mm.createModule("StandardGateway", "gw4", ""); TEST_ASSERT(gw1 != NULL); TEST_ASSERT(gw2 != NULL); TEST_ASSERT(gw3 != NULL); TEST_ASSERT(gw4 != NULL); // plug gateway into themselves NLNET::IModuleSocket *sGw1, *sGw2, *sGw3, *sGw4; sGw1 = mm.getModuleSocket("gw1"); sGw2 = mm.getModuleSocket("gw2"); sGw3 = mm.getModuleSocket("gw3"); sGw4 = mm.getModuleSocket("gw4"); TEST_ASSERT(sGw1 != NULL); TEST_ASSERT(sGw2 != NULL); TEST_ASSERT(sGw3 != NULL); TEST_ASSERT(sGw4 != NULL); gw1->plugModule(sGw1); gw2->plugModule(sGw2); gw3->plugModule(sGw3); gw4->plugModule(sGw4); string cmd; // create the transports cmd = "gw1.transportAdd L3Client l3c"; TEST_ASSERT(cr.execute(cmd, NLMISC::InfoLog())); cmd = "gw1.transportAdd L3Server l3s"; TEST_ASSERT(cr.execute(cmd, NLMISC::InfoLog())); cmd = "gw2.transportAdd L3Client l3c"; TEST_ASSERT(cr.execute(cmd, NLMISC::InfoLog())); cmd = "gw2.transportAdd L3Server l3s"; TEST_ASSERT(cr.execute(cmd, NLMISC::InfoLog())); cmd = "gw3.transportAdd L3Client l3c"; TEST_ASSERT(cr.execute(cmd, NLMISC::InfoLog())); cmd = "gw3.transportAdd L3Server l3s"; TEST_ASSERT(cr.execute(cmd, NLMISC::InfoLog())); cmd = "gw4.transportAdd L3Server l3s"; TEST_ASSERT(cr.execute(cmd, NLMISC::InfoLog())); // connect transport cmd = "gw1.transportCmd l3s(open port=8061)"; TEST_ASSERT(cr.execute(cmd, NLMISC::InfoLog())); cmd = "gw2.transportCmd l3s(open port=8062)"; TEST_ASSERT(cr.execute(cmd, NLMISC::InfoLog())); cmd = "gw3.transportCmd l3s(open port=8063)"; TEST_ASSERT(cr.execute(cmd, NLMISC::InfoLog())); cmd = "gw4.transportCmd l3s(open port=8064)"; TEST_ASSERT(cr.execute(cmd, NLMISC::InfoLog())); cmd = "gw1.transportCmd l3c(connect addr=localhost:8062)"; TEST_ASSERT(cr.execute(cmd, NLMISC::InfoLog())); cmd = "gw2.transportCmd l3c(connect addr=localhost:8063)"; TEST_ASSERT(cr.execute(cmd, NLMISC::InfoLog())); cmd = "gw3.transportCmd l3c(connect addr=localhost:8064)"; TEST_ASSERT(cr.execute(cmd, NLMISC::InfoLog())); // update the network for (uint i=0; i<15; ++i) { mm.updateModules(); NLMISC::nlSleep(40); } // check the modules list // ok, now, check that each gateways know the gateway it must know NLNET::IModuleGateway *gGw1, *gGw2, *gGw3, *gGw4; gGw1 = dynamic_cast<NLNET::IModuleGateway *>(gw1); TEST_ASSERT(gGw1 != NULL); gGw2 = dynamic_cast<NLNET::IModuleGateway *>(gw2); TEST_ASSERT(gGw2 != NULL); gGw3 = dynamic_cast<NLNET::IModuleGateway *>(gw3); TEST_ASSERT(gGw3 != NULL); gGw4 = dynamic_cast<NLNET::IModuleGateway *>(gw4); TEST_ASSERT(gGw4 != NULL); vector<NLNET::IModuleProxy*> proxList; gGw1->getModuleProxyList(proxList); TEST_ASSERT(proxList.size() == 4); proxList.clear(); gGw2->getModuleProxyList(proxList); TEST_ASSERT(proxList.size() == 4); proxList.clear(); gGw3->getModuleProxyList(proxList); TEST_ASSERT(proxList.size() == 4); proxList.clear(); gGw4->getModuleProxyList(proxList); TEST_ASSERT(proxList.size() == 4); // check the distance NLNET::IModuleProxy *gw1_1Prox, *gw1_2Prox, *gw1_3Prox, *gw1_4Prox; NLNET::IModuleProxy *gw2_1Prox, *gw2_2Prox, *gw2_3Prox, *gw2_4Prox; NLNET::IModuleProxy *gw3_1Prox, *gw3_2Prox, *gw3_3Prox, *gw3_4Prox; NLNET::IModuleProxy *gw4_1Prox, *gw4_2Prox, *gw4_3Prox, *gw4_4Prox; gw1_1Prox = retrieveModuleProxy(gGw1, "gw1"); TEST_ASSERT(gw1_1Prox != NULL); TEST_ASSERT(gw1_1Prox->getModuleDistance() == 0); gw1_2Prox = retrieveModuleProxy(gGw2, "gw1"); TEST_ASSERT(gw1_2Prox != NULL); TEST_ASSERT(gw1_2Prox->getModuleDistance() == 1); gw1_3Prox = retrieveModuleProxy(gGw3, "gw1"); TEST_ASSERT(gw1_3Prox != NULL); TEST_ASSERT(gw1_3Prox->getModuleDistance() == 2); gw1_4Prox = retrieveModuleProxy(gGw4, "gw1"); TEST_ASSERT(gw1_4Prox != NULL); TEST_ASSERT(gw1_4Prox->getModuleDistance() == 3); gw2_1Prox = retrieveModuleProxy(gGw1, "gw2"); TEST_ASSERT(gw2_1Prox != NULL); TEST_ASSERT(gw2_1Prox->getModuleDistance() == 1); gw2_2Prox = retrieveModuleProxy(gGw2, "gw2"); TEST_ASSERT(gw2_2Prox != NULL); TEST_ASSERT(gw2_2Prox->getModuleDistance() == 0); gw2_3Prox = retrieveModuleProxy(gGw3, "gw2"); TEST_ASSERT(gw2_3Prox != NULL); TEST_ASSERT(gw2_3Prox->getModuleDistance() == 1); gw2_4Prox = retrieveModuleProxy(gGw4, "gw2"); TEST_ASSERT(gw2_4Prox != NULL); TEST_ASSERT(gw2_4Prox->getModuleDistance() == 2); gw3_1Prox = retrieveModuleProxy(gGw1, "gw3"); TEST_ASSERT(gw3_1Prox != NULL); TEST_ASSERT(gw3_1Prox->getModuleDistance() == 2); gw3_2Prox = retrieveModuleProxy(gGw2, "gw3"); TEST_ASSERT(gw3_2Prox != NULL); TEST_ASSERT(gw3_2Prox->getModuleDistance() == 1); gw3_3Prox = retrieveModuleProxy(gGw3, "gw3"); TEST_ASSERT(gw3_3Prox != NULL); TEST_ASSERT(gw3_3Prox->getModuleDistance() == 0); gw3_4Prox = retrieveModuleProxy(gGw4, "gw3"); TEST_ASSERT(gw3_4Prox != NULL); TEST_ASSERT(gw3_4Prox->getModuleDistance() == 1); gw4_1Prox = retrieveModuleProxy(gGw1, "gw4"); TEST_ASSERT(gw4_1Prox != NULL); TEST_ASSERT(gw4_1Prox->getModuleDistance() == 3); gw4_2Prox = retrieveModuleProxy(gGw2, "gw4"); TEST_ASSERT(gw4_2Prox != NULL); TEST_ASSERT(gw4_2Prox->getModuleDistance() == 2); gw4_3Prox = retrieveModuleProxy(gGw3, "gw4"); TEST_ASSERT(gw4_3Prox != NULL); TEST_ASSERT(gw4_3Prox->getModuleDistance() == 1); gw4_4Prox = retrieveModuleProxy(gGw4, "gw4"); TEST_ASSERT(gw4_4Prox != NULL); TEST_ASSERT(gw4_4Prox->getModuleDistance() == 0); // now, connect gw3 to gw1 cmd = "gw3.transportCmd l3c(connect addr=localhost:8061)"; TEST_ASSERT(cr.execute(cmd, NLMISC::InfoLog())); // update the network for (uint i=0; i<7; ++i) { mm.updateModules(); NLMISC::nlSleep(100); } // check module list proxList.clear(); gGw1->getModuleProxyList(proxList); TEST_ASSERT(proxList.size() == 4); proxList.clear(); gGw2->getModuleProxyList(proxList); TEST_ASSERT(proxList.size() == 4); proxList.clear(); gGw3->getModuleProxyList(proxList); TEST_ASSERT(proxList.size() == 4); proxList.clear(); gGw4->getModuleProxyList(proxList); TEST_ASSERT(proxList.size() == 4); // check the distances gw1_1Prox = retrieveModuleProxy(gGw1, "gw1"); TEST_ASSERT(gw1_1Prox != NULL); TEST_ASSERT(gw1_1Prox->getModuleDistance() == 0); gw1_2Prox = retrieveModuleProxy(gGw2, "gw1"); TEST_ASSERT(gw1_2Prox != NULL); TEST_ASSERT(gw1_2Prox->getModuleDistance() == 1); gw1_3Prox = retrieveModuleProxy(gGw3, "gw1"); TEST_ASSERT(gw1_3Prox != NULL); TEST_ASSERT(gw1_3Prox->getModuleDistance() == 1); gw1_4Prox = retrieveModuleProxy(gGw4, "gw1"); TEST_ASSERT(gw1_4Prox != NULL); TEST_ASSERT(gw1_4Prox->getModuleDistance() == 2); gw2_1Prox = retrieveModuleProxy(gGw1, "gw2"); TEST_ASSERT(gw2_1Prox != NULL); TEST_ASSERT(gw2_1Prox->getModuleDistance() == 1); gw2_2Prox = retrieveModuleProxy(gGw2, "gw2"); TEST_ASSERT(gw2_2Prox != NULL); TEST_ASSERT(gw2_2Prox->getModuleDistance() == 0); gw2_3Prox = retrieveModuleProxy(gGw3, "gw2"); TEST_ASSERT(gw2_3Prox != NULL); TEST_ASSERT(gw2_3Prox->getModuleDistance() == 1); gw2_4Prox = retrieveModuleProxy(gGw4, "gw2"); TEST_ASSERT(gw2_4Prox != NULL); TEST_ASSERT(gw2_4Prox->getModuleDistance() == 2); gw3_1Prox = retrieveModuleProxy(gGw1, "gw3"); TEST_ASSERT(gw3_1Prox != NULL); TEST_ASSERT(gw3_1Prox->getModuleDistance() == 1); gw3_2Prox = retrieveModuleProxy(gGw2, "gw3"); TEST_ASSERT(gw3_2Prox != NULL); TEST_ASSERT(gw3_2Prox->getModuleDistance() == 1); gw3_3Prox = retrieveModuleProxy(gGw3, "gw3"); TEST_ASSERT(gw3_3Prox != NULL); TEST_ASSERT(gw3_3Prox->getModuleDistance() == 0); gw3_4Prox = retrieveModuleProxy(gGw4, "gw3"); TEST_ASSERT(gw3_4Prox != NULL); TEST_ASSERT(gw3_4Prox->getModuleDistance() == 1); gw4_1Prox = retrieveModuleProxy(gGw1, "gw4"); TEST_ASSERT(gw4_1Prox != NULL); TEST_ASSERT(gw4_1Prox->getModuleDistance() == 2); gw4_2Prox = retrieveModuleProxy(gGw2, "gw4"); TEST_ASSERT(gw4_2Prox != NULL); TEST_ASSERT(gw4_2Prox->getModuleDistance() == 2); gw4_3Prox = retrieveModuleProxy(gGw3, "gw4"); TEST_ASSERT(gw4_3Prox != NULL); TEST_ASSERT(gw4_3Prox->getModuleDistance() == 1); gw4_4Prox = retrieveModuleProxy(gGw4, "gw4"); TEST_ASSERT(gw4_4Prox != NULL); TEST_ASSERT(gw4_4Prox->getModuleDistance() == 0); // close gw3 to gw1 cmd = "gw3.transportCmd l3c(close connId=1)"; TEST_ASSERT(cr.execute(cmd, NLMISC::InfoLog())); // update the network for (uint i=0; i<7; ++i) { mm.updateModules(); NLMISC::nlSleep(100); } // check module list proxList.clear(); gGw1->getModuleProxyList(proxList); TEST_ASSERT(proxList.size() == 4); proxList.clear(); gGw2->getModuleProxyList(proxList); TEST_ASSERT(proxList.size() == 4); proxList.clear(); gGw3->getModuleProxyList(proxList); TEST_ASSERT(proxList.size() == 4); proxList.clear(); gGw4->getModuleProxyList(proxList); TEST_ASSERT(proxList.size() == 4); // check the distances gw1_1Prox = retrieveModuleProxy(gGw1, "gw1"); TEST_ASSERT(gw1_1Prox != NULL); TEST_ASSERT(gw1_1Prox->getModuleDistance() == 0); gw1_2Prox = retrieveModuleProxy(gGw2, "gw1"); TEST_ASSERT(gw1_2Prox != NULL); TEST_ASSERT(gw1_2Prox->getModuleDistance() == 1); gw1_3Prox = retrieveModuleProxy(gGw3, "gw1"); TEST_ASSERT(gw1_3Prox != NULL); TEST_ASSERT(gw1_3Prox->getModuleDistance() == 2); gw1_4Prox = retrieveModuleProxy(gGw4, "gw1"); TEST_ASSERT(gw1_4Prox != NULL); TEST_ASSERT(gw1_4Prox->getModuleDistance() == 3); gw2_1Prox = retrieveModuleProxy(gGw1, "gw2"); TEST_ASSERT(gw2_1Prox != NULL); TEST_ASSERT(gw2_1Prox->getModuleDistance() == 1); gw2_2Prox = retrieveModuleProxy(gGw2, "gw2"); TEST_ASSERT(gw2_2Prox != NULL); TEST_ASSERT(gw2_2Prox->getModuleDistance() == 0); gw2_3Prox = retrieveModuleProxy(gGw3, "gw2"); TEST_ASSERT(gw2_3Prox != NULL); TEST_ASSERT(gw2_3Prox->getModuleDistance() == 1); gw2_4Prox = retrieveModuleProxy(gGw4, "gw2"); TEST_ASSERT(gw2_4Prox != NULL); TEST_ASSERT(gw2_4Prox->getModuleDistance() == 2); gw3_1Prox = retrieveModuleProxy(gGw1, "gw3"); TEST_ASSERT(gw3_1Prox != NULL); TEST_ASSERT(gw3_1Prox->getModuleDistance() == 2); gw3_2Prox = retrieveModuleProxy(gGw2, "gw3"); TEST_ASSERT(gw3_2Prox != NULL); TEST_ASSERT(gw3_2Prox->getModuleDistance() == 1); gw3_3Prox = retrieveModuleProxy(gGw3, "gw3"); TEST_ASSERT(gw3_3Prox != NULL); TEST_ASSERT(gw3_3Prox->getModuleDistance() == 0); gw3_4Prox = retrieveModuleProxy(gGw4, "gw3"); TEST_ASSERT(gw3_4Prox != NULL); TEST_ASSERT(gw3_4Prox->getModuleDistance() == 1); gw4_1Prox = retrieveModuleProxy(gGw1, "gw4"); TEST_ASSERT(gw4_1Prox != NULL); TEST_ASSERT(gw4_1Prox->getModuleDistance() == 3); gw4_2Prox = retrieveModuleProxy(gGw2, "gw4"); TEST_ASSERT(gw4_2Prox != NULL); TEST_ASSERT(gw4_2Prox->getModuleDistance() == 2); gw4_3Prox = retrieveModuleProxy(gGw3, "gw4"); TEST_ASSERT(gw4_3Prox != NULL); TEST_ASSERT(gw4_3Prox->getModuleDistance() == 1); gw4_4Prox = retrieveModuleProxy(gGw4, "gw4"); TEST_ASSERT(gw4_4Prox != NULL); TEST_ASSERT(gw4_4Prox->getModuleDistance() == 0); // make a double connection from gw1 to gw2 cmd = "gw1.transportCmd l3c(connect addr=localhost:8062)"; TEST_ASSERT(cr.execute(cmd, NLMISC::InfoLog())); // update the network for (uint i=0; i<7; ++i) { mm.updateModules(); NLMISC::nlSleep(100); } // check module list proxList.clear(); gGw1->getModuleProxyList(proxList); TEST_ASSERT(proxList.size() == 4); proxList.clear(); gGw2->getModuleProxyList(proxList); TEST_ASSERT(proxList.size() == 4); proxList.clear(); gGw3->getModuleProxyList(proxList); TEST_ASSERT(proxList.size() == 4); proxList.clear(); gGw4->getModuleProxyList(proxList); TEST_ASSERT(proxList.size() == 4); // check the distances gw1_1Prox = retrieveModuleProxy(gGw1, "gw1"); TEST_ASSERT(gw1_1Prox != NULL); TEST_ASSERT(gw1_1Prox->getModuleDistance() == 0); gw1_2Prox = retrieveModuleProxy(gGw2, "gw1"); TEST_ASSERT(gw1_2Prox != NULL); TEST_ASSERT(gw1_2Prox->getModuleDistance() == 1); gw1_3Prox = retrieveModuleProxy(gGw3, "gw1"); TEST_ASSERT(gw1_3Prox != NULL); TEST_ASSERT(gw1_3Prox->getModuleDistance() == 2); gw1_4Prox = retrieveModuleProxy(gGw4, "gw1"); TEST_ASSERT(gw1_4Prox != NULL); TEST_ASSERT(gw1_4Prox->getModuleDistance() == 3); gw2_1Prox = retrieveModuleProxy(gGw1, "gw2"); TEST_ASSERT(gw2_1Prox != NULL); TEST_ASSERT(gw2_1Prox->getModuleDistance() == 1); gw2_2Prox = retrieveModuleProxy(gGw2, "gw2"); TEST_ASSERT(gw2_2Prox != NULL); TEST_ASSERT(gw2_2Prox->getModuleDistance() == 0); gw2_3Prox = retrieveModuleProxy(gGw3, "gw2"); TEST_ASSERT(gw2_3Prox != NULL); TEST_ASSERT(gw2_3Prox->getModuleDistance() == 1); gw2_4Prox = retrieveModuleProxy(gGw4, "gw2"); TEST_ASSERT(gw2_4Prox != NULL); TEST_ASSERT(gw2_4Prox->getModuleDistance() == 2); gw3_1Prox = retrieveModuleProxy(gGw1, "gw3"); TEST_ASSERT(gw3_1Prox != NULL); TEST_ASSERT(gw3_1Prox->getModuleDistance() == 2); gw3_2Prox = retrieveModuleProxy(gGw2, "gw3"); TEST_ASSERT(gw3_2Prox != NULL); TEST_ASSERT(gw3_2Prox->getModuleDistance() == 1); gw3_3Prox = retrieveModuleProxy(gGw3, "gw3"); TEST_ASSERT(gw3_3Prox != NULL); TEST_ASSERT(gw3_3Prox->getModuleDistance() == 0); gw3_4Prox = retrieveModuleProxy(gGw4, "gw3"); TEST_ASSERT(gw3_4Prox != NULL); TEST_ASSERT(gw3_4Prox->getModuleDistance() == 1); gw4_1Prox = retrieveModuleProxy(gGw1, "gw4"); TEST_ASSERT(gw4_1Prox != NULL); TEST_ASSERT(gw4_1Prox->getModuleDistance() == 3); gw4_2Prox = retrieveModuleProxy(gGw2, "gw4"); TEST_ASSERT(gw4_2Prox != NULL); TEST_ASSERT(gw4_2Prox->getModuleDistance() == 2); gw4_3Prox = retrieveModuleProxy(gGw3, "gw4"); TEST_ASSERT(gw4_3Prox != NULL); TEST_ASSERT(gw4_3Prox->getModuleDistance() == 1); gw4_4Prox = retrieveModuleProxy(gGw4, "gw4"); TEST_ASSERT(gw4_4Prox != NULL); TEST_ASSERT(gw4_4Prox->getModuleDistance() == 0); // release modules mm.deleteModule(gw1); mm.deleteModule(gw2); mm.deleteModule(gw3); mm.deleteModule(gw4); } void firewalling() { // check that, with firewall mode enabled, unsafe root can only see protected // modules if they initiate the dialog first (i.e only a protected module can send // a message to an unsafe module). // // for this test, we have the following context : // 'master' : a gateway that accesses connection on two transports, one 'firewalled', the other one normal // 'peer1' : gateway connected to gateway 'master' on a firewalled transport // 'peer2' : gateway connected to gateway 'master' on a firewalled transport // 'other' : gateway connected to gateway 'master' on a classic transport // // peer1 (l3c)-----\ // >-|<- (l3s1/Firewalled) master (l3s2) ----- (l3c) other // peer2 (l3c)-----/ // // 'peer1' and 'peer2' must not see any module except modules that try to communicate with them // 'master' and 'other' must see 'peer1', 'peer2', 'master' and 'other' // // Switching OFF the firewall should disclose all modules, // switching ON then must throw an exception NLNET::IModuleManager &mm = NLNET::IModuleManager::getInstance(); NLMISC::CCommandRegistry &cr = NLMISC::CCommandRegistry::getInstance(); NLNET::IModule *peer1, *peer2, *master, *other; // create the modules peer1 = mm.createModule("StandardGateway", "peer1", ""); peer2 = mm.createModule("StandardGateway", "peer2", ""); master = mm.createModule("StandardGateway", "master", ""); other = mm.createModule("StandardGateway", "other", ""); TEST_ASSERT(peer1 != NULL); TEST_ASSERT(peer2 != NULL); TEST_ASSERT(master != NULL); TEST_ASSERT(other != NULL); // plug gateway in themselves NLNET::IModuleSocket *sPeer1, *sPeer2, *sMaster, *sOther; sPeer1 = mm.getModuleSocket("peer1"); sPeer2 = mm.getModuleSocket("peer2"); sMaster = mm.getModuleSocket("master"); sOther = mm.getModuleSocket("other"); TEST_ASSERT(sPeer1 != NULL); TEST_ASSERT(sPeer2 != NULL); TEST_ASSERT(sMaster != NULL); TEST_ASSERT(sOther != NULL); peer1->plugModule(sPeer1); peer2->plugModule(sPeer2); master->plugModule(sMaster); other->plugModule(sOther); string cmd; // create the transports cmd = "peer1.transportAdd L3Client l3c"; TEST_ASSERT(cr.execute(cmd, NLMISC::InfoLog())); cmd = "peer2.transportAdd L3Client l3c"; TEST_ASSERT(cr.execute(cmd, NLMISC::InfoLog())); cmd = "master.transportAdd L3Server l3s1"; TEST_ASSERT(cr.execute(cmd, NLMISC::InfoLog())); cmd = "master.transportAdd L3Server l3s2"; TEST_ASSERT(cr.execute(cmd, NLMISC::InfoLog())); cmd = "other.transportAdd L3Client l3c"; TEST_ASSERT(cr.execute(cmd, NLMISC::InfoLog())); // Set option and connect transport cmd = "master.transportOptions l3s1(Firewalled)"; TEST_ASSERT(cr.execute(cmd, NLMISC::InfoLog())); cmd = "master.transportCmd l3s1(open port=8060)"; TEST_ASSERT(cr.execute(cmd, NLMISC::InfoLog())); cmd = "master.transportCmd l3s2(open port=8061)"; TEST_ASSERT(cr.execute(cmd, NLMISC::InfoLog())); cmd = "peer1.transportCmd l3c(connect addr=localhost:8060)"; TEST_ASSERT(cr.execute(cmd, NLMISC::InfoLog())); cmd = "peer2.transportCmd l3c(connect addr=localhost:8060)"; TEST_ASSERT(cr.execute(cmd, NLMISC::InfoLog())); cmd = "other.transportCmd l3c(connect addr=localhost:8061)"; TEST_ASSERT(cr.execute(cmd, NLMISC::InfoLog())); // d'ho ! all done, now let's run some loop of update for (uint i=0; i<7; ++i) { mm.updateModules(); NLMISC::nlSleep(100); } // ok, now, check that each gateway only knows the gateway it must know NLNET::IModuleGateway *gPeer1, *gPeer2, *gMaster, *gOther; gPeer1 = dynamic_cast<NLNET::IModuleGateway *>(peer1); TEST_ASSERT(gPeer1 != NULL); gPeer2 = dynamic_cast<NLNET::IModuleGateway *>(peer2); TEST_ASSERT(gPeer2 != NULL); gMaster = dynamic_cast<NLNET::IModuleGateway *>(master); TEST_ASSERT(gMaster != NULL); gOther = dynamic_cast<NLNET::IModuleGateway *>(other); TEST_ASSERT(gOther != NULL); vector<NLNET::IModuleProxy*> proxList; gPeer1->getModuleProxyList(proxList); TEST_ASSERT(proxList.size() == 1); TEST_ASSERT(lookForModuleProxy(proxList, "peer1")); proxList.clear(); gPeer2->getModuleProxyList(proxList); TEST_ASSERT(proxList.size() == 1); TEST_ASSERT(lookForModuleProxy(proxList, "peer2")); proxList.clear(); gMaster->getModuleProxyList(proxList); TEST_ASSERT(proxList.size() == 4); TEST_ASSERT(lookForModuleProxy(proxList, "master")); TEST_ASSERT(lookForModuleProxy(proxList, "peer1")); TEST_ASSERT(lookForModuleProxy(proxList, "peer2")); TEST_ASSERT(lookForModuleProxy(proxList, "other")); proxList.clear(); gOther->getModuleProxyList(proxList); TEST_ASSERT(proxList.size() == 4); TEST_ASSERT(lookForModuleProxy(proxList, "other")); TEST_ASSERT(lookForModuleProxy(proxList, "master")); TEST_ASSERT(lookForModuleProxy(proxList, "peer1")); TEST_ASSERT(lookForModuleProxy(proxList, "peer2")); // now send the debug 'PING' message from 'other' to 'peer1', and a message from 'master' to 'peer2' { NLNET::CMessage ping("DEBUG_MOD_PING"); // retrieve peer1 proxy from other NLNET::IModuleProxy *peer1Prox = retrieveModuleProxy(gMaster, "peer1"); TEST_ASSERT(peer1Prox != NULL); peer1Prox->sendModuleMessage(master, ping); } { NLNET::CMessage ping("DEBUG_MOD_PING"); // retrieve peer1 proxy from other NLNET::IModuleProxy *peer2Prox = retrieveModuleProxy(gOther, "peer2"); TEST_ASSERT(peer2Prox != NULL); peer2Prox->sendModuleMessage(other, ping); } // update the network for (uint i=0; i<7; ++i) { mm.updateModules(); NLMISC::nlSleep(100); } // check new proxy table and ping counter TEST_ASSERT(gPeer1->getReceivedPingCount() == 1); proxList.clear(); gPeer1->getModuleProxyList(proxList); TEST_ASSERT(proxList.size() == 2); TEST_ASSERT(lookForModuleProxy(proxList, "peer1")); TEST_ASSERT(lookForModuleProxy(proxList, "master")); TEST_ASSERT(gPeer2->getReceivedPingCount() == 1); proxList.clear(); gPeer2->getModuleProxyList(proxList); TEST_ASSERT(proxList.size() == 2); TEST_ASSERT(lookForModuleProxy(proxList, "peer2")); TEST_ASSERT(lookForModuleProxy(proxList, "other")); proxList.clear(); gMaster->getModuleProxyList(proxList); TEST_ASSERT(proxList.size() == 4); TEST_ASSERT(lookForModuleProxy(proxList, "master")); TEST_ASSERT(lookForModuleProxy(proxList, "peer1")); TEST_ASSERT(lookForModuleProxy(proxList, "peer2")); TEST_ASSERT(lookForModuleProxy(proxList, "other")); proxList.clear(); gOther->getModuleProxyList(proxList); TEST_ASSERT(proxList.size() == 4); TEST_ASSERT(lookForModuleProxy(proxList, "other")); TEST_ASSERT(lookForModuleProxy(proxList, "master")); TEST_ASSERT(lookForModuleProxy(proxList, "peer1")); TEST_ASSERT(lookForModuleProxy(proxList, "peer2")); // now, remove firewall mode cmd = "master.transportOptions l3s1()"; TEST_ASSERT(cr.execute(cmd, NLMISC::InfoLog())); // update the network for (uint i=0; i<7; ++i) { mm.updateModules(); NLMISC::nlSleep(100); } // check new proxy table and ping counter proxList.clear(); gPeer1->getModuleProxyList(proxList); TEST_ASSERT(proxList.size() == 4); TEST_ASSERT(lookForModuleProxy(proxList, "master")); TEST_ASSERT(lookForModuleProxy(proxList, "peer1")); TEST_ASSERT(lookForModuleProxy(proxList, "peer2")); TEST_ASSERT(lookForModuleProxy(proxList, "other")); TEST_ASSERT(gPeer2->getReceivedPingCount() == 1); proxList.clear(); gPeer2->getModuleProxyList(proxList); TEST_ASSERT(proxList.size() == 4); TEST_ASSERT(lookForModuleProxy(proxList, "master")); TEST_ASSERT(lookForModuleProxy(proxList, "peer1")); TEST_ASSERT(lookForModuleProxy(proxList, "peer2")); TEST_ASSERT(lookForModuleProxy(proxList, "other")); proxList.clear(); gMaster->getModuleProxyList(proxList); TEST_ASSERT(proxList.size() == 4); TEST_ASSERT(lookForModuleProxy(proxList, "master")); TEST_ASSERT(lookForModuleProxy(proxList, "peer1")); TEST_ASSERT(lookForModuleProxy(proxList, "peer2")); TEST_ASSERT(lookForModuleProxy(proxList, "other")); proxList.clear(); gOther->getModuleProxyList(proxList); TEST_ASSERT(proxList.size() == 4); TEST_ASSERT(lookForModuleProxy(proxList, "other")); TEST_ASSERT(lookForModuleProxy(proxList, "master")); TEST_ASSERT(lookForModuleProxy(proxList, "peer1")); TEST_ASSERT(lookForModuleProxy(proxList, "peer2")); // no try reactivate firewall mode with active route cmd = "master.transportOptions l3s1(Firewalled)"; TEST_THROWS(cr.execute(cmd, NLMISC::InfoLog()), NLNET::IModuleGateway::EGatewayFirewallBreak); // cleanup mm.deleteModule(peer1); mm.deleteModule(peer2); mm.deleteModule(master); mm.deleteModule(other); } void peerInvisible() { // check that, with peer invisible enable, the peer modules are effectively invisible, // and, also, check that other modules, on other route are visible. // for this test, we have the following context : // 'master' : a gateway that acces connection on to transport, on 'peer invisible', the other normal // 'peer1' : gateway connected to gateway 'master' on a peer invisible transport // 'peer2' : gateway connected to gateway 'master' on a peer invisible transport // 'other' : gateway connected to gateway 'master' on a classic transport // // peer1 (l3c)-----\ // >-- (l3s1/PeerInvisible) master (l3s2) ----- (l3c) other // peer2 (l3c)-----/ // // 'peer1' must see 'master' and 'other' // 'peer2' must see 'master' and 'other' // 'master' must see 'peer1', 'peer2' and 'other' // 'other' must see 'peer1', 'peer2' and 'master' // // When switching the PeerInvisible option to OFF, peer1 and peer2 must see each other NLNET::IModuleManager &mm = NLNET::IModuleManager::getInstance(); NLMISC::CCommandRegistry &cr = NLMISC::CCommandRegistry::getInstance(); NLNET::IModule *peer1, *peer2, *master, *other; // create the modules peer1 = mm.createModule("StandardGateway", "peer1", ""); peer2 = mm.createModule("StandardGateway", "peer2", ""); master = mm.createModule("StandardGateway", "master", ""); other = mm.createModule("StandardGateway", "other", ""); TEST_ASSERT(peer1 != NULL); TEST_ASSERT(peer2 != NULL); TEST_ASSERT(master != NULL); TEST_ASSERT(other != NULL); // plug gateway in themselves NLNET::IModuleSocket *sPeer1, *sPeer2, *sMaster, *sOther; sPeer1 = mm.getModuleSocket("peer1"); sPeer2 = mm.getModuleSocket("peer2"); sMaster = mm.getModuleSocket("master"); sOther = mm.getModuleSocket("other"); TEST_ASSERT(sPeer1 != NULL); TEST_ASSERT(sPeer2 != NULL); TEST_ASSERT(sMaster != NULL); TEST_ASSERT(sOther != NULL); peer1->plugModule(sPeer1); peer2->plugModule(sPeer2); master->plugModule(sMaster); other->plugModule(sOther); string cmd; // create the transports cmd = "peer1.transportAdd L3Client l3c"; TEST_ASSERT(cr.execute(cmd, NLMISC::InfoLog())); cmd = "peer2.transportAdd L3Client l3c"; TEST_ASSERT(cr.execute(cmd, NLMISC::InfoLog())); cmd = "master.transportAdd L3Server l3s1"; TEST_ASSERT(cr.execute(cmd, NLMISC::InfoLog())); cmd = "master.transportAdd L3Server l3s2"; TEST_ASSERT(cr.execute(cmd, NLMISC::InfoLog())); cmd = "other.transportAdd L3Client l3c"; TEST_ASSERT(cr.execute(cmd, NLMISC::InfoLog())); // Set option and connect transport cmd = "master.transportOptions l3s1(PeerInvisible)"; TEST_ASSERT(cr.execute(cmd, NLMISC::InfoLog())); cmd = "master.transportCmd l3s1(open port=8060)"; TEST_ASSERT(cr.execute(cmd, NLMISC::InfoLog())); cmd = "master.transportCmd l3s2(open port=8061)"; TEST_ASSERT(cr.execute(cmd, NLMISC::InfoLog())); cmd = "peer1.transportCmd l3c(connect addr=localhost:8060)"; TEST_ASSERT(cr.execute(cmd, NLMISC::InfoLog())); cmd = "peer2.transportCmd l3c(connect addr=localhost:8060)"; TEST_ASSERT(cr.execute(cmd, NLMISC::InfoLog())); cmd = "other.transportCmd l3c(connect addr=localhost:8061)"; TEST_ASSERT(cr.execute(cmd, NLMISC::InfoLog())); // d'ho ! all done, now let's run some loop of update for (uint i=0; i<7; ++i) { mm.updateModules(); NLMISC::nlSleep(100); } // ok, now, check that each gateway only knows the gateway it must know NLNET::IModuleGateway *gPeer1, *gPeer2, *gMaster, *gOther; gPeer1 = dynamic_cast<NLNET::IModuleGateway *>(peer1); TEST_ASSERT(gPeer1 != NULL); gPeer2 = dynamic_cast<NLNET::IModuleGateway *>(peer2); TEST_ASSERT(gPeer2 != NULL); gMaster = dynamic_cast<NLNET::IModuleGateway *>(master); TEST_ASSERT(gMaster != NULL); gOther = dynamic_cast<NLNET::IModuleGateway *>(other); TEST_ASSERT(gOther != NULL); vector<NLNET::IModuleProxy*> proxList; gPeer1->getModuleProxyList(proxList); TEST_ASSERT(proxList.size() == 3); TEST_ASSERT(lookForModuleProxy(proxList, "peer1")); TEST_ASSERT(lookForModuleProxy(proxList, "master")); TEST_ASSERT(lookForModuleProxy(proxList, "other")); proxList.clear(); gPeer2->getModuleProxyList(proxList); TEST_ASSERT(proxList.size() == 3); TEST_ASSERT(lookForModuleProxy(proxList, "peer2")); TEST_ASSERT(lookForModuleProxy(proxList, "master")); TEST_ASSERT(lookForModuleProxy(proxList, "other")); proxList.clear(); gMaster->getModuleProxyList(proxList); TEST_ASSERT(proxList.size() == 4); TEST_ASSERT(lookForModuleProxy(proxList, "master")); TEST_ASSERT(lookForModuleProxy(proxList, "peer1")); TEST_ASSERT(lookForModuleProxy(proxList, "peer2")); TEST_ASSERT(lookForModuleProxy(proxList, "other")); proxList.clear(); gOther->getModuleProxyList(proxList); TEST_ASSERT(proxList.size() == 4); TEST_ASSERT(lookForModuleProxy(proxList, "other")); TEST_ASSERT(lookForModuleProxy(proxList, "master")); TEST_ASSERT(lookForModuleProxy(proxList, "peer1")); TEST_ASSERT(lookForModuleProxy(proxList, "peer2")); // now, remove the 'PeerInvisible' options cmd = "master.transportOptions l3s1()"; TEST_ASSERT(cr.execute(cmd, NLMISC::InfoLog())); // update the network for (uint i=0; i<7; ++i) { mm.updateModules(); NLMISC::nlSleep(100); } // check new proxy table proxList.clear(); gPeer1->getModuleProxyList(proxList); TEST_ASSERT(proxList.size() == 4); TEST_ASSERT(lookForModuleProxy(proxList, "peer1")); TEST_ASSERT(lookForModuleProxy(proxList, "master")); TEST_ASSERT(lookForModuleProxy(proxList, "other")); TEST_ASSERT(lookForModuleProxy(proxList, "peer2")); proxList.clear(); gPeer2->getModuleProxyList(proxList); TEST_ASSERT(proxList.size() == 4); TEST_ASSERT(lookForModuleProxy(proxList, "peer2")); TEST_ASSERT(lookForModuleProxy(proxList, "master")); TEST_ASSERT(lookForModuleProxy(proxList, "other")); TEST_ASSERT(lookForModuleProxy(proxList, "peer1")); proxList.clear(); gMaster->getModuleProxyList(proxList); TEST_ASSERT(proxList.size() == 4); TEST_ASSERT(lookForModuleProxy(proxList, "master")); TEST_ASSERT(lookForModuleProxy(proxList, "peer1")); TEST_ASSERT(lookForModuleProxy(proxList, "peer2")); TEST_ASSERT(lookForModuleProxy(proxList, "other")); proxList.clear(); gOther->getModuleProxyList(proxList); TEST_ASSERT(proxList.size() == 4); TEST_ASSERT(lookForModuleProxy(proxList, "other")); TEST_ASSERT(lookForModuleProxy(proxList, "master")); TEST_ASSERT(lookForModuleProxy(proxList, "peer1")); TEST_ASSERT(lookForModuleProxy(proxList, "peer2")); // now, re set the 'PeerInvisible' options cmd = "master.transportOptions l3s1(PeerInvisible)"; TEST_ASSERT(cr.execute(cmd, NLMISC::InfoLog())); // update the network for (uint i=0; i<7; ++i) { mm.updateModules(); NLMISC::nlSleep(100); } // check new proxy table proxList.clear(); gPeer1->getModuleProxyList(proxList); TEST_ASSERT(proxList.size() == 3); TEST_ASSERT(lookForModuleProxy(proxList, "peer1")); TEST_ASSERT(lookForModuleProxy(proxList, "master")); TEST_ASSERT(lookForModuleProxy(proxList, "other")); proxList.clear(); gPeer2->getModuleProxyList(proxList); TEST_ASSERT(proxList.size() == 3); TEST_ASSERT(lookForModuleProxy(proxList, "peer2")); TEST_ASSERT(lookForModuleProxy(proxList, "master")); TEST_ASSERT(lookForModuleProxy(proxList, "other")); proxList.clear(); gMaster->getModuleProxyList(proxList); TEST_ASSERT(proxList.size() == 4); TEST_ASSERT(lookForModuleProxy(proxList, "master")); TEST_ASSERT(lookForModuleProxy(proxList, "peer1")); TEST_ASSERT(lookForModuleProxy(proxList, "peer2")); TEST_ASSERT(lookForModuleProxy(proxList, "other")); proxList.clear(); gOther->getModuleProxyList(proxList); TEST_ASSERT(proxList.size() == 4); TEST_ASSERT(lookForModuleProxy(proxList, "other")); TEST_ASSERT(lookForModuleProxy(proxList, "master")); TEST_ASSERT(lookForModuleProxy(proxList, "peer1")); TEST_ASSERT(lookForModuleProxy(proxList, "peer2")); // cleanup mm.deleteModule(peer1); mm.deleteModule(peer2); mm.deleteModule(master); mm.deleteModule(other); } void gwPlugUnplug() { // check that multiple plug/unplug operations work well NLNET::IModuleManager &mm = NLNET::IModuleManager::getInstance(); NLMISC::CCommandRegistry &cr = NLMISC::CCommandRegistry::getInstance(); NLNET::IModule *mod = mm.createModule("StandardGateway", "gw", ""); TEST_ASSERT(mod != NULL); NLNET::IModuleSocket *socket = mm.getModuleSocket("gw"); TEST_ASSERT(socket != NULL); mod->plugModule(socket); mod->unplugModule(socket); mod->plugModule(socket); mod->unplugModule(socket); mod->plugModule(socket); std::vector<NLNET::IModuleProxy*> result; socket->getModuleList(result); TEST_ASSERT(result.size() == 1); mod->unplugModule(socket); mm.deleteModule(mod); } void uniqueNameGenerator() { NLNET::IModuleManager &mm = NLNET::IModuleManager::getInstance(); NLMISC::CCommandRegistry &cr = NLMISC::CCommandRegistry::getInstance(); mm.setUniqueNameRoot("foo"); // create a simple module NLNET::IModule *mod = mm.createModule("ModuleType0", "mod", ""); TEST_ASSERT(mod != NULL); TEST_ASSERT(mod->getModuleFullyQualifiedName() == "foo:mod"); mm.deleteModule(mod); // reset the unique name to normal value mm.setUniqueNameRoot(string()); mod = mm.createModule("ModuleType0", "mod", ""); TEST_ASSERT(mod != NULL); TEST_ASSERT(mod->getModuleFullyQualifiedName() != "foo:mod"); mm.deleteModule(mod); } void localMessageQueing() { NLNET::IModuleManager &mm = NLNET::IModuleManager::getInstance(); NLMISC::CCommandRegistry &cr = NLMISC::CCommandRegistry::getInstance(); NLNET::IModule *mods = mm.createModule("StandardGateway", "gws", ""); TEST_ASSERT(mods != NULL); NLNET::IModuleGateway *gws = dynamic_cast<NLNET::IModuleGateway*>(mods); TEST_ASSERT(gws != NULL); // get the socket interface of the gateway NLNET::IModuleSocket *socketGws = mm.getModuleSocket("gws"); TEST_ASSERT(socketGws != NULL); // create two modules that will communicate localy NLNET::IModule *m1= mm.createModule("ModuleType0", "m1", ""); TEST_ASSERT(m1!= NULL); NLNET::IModule *m2= mm.createModule("ModuleAsync", "m2", ""); TEST_ASSERT(m2!= NULL); m1->plugModule(socketGws); m2->plugModule(socketGws); // update the networks for (uint i=0; i<4; ++i) { mm.updateModules(); NLMISC::nlSleep(50); } // retrieve module proxy and send one ping to each other vector<NLNET::IModuleProxy*> proxiesC; gws->getModuleProxyList(proxiesC); TEST_ASSERT(proxiesC.size() == 2); TEST_ASSERT(lookForModuleProxy(proxiesC, "m2")); NLNET::IModuleProxy *pm2 = retrieveModuleProxy(gws, "m2"); TEST_ASSERT(pm2 != NULL); NLNET::CMessage aMessage("DEBUG_MOD_PING"); pm2->sendModuleMessage(m1, aMessage); proxiesC.clear(); gws->getModuleProxyList(proxiesC); TEST_ASSERT(proxiesC.size() == 2); TEST_ASSERT(lookForModuleProxy(proxiesC, "m1")); NLNET::IModuleProxy *pm1 = retrieveModuleProxy(gws, "m1"); TEST_ASSERT(pm1 != NULL); aMessage = NLNET::CMessage("DEBUG_MOD_PING"); pm1->sendModuleMessage(m2, aMessage); // check received ping count CModuleType0 *mod1 = dynamic_cast<CModuleType0*>(m1); TEST_ASSERT(mod1 != NULL); TEST_ASSERT(mod1->PingCount == 1); CModuleType0 *mod2 = dynamic_cast<CModuleType0*>(m2); TEST_ASSERT(mod2 != NULL); TEST_ASSERT(mod2->PingCount == 0); // update the networks for (uint i=0; i<4; ++i) { mm.updateModules(); NLMISC::nlSleep(50); } // check received ping count TEST_ASSERT(mod1->PingCount == 1); TEST_ASSERT(mod2->PingCount == 1); // update the networks for (uint i=0; i<4; ++i) { mm.updateModules(); NLMISC::nlSleep(50); } // check received ping count TEST_ASSERT(mod1->PingCount == 1); TEST_ASSERT(mod2->PingCount == 1); // cleanup mm.deleteModule(m1); mm.deleteModule(m2); mm.deleteModule(mods); } void moduleMessaging() { NLNET::IModuleManager &mm = NLNET::IModuleManager::getInstance(); NLMISC::CCommandRegistry &cr = NLMISC::CCommandRegistry::getInstance(); // create two gateway an connect them, plug the gateway on themselves and send a message NLNET::IModule *mods = mm.createModule("StandardGateway", "gws", ""); TEST_ASSERT(mods != NULL); NLNET::IModuleGateway *gws = dynamic_cast<NLNET::IModuleGateway*>(mods); TEST_ASSERT(gws != NULL); // plug the module in itself before opening connection NLNET::IModuleSocket *socketGws = mm.getModuleSocket("gws"); TEST_ASSERT(socketGws != NULL); mods->plugModule(socketGws); // add transport for server mode string cmd = "gws.transportAdd L3Server l3s"; TEST_ASSERT(cr.execute(cmd, NLMISC::InfoLog())); cmd = "gws.transportCmd l3s(open port=6185)"; TEST_ASSERT(cr.execute(cmd, NLMISC::InfoLog())); NLNET::IModule *modc = mm.createModule("StandardGateway", "gwc", ""); TEST_ASSERT(modc != NULL); NLNET::IModuleGateway *gwc = dynamic_cast<NLNET::IModuleGateway*>(modc); TEST_ASSERT(gwc != NULL); // add transport for client mode cmd = "gwc.transportAdd L3Client l3c"; TEST_ASSERT(cr.execute(cmd, NLMISC::InfoLog())); cmd = "gwc.transportCmd l3c(connect addr=localhost:6185)"; TEST_ASSERT(cr.execute(cmd, NLMISC::InfoLog())); // plug the module in itself before opening connection NLNET::IModuleSocket *socketGwc = mm.getModuleSocket("gwc"); TEST_ASSERT(socketGwc != NULL); modc->plugModule(socketGwc); // update the gateways... for (uint i=0; i<4; ++i) { mm.updateModules(); NLMISC::nlSleep(100); } // send a message from gws to gwc using the proxy // First, get the proxy for the client (must be the second one) vector<NLNET::IModuleProxy*> proxiesS; gws->getModuleProxyList(proxiesS); TEST_ASSERT(proxiesS.size() == 2); TEST_ASSERT(lookForModuleProxy(proxiesS, "gwc")); NLNET::CMessage aMessage("DEBUG_MOD_PING"); proxiesS[1]->sendModuleMessage(mods, aMessage); // update the gateways... for (uint i=0; i<4; ++i) { mm.updateModules(); NLMISC::nlSleep(100); } // check that the ping has been received TEST_ASSERT(gwc->getReceivedPingCount() == 1); // send two crossing messages simultaneously vector<NLNET::IModuleProxy*> proxiesC; gwc->getModuleProxyList(proxiesC); TEST_ASSERT(proxiesC.size() == 2); TEST_ASSERT(lookForModuleProxy(proxiesC, "gws")); proxiesS[1]->sendModuleMessage(mods, aMessage); proxiesC[1]->sendModuleMessage(modc, aMessage); // update the gateways... for (uint i=0; i<4; ++i) { mm.updateModules(); NLMISC::nlSleep(100); } // check that the ping has been received TEST_ASSERT(gwc->getReceivedPingCount() == 2); TEST_ASSERT(gws->getReceivedPingCount() == 1); // send with ISocket socketGws->sendModuleMessage(mods, proxiesS[1]->getModuleProxyId(), aMessage); // update the gateways... for (uint i=0; i<4; ++i) { mm.updateModules(); NLMISC::nlSleep(100); } // check that the ping has been received TEST_ASSERT(gwc->getReceivedPingCount() == 3); TEST_ASSERT(gws->getReceivedPingCount() == 1); // cleanup modules mm.deleteModule(mods); TEST_ASSERT(mm.getLocalModule("gws") == NULL); mm.deleteModule(modc); TEST_ASSERT(mm.getLocalModule("gwc") == NULL); } void moduleDisclosure() { NLNET::IModuleManager &mm = NLNET::IModuleManager::getInstance(); NLMISC::CCommandRegistry &cr = NLMISC::CCommandRegistry::getInstance(); NLNET::IModule *mods = mm.createModule("StandardGateway", "gws", ""); TEST_ASSERT(mods != NULL); NLNET::IModuleGateway *gws = dynamic_cast<NLNET::IModuleGateway*>(mods); TEST_ASSERT(gws != NULL); TEST_ASSERT(gws->getProxyCount() == 0); // plug the module in itself before opening connection NLNET::IModuleSocket *socketGws = mm.getModuleSocket("gws"); TEST_ASSERT(socketGws != NULL); mods->plugModule(socketGws); // now, there must be one proxy in the gateway TEST_ASSERT(gws->getProxyCount() == 1); vector<NLNET::IModuleProxy*> proxies; gws->getModuleProxyList(proxies); TEST_ASSERT(proxies.size() == 1); TEST_ASSERT(proxies[0]->getGatewayRoute() == NULL); TEST_ASSERT(proxies[0]->getForeignModuleId() == mods->getModuleId()); // add transport for server mode string cmd = "gws.transportAdd L3Server l3s"; TEST_ASSERT(cr.execute(cmd, NLMISC::InfoLog())); cmd = "gws.transportCmd l3s(open port=6185)"; TEST_ASSERT(cr.execute(cmd, NLMISC::InfoLog())); NLNET::IModule *modc = mm.createModule("StandardGateway", "gwc", ""); TEST_ASSERT(modc != NULL); NLNET::IModuleGateway *gwc = dynamic_cast<NLNET::IModuleGateway*>(modc); TEST_ASSERT(gwc != NULL); // add transport for client mode cmd = "gwc.transportAdd L3Client l3c"; TEST_ASSERT(cr.execute(cmd, NLMISC::InfoLog())); cmd = "gwc.transportCmd l3c(connect addr=localhost:6185)"; TEST_ASSERT(cr.execute(cmd, NLMISC::InfoLog())); for (uint i=0; i<5; ++i) { mm.updateModules(); NLMISC::nlSleep(100); } // The server must have not changed TEST_ASSERT(gws->getProxyCount() == 1); // The client must have one proxy TEST_ASSERT(gwc->getProxyCount() == 1); proxies.clear(); gwc->getModuleProxyList(proxies); TEST_ASSERT(proxies.size() == 1); TEST_ASSERT(proxies[0]->getGatewayRoute() != NULL); TEST_ASSERT(proxies[0]->getModuleName().find("gws") == proxies[0]->getModuleName().size() - 3); // plug the client module in itself after opening connection NLNET::IModuleSocket *socketGwc = mm.getModuleSocket("gwc"); TEST_ASSERT(socketGwc != NULL); modc->plugModule(socketGwc); for (uint i=0; i<4; ++i) { mm.updateModules(); NLMISC::nlSleep(100); } // The server must have now the two modules TEST_ASSERT(gws->getProxyCount() == 2); proxies.clear(); gws->getModuleProxyList(proxies); TEST_ASSERT(proxies.size() == 2); TEST_ASSERT(proxies[0]->getGatewayRoute() == NULL); TEST_ASSERT(proxies[0]->getForeignModuleId() == mods->getModuleId()); TEST_ASSERT(proxies[1]->getGatewayRoute() != NULL); TEST_ASSERT(proxies[1]->getModuleName().find("gwc") == proxies[1]->getModuleName().size() - 3); // The client must have two module also TEST_ASSERT(gwc->getProxyCount() == 2); proxies.clear(); gwc->getModuleProxyList(proxies); TEST_ASSERT(proxies.size() == 2); TEST_ASSERT(proxies[0]->getGatewayRoute() != NULL); TEST_ASSERT(proxies[0]->getModuleName().find("gws") == proxies[1]->getModuleName().size() - 3); TEST_ASSERT(proxies[1]->getGatewayRoute() == NULL); TEST_ASSERT(proxies[1]->getForeignModuleId() == modc->getModuleId()); // unplug the client module in itself after opening connection mods->unplugModule(socketGws); for (uint i=0; i<4; ++i) { NLMISC::nlSleep(100); mm.updateModules(); } // The server must have one module left TEST_ASSERT(gws->getProxyCount() == 1); proxies.clear(); gws->getModuleProxyList(proxies); TEST_ASSERT(proxies.size() == 1); TEST_ASSERT(proxies[0]->getGatewayRoute() != NULL); TEST_ASSERT(proxies[0]->getModuleName().find("gwc") == proxies[0]->getModuleName().size() - 3); // The client must have one module left TEST_ASSERT(gwc->getProxyCount() == 1); proxies.clear(); gwc->getModuleProxyList(proxies); TEST_ASSERT(proxies.size() == 1); TEST_ASSERT(proxies[0]->getGatewayRoute() == NULL); TEST_ASSERT(proxies[0]->getForeignModuleId() == modc->getModuleId()); // Dump the module state cmd = "gws.dump"; TEST_ASSERT(cr.execute(cmd, NLMISC::InfoLog())); cmd = "gwc.dump"; TEST_ASSERT(cr.execute(cmd, NLMISC::InfoLog())); // cleanup modules mm.deleteModule(mods); TEST_ASSERT(mm.getLocalModule("gws") == NULL); mm.deleteModule(modc); TEST_ASSERT(mm.getLocalModule("gwc") == NULL); } void connectGateways() { NLNET::IModuleManager &mm = NLNET::IModuleManager::getInstance(); NLNET::IModule *mods = mm.createModule("StandardGateway", "gws", ""); TEST_ASSERT(mods != NULL); NLNET::IModuleGateway *gws = dynamic_cast<NLNET::IModuleGateway*>(mods); TEST_ASSERT(gws != NULL); // add transport for server mode string cmd = "gws.transportAdd L3Server l3s"; TEST_ASSERT(NLMISC::CCommandRegistry::getInstance().execute(cmd, NLMISC::InfoLog())); cmd = "gws.transportCmd l3s(open port=6185)"; TEST_ASSERT(NLMISC::CCommandRegistry::getInstance().execute(cmd, NLMISC::InfoLog())); NLNET::IModule *modc1 = mm.createModule("StandardGateway", "gwc1", ""); TEST_ASSERT(modc1 != NULL); NLNET::IModuleGateway *gwc1 = dynamic_cast<NLNET::IModuleGateway*>(modc1); TEST_ASSERT(gwc1 != NULL); // add transport for client mode cmd = "gwc1.transportAdd L3Client l3c"; TEST_ASSERT(NLMISC::CCommandRegistry::getInstance().execute(cmd, NLMISC::InfoLog())); cmd = "gwc1.transportCmd l3c(connect addr=localhost:6185)"; TEST_ASSERT(NLMISC::CCommandRegistry::getInstance().execute(cmd, NLMISC::InfoLog())); for (uint i=0; i<4; ++i) { mm.updateModules(); NLMISC::nlSleep(100); } TEST_ASSERT(gws->getRouteCount() == 1); TEST_ASSERT(gwc1->getRouteCount() == 1); // do a second connect to the server for stress // add transport for client mode cmd = "gwc1.transportCmd l3c(connect addr=localhost:6185)"; TEST_ASSERT(NLMISC::CCommandRegistry::getInstance().execute(cmd, NLMISC::InfoLog())); // create third gateway NLNET::IModule *modc2 = mm.createModule("StandardGateway", "gwc2", ""); TEST_ASSERT(modc2 != NULL); NLNET::IModuleGateway *gwc2 = dynamic_cast<NLNET::IModuleGateway*>(modc2); TEST_ASSERT(gwc2 != NULL); // add transport for client mode cmd = "gwc2.transportAdd L3Client l3c"; TEST_ASSERT(NLMISC::CCommandRegistry::getInstance().execute(cmd, NLMISC::InfoLog())); cmd = "gwc2.transportCmd l3c(connect addr=localhost:6185)"; TEST_ASSERT(NLMISC::CCommandRegistry::getInstance().execute(cmd, NLMISC::InfoLog())); // update the module to update the network callback client and server for (uint i=0; i<4; ++i) { // give some time to the listen and receiver thread to do there jobs NLMISC::nlSleep(100); mm.updateModules(); } TEST_ASSERT(gws->getRouteCount() == 3); TEST_ASSERT(gwc1->getRouteCount() == 2); TEST_ASSERT(gwc2->getRouteCount() == 1); // dump the gateways state cmd = "gws.dump"; TEST_ASSERT(NLMISC::CCommandRegistry::getInstance().execute(cmd, NLMISC::InfoLog())); cmd = "gwc1.dump"; TEST_ASSERT(NLMISC::CCommandRegistry::getInstance().execute(cmd, NLMISC::InfoLog())); cmd = "gwc2.dump"; TEST_ASSERT(NLMISC::CCommandRegistry::getInstance().execute(cmd, NLMISC::InfoLog())); // cleanup the modules mm.deleteModule(mods); TEST_ASSERT(mm.getLocalModule("gws") == NULL); mm.deleteModule(modc1); TEST_ASSERT(mm.getLocalModule("gwc1") == NULL); mm.deleteModule(modc2); TEST_ASSERT(mm.getLocalModule("gwc2") == NULL); } void gatewayTransportManagement() { NLNET::IModuleManager &mm = NLNET::IModuleManager::getInstance(); // create a gateway module NLNET::IModule *mod = mm.createModule("StandardGateway", "gw", ""); TEST_ASSERT(mod != NULL); NLNET::IModuleGateway *gw = dynamic_cast<NLNET::IModuleGateway*>(mod); TEST_ASSERT(gw != NULL); // Create a layer 3 server transport // send a transport creation command string cmd = "gw.transportAdd L3Server l3s"; TEST_ASSERT(NLMISC::CCommandRegistry::getInstance().execute(cmd, NLMISC::InfoLog())); NLNET::IGatewayTransport *transportL3s = gw->getGatewayTransport("l3s"); TEST_ASSERT(transportL3s != NULL); // send a transport command cmd = "gw.transportCmd l3s(open port=6185)"; TEST_ASSERT(NLMISC::CCommandRegistry::getInstance().execute(cmd, NLMISC::InfoLog())); // Create a layer 3 client transport // send a transport creation command cmd = "gw.transportAdd L3Client l3c"; TEST_ASSERT(NLMISC::CCommandRegistry::getInstance().execute(cmd, NLMISC::InfoLog())); NLNET::IGatewayTransport *transportL3c = gw->getGatewayTransport("l3c"); TEST_ASSERT(transportL3c != NULL); // send a transport command cmd = "gw.transportCmd l3c(connect addr=localhost:6185)"; TEST_ASSERT(NLMISC::CCommandRegistry::getInstance().execute(cmd, NLMISC::InfoLog())); // update the module to update the network callback client and server for (uint i=0; i<4; ++i) { // give some time to the listen and receiver thread to do there jobs mm.updateModules(); NLMISC::nlSleep(100); } TEST_ASSERT(transportL3s->getRouteCount() == 1); TEST_ASSERT(transportL3c->getRouteCount() == 1); TEST_ASSERT(gw->getRouteCount() == 2); // dump the gateways state cmd = "gw.dump"; TEST_ASSERT(NLMISC::CCommandRegistry::getInstance().execute(cmd, NLMISC::InfoLog())); // close all connections cmd = "gw.transportCmd l3s(close)"; TEST_ASSERT(NLMISC::CCommandRegistry::getInstance().execute(cmd, NLMISC::InfoLog())); cmd = "gw.transportCmd l3c(close connId=0)"; TEST_ASSERT(NLMISC::CCommandRegistry::getInstance().execute(cmd, NLMISC::InfoLog())); // update the module to update the network callback client and server for (uint i=0; i<4; ++i) { // give some time to the listen and receiver thread to do there jobs mm.updateModules(); NLMISC::nlSleep(100); } TEST_ASSERT(transportL3s->getRouteCount() == 0); TEST_ASSERT(transportL3c->getRouteCount() == 0); TEST_ASSERT(gw->getRouteCount() == 0); // Remove transports cmd = "gw.transportRemove l3s"; TEST_ASSERT(NLMISC::CCommandRegistry::getInstance().execute(cmd, NLMISC::InfoLog())); cmd = "gw.transportRemove l3c"; TEST_ASSERT(NLMISC::CCommandRegistry::getInstance().execute(cmd, NLMISC::InfoLog())); TEST_ASSERT(gw->getGatewayTransport("l3c") == NULL); TEST_ASSERT(gw->getGatewayTransport("l3s") == NULL); TEST_ASSERT(gw->getTransportCount() == 0); // update the module to update the network callback client and server for (uint i=0; i<4; ++i) { // give some time to the listen and receiver thread to do there jobs mm.updateModules(); NLMISC::nlSleep(100); } // cleanup the modules mm.deleteModule(mod); TEST_ASSERT(mm.getLocalModule("gw") == NULL); } /* void moduleManagerCommands() { string cmd; // load a library cmd = "moduleManager.loadLibrary net_module_lib_test/net_module_lib_test"; TEST_ASSERT(NLMISC::CCommandRegistry::getInstance().execute(cmd, NLMISC::InfoLog())); // dump the module state cmd = "moduleManager.dump"; TEST_ASSERT(NLMISC::CCommandRegistry::getInstance().execute(cmd, NLMISC::InfoLog())); // create a module cmd = "moduleManager.createModule ModuleType1 AModuleName"; TEST_ASSERT(NLMISC::CCommandRegistry::getInstance().execute(cmd, NLMISC::InfoLog())); // dump the module state cmd = "moduleManager.dump"; TEST_ASSERT(NLMISC::CCommandRegistry::getInstance().execute(cmd, NLMISC::InfoLog())); // delete the module cmd = "moduleManager.deleteModule AModuleName"; TEST_ASSERT(NLMISC::CCommandRegistry::getInstance().execute(cmd, NLMISC::InfoLog())); }*/ void plugLocalGateway() { NLNET::IModuleManager &mm = NLNET::IModuleManager::getInstance(); NLNET::IModule *gateway1 = mm.createModule("LocalGateway", "g1", ""); TEST_ASSERT(gateway1 != NULL); NLNET::IModule *gateway2 = mm.createModule("LocalGateway", "g2", ""); TEST_ASSERT(gateway2 != NULL); NLNET::IModuleSocket *socket1 = mm.getModuleSocket("g1"); TEST_ASSERT(socket1 != NULL); NLNET::IModuleSocket *socket2 = mm.getModuleSocket("g2"); TEST_ASSERT(socket2 != NULL); gateway1->plugModule(socket1); gateway1->plugModule(socket2); gateway2->plugModule(socket1); gateway2->plugModule(socket2); mm.deleteModule(gateway1); TEST_ASSERT(mm.getLocalModule("g1") == NULL); mm.deleteModule(gateway2); TEST_ASSERT(mm.getLocalModule("g2") == NULL); } void createLocalGateway() { NLNET::IModuleManager &mm = NLNET::IModuleManager::getInstance(); NLNET::IModule *gateway = mm.createModule("LocalGateway", "localGateway", ""); TEST_ASSERT(gateway != NULL); NLNET::IModule *mod1 = mm.createModule("ModuleType0", "plugged1", ""); TEST_ASSERT(mod1 != NULL); NLNET::IModule *mod2 = mm.createModule("ModuleType0", "plugged2", ""); TEST_ASSERT(mod2 != NULL); NLNET::IModuleSocket *socket = mm.getModuleSocket("localGateway"); TEST_ASSERT(socket != NULL); mod1->plugModule(socket); mod2->plugModule(socket); mm.deleteModule(mod1); TEST_ASSERT(mm.getLocalModule("plugged1") == NULL); mm.deleteModule(mod2); TEST_ASSERT(mm.getLocalModule("plugged2") == NULL); mm.deleteModule(gateway); TEST_ASSERT(mm.getLocalModule("localGateway") == NULL); } /* void unloadModuleLib() { IModuleManager &mm = IModuleManager::getInstance(); CRefPtr<IModule> module1 = mm.createModule("ModuleType1", "TheModule2", "the args"); TEST_ASSERT(module1 != NULL); TEST_ASSERT(mm.unloadModuleLibrary("net_module_lib_test")); // the module must have been deleted TEST_ASSERT(module1 == NULL); TModulePtr module2 = mm.createModule("ModuleType1", "TheModuleThatCantBeCreated", "the args"); TEST_ASSERT(module2 == NULL); }*/ void failedInit() { NLNET::IModuleManager &mm = NLNET::IModuleManager::getInstance(); NLNET::IModule *module = mm.createModule("ModuleType0", "FailingInit", "FAIL"); TEST_ASSERT(module == NULL); } /* void deleteModule() { IModuleManager &mm = IModuleManager::getInstance(); IModule *module = mm.createModule("ModuleType1", "TheModuleToDelete", "the args"); TEST_ASSERT(module != NULL); CRefPtr<IModule> checkPtr(module); mm.deleteModule(module); TEST_ASSERT(checkPtr == NULL); }*/ /* void createModule() { IModuleManager &mm = IModuleManager::getInstance(); TModulePtr module = mm.createModule("ModuleType1", "TheModule", "the args"); TEST_ASSERT(module != NULL); TEST_ASSERT(module->getModuleClassName() == "ModuleType1"); TEST_ASSERT(module->getModuleName() == "TheModule"); string lh; if (IService::isServiceInitialized()) lh = IService::getInstance()->getHostName(); else lh = ::NLNET::CInetAddress::localHost().hostName(); string fqmn = lh+":"+toString(getpid())+":TheModule"; TEST_ASSERT(module->getModuleFullyQualifiedName() == fqmn); }*/ /* void loadModuleLib() { string moduleLibName = "net_module_lib_test/net_module_lib_test"; IModuleManager &mm = IModuleManager::getInstance(); TEST_ASSERT(mm.loadModuleLibrary(moduleLibName)); vector<string> moduleList; mm.getAvailableModuleClassList(moduleList); TEST_ASSERT(moduleList.size() == 6); TEST_ASSERT(moduleList[0] == "LocalGateway"); TEST_ASSERT(moduleList[1] == "ModuleAsync"); TEST_ASSERT(moduleList[2] == "ModuleType0"); TEST_ASSERT(moduleList[3] == "ModuleType1"); TEST_ASSERT(moduleList[4] == "ModuleType2"); TEST_ASSERT(moduleList[5] == "StandardGateway"); }*/ void localModuleFactory() { NLNET::IModuleManager &mm = NLNET::IModuleManager::getInstance(); vector<string> moduleList; mm.getAvailableModuleClassList(moduleList); TEST_ASSERT(moduleList.size() == 4); TEST_ASSERT(moduleList[0] == "LocalGateway"); TEST_ASSERT(moduleList[1] == "ModuleAsync"); TEST_ASSERT(moduleList[2] == "ModuleType0"); TEST_ASSERT(moduleList[3] == "StandardGateway"); } void testModuleInitInfoBadParsing() { NLNET::TParsedCommandLine mif; string paramString = " a=1 b=2 ( b=1) "; TEST_ASSERT(!mif.parseParamList(paramString)); paramString = " lswkd ,fpqoj(( cruq fzemfwijf ujr wmozejifp_zujf woijpc_u ' "; TEST_ASSERT(!mif.parseParamList(paramString)); paramString = "a ( b=2"; TEST_ASSERT(!mif.parseParamList(paramString)); paramString = "a b=2)"; TEST_ASSERT(!mif.parseParamList(paramString)); paramString = "a b=2\"toto\""; TEST_ASSERT(!mif.parseParamList(paramString)); paramString = "=a"; TEST_ASSERT(!mif.parseParamList(paramString)); paramString = "a(=b)"; TEST_ASSERT(!mif.parseParamList(paramString)); } void testModuleInitInfoQuering() { NLNET::TParsedCommandLine mif; string paramString = " a=1 b=2 sub ( y=22 zzzz=12 subsub (g=\"bean in box\" z=2) ) "; TEST_ASSERT(mif.parseParamList(paramString)); TEST_ASSERT(mif.getParam("a") != NULL); TEST_ASSERT(mif.getParam("a") == mif.SubParams[0]); TEST_ASSERT(mif.getParam("sub") != NULL); TEST_ASSERT(mif.getParam("sub") == mif.SubParams[2]); TEST_ASSERT(mif.getParam("foo") == NULL); TEST_ASSERT(mif.getParam("sub.subsub.g") != NULL); TEST_ASSERT(mif.getParam("sub.subsub.g") == mif.SubParams[2]->SubParams[2]->SubParams[0]); } void testModuleInitInfoParsing() { NLNET::TParsedCommandLine mif; string paramString = "a"; TEST_ASSERT(mif.parseParamList(paramString)); paramString = "a=1"; TEST_ASSERT(mif.parseParamList(paramString)); paramString = "a(b=1)"; TEST_ASSERT(mif.parseParamList(paramString)); paramString = "a a a a"; TEST_ASSERT(mif.parseParamList(paramString)); TEST_ASSERT(mif.SubParams.size() == 4); paramString = " a ( b=1 )"; TEST_ASSERT(mif.parseParamList(paramString)); paramString = " a=1 b=2 sub ( y=22 zzzz=12 subsub (g=\"bean in box\" z=2) ) "; TEST_ASSERT(mif.parseParamList(paramString)); TEST_ASSERT(mif.SubParams.size() == 3); TEST_ASSERT(mif.SubParams[0]->SubParams.size() == 0); TEST_ASSERT(mif.SubParams[0]->ParamName == "a"); TEST_ASSERT(mif.SubParams[0]->ParamValue == "1"); TEST_ASSERT(mif.SubParams[1]->SubParams.size() == 0); TEST_ASSERT(mif.SubParams[1]->ParamName == "b"); TEST_ASSERT(mif.SubParams[1]->ParamValue == "2"); TEST_ASSERT(mif.SubParams[2]->SubParams.size() == 3); TEST_ASSERT(mif.SubParams[2]->ParamName == "sub"); TEST_ASSERT(mif.SubParams[2]->ParamValue.empty()); TEST_ASSERT(mif.SubParams[2]->SubParams[0]->SubParams.size() == 0); TEST_ASSERT(mif.SubParams[2]->SubParams[0]->ParamName == "y"); TEST_ASSERT(mif.SubParams[2]->SubParams[0]->ParamValue == "22"); TEST_ASSERT(mif.SubParams[2]->SubParams[1]->SubParams.size() == 0); TEST_ASSERT(mif.SubParams[2]->SubParams[1]->ParamName == "zzzz"); TEST_ASSERT(mif.SubParams[2]->SubParams[1]->ParamValue == "12"); TEST_ASSERT(mif.SubParams[2]->SubParams[2]->SubParams.size() == 2); TEST_ASSERT(mif.SubParams[2]->SubParams[2]->ParamName == "subsub"); TEST_ASSERT(mif.SubParams[2]->SubParams[2]->ParamValue.empty()); TEST_ASSERT(mif.SubParams[2]->SubParams[2]->SubParams[0]->SubParams.size() == 0); TEST_ASSERT(mif.SubParams[2]->SubParams[2]->SubParams[0]->ParamName == "g"); TEST_ASSERT(mif.SubParams[2]->SubParams[2]->SubParams[0]->ParamValue == "bean in box"); TEST_ASSERT(mif.SubParams[2]->SubParams[2]->SubParams[1]->SubParams.size() == 0); TEST_ASSERT(mif.SubParams[2]->SubParams[2]->SubParams[1]->ParamName == "z"); TEST_ASSERT(mif.SubParams[2]->SubParams[2]->SubParams[1]->ParamValue == "2"); } }; #endif