def test_published_messages(self) -> None: config = Config(LABBY_CONFIG_YAML) sequence = ExperimentSequence("./sequences/seq.yaml", SEQUENCE_YAML) runner = ExperimentRunner(config, sequence) with Sub0(dial=runner.subscription_address) as sub: sub.subscribe(b"") received_messages: List[ExperimentSequenceStatus] = [] with patch_time("2020-08-08"), patch_file_contents( "output/seq/000.csv"), patch("os.makedirs"): runner.start() while True: msg = sub.recv() status = ExperimentSequenceStatus.from_msgpack(msg) received_messages.append(status) if status.is_finished(): break runner.join() self.assertEqual( received_messages, [ ExperimentSequenceStatus(experiments=[ ExperimentStatus( name="000", state=ExperimentState.RUNNING, progress=0.0, ) ]), ExperimentSequenceStatus(experiments=[ ExperimentStatus( name="000", state=ExperimentState.RUNNING, progress=0.0, ) ]), ExperimentSequenceStatus(experiments=[ ExperimentStatus( name="000", state=ExperimentState.RUNNING, progress=0.5, ) ]), ExperimentSequenceStatus(experiments=[ ExperimentStatus( name="000", state=ExperimentState.RUNNING, progress=1.0, ) ]), ExperimentSequenceStatus(experiments=[ ExperimentStatus( name="000", state=ExperimentState.FINISHED, progress=1.0, ) ]), ], )
def test_patch_time(self) -> None: with patch_time("2020-08-08"): self.assertEqual(self._current_time(), "Sat Aug 8 00:00:00 2020") time.sleep(1) self.assertEqual(self._current_time(), "Sat Aug 8 00:00:01 2020") time.sleep(3600) self.assertEqual(self._current_time(), "Sat Aug 8 01:00:01 2020")
def test_patch_time_with_ticker(self) -> None: state: str = "unitialized" def _ticker() -> Generator[float, None, None]: nonlocal state state = "initial_state" yield 0.0 state = "]0s, 1s]" yield 1.0 state = "]1s, 1.5s]" yield 1.5 state = "]1.5s, 2s]" yield 2 state = "end_state" with patch_time("2020-08-08", _ticker()): self.assertEqual(state, "initial_state") time.sleep(0.01) self.assertEqual(state, "]0s, 1s]") time.sleep(0.98) self.assertEqual(state, "]0s, 1s]") self.assertEqual(self._current_time(), "Sat Aug 8 00:00:00 2020") time.sleep(0.01) self.assertEqual(self._current_time(), "Sat Aug 8 00:00:01 2020") self.assertEqual(state, "]0s, 1s]") # state change (t=1.01) time.sleep(0.01) self.assertEqual(state, "]1s, 1.5s]") time.sleep(0.49) self.assertEqual(state, "]1s, 1.5s]") # state change (t=1.51) time.sleep(0.01) self.assertEqual(state, "]1.5s, 2s]") self.assertEqual(self._current_time(), "Sat Aug 8 00:00:01 2020") time.sleep(0.49) self.assertEqual(self._current_time(), "Sat Aug 8 00:00:02 2020") self.assertEqual(state, "]1.5s, 2s]") # state change (t=2.01) time.sleep(0.01) self.assertEqual(state, "end_state") # state change (t=2.01) time.sleep(3600.0) self.assertEqual(state, "end_state") self.assertEqual(self._current_time(), "Sat Aug 8 01:00:02 2020")
def test_experiment_output(self) -> None: config = Config(LABBY_CONFIG_YAML) sequence = ExperimentSequence("./sequences/seq.yaml", SEQUENCE_YAML) runner = ExperimentRunner(config, sequence) with patch_time("2020-08-08"), patch_file_contents( "output/seq/000.csv") as output, patch( "os.makedirs") as makedirs: runner.start() runner.join() makedirs.assert_called_with(PosixPath("output/seq/"), exist_ok=True) self.assertEqual(len(output.write.call_args_list), 4) output.write.assert_has_calls([ call("seconds,voltage\n"), call("0.0,15.0\n"), call("0.5,15.0\n"), call("1.0,15.0\n"), ])
def test_run_sequence(self) -> None: SEQUENCE_CONTENTS = """ --- sequence: - experiment_type: labby.tests.test_server.TestExperiment - experiment_type: labby.tests.test_server.TestExperiment """ with patch_file_contents( "sequence/test.yml", SEQUENCE_CONTENTS ), patch_file_contents("output/test/000.csv") as output_0, patch_file_contents( "output/test/001.csv" ) as output_1, patch( "os.makedirs" ) as makedirs, patch_time( "2020-08-08" ): self.client.run_sequence("sequence/test.yml") while True: sequence_status = self.client.experiment_status().sequence_status if sequence_status and sequence_status.is_finished(): break time.sleep(0) makedirs.assert_called_with(PosixPath("output/test/"), exist_ok=True) self.assertEqual(len(output_0.write.call_args_list), 4) output_0.write.assert_has_calls( [ call("seconds,voltage\n"), call("0.0,15.0\n"), call("0.5,15.0\n"), call("1.0,15.0\n"), ] ) output_1.write.assert_has_calls( [ call("seconds,voltage\n"), call("0.0,15.0\n"), call("0.5,15.0\n"), call("1.0,15.0\n"), ] )