summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2013-10-25 22:43:42 +0000
committerGerrit Code Review <review@openstack.org>2013-10-25 22:43:42 +0000
commitbbca76444f7cd77d0e85831e4bfabd90016c1fdb (patch)
tree4398b569b8114c975bf6b4a690637dadb9d8bb3c
parent2d461d501314d920f7449b77f441e4e8db158d64 (diff)
parentc157502a9c65ad59cb8d83be59c264db03c3d2f8 (diff)
downloadtrove-bbca76444f7cd77d0e85831e4bfabd90016c1fdb.tar.gz
Merge "Simulates events so run_tests.py executes 10x faster"
-rw-r--r--run_tests.py2
-rw-r--r--trove/tests/util/event_simulator.py60
2 files changed, 62 insertions, 0 deletions
diff --git a/run_tests.py b/run_tests.py
index 899e4e60..8a9bbe87 100644
--- a/run_tests.py
+++ b/run_tests.py
@@ -82,6 +82,8 @@ def initialize_fakes(app):
wsgi_intercept.add_wsgi_intercept('localhost',
CONF.bind_port,
wsgi_interceptor)
+ from trove.tests.util import event_simulator
+ event_simulator.monkey_patch()
def parse_args_for_test_config():
diff --git a/trove/tests/util/event_simulator.py b/trove/tests/util/event_simulator.py
new file mode 100644
index 00000000..f2af50c4
--- /dev/null
+++ b/trove/tests/util/event_simulator.py
@@ -0,0 +1,60 @@
+"""
+Simulates time itself to make the fake mode tests run even faster.
+"""
+
+
+pending_events = []
+sleep_entrance_count = 0
+
+
+def event_simulator_spawn_after(time_from_now_in_seconds, func, *args, **kw):
+ """Fakes events without doing any actual waiting."""
+ def __cb():
+ func(*args, **kw)
+ pending_events.append({"time": time_from_now_in_seconds, "func": __cb})
+
+
+def event_simulator_spawn(func, *args, **kw):
+ event_simulator_spawn_after(0, func, *args, **kw)
+
+
+def event_simulator_sleep(time_to_sleep):
+ """Simulates waiting for an event."""
+ global sleep_entrance_count
+ sleep_entrance_count += 1
+ time_to_sleep = float(time_to_sleep)
+ global pending_events
+ run_once = False # Ensure simulator runs even if the sleep time is zero.
+ while not run_once or time_to_sleep > 0:
+ run_once = True
+ itr_sleep = 0.5
+ for i in range(len(pending_events)):
+ event = pending_events[i]
+ event["time"] = event["time"] - itr_sleep
+ if event["func"] is not None and event["time"] < 0:
+ # Call event, but first delete it so this function can be
+ # reentrant.
+ func = event["func"]
+ event["func"] = None
+ try:
+ func()
+ except Exception:
+ LOG.exception("Simulated event error.")
+ time_to_sleep -= itr_sleep
+ sleep_entrance_count -= 1
+ if sleep_entrance_count < 1:
+ # Clear out old events
+ pending_events = [event for event in pending_events
+ if event["func"] is not None]
+
+
+def monkey_patch():
+ import time
+ time.sleep = event_simulator_sleep
+ import eventlet
+ from eventlet import greenthread
+ eventlet.sleep = event_simulator_sleep
+ greenthread.sleep = event_simulator_sleep
+ eventlet.spawn_after = event_simulator_spawn_after
+ eventlet.spawn_n = event_simulator_spawn
+ eventlet.spawn = NotImplementedError