summaryrefslogtreecommitdiff
path: root/cpp/test/Glacier2/sessionHelper/Client.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/test/Glacier2/sessionHelper/Client.cpp')
-rw-r--r--cpp/test/Glacier2/sessionHelper/Client.cpp280
1 files changed, 116 insertions, 164 deletions
diff --git a/cpp/test/Glacier2/sessionHelper/Client.cpp b/cpp/test/Glacier2/sessionHelper/Client.cpp
index be2b034caae..9229d192687 100644
--- a/cpp/test/Glacier2/sessionHelper/Client.cpp
+++ b/cpp/test/Glacier2/sessionHelper/Client.cpp
@@ -2,7 +2,6 @@
// Copyright (c) ZeroC, Inc. All rights reserved.
//
-#include <IceUtil/IceUtil.h>
#include <Ice/Ice.h>
#include <Glacier2/Glacier2.h>
@@ -11,177 +10,134 @@
#include <iostream>
#include <iomanip>
#include <list>
+#include <chrono>
#include <Callback.h>
using namespace std;
+using namespace std::chrono_literals;
using namespace Test;
+class Client;
+void notifyClient();
+
namespace
{
-class Notify
-{
-public:
+Client* instance = nullptr;
- virtual ~Notify()
- {
- }
-
- virtual void notify() = 0;
-};
-
-Notify* instance = 0;
-
-class Dispatcher :
-#ifndef ICE_CPP11_MAPPING
- public Ice::Dispatcher,
-#endif
- public IceUtil::Thread
+class Dispatcher final
{
-
public:
- Dispatcher():
- _destroyed(false)
- {
- }
-
- virtual void dispatch(
-#ifdef ICE_CPP11_MAPPING
- std::function<void()> call,
-#else
- const Ice::DispatcherCallPtr& call,
-#endif
- const Ice::ConnectionPtr&)
+ void dispatch(std::function<void()> call, const shared_ptr<Ice::Connection>&)
{
- IceUtil::Monitor<IceUtil::Mutex>::Lock lock(_monitor);
- if(_queue.empty())
+ bool wasEmpty = false;
{
- _monitor.notify();
+ lock_guard<mutex> lg(_mutex);
+ wasEmpty = _queue.empty();
+ _queue.push_back(move(call));
+ }
+ if(wasEmpty)
+ {
+ _condVar.notify_one();
}
- _queue.push_back(call);
}
- virtual void
- destroy()
+ void destroy()
{
- IceUtil::Monitor<IceUtil::Mutex>::Lock lock(_monitor);
- _destroyed = true;
- _monitor.notify();
+ {
+ lock_guard<mutex> lg(_mutex);
+ _destroyed = true;
+ }
+ _condVar.notify_one();
}
- virtual void
- run()
+ void run()
{
- while(1)
+ for(;;)
{
-#ifdef ICE_CPP11_MAPPING
auto item = nextItem();
- if (!item)
- {
- break;
- }
- item();
-#else
- Ice::DispatcherCallPtr item = nextItem();
if(!item)
{
break;
}
- item->run();
-#endif
+ item();
}
}
private:
-#ifdef ICE_CPP11_MAPPING
- std::function<void()>
-#else
- Ice::DispatcherCallPtr
-#endif
- nextItem()
+ std::function<void()> nextItem()
{
- IceUtil::Monitor<IceUtil::Mutex>::Lock lock(_monitor);
+ unique_lock<mutex> lock(_mutex);
while(_queue.empty())
{
if(_destroyed)
{
- return ICE_NULLPTR;
+ return nullptr;
}
- _monitor.wait();
+ _condVar.wait(lock);
}
-#ifdef ICE_CPP11_MAPPING
auto item = _queue.front();
-#else
- Ice::DispatcherCallPtr item = _queue.front();
-#endif
_queue.pop_front();
return item;
}
- IceUtil::Monitor<IceUtil::Mutex> _monitor;
-#ifdef ICE_CPP11_MAPPING
list<std::function<void()>> _queue;
-#else
- list<Ice::DispatcherCallPtr> _queue;
-#endif
- bool _destroyed;
+ bool _destroyed = false;
+ mutex _mutex;
+ condition_variable _condVar;
};
-typedef IceUtil::Handle<Dispatcher> DispatcherPtr;
-class SuccessSessionCallback : public Glacier2::SessionCallback
+class SuccessSessionCallback final : public Glacier2::SessionCallback
{
-
public:
- virtual void
- connected(const Glacier2::SessionHelperPtr&)
+ void connected(const shared_ptr<Glacier2::SessionHelper>&) override
{
cout << "ok" << endl;
- instance->notify();
+ notifyClient();
}
- virtual void
- disconnected(const Glacier2::SessionHelperPtr&)
+ void
+ disconnected(const shared_ptr<Glacier2::SessionHelper>&) override
{
cout << "ok" << endl;
- instance->notify();
+ notifyClient();
}
- virtual void
- connectFailed(const Glacier2::SessionHelperPtr&, const Ice::Exception&)
+ void
+ connectFailed(const shared_ptr<Glacier2::SessionHelper>&, const Ice::Exception&) override
{
test(false);
}
- virtual void
- createdCommunicator(const Glacier2::SessionHelperPtr& session)
+ void
+ createdCommunicator(const shared_ptr<Glacier2::SessionHelper>& session) override
{
test(session->communicator());
}
};
-class AfterShutdownSessionCallback : public Glacier2::SessionCallback
+class AfterShutdownSessionCallback final : public Glacier2::SessionCallback
{
-
public:
- virtual void
- connected(const Glacier2::SessionHelperPtr&)
+ void
+ connected(const shared_ptr<Glacier2::SessionHelper>&) override
{
test(false);
}
- virtual void
- disconnected(const Glacier2::SessionHelperPtr&)
+ void
+ disconnected(const shared_ptr<Glacier2::SessionHelper>&) override
{
test(false);
}
- virtual void
- connectFailed(const Glacier2::SessionHelperPtr&, const Ice::Exception& ex)
+ void
+ connectFailed(const shared_ptr<Glacier2::SessionHelper>&, const Ice::Exception& ex) override
{
try
{
@@ -190,7 +146,7 @@ public:
catch(const Ice::ConnectFailedException&)
{
cout << "ok" << endl;
- instance->notify();
+ notifyClient();
}
catch(...)
{
@@ -198,32 +154,31 @@ public:
}
}
- virtual void
- createdCommunicator(const Glacier2::SessionHelperPtr& session)
+ void
+ createdCommunicator(const shared_ptr<Glacier2::SessionHelper>& session) override
{
test(session->communicator());
}
};
-class FailSessionCallback : public Glacier2::SessionCallback
+class FailSessionCallback final : public Glacier2::SessionCallback
{
-
public:
- virtual void
- connected(const Glacier2::SessionHelperPtr&)
+ void
+ connected(const shared_ptr<Glacier2::SessionHelper>&) override
{
test(false);
}
- virtual void
- disconnected(const Glacier2::SessionHelperPtr&)
+ void
+ disconnected(const shared_ptr<Glacier2::SessionHelper>&) override
{
test(false);
}
- virtual void
- connectFailed(const Glacier2::SessionHelperPtr&, const Ice::Exception& ex)
+ void
+ connectFailed(const shared_ptr<Glacier2::SessionHelper>&, const Ice::Exception& ex) override
{
try
{
@@ -232,7 +187,7 @@ public:
catch(const Glacier2::PermissionDeniedException&)
{
cout << "ok" << endl;
- instance->notify();
+ notifyClient();
}
catch(const Ice::LocalException&)
{
@@ -240,32 +195,31 @@ public:
}
}
- virtual void
- createdCommunicator(const Glacier2::SessionHelperPtr& session)
+ void
+ createdCommunicator(const shared_ptr<Glacier2::SessionHelper>& session) override
{
test(session->communicator());
}
};
-class InterruptConnectCallback : public Glacier2::SessionCallback
+class InterruptConnectCallback final : public Glacier2::SessionCallback
{
-
public:
- virtual void
- connected(const Glacier2::SessionHelperPtr&)
+ void
+ connected(const shared_ptr<Glacier2::SessionHelper>&) override
{
test(false);
}
- virtual void
- disconnected(const Glacier2::SessionHelperPtr&)
+ void
+ disconnected(const shared_ptr<Glacier2::SessionHelper>&) override
{
test(false);
}
- virtual void
- connectFailed(const Glacier2::SessionHelperPtr&, const Ice::Exception& ex)
+ void
+ connectFailed(const shared_ptr<Glacier2::SessionHelper>&, const Ice::Exception& ex) override
{
try
{
@@ -274,7 +228,7 @@ public:
catch(const Ice::CommunicatorDestroyedException&)
{
cout << "ok" << endl;
- instance->notify();
+ notifyClient();
}
catch(...)
{
@@ -282,8 +236,8 @@ public:
}
}
- virtual void
- createdCommunicator(const Glacier2::SessionHelperPtr& session)
+ void
+ createdCommunicator(const shared_ptr<Glacier2::SessionHelper>& session) override
{
test(session->communicator());
}
@@ -291,28 +245,32 @@ public:
} // Anonymous namespace end
-class Client : public Test::TestHelper,
- public Notify
+class Client final : public Test::TestHelper
{
public:
- void run(int, char**);
+ void run(int, char**) override;
void
notify()
{
- IceUtil::Monitor<IceUtil::Mutex>::Lock lock(_monitor);
- _monitor.notify();
+ _condVar.notify_one();
}
private:
- Glacier2::SessionHelperPtr _session;
- Glacier2::SessionFactoryHelperPtr _factory;
+ shared_ptr<Glacier2::SessionHelper> _session;
+ shared_ptr<Glacier2::SessionFactoryHelper> _factory;
Ice::InitializationData _initData;
- IceUtil::Monitor<IceUtil::Mutex> _monitor;
+ mutex _mutex;
+ condition_variable _condVar;
};
+void notifyClient()
+{
+ instance->notify();
+}
+
void
Client::run(int argc, char** argv)
{
@@ -323,24 +281,21 @@ Client::run(int argc, char** argv)
_initData.properties = Ice::createProperties(argc, argv, communicator->getProperties());
_initData.properties->setProperty("Ice.Default.Router", "Glacier2/router:" + getTestEndpoint(50));
- DispatcherPtr dispatcher = new Dispatcher();
- dispatcher->start();
-#ifdef ICE_CPP11_MAPPING
- _initData.dispatcher = [dispatcher](std::function<void()> call, const std::shared_ptr<Ice::Connection>& conn)
- {
- dispatcher->dispatch(call, conn);
- };
-#else
- _initData.dispatcher = dispatcher;
-#endif
- _factory = ICE_MAKE_SHARED(Glacier2::SessionFactoryHelper, _initData, ICE_MAKE_SHARED(FailSessionCallback));
+ Dispatcher dispatcher;
+ auto dfut = std::async(launch::async, [&dispatcher]{ dispatcher.run(); });
+
+ _initData.dispatcher = [&dispatcher](std::function<void()> call, const std::shared_ptr<Ice::Connection>& conn)
+ {
+ dispatcher.dispatch(call, conn);
+ };
+ _factory = make_shared<Glacier2::SessionFactoryHelper>(_initData, make_shared<FailSessionCallback>());
//
// Test to create a session with wrong userid/password
//
{
- IceUtil::Monitor<IceUtil::Mutex>::Lock lock(_monitor);
+ unique_lock<mutex> lock(_mutex);
cout << "testing SessionHelper connect with wrong userid/password... " << flush;
@@ -348,8 +303,7 @@ Client::run(int argc, char** argv)
//
// Wait for connectFailed callback
//
- _monitor.timedWait(IceUtil::Time::seconds(30));
-
+ _condVar.wait_for(lock, 30s);
test(!_session->isConnected());
}
_factory->destroy();
@@ -359,31 +313,31 @@ Client::run(int argc, char** argv)
//
_initData.properties->setProperty("Ice.Default.Router", "");
- _factory = ICE_MAKE_SHARED(Glacier2::SessionFactoryHelper, _initData, ICE_MAKE_SHARED(InterruptConnectCallback));
+ _factory = make_shared<Glacier2::SessionFactoryHelper>(_initData, make_shared<InterruptConnectCallback>());
{
- IceUtil::Monitor<IceUtil::Mutex>::Lock lock(_monitor);
+ unique_lock<mutex> lock(_mutex);
cout << "testing SessionHelper connect interrupt... " << flush;
_factory->setRouterHost(host);
_factory->setPort(getTestPort(_initData.properties, 1));
_factory->setProtocol(protocol);
_session = _factory->connect("userid", "abc123");
- IceUtil::ThreadControl::sleep(IceUtil::Time::milliSeconds(100));
+ this_thread::sleep_for(100ms);
_session->destroy();
//
// Wait for connectFailed callback
//
- _monitor.timedWait(IceUtil::Time::seconds(30));
+ _condVar.wait_for(lock, 30s);
test(!_session->isConnected());
}
_factory->destroy();
- _factory = ICE_MAKE_SHARED(Glacier2::SessionFactoryHelper, _initData, ICE_MAKE_SHARED(SuccessSessionCallback));
+ _factory = make_shared<Glacier2::SessionFactoryHelper>(_initData, make_shared<SuccessSessionCallback>());
{
- IceUtil::Monitor<IceUtil::Mutex>::Lock lock(_monitor);
+ unique_lock<mutex> lock(_mutex);
cout << "testing SessionHelper connect... " << flush;
_factory->setRouterHost(host);
_factory->setPort(getTestPort(_initData.properties, 50));
@@ -393,7 +347,7 @@ Client::run(int argc, char** argv)
//
// Wait for connect callback
//
- _monitor.timedWait(IceUtil::Time::seconds(30));
+ _condVar.wait_for(lock, 30s);
cout << "testing SessionHelper isConnected after connect... " << flush;
test(_session->isConnected());
@@ -413,7 +367,7 @@ Client::run(int argc, char** argv)
test(!_session->session());
cout << "testing stringToProxy for server object... " << flush;
- Ice::ObjectPrxPtr base =
+ auto base =
_session->communicator()->stringToProxy("callback:" + getTestEndpoint(_session->communicator()->getProperties()));
cout << "ok" << endl;
@@ -422,7 +376,7 @@ Client::run(int argc, char** argv)
cout << "ok" << endl;
cout << "testing checked cast for server object... " << flush;
- CallbackPrxPtr twoway = ICE_CHECKED_CAST(CallbackPrx, base);
+ auto twoway = Ice::checkedCast<CallbackPrx>(base);
test(twoway);
cout << "ok" << endl;
@@ -437,7 +391,7 @@ Client::run(int argc, char** argv)
//
// Wait for disconnected callback
//
- _monitor.wait();
+ _condVar.wait(lock);
cout << "testing SessionHelper isConnected after destroy... " << flush;
test(_session->isConnected() == false);
@@ -455,7 +409,7 @@ Client::run(int argc, char** argv)
cout << "ok" << endl;
cout << "testing SessionHelper session after destroy... " << flush;
- test(_session->session() == ICE_NULLPTR);
+ test(_session->session() == nullptr);
cout << "ok" << endl;
cout << "testing SessionHelper communicator after destroy... " << flush;
@@ -471,20 +425,20 @@ Client::run(int argc, char** argv)
cout << "ok" << endl;
cout << "uninstalling router with communicator... " << flush;
- communicator->setDefaultRouter(0);
+ communicator->setDefaultRouter(nullptr);
cout << "ok" << endl;
- Ice::ObjectPrxPtr processBase;
+ shared_ptr<Ice::ObjectPrx> processBase;
{
cout << "testing stringToProxy for process object... " << flush;
processBase = communicator->stringToProxy("Glacier2/admin -f Process:" + getTestEndpoint(51));
cout << "ok" << endl;
}
- Ice::ProcessPrxPtr process;
+ shared_ptr<Ice::ProcessPrx> process;
{
cout << "testing checked cast for admin object... " << flush;
- process = ICE_CHECKED_CAST(Ice::ProcessPrx, processBase);
+ process = Ice::checkedCast<Ice::ProcessPrx>(processBase);
test(process != 0);
cout << "ok" << endl;
}
@@ -504,15 +458,15 @@ Client::run(int argc, char** argv)
_factory->destroy();
- _factory = ICE_MAKE_SHARED(Glacier2::SessionFactoryHelper, _initData, ICE_MAKE_SHARED(AfterShutdownSessionCallback));
+ _factory = make_shared<Glacier2::SessionFactoryHelper>( _initData, make_shared<AfterShutdownSessionCallback>());
//
// Wait a bit to ensure glaci2router has been shutdown.
//
- IceUtil::ThreadControl::sleep(IceUtil::Time::milliSeconds(100));
+ this_thread::sleep_for(100ms);
{
- IceUtil::Monitor<IceUtil::Mutex>::Lock lock(_monitor);
+ unique_lock<mutex> lock(_mutex);
cout << "testing SessionHelper connect after router shutdown... " << flush;
_factory->setRouterHost(host);
_factory->setPort(getTestPort(_initData.properties, 50));
@@ -522,7 +476,7 @@ Client::run(int argc, char** argv)
//
// Wait for connectFailed callback
//
- _monitor.wait();
+ _condVar.wait(lock);
cout << "testing SessionHelper isConnect after connect failure... " << flush;
test(_session->isConnected() == false);
@@ -547,11 +501,9 @@ Client::run(int argc, char** argv)
_factory->destroy();
- if(dispatcher)
- {
- dispatcher->destroy();
- dispatcher->getThreadControl().join();
- }
+ // Wait for std::async thread to complete:
+ dispatcher.destroy();
+ dfut.get();
}
DEFINE_TEST(Client)