class TestHub(unittest.TestCase): def _setUp(self): def kernel(config): self.hub = MokshaHub(config=config) self.topic = str(uuid4()) for __setup, name in testutils.make_setup_functions(kernel): yield __setup, name def _tearDown(self): self.hub.close() @testutils.crosstest def test_hub_creation(self): """ Test that we can simply create the hub. """ assert_true(self.hub) eq_(self.hub.topics, {}) @testutils.crosstest def test_hub_send_recv(self): "Test that we can send a message and receive it." messages_received = [] def callback(json): messages_received.append(json.body[1:-1]) self.hub.subscribe(topic=self.topic, callback=callback) sleep(sleep_duration) self.hub.send_message(topic=self.topic, message=secret) simulate_reactor(sleep_duration) sleep(sleep_duration) eq_(messages_received, [secret]) @testutils.crosstest def test_hub_no_subscription(self): "Test that we don't receive messages we're not subscribed for." messages_received = [] def callback(json): messages_received.append(json.body[1:-1]) self.hub.send_message(topic=self.topic, message=secret) simulate_reactor(sleep_duration) sleep(sleep_duration) eq_(messages_received, [])
class TestProducer: def _setUp(self): def kernel(config): self.hub = MokshaHub(config=config) self.a_topic = a_topic = str(uuid4()) for __setup, name in testutils.make_setup_functions(kernel): yield __setup, name def _tearDown(self): self.hub.close() def fake_register_producer(self, prod): """ Fake register a producer, not by entry-point like usual. Registering producers is a little easier than registering consumers. The MokshaHub doesn't even keep track of the .poll method callbacks. We simply instantiate the producer (and it registers itself with the hub). """ return prod(self.hub) @testutils.crosstest def test_produce_ten_strs(self): """ Produce ten-ish strings. """ messages_received = [] def callback(json): messages_received.append(json.body[1:-1]) self.hub.subscribe(topic=self.a_topic, callback=callback) class TestProducer(moksha.hub.api.producer.PollingProducer): topic = self.a_topic frequency = sleep_duration / 10.9 def poll(self): self.send_message(self.topic, secret) # Ready? self.fake_register_producer(TestProducer) # Go! simulate_reactor(duration=sleep_duration) # Ok. # We also need to sleep for `sleep_duration` seconds after the reactor # has stopped, not because the messages still need to get where they're # going, but so that the `messages_received` object can sync between # python threads. # It has already been updated in callback(json) at this point, but it # hasn't yet propagated to this context. sleep(sleep_duration) # Finally, the check. Did we get our ten messages? (or about as much) assert (len(messages_received) > 8 and len(messages_received) < 12) @testutils.crosstest def test_idempotence(self): """ Test that running the same test twice still works. """ return self.test_produce_ten_strs()
class TestProducer: def _setUp(self): def kernel(config): self.hub = MokshaHub(config=config) self.a_topic = a_topic = str(uuid4()) for __setup, name in testutils.make_setup_functions(kernel): yield __setup, name def _tearDown(self): self.hub.close() def fake_register_producer(self, prod): """ Fake register a producer, not by entry-point like usual. Registering producers is a little easier than registering consumers. The MokshaHub doesn't even keep track of the .poll method callbacks. We simply instantiate the producer (and it registers itself with the hub). """ return prod(self.hub) @testutils.crosstest def test_produce_ten_strs(self): """ Produce ten-ish strings. """ messages_received = [] def callback(json): messages_received.append(json.body[1:-1]) self.hub.subscribe(topic=self.a_topic, callback=callback) class TestProducer(moksha.hub.api.producer.PollingProducer): topic = self.a_topic frequency = sleep_duration / 10.9 def poll(self): self.send_message(self.topic, secret) # Ready? self.fake_register_producer(TestProducer) # Go! simulate_reactor(duration=sleep_duration) # Ok. # We also need to sleep for `sleep_duration` seconds after the reactor # has stopped, not because the messages still need to get where they're # going, but so that the `messages_received` object can sync between # python threads. # It has already been updated in callback(json) at this point, but it # hasn't yet propagated to this context. sleep(sleep_duration) # Finally, the check. Did we get our ten messages? (or about as much) assert(len(messages_received) > 8, len(messages_received) < 12) @testutils.crosstest def test_idempotence(self): """ Test that running the same test twice still works. """ return self.test_produce_ten_strs()