def test_message_receive(self): """Test %s QueuedListener() message send-receive functionality.""" listener = QueuedListener(self.Message) broadcaster = MessageBroadcaster(self.Message) data = self.Message(A=1, B=2) self.queued_send_receive(listener, broadcaster, data)
def test_message_init(self): """Test %s MessageBroadcaster() initialisation.""" # Ensure non-Message() inputs are caught. with self.assertRaises(TypeError): MessageBroadcaster(None) # Ensure errors are propagated. with self.assertRaises(Exception): MessageBroadcaster(self.BadMessage) # Create an instance of MessageBroadcaster() with defaults. broadcaster = MessageBroadcaster(self.Message) self.assertEqual(broadcaster.topic, None) self.assertTrue(broadcaster.is_open) broadcaster.close() # Create an instance of MessageBroadcaster() with a specific topic. broadcaster = MessageBroadcaster(self.Message, topic=TOPIC) self.assertEqual(broadcaster.topic, TOPIC) self.assertTrue(broadcaster.is_open) broadcaster.close() # Ensure non-string topics are caught. with self.assertRaises(TypeError): MessageBroadcaster(self.Message, topic=False)
def test_message_send_receive(self): """Test %s with MessageBroadcaster/Listener() objects.""" # NOTE: this test listens for multiple topics from many. Rather than # sending raw data (a previous test), Message() objects are # sent. This tests all the functionality of the # MessageBroadcaster() and MessageListener() objects. # Send multiple topics, receive SOME topics. send_topics = ['topic A', 'topic B', 'topic C', 'topic D', 'topic E'] listen_topics = ['topic A', 'topic C', 'topic E'] # Create broadcaster. broadcaster = MessageBroadcaster(self.Message) # Catch messages with a specific topic. topic_buffer = list() listener_topic = MessageListener(self.Message, topics=listen_topics) # Subscribe callback. def callback(data): topic_buffer.append(data) self.assertTrue(listener_topic.subscribe(callback)) self.assertTrue(listener_topic.is_subscribed(callback)) self.assertEqual(listener_topic.num_subscriptions(), 1) # Catch all messages. This ensures the unit-test does not time out # waiting for messages that are filtered out by topic. message_buffer = list() listener_message = MessageListener(self.Message) # Ensure network objects are open. self.assertTrue(broadcaster.is_open) self.assertTrue(listener_topic.is_open) self.assertTrue(listener_message.is_open) # Publish messages with different topics. messages = list() for (i, topic) in enumerate(send_topics): messages.append(self.Message()) messages[-1]['text'] = '%s: %1.8f' % (topic, time.time()) # Perform test. message_buffer = self.publish(broadcaster, listener_message, messages[-1], topic=topic, received_buffer=message_buffer) # Close connections. broadcaster.close() listener_topic.close() listener_message.close() self.assertFalse(broadcaster.is_open) self.assertFalse(listener_topic.is_open) self.assertFalse(listener_message.is_open) # Ensure all topics were received. self.assertEqual(len(topic_buffer), len(listen_topics)) for i, topic in enumerate(listen_topics): self.assertEqual(topic_buffer[i]['payload'], messages[send_topics.index(topic)])
def test_message_publish(self): """Test %s MessageBroadcaster() publish.""" # Test publish fails if the input is not a Message(). with self.assertRaises(TypeError): MessageBroadcaster(dict) with self.assertRaises(TypeError): MessageBroadcaster(0) # Create an instance of MessageBroadcaster(). message = self.Message() broadcaster = MessageBroadcaster(self.Message) # Test publish succeeds with default topic. broadcaster.publish(message) # Ensure attempts to publish a non-message type raises an exception. with self.assertRaises(TypeError): broadcaster.publish(False) # Test setting topic at publish. self.assertEqual(broadcaster.topic, None) broadcaster.publish(message, topic='topic') with self.assertRaises(TypeError): broadcaster(message, topic=5) # Ensure attempts to publish on a closed connection raises an # exception. broadcaster.close() with self.assertRaises(IOError): broadcaster.publish(message)
def test_open_close(self): """Test LogNetwork() open/close.""" # Create broadcasters. broadcaster_A = MessageBroadcaster(UnitTestMessageA) broadcaster_B = MessageBroadcaster(UnitTestMessageB) # Initialise network dump. messages = [UnitTestMessageA, UnitTestMessageB] dump = LogNetwork(TMP_PATH, messages, open_init=False) self.assertEqual(dump.directory, None) self.assertFalse(dump.is_alive) # Ensure a log directory has NOT been created (Note a README file is # created in the /tmp directory). self.assertEqual(len(os.listdir(TMP_PATH)), 1) # Start network dump. self.assertTrue(dump.open()) self.assertTrue(dump.is_alive) self.assertFalse(dump.open()) self.assertNotEqual(dump.directory, None) # Ensure a log directory as been created and it is empty. directory = dump.directory self.assertEqual(len(os.listdir(TMP_PATH)), 2) self.assertEqual(len(os.listdir(directory)), 0) # Broadcast messages for logging. broadcaster_A.publish(UnitTestMessageA(data='A')) broadcaster_B.publish(UnitTestMessageB(data='B')) # Wait for log files to be created. begin_time = time.time() while len(os.listdir(dump.directory)) < 2: time.sleep(0.1) if time.time() - begin_time > TIME_OUT: break # Ensure the log files have been created and are in a logging state. directory = dump.directory files = os.listdir(directory) self.assertEqual(len(files), 2) for message in messages: self.assertTrue((message.name + '.tmp') in files) # Stop network dump. self.assertTrue(dump.close()) self.assertFalse(dump.is_alive) self.assertFalse(dump.close()) self.assertEqual(dump.directory, None) # Ensure the log files have been closed. files = os.listdir(directory) self.assertEqual(len(files), 2) for message in messages: self.assertTrue((message.name + '.log') in files) # Ensure LogNetwork auto-opens by default. dump = LogNetwork(TMP_PATH, messages) self.assertNotEqual(dump.directory, None) self.assertFalse(dump.open()) self.assertTrue(dump.is_alive) self.assertTrue(dump.close())
def test_log_message(self): """Test LogConnection() log message data.""" self.log_file(os.path.join(TMP_PATH, 'unittest'), UnitTestMessageA, MessageBroadcaster(UnitTestMessageA), UnitTestMessageA(data='test'))