def test_init(self): """Test ScheduleBroadcasts() default instantiation.""" # Create multiprocessing queue. queue = multiprocessing.Queue() scheduler = ScheduleBroadcasts(queue) # Initialise scheduler and ensure the first input is a multiprocessing # queue. self.assertEqual(scheduler.queue, queue) with self.assertRaises(TypeError): ScheduleBroadcasts('queue')
def test_start_stop(self): """Test ScheduleBroadcasts() start/stop.""" # Create objects for scheduling data. read = ReadDirectory(LOG_PATH, message=True) data = BufferData(read) data.start() # Wait for buffer to fill. start_wait = time.time() while not data.is_ready() and ((time.time() - start_wait) < TIMEOUT): time.sleep(0.1) # Schedule data. scheduler = ScheduleBroadcasts(data.queue) # Start scheduling data. self.assertTrue(scheduler.start()) self.assertTrue(scheduler.is_alive()) self.assertFalse(scheduler.start()) # Stop scheduling data. self.assertTrue(scheduler.stop()) self.assertFalse(scheduler.is_alive()) self.assertFalse(scheduler.stop()) # Allow threads to fully shut down. time.sleep(0.1)
def schedule(self, speed=None): """Schedule broadcasts.""" # Listen for message broadcasts. listener_A = MessageListener(UnitTestMessageA) listener_B = MessageListener(UnitTestMessageB) buffer_A = list() buffer_B = list() # Subscribe callbacks. def callback_A(data): buffer_A.append(data) def callback_B(data): buffer_B.append(data) listener_A.subscribe(callback_A) listener_B.subscribe(callback_B) # Create objects for reading and scheduling data. read = ReadDirectory(LOG_PATH, message=True) data = BufferData(read) data.start() # Wait for buffer to fill. start_wait = time.time() while not data.is_ready() and ((time.time() - start_wait) < TIMEOUT): time.sleep(0.1) # Schedule data. if not speed: speed = 1.0 scheduler = ScheduleBroadcasts(data.queue) else: scheduler = ScheduleBroadcasts(data.queue, speed=speed) scheduler.start() # Wait for broadcasts to end. run_time = 1.0 / float(speed) start_wait = time.time() while True: duration = time.time() - start_wait if scheduler.is_alive() and duration < 2.0 * run_time: time.sleep(0.1) else: break # Ensure all messages were received. self.assertEqual(len(buffer_A) + len(buffer_B), 20) # Ensure timing is approximately correct. self.assertGreaterEqual(duration, 0.5 * run_time) self.assertLessEqual(duration, 2.0 * run_time)
def test_init_speed(self): """Test ScheduleBroadcasts() speed instantiation.""" # Initialise scheduler object with a speed argument. speed = 3 queue = multiprocessing.Queue() scheduler = ScheduleBroadcasts(queue, speed=speed) # Validate input type. self.assertEqual(scheduler.speed, speed) with self.assertRaises(TypeError): ScheduleBroadcasts(queue, speed='speed') # Ensure speed cannot be zero. with self.assertRaises(TypeError): ScheduleBroadcasts(queue, speed=0) # Ensure speed cannot be negative. with self.assertRaises(TypeError): ScheduleBroadcasts(queue, speed=-1.0)