Fix slow notification listener tests

The notification listener tests have a listener endpoint that will stop
the listener thread when a certain number of messages have been
received. If this doesn't work, the main thread will time out its
join() after 5 seconds and the only way sign of this is that the test
took over 5 seconds.

Let's make stop_listener() return a boolean indicating whether the the
thread has stopped or we timed out, and assert that the thread has
stopped.

Fix a few cases where the thread hasn't stopped. In the 'two exchanges'
case, we send three messages but only two are to the exchanges we are
listening on. In the tests using the HANDLED return value, the info()
handler which stops the thread was never been called because that
endpoint was last in the endpoints list.

Change-Id: Iea2486f23cee073c3891188d7aabb22ae945900d
This commit is contained in:
Mark McLoughlin 2014-06-27 06:50:39 +01:00
parent 13fc9f251a
commit a7f01d9683
1 changed files with 8 additions and 7 deletions

View File

@ -33,7 +33,7 @@ class ListenerSetupMixin(object):
self._expect_messages = expect_messages
self._received_msgs = 0
self._listener = messaging.get_notification_listener(
transport, targets, endpoints + [self], allow_requeue=True)
transport, targets, [self] + endpoints, allow_requeue=True)
def info(self, ctxt, publisher_id, event_type, payload, metadata):
self._received_msgs += 1
@ -61,6 +61,7 @@ class ListenerSetupMixin(object):
def _stop_listener(self, thread):
thread.join(timeout=5)
return thread.isAlive()
def _setup_notifier(self, transport, topic='testtopic',
publisher_id='testpublisher'):
@ -128,7 +129,7 @@ class TestNotifyListener(test_utils.BaseTestCase, ListenerSetupMixin):
notifier = self._setup_notifier(transport)
notifier.info({}, 'an_event.start', 'test message')
self._stop_listener(listener_thread)
self.assertFalse(self._stop_listener(listener_thread))
endpoint.info.assert_called_once_with(
{}, 'testpublisher', 'an_event.start', 'test message',
@ -148,7 +149,7 @@ class TestNotifyListener(test_utils.BaseTestCase, ListenerSetupMixin):
notifier = self._setup_notifier(transport, topic='topic2')
notifier.info({'ctxt': '2'}, 'an_event.start2', 'test')
self._stop_listener(listener_thread)
self.assertFalse(self._stop_listener(listener_thread))
endpoint.info.assert_has_calls([
mock.call({'ctxt': '1'}, 'testpublisher',
@ -168,7 +169,7 @@ class TestNotifyListener(test_utils.BaseTestCase, ListenerSetupMixin):
exchange="exchange1"),
messaging.Target(topic="topic",
exchange="exchange2")]
listener_thread = self._setup_listener(transport, [endpoint], 3,
listener_thread = self._setup_listener(transport, [endpoint], 2,
targets=targets)
notifier = self._setup_notifier(transport, topic="topic")
@ -191,7 +192,7 @@ class TestNotifyListener(test_utils.BaseTestCase, ListenerSetupMixin):
notifier.info({'ctxt': '2'},
'an_event.start', 'test message exchange2')
self._stop_listener(listener_thread)
self.assertFalse(self._stop_listener(listener_thread))
endpoint.info.assert_has_calls([
mock.call({'ctxt': '1'}, 'testpublisher', 'an_event.start',
@ -214,7 +215,7 @@ class TestNotifyListener(test_utils.BaseTestCase, ListenerSetupMixin):
notifier = self._setup_notifier(transport)
notifier.info({}, 'an_event.start', 'test')
self._stop_listener(listener_thread)
self.assertFalse(self._stop_listener(listener_thread))
endpoint1.info.assert_called_once_with(
{}, 'testpublisher', 'an_event.start', 'test', {
@ -242,7 +243,7 @@ class TestNotifyListener(test_utils.BaseTestCase, ListenerSetupMixin):
notifier = self._setup_notifier(transport)
notifier.info({}, 'an_event.start', 'test')
self._stop_listener(listener_thread)
self.assertFalse(self._stop_listener(listener_thread))
endpoint.info.assert_has_calls([
mock.call({}, 'testpublisher', 'an_event.start', 'test',