def test_experiment_runner_flash_firmwares(mocker, api_mock, exp_id, descs, exp_builds, exp_flashs): # pylint: disable=too-many-arguments dispatcher = mocker.Mock() runner = descs_runner.ExperimentRunner(dispatcher, descs[exp_id], exp_id=exp_id, api=api_mock) assert runner.exp_id == exp_id clean = mocker.patch('iotlab_controller.riot.RIOTFirmware.clean') build = mocker.patch('iotlab_controller.riot.RIOTFirmware.build') flash = mocker.patch('iotlabcli.node.node_command') run = runner.runs[-1] if len(runner.runs) > 1: prev_run = runner.runs[-2] else: prev_run = None for firmware in runner.experiment.firmwares: assert firmware.env['ABC'] == 'DEF' runner.reflash_firmwares(run, prev_run) assert len(clean.mock_calls) == exp_builds assert len(build.mock_calls) == exp_builds # Accessing mock call args was only introduced in python 3.8: # https://bugs.python.org/issue21269 if sys.version_info < (3, 8): return # pragma: no cover assert len([ c for c in flash.mock_calls if len(c.args) > 1 and c.args[1] == "flash" ]) == exp_flashs
def test_experiment_runner_run_name(mocker, exp_id, descs): # use patched "default" API to increase code coverage mocker.patch('iotlab_controller.common.get_default_api') dispatcher = mocker.Mock() runner = descs_runner.ExperimentRunner(dispatcher, descs[exp_id], exp_id=exp_id) assert len(runner.runs) == 2 for i, run in enumerate(runner.runs): run['idx'] = i if exp_id == 123: if i == 0: assert runner.run_name(run) == '123-0' # name stays the same assert runner.run_name(run) == '123-0' else: assert runner.run_name(run) == '123-1' # name stays the same assert runner.run_name(run) == '123-1' else: if i == 0: res = runner.run_name(run) # is a valid timestamp assert int(res) <= time.time() # name stays the same assert runner.run_name(run) == res else: res = runner.run_name(run) assert res == f'{exp_id}-{run["__timestamp__"]}' # name stays the same assert runner.run_name(run) == res
def test_experiment_runner_init_faulty_descs(mocker, api_mock, exp_id, descs): dispatcher = mocker.Mock() with pytest.raises(file_handler.DescriptionError): descs_runner.ExperimentRunner(dispatcher, descs[exp_id], exp_id=exp_id, api=api_mock)
def test_experiment_runner_init_warnings(mocker, caplog, exp_id, descs): # use patched "default" API to increase code coverage mocker.patch('iotlab_controller.common.get_default_api') dispatcher = mocker.Mock() with caplog.at_level(logging.WARNING): runner = descs_runner.ExperimentRunner(dispatcher, descs[exp_id], exp_id=exp_id) assert 'iotlab_controller.experiment.descs.runner' in \ [r.name for r in caplog.records] assert runner.exp_id == exp_id # don't make any assertions on nodes or experiment as API is a MagicMock assert runner.desc.env['FOOBAR'] == 'foobar' assert runner.experiment.target_kwargs['env'] == {'FOOBAR': 'foobar'}
def test_experiment_runner_init_success(mocker, api_mock, exp_id, exp_nodes, descs): dispatcher = mocker.Mock() if isinstance(descs[exp_id]['nodes'], dict) and \ 'edgelist_file' in descs[exp_id]['nodes']['network']: open_mock = mocker.mock_open(read_data='m3-1 m3-2 2.4\n') mocker.patch('builtins.open', open_mock) check_edgefile = True else: open_mock = mocker.Mock() check_edgefile = False runner = descs_runner.ExperimentRunner(dispatcher, descs[exp_id], exp_id=exp_id, api=api_mock) assert runner.exp_id == exp_id if check_edgefile: open_mock.assert_called_once_with( descs[exp_id]['nodes']['network']['edgelist_file'], mode='rb') # with python 3.6 mocking the edgelist file does not work properly if not check_edgefile or sys.version_info >= (3, 7): # pragma: no cover assert len(runner.nodes) == exp_nodes assert 'm3-1.grenoble.iot-lab.info' in runner.nodes assert 'm3-2.grenoble.iot-lab.info' in runner.nodes if exp_nodes > 2: assert 'm3-3.grenoble.iot-lab.info' in runner.nodes assert runner.experiment.name == dispatcher.DEFAULT_EXP_NAME if descs[exp_id].get('firmwares') or descs[exp_id].get('sink_firmware'): assert len(runner.experiment.firmwares) == exp_nodes else: assert not runner.experiment.firmwares if 'sink_firmware' in descs[exp_id]: assert runner.experiment.firmwares[0].env['SINK'] == 'canary' for firmware in runner.experiment.firmwares: assert firmware.application_path == 'test-app' assert firmware.board == 'iotlab-m3'
def test_experiment_runner_results_dir(mocker, exp_results_dir, descs): # use patched "default" API to increase code coverage mocker.patch('iotlab_controller.common.get_default_api') dispatcher = mocker.Mock() runner = descs_runner.ExperimentRunner(dispatcher, descs[124], exp_id=124) assert runner.results_dir == exp_results_dir