summaryrefslogtreecommitdiff
path: root/csharp/test/Ice/acm/AllTests.cs
diff options
context:
space:
mode:
Diffstat (limited to 'csharp/test/Ice/acm/AllTests.cs')
-rw-r--r--csharp/test/Ice/acm/AllTests.cs578
1 files changed, 578 insertions, 0 deletions
diff --git a/csharp/test/Ice/acm/AllTests.cs b/csharp/test/Ice/acm/AllTests.cs
new file mode 100644
index 00000000000..e78d8b84eaa
--- /dev/null
+++ b/csharp/test/Ice/acm/AllTests.cs
@@ -0,0 +1,578 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2015 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.
+//
+// **********************************************************************
+
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Threading;
+using Test;
+#if SILVERLIGHT
+using System.Net;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Documents;
+using System.Windows.Ink;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Animation;
+using System.Windows.Shapes;
+#endif
+
+class LoggerI : Ice.Logger
+{
+ public void start()
+ {
+ lock(this)
+ {
+ _started = true;
+ dump();
+ }
+ }
+
+ public void print(string msg)
+ {
+ lock(this)
+ {
+ _messages.Add(msg);
+ if(_started)
+ {
+ dump();
+ }
+ }
+ }
+
+ public void trace(string category, string message)
+ {
+ lock(this)
+ {
+ _messages.Add("[" + category + "] " + message);
+ if(_started)
+ {
+ dump();
+ }
+ }
+ }
+
+ public void warning(string message)
+ {
+ lock(this)
+ {
+ _messages.Add("warning: " + message);
+ if(_started)
+ {
+ dump();
+ }
+ }
+ }
+
+ public void error(string message)
+ {
+ lock(this)
+ {
+ _messages.Add("error: " + message);
+ if(_started)
+ {
+ dump();
+ }
+ }
+ }
+
+ public string getPrefix()
+ {
+ return "";
+ }
+
+ public Ice.Logger cloneWithPrefix(string prefix)
+ {
+ return this;
+ }
+
+ private void dump()
+ {
+ foreach(string line in _messages)
+ {
+ System.Console.WriteLine(line);
+ }
+ _messages.Clear();
+ }
+
+ private bool _started;
+ private List<string> _messages = new List<string>();
+};
+
+abstract class TestCase : Ice.ConnectionCallback
+{
+ public TestCase(string name, RemoteCommunicatorPrx com)
+ {
+ _name = name;
+ _com = com;
+ _logger = new LoggerI();
+
+ _clientACMTimeout = -1;
+ _clientACMClose = -1;
+ _clientACMHeartbeat = -1;
+
+ _serverACMTimeout = -1;
+ _serverACMClose = -1;
+ _serverACMHeartbeat = -1;
+
+ _heartbeat = 0;
+ _closed = false;
+ }
+
+ public void init()
+ {
+ _adapter = _com.createObjectAdapter(_serverACMTimeout, _serverACMClose, _serverACMHeartbeat);
+
+ Ice.InitializationData initData = new Ice.InitializationData();
+ initData.properties = _com.ice_getCommunicator().getProperties().ice_clone_();
+ initData.logger = _logger;
+ initData.properties.setProperty("Ice.ACM.Timeout", "1");
+ if(_clientACMTimeout >= 0)
+ {
+ initData.properties.setProperty("Ice.ACM.Client.Timeout", _clientACMTimeout.ToString());
+ }
+ if(_clientACMClose >= 0)
+ {
+ initData.properties.setProperty("Ice.ACM.Client.Close", _clientACMClose.ToString());
+ }
+ if(_clientACMHeartbeat >= 0)
+ {
+ initData.properties.setProperty("Ice.ACM.Client.Heartbeat", _clientACMHeartbeat.ToString());
+ }
+ //initData.properties.setProperty("Ice.Trace.Protocol", "2");
+ //initData.properties.setProperty("Ice.Trace.Network", "2");
+ _communicator = Ice.Util.initialize(initData);
+ _thread = new Thread(this.run);
+ }
+
+ public void start()
+ {
+ _thread.Start();
+ }
+
+ public void destroy()
+ {
+ _adapter.deactivate();
+ _communicator.destroy();
+ }
+
+ public void join()
+ {
+ System.Console.Out.Write("testing " + _name + "... ");
+ System.Console.Out.Flush();
+ _logger.start();
+ _thread.Join();
+ if(_msg == null)
+ {
+ System.Console.Out.WriteLine("ok");
+ }
+ else
+ {
+ System.Console.Out.WriteLine("failed! " + _msg);
+ throw new System.Exception();
+ }
+ }
+
+ public void run()
+ {
+ TestIntfPrx proxy = TestIntfPrxHelper.uncheckedCast(_communicator.stringToProxy(
+ _adapter.getTestIntf().ToString()));
+ try
+ {
+ proxy.ice_getConnection().setCallback(this);
+ runTestCase(_adapter, proxy);
+ }
+ catch(Exception ex)
+ {
+ _msg = "unexpected exception:\n" + ex.ToString();
+ }
+ }
+
+ public void heartbeat(Ice.Connection con)
+ {
+ lock(this)
+ {
+ ++_heartbeat;
+ }
+ }
+
+ public void closed(Ice.Connection con)
+ {
+ lock(this)
+ {
+ _closed = true;
+ Monitor.Pulse(this);
+ }
+ }
+
+ public void waitForClosed()
+ {
+ lock(this)
+ {
+ long now = IceInternal.Time.currentMonotonicTimeMillis();
+ while(!_closed)
+ {
+ Monitor.Wait(this, 1000);
+ if(IceInternal.Time.currentMonotonicTimeMillis() - now > 1000)
+ {
+ System.Diagnostics.Debug.Assert(false); // Waited for more than 1s for close, something's wrong.
+ throw new System.Exception();
+ }
+ }
+ }
+ }
+
+ public abstract void runTestCase(RemoteObjectAdapterPrx adapter, TestIntfPrx proxy);
+
+ public void setClientACM(int timeout, int close, int heartbeat)
+ {
+ _clientACMTimeout = timeout;
+ _clientACMClose = close;
+ _clientACMHeartbeat = heartbeat;
+ }
+
+ public void setServerACM(int timeout, int close, int heartbeat)
+ {
+ _serverACMTimeout = timeout;
+ _serverACMClose = close;
+ _serverACMHeartbeat = heartbeat;
+ }
+
+ private string _name;
+ private RemoteCommunicatorPrx _com;
+ private string _msg;
+ private LoggerI _logger;
+ private System.Threading.Thread _thread;
+
+ private Ice.Communicator _communicator;
+ private RemoteObjectAdapterPrx _adapter;
+
+ private int _clientACMTimeout;
+ private int _clientACMClose;
+ private int _clientACMHeartbeat;
+ private int _serverACMTimeout;
+ private int _serverACMClose;
+ private int _serverACMHeartbeat;
+
+ protected int _heartbeat;
+ protected bool _closed;
+};
+
+public class AllTests : TestCommon.TestApp
+{
+ class InvocationHeartbeatTest : TestCase
+ {
+ public InvocationHeartbeatTest(RemoteCommunicatorPrx com) : base("invocation heartbeat", com)
+ {
+ }
+
+ public override void runTestCase(RemoteObjectAdapterPrx adapter, TestIntfPrx proxy)
+ {
+ proxy.sleep(2);
+
+ lock(this)
+ {
+ test(_heartbeat >= 2);
+ }
+ }
+ };
+
+ class InvocationHeartbeatOnHoldTest : TestCase
+ {
+ public InvocationHeartbeatOnHoldTest(RemoteCommunicatorPrx com) :
+ base("invocation with heartbeat on hold", com)
+ {
+ // Use default ACM configuration.
+ }
+
+ public override void runTestCase(RemoteObjectAdapterPrx adapter, TestIntfPrx proxy)
+ {
+ try
+ {
+ // When the OA is put on hold, connections shouldn't
+ // send heartbeats, the invocation should therefore
+ // fail.
+ proxy.sleepAndHold(10);
+ test(false);
+ }
+ catch(Ice.ConnectionTimeoutException)
+ {
+ adapter.activate();
+ proxy.interruptSleep();
+
+ waitForClosed();
+ }
+ }
+ };
+
+ class InvocationNoHeartbeatTest : TestCase
+ {
+ public InvocationNoHeartbeatTest(RemoteCommunicatorPrx com) : base("invocation with no heartbeat", com)
+ {
+ setServerACM(1, 2, 0); // Disable heartbeat on invocations
+ }
+
+ public override void runTestCase(RemoteObjectAdapterPrx adapter, TestIntfPrx proxy)
+ {
+ try
+ {
+ // Heartbeats are disabled on the server, the
+ // invocation should fail since heartbeats are
+ // expected.
+ proxy.sleep(10);
+ test(false);
+ }
+ catch(Ice.ConnectionTimeoutException)
+ {
+ proxy.interruptSleep();
+
+ waitForClosed();
+ lock(this)
+ {
+ test(_heartbeat == 0);
+ }
+ }
+ }
+ };
+
+ class InvocationHeartbeatCloseOnIdleTest : TestCase
+ {
+ public InvocationHeartbeatCloseOnIdleTest(RemoteCommunicatorPrx com) :
+ base("invocation with no heartbeat and close on idle", com)
+ {
+ setClientACM(1, 1, 0); // Only close on idle.
+ setServerACM(1, 2, 0); // Disable heartbeat on invocations
+ }
+
+ public override void runTestCase(RemoteObjectAdapterPrx adapter, TestIntfPrx proxy)
+ {
+ // No close on invocation, the call should succeed this
+ // time.
+ proxy.sleep(2);
+
+ lock(this)
+ {
+ test(_heartbeat == 0);
+ test(!_closed);
+ }
+ }
+ };
+
+ class CloseOnIdleTest : TestCase
+ {
+ public CloseOnIdleTest(RemoteCommunicatorPrx com) : base("close on idle", com)
+ {
+ setClientACM(1, 1, 0); // Only close on idle
+ }
+
+ public override void runTestCase(RemoteObjectAdapterPrx adapter, TestIntfPrx proxy)
+ {
+ Thread.Sleep(1500); // Idle for 1.5 second
+
+ waitForClosed();
+ lock(this)
+ {
+ test(_heartbeat == 0);
+ }
+ }
+ };
+
+ class CloseOnInvocationTest : TestCase
+ {
+ public CloseOnInvocationTest(RemoteCommunicatorPrx com) : base("close on invocation", com)
+ {
+ setClientACM(1, 2, 0); // Only close on invocation
+ }
+
+ public override void runTestCase(RemoteObjectAdapterPrx adapter, TestIntfPrx proxy)
+ {
+ Thread.Sleep(1500); // Idle for 1.5 second
+
+ lock(this)
+ {
+ test(_heartbeat == 0);
+ test(!_closed);
+ }
+ }
+ };
+
+ class CloseOnIdleAndInvocationTest : TestCase
+ {
+ public CloseOnIdleAndInvocationTest(RemoteCommunicatorPrx com) : base("close on idle and invocation", com)
+ {
+ setClientACM(1, 3, 0); // Only close on idle and invocation
+ }
+
+ public override void runTestCase(RemoteObjectAdapterPrx adapter, TestIntfPrx proxy)
+ {
+ //
+ // Put the adapter on hold. The server will not respond to
+ // the graceful close. This allows to test whether or not
+ // the close is graceful or forceful.
+ //
+ adapter.hold();
+ Thread.Sleep(1500); // Idle for 1.5 second
+
+ lock(this)
+ {
+ test(_heartbeat == 0);
+ test(!_closed); // Not closed yet because of graceful close.
+ }
+
+ adapter.activate();
+ Thread.Sleep(500);
+
+ waitForClosed();
+ }
+ };
+
+ class ForcefulCloseOnIdleAndInvocationTest : TestCase
+ {
+ public ForcefulCloseOnIdleAndInvocationTest(RemoteCommunicatorPrx com) :
+ base("forceful close on idle and invocation", com)
+ {
+ setClientACM(1, 4, 0); // Only close on idle and invocation
+ }
+
+ public override void runTestCase(RemoteObjectAdapterPrx adapter, TestIntfPrx proxy)
+ {
+ adapter.hold();
+ Thread.Sleep(1500); // Idle for 1.5 second
+
+ waitForClosed();
+ lock(this)
+ {
+ test(_heartbeat == 0);
+ }
+ }
+ };
+
+ class HeartbeatOnIdleTest : TestCase
+ {
+ public HeartbeatOnIdleTest(RemoteCommunicatorPrx com) : base("heartbeat on idle", com)
+ {
+ setServerACM(1, -1, 2); // Enable server heartbeats.
+ }
+
+ public override void runTestCase(RemoteObjectAdapterPrx adapter, TestIntfPrx proxy)
+ {
+ Thread.Sleep(2000);
+
+ lock(this)
+ {
+ test(_heartbeat >= 3);
+ }
+ }
+ };
+
+ class HeartbeatAlwaysTest : TestCase
+ {
+ public HeartbeatAlwaysTest(RemoteCommunicatorPrx com) : base("heartbeat always", com)
+ {
+ setServerACM(1, -1, 3); // Enable server heartbeats.
+ }
+
+ public override void runTestCase(RemoteObjectAdapterPrx adapter, TestIntfPrx proxy)
+ {
+ for(int i = 0; i < 12; i++)
+ {
+ proxy.ice_ping();
+ Thread.Sleep(200);
+ }
+
+ lock(this)
+ {
+ test(_heartbeat >= 3);
+ }
+ }
+ };
+
+ class SetACMTest : TestCase
+ {
+ public SetACMTest(RemoteCommunicatorPrx com) : base("setACM/getACM", com)
+ {
+ setClientACM(15, 4, 2);
+ }
+
+ public override void runTestCase(RemoteObjectAdapterPrx adapter, TestIntfPrx proxy)
+ {
+ Ice.ACM acm;
+ acm = proxy.ice_getCachedConnection().getACM();
+ test(acm.timeout == 15);
+ test(acm.close == Ice.ACMClose.CloseOnIdleForceful);
+ test(acm.heartbeat == Ice.ACMHeartbeat.HeartbeatOnIdle);
+
+ proxy.ice_getCachedConnection().setACM(Ice.Util.None, Ice.Util.None, Ice.Util.None);
+ acm = proxy.ice_getCachedConnection().getACM();
+ test(acm.timeout == 15);
+ test(acm.close == Ice.ACMClose.CloseOnIdleForceful);
+ test(acm.heartbeat == Ice.ACMHeartbeat.HeartbeatOnIdle);
+
+ proxy.ice_getCachedConnection().setACM(20,
+ Ice.ACMClose.CloseOnInvocationAndIdle,
+ Ice.ACMHeartbeat.HeartbeatOnInvocation);
+ acm = proxy.ice_getCachedConnection().getACM();
+ test(acm.timeout == 20);
+ test(acm.close == Ice.ACMClose.CloseOnInvocationAndIdle);
+ test(acm.heartbeat == Ice.ACMHeartbeat.HeartbeatOnInvocation);
+ }
+ };
+
+
+#if SILVERLIGHT
+ override
+ public void run(Ice.Communicator communicator)
+#else
+ public static void allTests(Ice.Communicator communicator)
+#endif
+ {
+ string @ref = "communicator:default -p 12010";
+ RemoteCommunicatorPrx com = RemoteCommunicatorPrxHelper.uncheckedCast(communicator.stringToProxy(@ref));
+
+ List<TestCase> tests = new List<TestCase>();
+
+ tests.Add(new InvocationHeartbeatTest(com));
+ tests.Add(new InvocationHeartbeatOnHoldTest(com));
+ tests.Add(new InvocationNoHeartbeatTest(com));
+ tests.Add(new InvocationHeartbeatCloseOnIdleTest(com));
+
+ tests.Add(new CloseOnIdleTest(com));
+ tests.Add(new CloseOnInvocationTest(com));
+ tests.Add(new CloseOnIdleAndInvocationTest(com));
+ tests.Add(new ForcefulCloseOnIdleAndInvocationTest(com));
+
+ tests.Add(new HeartbeatOnIdleTest(com));
+ tests.Add(new HeartbeatAlwaysTest(com));
+ tests.Add(new SetACMTest(com));
+
+ foreach(TestCase test in tests)
+ {
+ test.init();
+ }
+ foreach(TestCase test in tests)
+ {
+ test.start();
+ }
+ foreach(TestCase test in tests)
+ {
+ test.join();
+ }
+ foreach(TestCase test in tests)
+ {
+ test.destroy();
+ }
+
+ System.Console.Out.Write("shutting down... ");
+ System.Console.Out.Flush();
+ com.shutdown();
+ System.Console.WriteLine("ok");
+ }
+}