5037: Fix race condition in PySDK Websockets test.
authorBrett Smith <brett@curoverse.com>
Fri, 30 Jan 2015 20:09:34 +0000 (15:09 -0500)
committerBrett Smith <brett@curoverse.com>
Fri, 30 Jan 2015 20:24:49 +0000 (15:24 -0500)
This might just be bad luck, but for some reason when testing Tom's
changes I ran into a situation where this test failed because it
started processing the Websocket event about the new human before it
assigned self.h, so the assertion failed.  Fix the race condition by
asserting against a thread-aware Queue.

sdk/python/tests/test_websockets.py

index b62acb2b9d6c609543d495bacfbe5f5d219879af..61fb54df225cf6c4a299314493d55b4b2134ef93 100644 (file)
@@ -1,3 +1,4 @@
+import Queue
 import run_test_server
 import unittest
 import arvados
@@ -5,31 +6,18 @@ import arvados.events
 import threading
 
 class EventTestBase(object):
-    def on_event(self, ev):
-        if self.state == 1:
-            self.assertEqual(200, ev['status'])
-            self.state = 2
-            self.subscribed.set()
-        elif self.state == 2:
-            self.assertEqual(self.h[u'uuid'], ev[u'object_uuid'])
-            self.state = 3
-            self.done.set()
-        elif self.state == 3:
-            self.fail()
-
     def runTest(self):
-        self.ws = None
-        self.state = 1
-        self.subscribed = threading.Event()
-        self.done = threading.Event()
-
         run_test_server.authorize_with("admin")
-        self.ws = arvados.events.subscribe(arvados.api('v1'), [['object_uuid', 'is_a', 'arvados#human']], self.on_event, poll_fallback=2)
+        events = Queue.Queue(3)
+        self.ws = arvados.events.subscribe(
+            arvados.api('v1'), [['object_uuid', 'is_a', 'arvados#human']],
+            events.put, poll_fallback=2)
         self.assertIsInstance(self.ws, self.WS_TYPE)
-        self.subscribed.wait(10)
-        self.h = arvados.api('v1').humans().create(body={}).execute()
-        self.done.wait(10)
-        self.assertEqual(3, self.state)
+        self.assertEqual(200, events.get(True, 10)['status'])
+        human = arvados.api('v1').humans().create(body={}).execute()
+        self.assertEqual(human['uuid'], events.get(True, 10)['object_uuid'])
+        self.assertTrue(events.empty(), "got more events than expected")
+
 
 class WebsocketTest(run_test_server.TestCaseWithServers, EventTestBase):
     MAIN_SERVER = {'websockets': True}