summaryrefslogtreecommitdiff
path: root/cpp/test/Common/TestHelper.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/test/Common/TestHelper.cpp')
-rw-r--r--cpp/test/Common/TestHelper.cpp270
1 files changed, 270 insertions, 0 deletions
diff --git a/cpp/test/Common/TestHelper.cpp b/cpp/test/Common/TestHelper.cpp
new file mode 100644
index 00000000000..abf6e13481a
--- /dev/null
+++ b/cpp/test/Common/TestHelper.cpp
@@ -0,0 +1,270 @@
+
+#include <TestHelper.h>
+#include <Ice/RegisterPlugins.h>
+#include <IceUtil/CtrlCHandler.h>
+
+using namespace std;
+using namespace Test;
+
+namespace
+{
+
+IceUtil::Mutex* globalMutex = 0;
+Test::TestHelper* instance = 0;
+IceUtil::CtrlCHandler* ctrlCHandler = 0;
+
+class Init
+{
+public:
+
+ Init()
+ {
+ globalMutex = new IceUtil::Mutex;
+ }
+
+ ~Init()
+ {
+ delete globalMutex;
+ globalMutex = 0;
+ if(ctrlCHandler)
+ {
+ delete ctrlCHandler;
+ ctrlCHandler = 0;
+ }
+ }
+};
+
+Init init;
+
+}
+
+Test::TestHelper::TestHelper(bool registerPlugins)
+{
+ {
+ IceUtilInternal::MutexPtrLock<IceUtil::Mutex> lock(globalMutex);
+ if(instance != 0)
+ {
+ throw runtime_error("only one instance of the Test::TestHelper class can be used");
+ }
+ instance = this;
+ }
+
+ if(registerPlugins)
+ {
+#ifdef ICE_STATIC_LIBS
+ Ice::registerIceSSL(false);
+ Ice::registerIceWS(true);
+ Ice::registerIceUDP(true);
+# ifdef ICE_HAS_BT
+ Ice::registerIceBT(false);
+# endif
+#endif
+ }
+
+#if defined(_WIN32) && !defined(ICE_OS_UWP)
+ _CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_FILE);
+ _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR);
+
+ _CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_FILE);
+ _CrtSetReportFile(_CRT_ERROR, _CRTDBG_FILE_STDERR);
+
+ _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE);
+ _CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDERR);
+
+ _set_abort_behavior(_CALL_REPORTFAULT, _CALL_REPORTFAULT);
+#endif
+}
+
+Test::TestHelper::~TestHelper()
+{
+}
+
+void
+Test::TestHelper::setControllerHelper(const ControllerHelperPtr& controllerHelper)
+{
+ assert(!_controllerHelper);
+ _controllerHelper = controllerHelper;
+}
+
+string
+Test::TestHelper::getTestEndpoint(const std::string& prot)
+{
+ assert(_communicator);
+ return getTestEndpoint(_communicator->getProperties(), 0, prot);
+}
+
+string
+Test::TestHelper::getTestEndpoint(int num, const std::string& prot)
+{
+ assert(_communicator);
+ return getTestEndpoint(_communicator->getProperties(), num, prot);
+}
+
+std::string
+Test::TestHelper::getTestEndpoint(const Ice::PropertiesPtr& properties, int num, const std::string& prot)
+{
+ std::ostringstream ostr;
+ std::string protocol = prot;
+ if(protocol.empty())
+ {
+ protocol = properties->getPropertyWithDefault("Ice.Default.Protocol", "default");
+ }
+
+ int basePort = properties->getPropertyAsIntWithDefault("Test.BasePort", 12010);
+
+ if(protocol == "bt")
+ {
+ //
+ // For Bluetooth, there's no need to specify a port (channel) number.
+ // The client locates the server using its address and a UUID.
+ //
+ switch(num)
+ {
+ case 0:
+ {
+ ostr << "default -u 5e08f4de-5015-4507-abe1-a7807002db3d";
+ break;
+ }
+ case 1:
+ {
+ ostr << "default -u dae56460-2485-46fd-a3ca-8b730e1e868b";
+ break;
+ }
+ case 2:
+ {
+ ostr << "default -u 99e08bc6-fcda-4758-afd0-a8c00655c999";
+ break;
+ }
+ default:
+ {
+ assert(false);
+ }
+ }
+ }
+ else
+ {
+ ostr << protocol << " -p " << (basePort + num);
+ }
+ return ostr.str();
+}
+
+string
+Test::TestHelper::getTestHost()
+{
+ assert(_communicator);
+ return getTestHost(_communicator->getProperties());
+}
+
+string
+Test::TestHelper::getTestHost(const Ice::PropertiesPtr& properties)
+{
+ return properties->getPropertyWithDefault("Ice.Default.Host", "127.0.0.1");
+}
+
+string
+Test::TestHelper::getTestProtocol()
+{
+ assert(_communicator);
+ return getTestProtocol(_communicator->getProperties());
+}
+
+string
+Test::TestHelper::getTestProtocol(const Ice::PropertiesPtr& properties)
+{
+ return properties->getPropertyWithDefault("Ice.Default.Protocol", "tcp");
+}
+
+int
+Test::TestHelper::getTestPort(int num)
+{
+ assert(_communicator);
+ return getTestPort(_communicator->getProperties(), num);
+}
+
+int
+Test::TestHelper::getTestPort(const Ice::PropertiesPtr& properties, int num)
+{
+ return properties->getPropertyAsIntWithDefault("Test.BasePort", 12010) + num;
+}
+
+Ice::PropertiesPtr
+Test::TestHelper::createTestProperties(int& argc, char* argv[])
+{
+ Ice::PropertiesPtr properties = Ice::createProperties(argc, argv);
+ Ice::StringSeq args = Ice::argsToStringSeq(argc, argv);
+ args = properties->parseCommandLineOptions("Test", args);
+ args = properties->parseCommandLineOptions("TestAdapter", args);
+ Ice::stringSeqToArgs(args, argc, argv);
+ return properties;
+}
+
+Ice::CommunicatorPtr
+Test::TestHelper::initialize(int& argc, char* argv[], const Ice::PropertiesPtr& properties)
+{
+ Ice::InitializationData initData;
+ initData.properties = properties ? properties : createTestProperties(argc, argv);
+ return initialize(argc, argv, initData);
+}
+
+Ice::CommunicatorPtr
+Test::TestHelper::initialize(int& argc, char* argv[], Ice::InitializationData initData)
+{
+ IceUtil::Mutex::Lock lock(_mutex);
+ _communicator = Ice::initialize(argc, argv, initData);
+ return _communicator;
+}
+
+Ice::CommunicatorPtr
+Test::TestHelper::communicator() const
+{
+ return _communicator;
+}
+
+void
+Test::TestHelper::serverReady()
+{
+#if defined(ICE_OS_UWP) || (TARGET_OS_IPHONE != 0)
+ assert(_controllerHelper);
+ _controllerHelper->serverReady();
+#endif
+}
+
+void
+Test::TestHelper::completed()
+{
+ IceUtil::Mutex::Lock lock(_mutex);
+ _communicator = ICE_NULLPTR;
+}
+
+void
+Test::TestHelper::shutdown()
+{
+ IceUtil::Mutex::Lock lock(_mutex);
+ if(_communicator)
+ {
+ _communicator->shutdown();
+ }
+}
+
+void
+Test::TestHelper::shutdownOnInterruptCallback(int)
+{
+ if(instance)
+ {
+ instance->shutdown();
+ }
+}
+
+void
+Test::TestHelper::shutdownOnInterrupt()
+{
+ {
+ IceUtilInternal::MutexPtrLock<IceUtil::Mutex> lock(globalMutex);
+ assert(!ctrlCHandler);
+ if(ctrlCHandler == 0)
+ {
+ ctrlCHandler = new IceUtil::CtrlCHandler();
+ }
+ }
+ ctrlCHandler->setCallback(shutdownOnInterruptCallback);
+}