def test_run(self): source = MemorySource(list(range(10))) sink = MemorySink() Pipe.join(source, [Pipe_Tests.ProcessNameFilter()], sink).run() self.assertEqual(sink.items, ['MainProcess'] * 10)
def test_exception(self): CobaConfig.Logger = BasicLogger(MemorySink()) list(MultiprocessFilter([ExceptionFilter()], 2, 1).filter(range(4))) for item in CobaConfig.Logger.sink.items: self.assertIn("Unexpected exception:", item)
def test_time_two_separate(self): sink = MemorySink() logger = IndentLogger(sink, with_stamp=False) logs = sink.items with logger.time('a'): time.sleep(0.05) with logger.time('d'): logger.log('e') time.sleep(0.05) logger.log('g') with logger.time('a'): time.sleep(0.05) with logger.time('d'): logger.log('e') time.sleep(0.05) self.assertEqual(7, len(logs)) self.assertRegexpMatches(logs[0 ], 'a \\(\\d+\\.\\d+ seconds\\)') self.assertRegexpMatches(logs[1 ], ' \\* d \\(\\d+\\.\\d+ seconds\\)') self.assertEqual (logs[2 ], ' > e') self.assertEqual (logs[3 ], 'g') self.assertRegexpMatches(logs[4 ], 'a \\(\\d+\\.\\d+ seconds\\)') self.assertRegexpMatches(logs[5 ], ' \\* d \\(\\d+\\.\\d+ seconds\\)') self.assertEqual (logs[6 ], ' > e') self.assertAlmostEqual(float(logs[0][3:7 ]), 0.10, 1) self.assertAlmostEqual(float(logs[1][7:11]), 0.05, 1) self.assertAlmostEqual(float(logs[4][3:7 ]), 0.10, 1) self.assertAlmostEqual(float(logs[5][7:11]), 0.05, 1)
def test_time_with_1(self): #This test is somewhat time dependent. #I don't think it should ever fail, but if it does #try running it again and see if it works that time. sink = MemorySink() logger = BasicLogger(sink,with_stamp=False, with_name=False) logs = sink.items with logger.time('a'): logger.log('c') time.sleep(0.15) logger.log('d') logger.log('e') self.assertEqual(5, len(logs)) self.assertEqual (logs[0], 'a') self.assertEqual (logs[1], 'c') self.assertEqual (logs[2], 'd') self.assertRegexpMatches(logs[3], '^a \\(\\d+\\.\\d+ seconds\\) \\(completed\\)$') self.assertEqual (logs[4], 'e') self.assertAlmostEqual(float(logs[3][3:7 ]), 0.15, 1)
def test_time_with_3(self): sink = MemorySink() logger = IndentLogger(sink, with_stamp=False) logs = sink.items with logger.time('a'): with logger.log('c'): time.sleep(0.05) with logger.time('d'): logger.log('e') time.sleep(0.05) with logger.time('d'): logger.log('e') time.sleep(0.05) logger.log('f') logger.log('g') self.assertEqual(8, len(logs)) self.assertRegexpMatches(logs[0], '^a \\(\\d+\\.\\d+ seconds\\) \\(completed\\)') self.assertEqual (logs[1], ' * c') self.assertRegexpMatches(logs[2], '^ > d \\(\\d+\\.\\d+ seconds\\) \\(completed\\)$') self.assertEqual (logs[3], ' - e') self.assertRegexpMatches(logs[4], '^ > d \\(\\d+\\.\\d+ seconds\\) \\(completed\\)$') self.assertEqual (logs[5], ' - e') self.assertEqual (logs[6], ' * f') self.assertEqual (logs[7], 'g' ) self.assertAlmostEqual(float(logs[0][3:7 ]), 0.15, 1) self.assertAlmostEqual(float(logs[2][9:13]), 0.05, 1) self.assertAlmostEqual(float(logs[4][9:13]), 0.05, 1)
def test_not_picklable_sans_reduce(self): CobaConfig.Logger = BasicLogger(MemorySink()) list( MultiprocessFilter([ProcessNameFilter()], 2, 1).filter([NotPicklableFilter()])) self.assertEqual(1, len(CobaConfig.Logger.sink.items)) self.assertIn("pickle", CobaConfig.Logger.sink.items[0])
def test_wrapped_not_picklable_learner_sans_reduce(self): sim1 = LambdaSimulation(5, lambda i: i, lambda i, c: [0, 1, 2], lambda i, c, a: cast(float, a)) learner = WrappedLearner(NotPicklableLearner()) benchmark = Benchmark([sim1]) CobaConfig.Logger = BasicLogger(MemorySink()) benchmark.evaluate([learner]) self.assertEqual(1, len(CobaConfig.Logger.sink.items)) self.assertIn("pickle", CobaConfig.Logger.sink.items[0])
def test_log(self): sink = MemorySink() logger = IndentLogger(sink, with_stamp=False, with_name=False) logs = sink.items logger.log('a') logger.log('c') logger.log('d') self.assertEqual(logs[0], 'a' ) self.assertEqual(logs[1], 'c' ) self.assertEqual(logs[2], 'd' )
def test_logging(self): #this is an important example. Even if we set the main logger's #with_stamp to false it doesn't propogate to the processes. logger_sink = MemorySink() logger = IndentLogger(logger_sink, with_stamp=False, with_name=True) CobaConfig.Logger = logger items = list( MultiprocessFilter([ProcessNameFilter()], 2, 1).filter(range(4))) self.assertEqual(len(logger_sink.items), 4) self.assertEqual(items, [l.split(' ')[3] for l in logger_sink.items]) self.assertEqual(items, [l.split(' ')[-1] for l in logger_sink.items])
def test_log_exception_2(self): sink = MemorySink() logger = IndentLogger(sink, with_stamp=False) logs = sink.items exception = Exception("Test Exception") logger.log('a') logger.log_exception(exception,'') tb = ''.join(traceback.format_tb(exception.__traceback__)) msg = ''.join(traceback.TracebackException.from_exception(exception).format_exception_only()) expected_msg = f"\n\n{tb}\n {msg}" self.assertTrue(exception.__logged__) #type:ignore self.assertEqual(logs[0], "a") self.assertEqual(logs[1], expected_msg)
def test_log_exception_1(self): sink = MemorySink() logger = IndentLogger(sink, with_stamp=False) logs = sink.items try: raise Exception("Test Exception") except Exception as ex: logger.log_exception(ex,'error:') tb = ''.join(traceback.format_tb(ex.__traceback__)) msg = ''.join(traceback.TracebackException.from_exception(ex).format_exception_only()) expected_msg = f"error:\n\n{tb}\n {msg}" self.assertTrue(ex.__logged__) #type:ignore self.assertEqual(len(logs), 1) self.assertEqual(logs[0], expected_msg)
def test_log_with_1(self): #This test is somewhat time dependent. #I don't think it should ever fail, but if it does #try running it again and see if it works that time. sink = MemorySink() logger = IndentLogger(sink,with_stamp=False, with_name=False) logs = sink.items with logger.log('a'): logger.log('c') logger.log('d') logger.log('e') self.assertEqual(4, len(logs)) self.assertEqual(logs[0], 'a' ) self.assertEqual(logs[1], ' * c') self.assertEqual(logs[2], ' * d') self.assertEqual(logs[3], 'e' )
def test_ignore_raise(self): log_sink = MemorySink() CobaConfig.Logger = IndentLogger(log_sink) sim1 = LambdaSimulation(2, lambda i: i, lambda i, c: [0, 1, 2], lambda i, c, a: cast(float, a)) sim2 = LambdaSimulation(3, lambda i: i, lambda i, c: [3, 4, 5], lambda i, c, a: cast(float, a)) learners = [ModuloLearner(), BrokenLearner()] benchmark = Benchmark([sim1, sim2]) result = benchmark.evaluate(learners) actual_learners = result.learners.to_tuples() actual_simulations = result.simulations.to_tuples() actual_interactions = result.interactions.to_tuples() expected_learners = [(0, "Modulo(p=0)", "Modulo", '0'), (1, "Broken", "Broken", float('nan'))] expected_simulations = [ (0, "LambdaSimulation", "None", "None", '"LambdaSimulation"'), (1, "LambdaSimulation", "None", "None", '"LambdaSimulation"') ] expected_interactions = [(0, 0, 1, 0), (0, 0, 2, 1), (1, 0, 1, 3), (1, 0, 2, 4), (1, 0, 3, 5)] self.assertEqual( 2, sum([ int("Unexpected exception:" in item) for item in log_sink.items ])) self.assertCountEqual(actual_learners[0], expected_learners[0]) self.assertCountEqual(actual_learners[1][:3], expected_learners[1][:3]) self.assertTrue(math.isnan(expected_learners[1][3])) self.assertCountEqual(actual_simulations, expected_simulations) self.assertCountEqual(actual_interactions, expected_interactions)
def test_exception(self): source = MemorySource(list(range(4))) sink = MemorySink() with self.assertRaises(Exception): Pipe.join(source, [Pipe_Tests.ExceptionFilter()], sink).run()