def test_timeout_with_concurrently_queues(self): transport = self.useFixture(utils.TransportFixture( self.conf, self.url)) target = oslo_messaging.Target(topic="topic_" + str(uuid.uuid4()), server="server_" + str(uuid.uuid4())) server = self.useFixture( utils.RpcServerFixture(self.conf, self.url, target, executor="threading")) client = utils.ClientStub(transport.transport, target, cast=False, timeout=5) def short_periodical_tasks(): for i in range(10): client.add(increment=1) time.sleep(1) with concurrent.futures.ThreadPoolExecutor(max_workers=2) as executor: future = executor.submit(client.long_running_task, seconds=10) executor.submit(short_periodical_tasks) self.assertRaises(oslo_messaging.MessagingTimeout, future.result) self.assertEqual(10, server.endpoint.ival)
def test_independent_topics(self): transport = self.useFixture(utils.TransportFixture(self.url)) listener_a = self.useFixture( utils.NotificationFixture(transport.transport, ['1'])) listener_b = self.useFixture( utils.NotificationFixture(transport.transport, ['2'])) transport.wait() a = listener_a.notifier('pub-1', topic='1') b = listener_b.notifier('pub-2', topic='2') a_out = [('test-1-%s' % c, 'payload-1-%s' % c) for c in 'abcdefgh'] for event_type, payload in a_out: a.info({}, event_type, payload) b_out = [('test-2-%s' % c, 'payload-2-%s' % c) for c in 'ijklmnop'] for event_type, payload in b_out: b.info({}, event_type, payload) for expected in a_out: actual = listener_a.events.get(timeout=0.5) self.assertEqual('info', actual[0]) self.assertEqual(expected[0], actual[1]) self.assertEqual(expected[1], actual[2]) self.assertEqual('pub-1', actual[3]) for expected in b_out: actual = listener_b.events.get(timeout=0.5) self.assertEqual('info', actual[0]) self.assertEqual(expected[0], actual[1]) self.assertEqual(expected[1], actual[2]) self.assertEqual('pub-2', actual[3])
def test_timeout(self): transport = self.useFixture(utils.TransportFixture( self.conf, self.url)) target = oslo_messaging.Target(topic="no_such_topic") c = utils.ClientStub(transport.transport, target, timeout=1) self.assertThat(c.ping, matchers.raises(oslo_messaging.MessagingTimeout))
def test_multiple_topics(self): transport = self.useFixture(utils.TransportFixture(self.url)) listener = self.useFixture( utils.NotificationFixture(transport.transport, ['a', 'b'])) transport.wait() a = listener.notifier('pub-a', topic='a') b = listener.notifier('pub-b', topic='b') sent = { 'pub-a': [a, 'test-a', 'payload-a'], 'pub-b': [b, 'test-b', 'payload-b'] } for e in sent.values(): e[0].info({}, e[1], e[2]) received = {} while len(received) < len(sent): e = listener.events.get(timeout=1) received[e[3]] = e for key in received: actual = received[key] expected = sent[key] self.assertEqual('info', actual[0]) self.assertEqual(expected[1], actual[1]) self.assertEqual(expected[2], actual[2])
def test_simple(self): transport = self.useFixture(utils.TransportFixture(self.url)) listener = self.useFixture( utils.NotificationFixture(transport.transport, ['test_simple'])) transport.wait() notifier = listener.notifier('abc') notifier.info({}, 'test', 'Hello World!') event = listener.events.get(timeout=1) self.assertEqual('info', event[0]) self.assertEqual('test', event[1]) self.assertEqual('Hello World!', event[2]) self.assertEqual('abc', event[3])
def test_endpoint_version_namespace(self): # verify endpoint version and namespace are checked target = oslo_messaging.Target(topic="topic_" + str(uuid.uuid4()), server="server_" + str(uuid.uuid4()), namespace="Name1", version="7.5") class _endpoint(object): def __init__(self, target): self.target = target() def test(self, ctxt, echo): return echo transport = self.useFixture(utils.TransportFixture( self.conf, self.url)) self.useFixture( utils.RpcServerFixture(self.conf, self.url, target, executor="threading", endpoint=_endpoint(target))) client1 = utils.ClientStub(transport.transport, target, cast=False, timeout=5) self.assertEqual("Hi there", client1.test(echo="Hi there")) # unsupported version target2 = target() target2.version = "7.6" client2 = utils.ClientStub(transport.transport, target2, cast=False, timeout=5) self.assertRaises(oslo_messaging.rpc.client.RemoteError, client2.test, echo="Expect failure") # no matching namespace target3 = oslo_messaging.Target(topic=target.topic, server=target.server, version=target.version, namespace="Name2") client3 = utils.ClientStub(transport.transport, target3, cast=False, timeout=5) self.assertRaises(oslo_messaging.rpc.client.RemoteError, client3.test, echo="Expect failure")
def test_different_exchanges(self): t = self.useFixture(utils.TransportFixture(self.url)) # If the different exchanges are not honoured, then the # teardown may hang unless we broadcast all control messages # to each server group1 = self.useFixture( utils.RpcServerGroupFixture(self.url, transport=t, use_fanout_ctrl=True)) group2 = self.useFixture( utils.RpcServerGroupFixture(self.url, exchange="a", transport=t, use_fanout_ctrl=True)) group3 = self.useFixture( utils.RpcServerGroupFixture(self.url, exchange="b", transport=t, use_fanout_ctrl=True)) client1 = group1.client(1) data1 = [c for c in 'abcdefghijklmn'] for i in data1: client1.append(text=i) client2 = group2.client() data2 = [c for c in 'opqrstuvwxyz'] for i in data2: client2.append(text=i) actual1 = [[c for c in s.endpoint.sval] for s in group1.servers] self.assertThat(actual1, utils.IsValidDistributionOf(data1)) actual1 = [c for c in group1.servers[1].endpoint.sval] self.assertThat([actual1], utils.IsValidDistributionOf(data1)) for s in group1.servers: expected = len(data1) if group1.servers.index(s) == 1 else 0 self.assertEqual(expected, len(s.endpoint.sval)) self.assertEqual(0, s.endpoint.ival) actual2 = [[c for c in s.endpoint.sval] for s in group2.servers] for s in group2.servers: self.assertThat(len(s.endpoint.sval), matchers.GreaterThan(0)) self.assertEqual(0, s.endpoint.ival) self.assertThat(actual2, utils.IsValidDistributionOf(data2)) for s in group3.servers: self.assertEqual(0, len(s.endpoint.sval)) self.assertEqual(0, s.endpoint.ival)
def test_bad_endpoint(self): # 'target' attribute is reserved and should be of type Target class _endpoint(object): def target(self, ctxt, echo): return echo target = oslo_messaging.Target(topic="topic_" + str(uuid.uuid4()), server="server_" + str(uuid.uuid4())) transport = self.useFixture(utils.TransportFixture( self.conf, self.url)) self.assertRaises(TypeError, oslo_messaging.get_rpc_server, transport=transport.transport, target=target, endpoints=[_endpoint()], executor="threading")
def test_multiple_servers(self): transport = self.useFixture(utils.TransportFixture(self.url)) listener_a = self.useFixture( utils.NotificationFixture(transport.transport, ['test-topic'])) listener_b = self.useFixture( utils.NotificationFixture(transport.transport, ['test-topic'])) transport.wait() n = listener_a.notifier('pub') events_out = [('test-%s' % c, 'payload-%s' % c) for c in 'abcdefgh'] for event_type, payload in events_out: n.info({}, event_type, payload) events_in = [[(e[1], e[2]) for e in listener_a.get_events()], [(e[1], e[2]) for e in listener_b.get_events()]] self.assertThat(events_in, utils.IsValidDistributionOf(events_out)) for stream in events_in: self.assertThat(len(stream), matchers.GreaterThan(0))
def test_all_categories(self): transport = self.useFixture(utils.TransportFixture(self.url)) listener = self.useFixture( utils.NotificationFixture(transport.transport, ['test_all_categories'])) transport.wait() n = listener.notifier('abc') cats = ['debug', 'audit', 'info', 'warn', 'error', 'critical'] events = [(getattr(n, c), c, 'type-' + c, c + '-data') for c in cats] for e in events: e[0]({}, e[2], e[3]) # order between events with different categories is not guaranteed received = {} for expected in events: e = listener.events.get(timeout=0.5) received[e[0]] = e for expected in events: actual = received[expected[1]] self.assertEqual(expected[1], actual[0]) self.assertEqual(expected[2], actual[1]) self.assertEqual(expected[3], actual[2])