Example #1
0
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()
Example #2
0
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()