summaryrefslogtreecommitdiff
path: root/cpp/test/Ice/interceptor/AMDInterceptorI.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/test/Ice/interceptor/AMDInterceptorI.cpp')
-rw-r--r--cpp/test/Ice/interceptor/AMDInterceptorI.cpp154
1 files changed, 154 insertions, 0 deletions
diff --git a/cpp/test/Ice/interceptor/AMDInterceptorI.cpp b/cpp/test/Ice/interceptor/AMDInterceptorI.cpp
new file mode 100644
index 00000000000..5387f799bdc
--- /dev/null
+++ b/cpp/test/Ice/interceptor/AMDInterceptorI.cpp
@@ -0,0 +1,154 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2007 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 <AMDInterceptorI.h>
+#include <Test.h>
+#include <TestCommon.h>
+
+AMDInterceptorI::AMDInterceptorI(const Ice::ObjectPtr& servant) :
+ InterceptorI(servant),
+ _defaultCb(new DispatchInterceptorAsyncCallbackI(*this)),
+ _actualStatus(IceInternal::DispatchAsync)
+
+{
+}
+
+
+IceInternal::DispatchStatus
+AMDInterceptorI::dispatch(Ice::Request& request)
+{
+ class CallbackI : public Ice::DispatchInterceptorAsyncCallback
+ {
+ public:
+
+ CallbackI(AMDInterceptorI& interceptor) :
+ _interceptor(interceptor)
+ {
+ }
+
+ virtual bool response(bool ok)
+ {
+ test(ok);
+ return false;
+ }
+
+ virtual bool exception(const std::exception& ex)
+ {
+ test(dynamic_cast<const Test::RetryException*>(&ex) != 0);
+ return false;
+ }
+
+ virtual bool exception()
+ {
+ //
+ // Unexpected
+ //
+ test(false);
+ return false;
+ }
+
+ private:
+
+ AMDInterceptorI& _interceptor;
+ };
+
+
+ Ice::Current& current = const_cast<Ice::Current&>(request.getCurrent());
+ _lastOperation = current.operation;
+
+ Ice::DispatchInterceptorAsyncCallbackPtr cb = new CallbackI(*this);
+
+ if(_lastOperation == "amdAddWithRetry")
+ {
+ for(int i = 0; i < 10; ++i)
+ {
+ _lastStatus = _servant->ice_dispatch(request, cb);
+ test(_lastStatus == IceInternal::DispatchAsync);
+ }
+
+ current.ctx["retry"] = "no";
+ }
+
+ _lastStatus = _servant->ice_dispatch(request, _defaultCb);
+ return _lastStatus;
+}
+
+void
+AMDInterceptorI::setActualStatus(IceInternal::DispatchStatus status)
+{
+ IceUtil::Mutex::Lock lock(_mutex);
+ _actualStatus = status;
+}
+
+void
+AMDInterceptorI::setActualStatus(const IceUtil::Exception& e)
+{
+ IceUtil::Mutex::Lock lock(_mutex);
+ _exception.reset(e.ice_clone());
+ _actualStatus = IceInternal::DispatchAsync;
+}
+
+IceInternal::DispatchStatus
+AMDInterceptorI::getActualStatus() const
+{
+ IceUtil::Mutex::Lock lock(_mutex);
+ return _actualStatus;
+}
+
+IceUtil::Exception*
+AMDInterceptorI::getException() const
+{
+ IceUtil::Mutex::Lock lock(_mutex);
+ return _exception.get();
+}
+
+void
+AMDInterceptorI::clear()
+{
+ InterceptorI::clear();
+ IceUtil::Mutex::Lock lock(_mutex);
+ _actualStatus = IceInternal::DispatchAsync;
+ _exception.reset();
+}
+
+
+DispatchInterceptorAsyncCallbackI::DispatchInterceptorAsyncCallbackI(AMDInterceptorI& interceptor) :
+ _interceptor(interceptor)
+{
+}
+
+bool
+DispatchInterceptorAsyncCallbackI::response(bool ok)
+{
+ _interceptor.setActualStatus(ok ? IceInternal::DispatchOK : IceInternal::DispatchUserException);
+ return true;
+}
+
+
+bool
+DispatchInterceptorAsyncCallbackI::exception(const std::exception& ex)
+{
+ //
+ // Only Ice exceptions are raised by this test
+ //
+ const IceUtil::Exception& ue = dynamic_cast<const IceUtil::Exception&>(ex);
+ _interceptor.setActualStatus(ue);
+ return true;
+
+}
+
+bool
+DispatchInterceptorAsyncCallbackI::exception()
+{
+ //
+ // Unexpected
+ //
+ test(false);
+ return true;
+}