Skip to content

Commit

Permalink
perf(test): enhance test performance
Browse files Browse the repository at this point in the history
Fix #279
  • Loading branch information
spaceone committed Jan 6, 2023
1 parent b11a827 commit d2394d7
Show file tree
Hide file tree
Showing 11 changed files with 99 additions and 154 deletions.
24 changes: 24 additions & 0 deletions tests/conftest.py
Expand Up @@ -107,20 +107,44 @@ def wait_for(obj, attr, value=True, timeout=30.0):

class SimpleManager(Manager):

watcher = None

def tick(self, timeout=-1):
self._running = False
return super().tick(timeout)

def watch(self):
if self.watcher is not None:
return
self.watcher = Watcher().register(self)

def run_until(self, *args, **kwargs):
self.run()
return self.watcher.wait(*args, **kwargs)

def clear(self, *args, **kwargs):
return self.watcher.clear(*args, **kwargs)

def count(self, *args, **kwargs):
return self.watcher.count(*args, **kwargs)


@pytest.fixture
def simple_manager(request):
"""A manager main loop which runs in the MainThread until all events are processed.
It leaves out the generate_events event and can therefore not be used to FileIO or socket components.
"""
manager = SimpleManager()
Debugger(events=request.config.option.verbose).register(manager)
manager.watch()
manager.run()
manager.clear()
return manager


@pytest.fixture
def manager(request):
"""A manager main loop started in a separate thread"""
manager = Manager()

def finalizer():
Expand Down
18 changes: 5 additions & 13 deletions tests/core/test_call_wait_instance.py
Expand Up @@ -30,21 +30,13 @@ def hello(self):


@pytest.fixture
def app(request, manager, watcher):
app = App().register(manager)
assert watcher.wait("registered")
def app(simple_manager):
return App().register(simple_manager)

def finalizer():
app.unregister()

request.addfinalizer(finalizer)

return app


def test_wait_instance(manager, watcher, app):
x = manager.fire(wait())
assert watcher.wait("wait_success")
def test_wait_instance(simple_manager, app):
x = simple_manager.fire(wait())
assert simple_manager.run_until("wait_success")

value = x.value
assert value == "Hello World!"
18 changes: 5 additions & 13 deletions tests/core/test_component_targeting.py
Expand Up @@ -20,21 +20,13 @@ def hello(self):


@pytest.fixture
def app(request, manager, watcher):
app = App().register(manager)
assert watcher.wait("registered")
def app(simple_manager):
return App().register(simple_manager)

def finalizer():
app.unregister()

request.addfinalizer(finalizer)

return app


def test(manager, watcher, app):
x = manager.fire(hello(), app)
assert watcher.wait("hello_success")
def test(simple_manager, app):
x = simple_manager.fire(hello(), app)
assert simple_manager.run_until("hello_success")

value = x.value
assert value == "Hello World!"
22 changes: 7 additions & 15 deletions tests/core/test_coroutine.py
Expand Up @@ -49,24 +49,16 @@ def coroutine2(self):


@pytest.fixture
def app(request, manager, watcher):
app = App().register(manager)
assert watcher.wait("registered")
def app(simple_manager):
return App().register(simple_manager)

def finalizer():
app.unregister()

request.addfinalizer(finalizer)

return app


def test_coroutine(manager, watcher, app):
manager.fire(coroutine1())
assert watcher.wait("coroutine1_complete")
def test_coroutine(simple_manager, app):
simple_manager.fire(coroutine1())
assert simple_manager.run_until("coroutine1_complete")
assert app.returned, "coroutine1"

app.returned = False
manager.fire(coroutine2())
assert watcher.wait("coroutine2_complete")
simple_manager.fire(coroutine2())
assert simple_manager.run_until("coroutine2_complete")
assert app.returned, "coroutine2"
16 changes: 4 additions & 12 deletions tests/core/test_errors.py
Expand Up @@ -36,22 +36,14 @@ def reraise(e):


@pytest.fixture
def app(request, manager, watcher):
app = App().register(manager)
watcher.wait("registered")
def app(simple_manager):
return App().register(simple_manager)

def finalizer():
app.unregister()

request.addfinalizer(finalizer)

return app


def test_main(app, watcher):
def test_main(app, simple_manager):
e = test()
app.fire(e)
watcher.wait("exception")
assert simple_manager.run_until("exception")

assert app.etype == NameError
pytest.raises(NameError, lambda e: reraise(e), app.evalue)
Expand Down
20 changes: 6 additions & 14 deletions tests/core/test_memory_leaks.py
Expand Up @@ -27,20 +27,12 @@ def hello(self):


@pytest.fixture
def app(request, manager, watcher):
app = App().register(manager)
assert watcher.wait("registered")
def app(simple_manager):
return App().register(simple_manager)

def finalizer():
app.unregister()

request.addfinalizer(finalizer)

return app


def test_done_handlers_dont_leak(manager, watcher, app):
manager.fire(call())
manager.fire(call())
assert watcher.wait("call_success")
def test_done_handlers_dont_leak(simple_manager, app):
simple_manager.fire(call())
simple_manager.fire(call())
assert simple_manager.run_until("call_success")
assert "hello_done" not in app._handlers
21 changes: 6 additions & 15 deletions tests/core/test_new_filter.py
Expand Up @@ -20,26 +20,17 @@ def hello(self, event, *args, **kwargs):


@pytest.fixture
def app(request, manager, watcher):
app = (App() + App()).register(manager)
watcher.wait("registered")
def app(simple_manager):
return (App() + App()).register(simple_manager)

def finalizer():
app.unregister()
watcher.wait("unregistered")

request.addfinalizer(finalizer)

return app


def test_normal(app, watcher):
def test_normal(app, simple_manager):
x = app.fire(hello())
watcher.wait("hello_success")
assert simple_manager.run_until("hello_success")
assert x.value == ["Hello World!", "Hello World!"]


def test_filter(app, watcher):
def test_filter(app, simple_manager):
x = app.fire(hello(stop=True))
watcher.wait("hello_success")
assert simple_manager.run_until("hello_success")
assert x.value == "Hello World!"
12 changes: 6 additions & 6 deletions tests/core/test_value.py
Expand Up @@ -67,15 +67,15 @@ def app(request, simple_manager):

def test_value(app, simple_manager):
x = app.fire(hello())
simple_manager.run()
assert simple_manager.run_until('hello')

assert "Hello World!" in x
assert x.value == "Hello World!"


def test_nested_value(app, simple_manager):
x = app.fire(test())
simple_manager.run()
assert simple_manager.run_until('test')

assert x.value == "Hello World!"
assert str(x) == "Hello World!"
Expand All @@ -86,7 +86,7 @@ def test_value_notify(app, simple_manager):
ev.notify = True
x = app.fire(ev)

simple_manager.run()
assert simple_manager.run_until('hello_value_changed')

assert "Hello World!" in x
assert x.value == "Hello World!"
Expand All @@ -98,7 +98,7 @@ def test_nested_value_notify(app, simple_manager):
ev.notify = True
x = app.fire(ev)

simple_manager.run()
assert simple_manager.run_until('test_value_changed')

assert x.value == "Hello World!"
assert str(x) == "Hello World!"
Expand All @@ -107,7 +107,7 @@ def test_nested_value_notify(app, simple_manager):

def test_error_value(app, simple_manager):
x = app.fire(foo())
simple_manager.run()
assert simple_manager.run_until('foo')

etype, evalue, etraceback = x
assert etype is Exception
Expand All @@ -117,7 +117,7 @@ def test_error_value(app, simple_manager):

def test_multiple_values(app, simple_manager):
v = app.fire(values())
simple_manager.run()
assert simple_manager.run_until('values_complete')

assert isinstance(v.value, list)

Expand Down
10 changes: 5 additions & 5 deletions tests/net/test_tcp.py
Expand Up @@ -322,22 +322,22 @@ def test_tcp_bind(Poller, ipv6):
m.stop()


def test_tcp_lookup_failure(manager, watcher, Poller, ipv6):
poller = Poller().register(manager)
def test_tcp_lookup_failure(simple_manager, Poller, ipv6):
poller = Poller().register(simple_manager)

if ipv6:
tcp_client = TCP6Client()
else:
tcp_client = TCPClient()

client = Client() + tcp_client
client.register(manager)
client.register(simple_manager)

try:
assert watcher.wait("ready", "client")
assert simple_manager.run_until("ready", "client")

client.fire(connect("foo.bar.baz", 1234))
assert watcher.wait("error", "client")
assert simple_manager.run_until("error", "client")

if pytest.PLATFORM == "win32":
assert client.error.errno == 11004
Expand Down
14 changes: 7 additions & 7 deletions tests/node/test_node.py
Expand Up @@ -30,17 +30,17 @@ def remote_value_changed(self, value):


@fixture()
def bind(request, manager, watcher):
server = UDPServer(0).register(manager)
assert watcher.wait('ready')
def bind(request, simple_manager):
server = UDPServer(0).register(simple_manager)
assert simple_manager.run_until("ready")

host, port = server.host, server.port

server.fire(close())
assert watcher.wait('closed')
assert simple_manager.run_until("closed")

server.unregister()
assert watcher.wait('unregistered')
assert simple_manager.run_until("unregistered")

return host, port

Expand All @@ -49,13 +49,13 @@ def bind(request, manager, watcher):
def app(request, manager, watcher, bind):
app = App().register(manager)
node = Node().register(app)
watcher.wait('ready')
assert watcher.wait('ready')

child = (App() + Node(port=bind[1], server_ip=bind[0]))
child.start(process=True)

node.add('child', *bind)
watcher.wait('connected')
assert watcher.wait('connected')

def finalizer():
child.stop()
Expand Down

0 comments on commit d2394d7

Please sign in to comment.