class MockServer(object): TIMEOUT = 0.15 def __init__(self, port=None, timeout=None): port = port or 0 self.tchannel = TChannel( name='test', hostport="localhost:%s" % str(port), ) self.timeout = timeout or self.TIMEOUT self.thread = None self.ready = False self.io_loop = None @property def port(self): return int(self.hostport.rsplit(':', 1)[1]) @property def hostport(self): return self.tchannel.hostport def expect_call(self, endpoint, scheme='raw', **kwargs): assert isinstance(scheme, basestring) if not isinstance(endpoint, basestring): scheme = 'thrift' expectation = Expectation() def handle_expected_endpoint(request): response = Response() return expectation.execute(request, response) self.tchannel.register(scheme=scheme, endpoint=endpoint, handler=handle_expected_endpoint, **kwargs) return expectation def __enter__(self): self.start() return self def __exit__(self, *args): self.stop() def start(self): assert self.thread is None, 'server already started' self.thread = threading.Thread(target=self.serve) self.thread.start() while not self.ready: pass def serve(self): self.io_loop = tornado.ioloop.IOLoop() self.io_loop.make_current() self.tchannel.listen() def callback(): self.ready = True self.io_loop.add_callback(callback) self.io_loop.start() def stop(self): self.shutdown() self.thread.join() def shutdown(self): self.io_loop.stop()
class MockServer(object): TIMEOUT = 0.15 def __init__(self, port=None, timeout=None): port = port or 0 self.tchannel = TChannel( name='test', hostport="localhost:%s" % str(port), ) self.timeout = timeout or self.TIMEOUT self.thread = None self.ready = False self.io_loop = None @property def port(self): return self.tchannel.port @property def hostport(self): return self.tchannel.hostport def expect_call(self, endpoint, scheme='raw', **kwargs): assert isinstance(scheme, basestring) if not isinstance(endpoint, basestring): scheme = 'thrift' expectation = Expectation() def handle_expected_endpoint(request): response = Response() return expectation.execute(request, response) self.tchannel.register( scheme=scheme, endpoint=endpoint, handler=handle_expected_endpoint, **kwargs ) return expectation def __enter__(self): self.start() return self def __exit__(self, *args): self.stop() def start(self): assert self.thread is None, 'server already started' self.thread = threading.Thread(target=self.serve) self.thread.start() while not self.ready: pass def serve(self): self.io_loop = tornado.ioloop.IOLoop() self.io_loop.make_current() self.tchannel.listen() def callback(): self.ready = True self.io_loop.add_callback(callback) self.io_loop.start() def stop(self): self.shutdown() self.thread.join() def shutdown(self): self.io_loop.stop()