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.
import run_test_server
import unittest
import arvados
import run_test_server
import unittest
import arvados
import threading
class EventTestBase(object):
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()
-
- self.ws = None
- self.state = 1
- self.subscribed = threading.Event()
- self.done = threading.Event()
-
run_test_server.authorize_with("admin")
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.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}
class WebsocketTest(run_test_server.TestCaseWithServers, EventTestBase):
MAIN_SERVER = {'websockets': True}