diff options
Diffstat (limited to 'cpp/test/Ice/invoke/AllTests.cpp')
-rw-r--r-- | cpp/test/Ice/invoke/AllTests.cpp | 435 |
1 files changed, 435 insertions, 0 deletions
diff --git a/cpp/test/Ice/invoke/AllTests.cpp b/cpp/test/Ice/invoke/AllTests.cpp new file mode 100644 index 00000000000..5d334bcfd18 --- /dev/null +++ b/cpp/test/Ice/invoke/AllTests.cpp @@ -0,0 +1,435 @@ +// ********************************************************************** +// +// Copyright (c) 2003-2009 ZeroC, Inc. All rights reserved. +// +// This copy of Ice is licensed to you under the terms described in the +// ICE_LICENSE file included in this distribution. +// +// ********************************************************************** + +#include <Ice/Ice.h> +#include <Ice/Stream.h> +#include <TestCommon.h> +#include <Test.h> + +using namespace std; + +static string testString = "This is a test string"; + +class Cookie : public Ice::LocalObject +{ +public: + + string getString() + { + return testString; + } +}; +typedef IceUtil::Handle<Cookie> CookiePtr; + +class CallbackBase : public IceUtil::Monitor<IceUtil::Mutex> +{ +public: + + CallbackBase() : + _called(false) + { + } + + virtual ~CallbackBase() + { + } + + void check() + { + IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this); + while(!_called) + { + wait(); + } + _called = false; + } + +protected: + + void called() + { + IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this); + assert(!_called); + _called = true; + notify(); + } + +private: + + bool _called; +}; + +class Callback : public IceUtil::Shared, public CallbackBase +{ +public: + + Callback(const Ice::CommunicatorPtr& communicator, bool useCookie) : + _communicator(communicator), + _useCookie(useCookie) + { + } + + void opString(const Ice::AsyncResultPtr& result) + { + string cmp = testString; + if(_useCookie) + { + CookiePtr cookie = CookiePtr::dynamicCast(result->getCookie()); + cmp = cookie->getString(); + } + + Ice::ByteSeq outParams; + if(result->getProxy()->end_ice_invoke(outParams, result)) + { + Ice::InputStreamPtr in = Ice::createInputStream(_communicator, outParams); + string s; + in->read(s); + test(s == cmp); + in->read(s); + test(s == cmp); + called(); + } + else + { + test(false); + }; + } + + void opException(const Ice::AsyncResultPtr& result) + { + if(_useCookie) + { + CookiePtr cookie = CookiePtr::dynamicCast(result->getCookie()); + test(cookie->getString() == testString); + } + + Ice::ByteSeq outParams; + if(result->getProxy()->end_ice_invoke(outParams, result)) + { + test(false); + } + else + { + Ice::InputStreamPtr in = Ice::createInputStream(_communicator, outParams); + try + { + in->throwException(); + } + catch(const Test::MyException&) + { + called(); + } + catch(...) + { + test(false); + } + } + } + + void opStringNC(bool ok, const Ice::ByteSeq& outParams) + { + if(ok) + { + Ice::InputStreamPtr in = Ice::createInputStream(_communicator, outParams); + string s; + in->read(s); + test(s == testString); + in->read(s); + test(s == testString); + called(); + } + else + { + test(false); + } + } + + void opStringWC(bool ok, const Ice::ByteSeq& outParams, const CookiePtr& cookie) + { + if(ok) + { + Ice::InputStreamPtr in = Ice::createInputStream(_communicator, outParams); + string s; + in->read(s); + test(s == cookie->getString()); + in->read(s); + test(s == cookie->getString()); + called(); + } + else + { + test(false); + } + } + + void opExceptionNC(bool ok, const Ice::ByteSeq& outParams) + { + if(ok) + { + test(false); + } + else + { + Ice::InputStreamPtr in = Ice::createInputStream(_communicator, outParams); + try + { + in->throwException(); + } + catch(const Test::MyException&) + { + called(); + } + catch(...) + { + test(false); + } + } + } + + void opExceptionWC(bool ok, const Ice::ByteSeq& outParams, const CookiePtr& cookie) + { + test(cookie->getString() == testString); + if(ok) + { + test(false); + } + else + { + Ice::InputStreamPtr in = Ice::createInputStream(_communicator, outParams); + try + { + in->throwException(); + } + catch(const Test::MyException&) + { + called(); + } + catch(...) + { + test(false); + } + } + } + +private: + + Ice::CommunicatorPtr _communicator; + bool _useCookie; +}; +typedef IceUtil::Handle<Callback> CallbackPtr; + +Test::MyClassPrx +allTests(const Ice::CommunicatorPtr& communicator) +{ + string ref = "test:default -p 12010"; + Ice::ObjectPrx base = communicator->stringToProxy(ref); + test(base); + + Test::MyClassPrx cl = Test::MyClassPrx::checkedCast(base); + test(cl); + + cout << "testing ice_invoke... " << flush; + + { + Ice::ByteSeq inParams, outParams; + Ice::OutputStreamPtr out = Ice::createOutputStream(communicator); + out->write(testString); + out->finished(inParams); + + // ice_invoke + if(cl->ice_invoke("opString", Ice::Normal, inParams, outParams)) + { + Ice::InputStreamPtr in = Ice::createInputStream(communicator, outParams); + string s; + in->read(s); + test(s == testString); + in->read(s); + test(s == testString); + } + else + { + test(false); + } + + // ice_invoke with array mapping + pair<const ::Ice::Byte*, const ::Ice::Byte*> inPair(&inParams[0], &inParams[0] + inParams.size()); + if(cl->ice_invoke("opString", Ice::Normal, inPair, outParams)) + { + Ice::InputStreamPtr in = Ice::createInputStream(communicator, outParams); + string s; + in->read(s); + test(s == testString); + in->read(s); + test(s == testString); + } + else + { + test(false); + } + } + + { + Ice::ByteSeq inParams, outParams; + if(cl->ice_invoke("opException", Ice::Normal, inParams, outParams)) + { + test(false); + } + else + { + Ice::InputStreamPtr in = Ice::createInputStream(communicator, outParams); + try + { + in->throwException(); + } + catch(const Test::MyException&) + { + } + catch(...) + { + test(false); + } + } + } + + cout << "ok" << endl; + + cout << "testing asynchronous ice_invoke... " << flush; + + { + CookiePtr cookie = new Cookie(); + + Ice::ByteSeq inParams, outParams; + Ice::OutputStreamPtr out = Ice::createOutputStream(communicator); + out->write(testString); + out->finished(inParams); + + // begin_ice_invoke with no callback + Ice::AsyncResultPtr result = cl->begin_ice_invoke("opString", Ice::Normal, inParams); + if(cl->end_ice_invoke(outParams, result)) + { + Ice::InputStreamPtr in = Ice::createInputStream(communicator, outParams); + string s; + in->read(s); + test(s == testString); + in->read(s); + test(s == testString); + } + else + { + test(false); + }; + + // begin_ice_invoke with no callback and array mapping + pair<const ::Ice::Byte*, const ::Ice::Byte*> inPair(&inParams[0], &inParams[0] + inParams.size()); + result = cl->begin_ice_invoke("opString", Ice::Normal, inPair); + pair<const ::Ice::Byte*, const ::Ice::Byte*> outPair; + if(cl->end_ice_invoke(outPair, result)) + { + Ice::InputStreamPtr in = Ice::createInputStream(communicator, outPair); + string s; + in->read(s); + test(s == testString); + in->read(s); + test(s == testString); + } + else + { + test(false); + }; + + // begin_ice_invoke with Callback + CallbackPtr cb = new Callback(communicator, false); + cl->begin_ice_invoke("opString", Ice::Normal, inParams, Ice::newCallback(cb, &Callback::opString)); + cb->check(); + + // begin_ice_invoke with Callback and Cookie + cb = new Callback(communicator, true); + cl->begin_ice_invoke("opString", Ice::Normal, inParams, Ice::newCallback(cb, &Callback::opString), cookie); + cb->check(); + + // begin_ice_invoke with Callback_Object_ice_invoke + cb = new Callback(communicator, false); + Ice::Callback_Object_ice_invokePtr d = + Ice::newCallback_Object_ice_invoke(cb, &Callback::opStringNC); + cl->begin_ice_invoke("opString", Ice::Normal, inParams, d); + cb->check(); + + // begin_ice_invoke with Callback_Object_ice_invoke with Cookie + cb = new Callback(communicator, false); + d = Ice::newCallback_Object_ice_invoke(cb, &Callback::opStringWC); + cl->begin_ice_invoke("opString", Ice::Normal, inParams, d, cookie); + cb->check(); + + // begin_ice_invoke with Callback_Object_ice_invoke and array mapping + cb = new Callback(communicator, false); + d = Ice::newCallback_Object_ice_invoke(cb, &Callback::opStringNC); + cl->begin_ice_invoke("opString", Ice::Normal, inPair, d); + cb->check(); + + // begin_ice_invoke with Callback_Object_ice_invoke and array mapping with Cookie + cb = new Callback(communicator, false); + d = Ice::newCallback_Object_ice_invoke(cb, &Callback::opStringWC); + cl->begin_ice_invoke("opString", Ice::Normal, inPair, d, cookie); + cb->check(); + } + + { + CookiePtr cookie = new Cookie(); + Ice::ByteSeq inParams, outParams; + + // begin_ice_invoke with no callback + Ice::AsyncResultPtr result = cl->begin_ice_invoke("opException", Ice::Normal, inParams); + if(cl->end_ice_invoke(outParams, result)) + { + test(false); + } + else + { + Ice::InputStreamPtr in = Ice::createInputStream(communicator, outParams); + try + { + in->throwException(); + } + catch(const Test::MyException&) + { + } + catch(...) + { + test(false); + } + } + + // begin_ice_invoke with Callback + CallbackPtr cb = new Callback(communicator, false); + cl->begin_ice_invoke("opException", Ice::Normal, inParams, Ice::newCallback(cb, &Callback::opException)); + cb->check(); + + // begin_ice_invoke with Callback and Cookie + cb = new Callback(communicator, true); + cl->begin_ice_invoke("opException", Ice::Normal, inParams, Ice::newCallback(cb, &Callback::opException), + cookie); + cb->check(); + + // begin_ice_invoke with Callback_Object_ice_invoke + cb = new Callback(communicator, false); + Ice::Callback_Object_ice_invokePtr d = Ice::newCallback_Object_ice_invoke(cb, &Callback::opExceptionNC); + cl->begin_ice_invoke("opException", Ice::Normal, inParams, d); + cb->check(); + + // begin_ice_invoke with Callback_Object_ice_invoke with Cookie + cb = new Callback(communicator, false); + d = Ice::newCallback_Object_ice_invoke(cb, &Callback::opExceptionWC); + cl->begin_ice_invoke("opException", Ice::Normal, inParams, d, cookie); + cb->check(); + } + + cout << "ok" << endl; + + return cl; +} |