# ********************************************************************** # # Copyright (c) 2003-2017 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. # # ********************************************************************** import Ice, Test, sys, threading, time def test(b): if not b: raise RuntimeError('test assertion failed') class CallbackBase: def __init__(self): self._called = False self._cond = threading.Condition() def called(self): with self._cond: self._called = True self._cond.notify() def check(self): with self._cond: while not self._called: self._cond.wait() self._called = False return True class Callback(CallbackBase): def response(self): self.called() def exception(self, ex): test(False) def responseEx(self): test(False) def exceptionEx(self, ex): test(isinstance(ex, Ice.TimeoutException)) self.called() def allTests(communicator): sref = "timeout:default -p 12010" obj = communicator.stringToProxy(sref) test(obj != None) timeout = Test.TimeoutPrx.checkedCast(obj) test(timeout != None) sys.stdout.write("testing connect timeout... ") sys.stdout.flush() # # Expect ConnectTimeoutException. # to = Test.TimeoutPrx.uncheckedCast(obj.ice_timeout(100)) timeout.holdAdapter(500) try: to.op() test(False) except Ice.ConnectTimeoutException: pass # Expected. # # Expect success. # timeout.op() # Ensure adapter is active. to = Test.TimeoutPrx.uncheckedCast(obj.ice_timeout(1000)) timeout.holdAdapter(500) try: to.op() except Ice.ConnectTimeoutException: test(False) print("ok") sys.stdout.write("testing connection timeout... ") sys.stdout.flush() # # Expect TimeoutException. # if sys.version_info[0] == 2: seq = [] seq[0:10000000] = range(0, 10000000) # add 10,000,000 entries. seq = ['\x00' for x in seq] # set them all to \x00 seq = ''.join(seq) # make into a byte array else: seq = bytes([0 for x in range(0, 10000000)]) to = Test.TimeoutPrx.uncheckedCast(obj.ice_timeout(100)) timeout.holdAdapter(500) try: to.sendData(seq) test(False) except Ice.TimeoutException: pass # Expected. # # Expect success. # timeout.op() # Ensure adapter is active. to = Test.TimeoutPrx.uncheckedCast(obj.ice_timeout(1000)) timeout.holdAdapter(500) try: if sys.version_info[0] == 2: seq2 = [] seq2[0:1000000] = range(0, 1000000) # add 1,000,000 entries. seq2 = ['\x00' for x in seq2] # set them all to \x00 seq2 = ''.join(seq2) # make into a byte array else: seq2 = bytes([0 for x in range(0, 1000000)]) to.sendData(seq2) except Ice.TimeoutException: test(False) print("ok") sys.stdout.write("testing invocation timeout... ") sys.stdout.flush() connection = obj.ice_getConnection() to = Test.TimeoutPrx.uncheckedCast(obj.ice_invocationTimeout(100)) test(connection == to.ice_getConnection()) try: to.sleep(750) test(False) except Ice.InvocationTimeoutException: pass obj.ice_ping() to = Test.TimeoutPrx.uncheckedCast(obj.ice_invocationTimeout(500)) test(connection == to.ice_getConnection()) try: to.sleep(250) except Ice.InvocationTimeoutException: test(False) test(connection == to.ice_getConnection()) # # # # Expect InvocationTimeoutException. # # # to = Test.TimeoutPrx.uncheckedCast(obj.ice_invocationTimeout(250)) # cb = new Callback() # to.begin_sleep(750, newCallback_Timeout_sleep(cb, &Callback.responseEx, &Callback.exceptionEx)) # cb.check() # # # # Expect success. # # # to = Test.TimeoutPrx.uncheckedCast(obj.ice_invocationTimeout(500)) # cb = new Callback() # to.begin_sleep(250, newCallback_Timeout_sleep(cb, &Callback.response, &Callback.exception)) # cb.check() print("ok") sys.stdout.write("testing close timeout... ") sys.stdout.flush() to = Test.TimeoutPrx.checkedCast(obj.ice_timeout(100)) connection = to.ice_getConnection() timeout.holdAdapter(500) connection.close(Ice.ConnectionClose.GracefullyWithWait) try: connection.getInfo(); # getInfo() doesn't throw in the closing state. except Ice.LocalException: test(False) time.sleep(0.5) try: connection.getInfo() test(False) except Ice.ConnectionManuallyClosedException as ex: # Expected. test(ex.graceful) timeout.op() # Ensure adapter is active. print("ok") sys.stdout.write("testing timeout overrides... ") sys.stdout.flush() # # Test Ice.Override.Timeout. This property overrides all # endpoint timeouts. # initData = Ice.InitializationData() initData.properties = communicator.getProperties().clone() initData.properties.setProperty("Ice.Override.Timeout", "250") comm = Ice.initialize(initData) to = Test.TimeoutPrx.checkedCast(comm.stringToProxy(sref)) timeout.holdAdapter(700) try: to.sendData(seq) test(False) except Ice.TimeoutException: pass # Expected. # # Calling ice_timeout() should have no effect. # timeout.op() # Ensure adapter is active. to = Test.TimeoutPrx.checkedCast(to.ice_timeout(1000)) timeout.holdAdapter(500) try: to.sendData(seq) test(False) except Ice.TimeoutException: pass # Expected. comm.destroy() # # Test Ice.Override.ConnectTimeout. # initData = Ice.InitializationData() initData.properties = communicator.getProperties().clone() initData.properties.setProperty("Ice.Override.ConnectTimeout", "250") comm = Ice.initialize(initData) timeout.holdAdapter(750) to = Test.TimeoutPrx.uncheckedCast(comm.stringToProxy(sref)) try: to.op() test(False) except Ice.ConnectTimeoutException: pass # Expected. # # Calling ice_timeout() should have no effect on the connect timeout. # timeout.op() # Ensure adapter is active. timeout.holdAdapter(750) to = Test.TimeoutPrx.uncheckedCast(to.ice_timeout(1000)) try: to.op() test(False) except Ice.ConnectTimeoutException: pass # Expected. # # Verify that timeout set via ice_timeout() is still used for requests. # timeout.op() # Ensure adapter is active. to = Test.TimeoutPrx.uncheckedCast(to.ice_timeout(250)) to.ice_getConnection(); # Establish connection timeout.holdAdapter(750) try: to.sendData(seq) test(False) except Ice.TimeoutException: pass # Expected. comm.destroy() # # Test Ice.Override.CloseTimeout. # initData = Ice.InitializationData() initData.properties = communicator.getProperties().clone() initData.properties.setProperty("Ice.Override.CloseTimeout", "100") comm = Ice.initialize(initData) connection = comm.stringToProxy(sref).ice_getConnection() timeout.holdAdapter(800) now = time.clock() comm.destroy() test((time.clock() - now) < 0.7) print("ok") return timeout