From 51f9e6cb1d83249133fa9981cd7b1a882d11964b Mon Sep 17 00:00:00 2001 From: Brett Smith Date: Fri, 30 Jan 2015 15:09:34 -0500 Subject: [PATCH] 5037: Fix race condition in PySDK Websockets test. 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 | 32 +++++++++-------------------- 1 file changed, 10 insertions(+), 22 deletions(-) diff --git a/sdk/python/tests/test_websockets.py b/sdk/python/tests/test_websockets.py index b62acb2b9d..61fb54df22 100644 --- a/sdk/python/tests/test_websockets.py +++ b/sdk/python/tests/test_websockets.py @@ -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} -- 2.30.2