Esempio n. 1
0
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
Esempio n. 2
0
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
Esempio n. 3
0
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)
Esempio n. 4
0
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'}
Esempio n. 5
0
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'
Esempio n. 6
0
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