Exemple #1
0
def test_execute_jobs():
    context = Mock()
    context.args = Mock()
    context.args.event_handlers = None
    task_context = Mock()
    task_context.pkg = Mock()
    task_context.pkg.name = 'name'
    jobs = {
        'one':
        Job(identifier='id',
            dependencies=set(),
            task=None,
            task_context=task_context)
    }

    event_reactor = Mock()
    event_reactor.__enter__ = lambda self: self
    event_reactor.__exit__ = lambda self, *args: None
    with patch('colcon_core.executor.create_event_reactor',
               return_value=event_reactor):
        with EntryPointContext(extension1=Extension1, extension2=Extension2):
            # no extension selected
            with pytest.raises(AssertionError):
                execute_jobs(context, jobs)

            # execute method not implemented and sending skipped job event
            context.args.executor = 'extension2'
            with patch('colcon_core.executor.logger.error') as error:
                rc = execute_jobs(context, jobs)
            assert rc == 1
            assert error.call_count == 1
            assert len(error.call_args[0]) == 1
            assert error.call_args[0][0].startswith(
                "Exception in executor extension 'extension2': \n")
            assert event_reactor.get_queue().put.call_count == 2
            assert isinstance(
                event_reactor.get_queue().put.call_args_list[0][0][0][0],
                JobQueued)
            assert isinstance(
                event_reactor.get_queue().put.call_args_list[1][0][0][0],
                JobSkipped)

            # successful execution
            event_reactor.get_queue().put.reset_mock()
            jobs['one'].returncode = 0
            extensions = get_executor_extensions()
            extensions[110]['extension2'].execute = \
                lambda args, jobs, on_error: 0
            callback = Mock()
            rc = execute_jobs(context,
                              jobs,
                              on_error=OnError.interrupt,
                              pre_execution_callback=callback)
            assert rc == 0
            assert event_reactor.get_queue().put.call_count == 1
            assert isinstance(event_reactor.get_queue().put.call_args[0][0][0],
                              JobQueued)
            assert callback.call_count == 1
Exemple #2
0
def test_add_executor_arguments():
    parser = ArgumentParser()
    # extensions with the same priority
    with EntryPointContext(extension1=Extension1,
                           extension2=Extension2,
                           extension3=Extension3):
        with pytest.raises(AssertionError) as e:
            add_executor_arguments(parser)
        assert 'Executor extensions must have unique priorities' in \
            str(e.value)

    # no extensions
    with EntryPointContext():
        with pytest.raises(AssertionError) as e:
            add_executor_arguments(parser)
        assert 'No executor extensions found' in str(e.value)

    # choose executor by environment variable
    with EntryPointContext(extension1=Extension1, extension2=Extension2):
        extensions = get_executor_extensions()
        extensions[110]['extension2'].add_arguments = Mock(
            side_effect=RuntimeError('custom exception'))
        extensions[100]['extension1'].add_arguments = Mock(return_value=None)
        env = {DEFAULT_EXECUTOR_ENVIRONMENT_VARIABLE.name: 'extension1'}
        with EnvironmentContext(**env):
            with patch('colcon_core.executor.logger.error') as error:
                add_executor_arguments(parser)
    assert extensions[100]['extension1'].add_arguments.call_count == 1
    # the raised exception is catched and results in an error message
    assert error.call_count == 1
    assert len(error.call_args[0]) == 1
    assert error.call_args[0][0].startswith(
        "Exception in executor extension 'extension2': custom exception\n")
    args = parser.parse_args([])
    assert args.executor == 'extension1'

    # choose default executor
    parser = ArgumentParser()
    with EntryPointContext(extension1=Extension1, extension2=Extension2):
        add_executor_arguments(parser)
    args = parser.parse_args([])
    assert args.executor == 'extension2'