Esempio n. 1
0
    def test_delayed_creation(self):
        def creator():
            yield Task('foo', None, loader=DelayedLoader(lambda : None))
        delayed_loader = DelayedLoader(creator, executed='t2')
        tasks = {'t1': Task('t1', None, loader=delayed_loader),
                 't2': Task('t2', None),
                 }
        td = TaskDispatcher(tasks, [], None)
        n1 = td._gen_node(None, 't1')
        gen = td._add_task(n1)

        # first returned node is `t2` because it is an implicit task_dep
        n2 = next(gen)
        assert n2.task.name == 't2'

        # wait until t2 is finished
        n3 = next(gen)
        assert n3 == 'wait'

        # after t2 is done, generator is reseted
        td._update_waiting(n2)
        n4 = next(gen)
        assert n4 == "reset generator"

        # recursive loader is preserved
        assert isinstance(td.tasks['foo'].loader, DelayedLoader)
        pytest.raises(AssertionError, next, gen)
Esempio n. 2
0
 def test_cyclic(self):
     tasks = {'t1': Task('t1', None),
              't2': Task('t2', None)
              }
     td = TaskDispatcher(tasks, [], None)
     n1 = td._gen_node(None, 't1')
     n2 = td._gen_node(n1, 't2')
     pytest.raises(InvalidDodoFile, td._gen_node, n2, 't1')
Esempio n. 3
0
 def test_to_run_none(self):
     tasks = {'t1': Task('t1', None),
              }
     td = TaskDispatcher(tasks, [], None)
     td._gen_node(None, 't1') # t1 was already created
     to_run = ['t1']
     assert None == td._get_next_node([], to_run)
     assert [] == to_run
Esempio n. 4
0
 def test_already_created(self):
     tasks = {'t1': Task('t1', None),
              't2': Task('t2', None)
              }
     td = TaskDispatcher(tasks, [], None)
     n1 = td._gen_node(None, 't1')
     td._gen_node(n1, 't2')
     assert None == td._gen_node(None, 't1')
Esempio n. 5
0
 def test_ready(self):
     tasks = {'t1': Task('t1', None),
              't2': Task('t2', None),
              }
     td = TaskDispatcher(tasks, [], None)
     n1 = td._gen_node(None, 't1')
     ready = deque([n1])
     assert n1 == td._get_next_node(ready, ['t2'])
     assert 0 == len(ready)
Esempio n. 6
0
 def test_none(self):
     tasks = {'t1': Task('t1', None),
              't2': Task('t2', None),
              }
     td = TaskDispatcher(tasks, [], None)
     n1 = td._gen_node(None, 't1')
     n2 = td._gen_node(None, 't2')
     n2.run_status = 'done'
     td._node_add_wait_run(n1, ['t2'])
     assert not n1.wait_run
Esempio n. 7
0
 def test_deps_not_ok(self):
     tasks = {'t1': Task('t1', None),
              't2': Task('t2', None),
              }
     td = TaskDispatcher(tasks, [], None)
     n1 = td._gen_node(None, 't1')
     n2 = td._gen_node(None, 't2')
     n2.run_status = 'failure'
     td._node_add_wait_run(n1, ['t2'])
     assert n1.bad_deps
Esempio n. 8
0
 def test_task_deps_no_wait(self):
     tasks = {'t1': Task('t1', None, task_dep=['t2']),
              't2': Task('t2', None),
              }
     td = TaskDispatcher(tasks, [], None)
     n1 = td._gen_node(None, 't1')
     n2 = td._gen_node(None, 't2')
     n2.run_status = 'done'
     gen = td._add_task(n1)
     assert tasks['t1'] == next(gen)
Esempio n. 9
0
 def test_to_run(self):
     tasks = {'t1': Task('t1', None, task_dep=['t2']),
              't2': Task('t2', None),
              }
     td = TaskDispatcher(tasks, [], None)
     to_run = ['t2', 't1']
     td._gen_node(None, 't1') # t1 was already created
     got = td._get_next_node([], to_run)
     assert isinstance(got, ExecNode)
     assert 't2' == got.task.name
     assert [] == to_run
Esempio n. 10
0
 def test_wait_select(self):
     tasks = {'t1': Task('t1', None, task_dep=['t2']),
              't2': Task('t2', None),
              }
     td = TaskDispatcher(tasks, [], None)
     n2 = td._gen_node(None, 't2')
     n2.wait_select = True
     n2.run_status = 'run'
     td.waiting.add(n2)
     td._update_waiting(n2)
     assert False == n2.wait_select
     assert deque([n2]) == td.ready
Esempio n. 11
0
 def test_task_deps_already_created(self):
     tasks = {'t1': Task('t1', None, task_dep=['t2']),
              't2': Task('t2', None),
              }
     td = TaskDispatcher(tasks, [], None)
     n1 = td._gen_node(None, 't1')
     n2 = td._gen_node(None, 't2')
     assert 'wait' == n1.step()
     assert 'wait' == n1.step()
     #tasks['t2'].run_status = 'done'
     td._update_waiting(n2)
     assert tasks['t1'] == n1.step()
Esempio n. 12
0
 def test_wait(self):
     tasks = {'t1': Task('t1', None),
              't2': Task('t2', None),
              }
     td = TaskDispatcher(tasks, [], None)
     n1 = td._gen_node(None, 't1')
     n2 = td._gen_node(None, 't2')
     n1.wait_run.add('xxx')
     td._node_add_wait_run(n1, ['t2'])
     assert 2 == len(n1.wait_run)
     assert 't2' in n1.wait_run
     assert not n1.bad_deps
     assert n1 in n2.waiting_me
Esempio n. 13
0
 def test_setup_task__run(self):
     tasks = {'t1': Task('t1', None, setup=['t2']),
              't2': Task('t2', None),
              }
     td = TaskDispatcher(tasks, [], None)
     n1 = td._gen_node(None, 't1')
     gen = td._add_task(n1)
     assert tasks['t1'] == next(gen) # first time (just select)
     assert 'wait' == next(gen)      # wait for select result
     n1.run_status = 'run'
     assert tasks['t2'] == next(gen).task # send setup task
     assert 'wait' == next(gen)
     assert tasks['t1'] == next(gen)  # second time
Esempio n. 14
0
 def test_calc_dep_already_executed(self):
     tasks = {'t1': Task('t1', None, calc_dep=['t2']),
              't2': Task('t2', None),
              't3': Task('t3', None),
              }
     td = TaskDispatcher(tasks, {'intermediate': 't3'}, None)
     n1 = td._gen_node(None, 't1')
     n2 = td._gen_node(None, 't2')
     n2.run_status = 'done'
     n2.task.values = {'calc_dep': ['t3']}
     assert 't3' == n1.step().task.name
     assert set() == n1.wait_run
     assert set() == n1.wait_run_calc
Esempio n. 15
0
 def test_calc_dep_already_executed(self):
     tasks = {'t1': Task('t1', None, calc_dep=['t2']),
              't2': Task('t2', None),
              }
     td = TaskDispatcher(tasks, [], None)
     n1 = td._gen_node(None, 't1')
     n2 = td._gen_node(None, 't2')
     n2.run_status = 'done'
     n2.task.values = {'calc_dep': ['t3'], 'task_dep':['t5']}
     td._node_add_wait_run(n1, ['t2'], calc=True)
     # n1 is updated with results from t2
     assert n1.calc_dep == set(['t2', 't3'])
     assert n1.task_dep == ['t5']
     # n1 doesnt need to wait any calc_dep to be executed
     assert n1.wait_run_calc == set()
Esempio n. 16
0
    def test_regex_not_found(self):
        def creator1():
            yield Task('foo1', None, targets=['tgt1'])
        delayed_loader1 = DelayedLoader(creator1, target_regex='tgt.*')

        t1 = Task('t1', None, loader=delayed_loader1)

        tc = TaskControl([t1])
        selection = tc._filter_tasks(['tgt666'])
        assert ['_regex_target_tgt666:t1'] == selection
        td = TaskDispatcher(tc.tasks, tc.targets, selection)

        n1 = td._gen_node(None, '_regex_target_tgt666:t1')
        gen = td._add_task(n1)
        # target not found after generating all tasks from regex group
        pytest.raises(InvalidCommand, next, gen)
Esempio n. 17
0
    def test_calc_dep(self):
        def calc_intermediate():
            return {'file_dep': ['intermediate']}
        tasks = {'t1': Task('t1', None, calc_dep=['t2']),
                 't2': Task('t2', [calc_intermediate]),
                 't3': Task('t3', None, targets=['intermediate']),
                 }
        td = TaskDispatcher(tasks, {'intermediate': 't3'}, None)
        n1 = td._gen_node(None, 't1')
        n2 = n1.step()
        assert tasks['t2'] == n2.task
        assert 'wait' == n1.step()
        # execute t2 to process calc_dep
        tasks['t2'].execute()
        td.nodes['t2'].run_status = 'done'
        td._update_waiting(n2)
        n3 = n1.step()
        assert tasks['t3'] == n3.task
        assert 'intermediate' in tasks['t1'].file_dep
        assert 't3' in tasks['t1'].task_dep

        # t3 was added by calc dep
        assert 'wait' == n1.step()
        n3.run_status = 'done'
        td._update_waiting(n3)
        assert tasks['t1'] == n1.step()
Esempio n. 18
0
    def test_delayed_creation_target_regex(self):
        def creator():
            yield Task('foo', None, targets=['tgt1'])
        delayed_loader = DelayedLoader(creator,
                                       executed='t2', target_regex='tgt1')
        tasks = {
            't1': Task('t1', None, loader=delayed_loader),
            't2': Task('t2', None),
        }

        tc = TaskControl(list(tasks.values()))
        selection = tc._filter_tasks(['tgt1'])
        assert ['_regex_target_tgt1:t1'] == selection
        td = TaskDispatcher(tc.tasks, tc.targets, selection)

        n1 = td._gen_node(None, '_regex_target_tgt1:t1')
        gen = td._add_task(n1)

        # first returned node is `t2` because it is an implicit task_dep
        n2 = next(gen)
        assert n2.task.name == 't2'

        # wait until t2 is finished
        n3 = next(gen)
        assert n3 == 'wait'

        # after t2 is done, generator is reseted
        n2.run_status = 'done'
        td._update_waiting(n2)
        n4 = next(gen)
        assert n4 == "reset generator"

        # manually reset generator
        n1.reset_task(td.tasks[n1.task.name], td._add_task(n1))

        # get the delayed created task
        gen2 = n1.generator  # n1 generator was reset / replaced
        # get t1 because of its target was a file_dep of _regex_target_tgt1
        n5 = next(gen2)
        assert n5.task.name == 'foo'

        # get internal created task
        n5.run_status = 'done'
        td._update_waiting(n5)
        n6 = next(gen2)
        assert n6.name == '_regex_target_tgt1:t1'

        # file_dep is removed because foo might not be task
        # that creates this task (support for multi regex matches)
        assert n6.file_dep == {}
Esempio n. 19
0
    def test_delayed_creation_sub_task(self):
        # usually a repeated loader is replaced by the real task
        # when it is first executed, the problem arises when the
        # the expected task is not actually created
        def creator():
            yield Task('t1:foo', None)
            yield Task('t1:bar', None)
        delayed_loader = DelayedLoader(creator, executed='t2')
        tasks = {
            't1': Task('t1', None, loader=delayed_loader),
            't2': Task('t2', None),}

        # simulate a sub-task from delayed created added to task_list
        tasks['t1:foo'] = Task('t1:foo', None, loader=delayed_loader)
        tasks['t1:xxx'] = Task('t1:xxx', None, loader=delayed_loader)
        delayed_loader.basename = 't1'

        td = TaskDispatcher(tasks, [], None)
        n1 = td._gen_node(None, 't1:foo')
        gen = td._add_task(n1)

        # first returned node is `t2` because it is an implicit task_dep
        n1b = next(gen)
        assert n1b.task.name == 't2'

        # wait until t2 is finished
        n1c = next(gen)
        assert n1c == 'wait'

        # after t2 is done, generator is reseted
        n1b.run_status = 'successful'
        td._update_waiting(n1b)
        n1d = next(gen)
        assert n1d == "reset generator"
        assert 't1:foo' in td.tasks
        assert 't1:bar' in td.tasks

        # finish with t1:foo
        gen2 = td._add_task(n1)
        n1.reset_task(td.tasks[n1.task.name], gen2)
        n2 = next(gen2)
        assert n2.name == 't1:foo'
        pytest.raises(StopIteration, next, gen2)

        # try non-existent t1:xxx
        n3 = td._gen_node(None, 't1:xxx')
        gen3 = td._add_task(n3)
        # ? should raise a runtime error?
        assert next(gen3) == 'reset generator'
Esempio n. 20
0
    def test_waiting_node_updated(self):
        tasks = {'t1': Task('t1', None, calc_dep=['t2'], task_dep=['t4']),
                 't2': Task('t2', None),
                 't3': Task('t3', None),
                 't4': Task('t4', None),
                 }
        td = TaskDispatcher(tasks, [], None)
        n1 = td._gen_node(None, 't1')
        n1_gen = td._add_task(n1)
        n2 = next(n1_gen)
        assert 't2' == n2.task.name
        assert 't4' == next(n1_gen).task.name
        assert 'wait' == next(n1_gen)
        assert set() == n1.calc_dep
        assert td.waiting == set()

        n2.run_status = 'done'
        n2.task.values = {'calc_dep': ['t2', 't3'], 'task_dep':['t5']}
        assert n1.calc_dep == set()
        assert n1.task_dep == []
        td._update_waiting(n2)
        assert n1.calc_dep == set(['t3'])
        assert n1.task_dep == ['t5']
Esempio n. 21
0
    def test_regex_group_already_created(self):
        # this is required to avoid loading more tasks than required, GH-#60
        def creator1():
            yield Task('foo1', None, targets=['tgt1'])
        delayed_loader1 = DelayedLoader(creator1, target_regex='tgt.*')

        def creator2():  # pragma: no cover
            yield Task('foo2', None, targets=['tgt2'])
        delayed_loader2 = DelayedLoader(creator2, target_regex='tgt.*')

        t1 = Task('t1', None, loader=delayed_loader1)
        t2 = Task('t2', None, loader=delayed_loader2)

        tc = TaskControl([t1, t2])
        selection = tc._filter_tasks(['tgt1'])
        assert ['_regex_target_tgt1:t1', '_regex_target_tgt1:t2'] == selection
        td = TaskDispatcher(tc.tasks, tc.targets, selection)

        n1 = td._gen_node(None, '_regex_target_tgt1:t1')
        gen = td._add_task(n1)

        # delayed loader executed, so generator is reset
        n1b = next(gen)
        assert n1b == "reset generator"

        # manually reset generator
        n1.reset_task(td.tasks[n1.task.name], td._add_task(n1))

        # get the delayed created task
        gen1b = n1.generator  # n1 generator was reset / replaced
        # get t1 because of its target was a file_dep of _regex_target_tgt1
        n1c = next(gen1b)
        assert n1c.task.name == 'foo1'

        # get internal created task
        n1c.run_status = 'done'
        td._update_waiting(n1c)
        n1d = next(gen1b)
        assert n1d.name == '_regex_target_tgt1:t1'

        ## go for second selected task
        n2 = td._gen_node(None, '_regex_target_tgt1:t2')
        gen2 = td._add_task(n2)
        # loader is not executed because target t1 was already found
        pytest.raises(StopIteration, next, gen2)
Esempio n. 22
0
 def test_wait_run_deps_not_ok(self):
     tasks = {'t1': Task('t1', None, task_dep=['t2']),
              't2': Task('t2', None),
              }
     td = TaskDispatcher(tasks, [], None)
     n1 = td._gen_node(None, 't1')
     n2 = td._gen_node(None, 't2')
     td._node_add_wait_run(n1, ['t2'])
     n2.run_status = 'failure'
     td.waiting.add(n1)
     td._update_waiting(n2)
     assert n1.bad_deps
     assert deque([n1]) == td.ready
     assert 0 == len(td.waiting)
Esempio n. 23
0
 def test_task_deps(self):
     tasks = {'t1': Task('t1', None, task_dep=['t2', 't3']),
              't2': Task('t2', None),
              't3': Task('t3', None),
              }
     td = TaskDispatcher(tasks, [], None)
     n1 = td._gen_node(None, 't1')
     gen = td._add_task(n1)
     n2 = next(gen)
     assert tasks['t2'] == n2.task
     n3 = next(gen)
     assert tasks['t3'] == n3.task
     assert 'wait' == next(gen)
     tasks['t2'].run_status = 'done'
     td._update_waiting(n2)
     tasks['t3'].run_status = 'done'
     td._update_waiting(n3)
     assert tasks['t1'] == next(gen)
Esempio n. 24
0
    def test_delayed_loaded(self, reporter, dep_manager):
        def create():
            return {'basename': 't1', 'actions': None}

        t1 = Task('t1', [], loader=DelayedLoader(create, executed='t2'))
        t2 = Task('t2', [])
        run = runner.MRunner(dep_manager, reporter)
        dispatcher = TaskDispatcher({'t1': t1, 't2': t2}, [], ['t1', 't2'])
        run._run_tasks_init(dispatcher)
        assert t2.name == run.get_next_job(None).name
        assert runner.JobHold.type == run.get_next_job(None).type

        # after t2 is done t1 can be dispatched
        n2 = dispatcher.nodes[t2.name]
        n2.run_status = 'done'
        j1 = run.get_next_job(n2)
        assert t1.name == j1.name
        # the job for t1 contains the whole task since sub-process dont
        # have it
        assert j1.type == runner.JobTask.type
Esempio n. 25
0
    def test_updateDependencies(self, reporter, RunnerClass, depfile_name):
        depPath = os.path.join(os.path.dirname(__file__), "data", "dependency1")
        ff = open(depPath,"a")
        ff.write("xxx")
        ff.close()
        dependencies = [depPath]

        filePath = os.path.join(os.path.dirname(__file__), "data", "target")
        ff = open(filePath,"a")
        ff.write("xxx")
        ff.close()
        targets = [filePath]

        t1 = Task("t1", [my_print], dependencies, targets)
        dep_manager = Dependency(DbmDB, depfile_name)
        my_runner = RunnerClass(dep_manager, reporter)
        my_runner.run_tasks(TaskDispatcher({'t1':t1}, [], ['t1']))
        assert runner.SUCCESS == my_runner.finish()
        d = Dependency(DbmDB, depfile_name)
        assert d._get("t1", os.path.abspath(depPath))
Esempio n. 26
0
    def test_waiting(self, reporter, dep_manager):
        t1 = Task('t1', [])
        t2 = Task('t2', [], setup=('t1', ))
        run = runner.MRunner(dep_manager, reporter)
        dispatcher = TaskDispatcher({'t1': t1, 't2': t2}, [], ['t2'])
        run._run_tasks_init(dispatcher)

        # first start task 1
        j1 = run.get_next_job(None)
        assert t1.name == j1.name

        # hold until t1 is done
        assert isinstance(run.get_next_job(None), runner.JobHold)
        assert isinstance(run.get_next_job(None), runner.JobHold)

        n1 = dispatcher.nodes[j1.name]
        n1.run_status = 'done'
        j2 = run.get_next_job(n1)
        assert t2.name == j2.name
        assert None == run.get_next_job(dispatcher.nodes[j2.name])
Esempio n. 27
0
 def test_continue_dont_execute_parent_of_failed_task(
         self, reporter, RunnerClass, dep_manager):
     t1 = Task("t1", [(_error, )])
     t2 = Task("t2", [(ok, )], task_dep=['t1'])
     t3 = Task("t3", [(ok, )])
     my_runner = RunnerClass(dep_manager, reporter, continue_=True)
     disp = TaskDispatcher({
         't1': t1,
         't2': t2,
         't3': t3
     }, [], ['t1', 't2', 't3'])
     my_runner.run_tasks(disp)
     assert runner.ERROR == my_runner.finish()
     assert ('start', t1) == reporter.log.pop(0)
     assert ('execute', t1) == reporter.log.pop(0)
     assert ('fail', t1) == reporter.log.pop(0)
     assert ('start', t2) == reporter.log.pop(0)
     assert ('fail', t2) == reporter.log.pop(0)
     assert ('start', t3) == reporter.log.pop(0)
     assert ('execute', t3) == reporter.log.pop(0)
     assert ('success', t3) == reporter.log.pop(0)
     assert 0 == len(reporter.log)
Esempio n. 28
0
    def test_getargs(self, reporter, RunnerClass, depfile_name):
        def use_args(arg1):
            six.print_(arg1)

        def make_args():
            return {'myarg': 1}

        t1 = Task("t1", [(use_args, )], getargs=dict(arg1=('t2', 'myarg')))
        t2 = Task("t2", [(make_args, )])
        my_runner = RunnerClass(Dependency, depfile_name, reporter)
        my_runner.run_tasks(
            TaskDispatcher({
                't1': t1,
                't2': t2
            }, [], ['t1', 't2']))
        assert runner.SUCCESS == my_runner.finish()
        assert ('start', t1) == reporter.log.pop(0)
        assert ('start', t2) == reporter.log.pop(0)
        assert ('execute', t2) == reporter.log.pop(0)
        assert ('success', t2) == reporter.log.pop(0)
        assert ('execute', t1) == reporter.log.pop(0)
        assert ('success', t1) == reporter.log.pop(0)
        assert 0 == len(reporter.log)
Esempio n. 29
0
    def test_waiting_node_updated(self):
        tasks = {'t1': Task('t1', None, calc_dep=['t2'], task_dep=['t4']),
                 't2': Task('t2', None),
                 't3': Task('t3', None),
                 't4': Task('t4', None),
                 }
        td = TaskDispatcher(tasks, [], None)
        n1 = td._gen_node(None, 't1')
        n1_gen = td._add_task(n1)
        n2 = next(n1_gen)
        assert 't2' == n2.task.name
        assert 't4' == next(n1_gen).task.name
        assert 'wait' == next(n1_gen)
        assert set() == n1.calc_dep
        assert td.waiting == set()

        n2.run_status = 'done'
        n2.task.values = {'calc_dep': ['t2', 't3'], 'task_dep':['t5']}
        assert n1.calc_dep == set()
        assert n1.task_dep == []
        td._update_waiting(n2)
        assert n1.calc_dep == set(['t3'])
        assert n1.task_dep == ['t5']
Esempio n. 30
0
 def test_create(self):
     tasks = {'t1': Task('t1', None)}
     td = TaskDispatcher(tasks, [], None)
     node = td._gen_node(None, 't1')
     assert isinstance(node, ExecNode)
     assert node == td.nodes['t1']
Esempio n. 31
0
 def testSystemExitRaises(self, reporter, RunnerClass, dep_manager):
     t1 = Task("t1", [_exit])
     my_runner = RunnerClass(dep_manager, reporter)
     disp = TaskDispatcher({'t1': t1}, [], ['t1'])
     pytest.raises(SystemExit, my_runner.run_tasks, disp)
     my_runner.finish()
Esempio n. 32
0
 def test_create(self):
     tasks = {'t1': Task('t1', None)}
     td = TaskDispatcher(tasks, [], None)
     node = td._gen_node(None, 't1')
     assert isinstance(node, ExecNode)
     assert node == td.nodes['t1']
Esempio n. 33
0
 def test_no_deps(self):
     tasks = {'t1': Task('t1', None),
              }
     td = TaskDispatcher(tasks, [], None)
     n1 = td._gen_node(None, 't1')
     assert [tasks['t1']] == list(td._add_task(n1))
Esempio n. 34
0
 def test_already_created(self):
     tasks = {'t1': Task('t1', None), 't2': Task('t2', None)}
     td = TaskDispatcher(tasks, [], None)
     n1 = td._gen_node(None, 't1')
     td._gen_node(n1, 't2')
     assert None == td._gen_node(None, 't1')
Esempio n. 35
0
 def test_none(self):
     tasks = {'t1': Task('t1', None, task_dep=['t2']),
              't2': Task('t2', None),
              }
     td = TaskDispatcher(tasks, [], None)
     assert None == td._get_next_node([], [])
Esempio n. 36
0
 def test_none(self):
     tasks = {'t1': Task('t1', None, task_dep=['t2']),
              't2': Task('t2', None),
              }
     td = TaskDispatcher(tasks, [], None)
     assert None == td._get_next_node([], [])
Esempio n. 37
0
 def test_cyclic(self):
     tasks = {'t1': Task('t1', None), 't2': Task('t2', None)}
     td = TaskDispatcher(tasks, [], None)
     n1 = td._gen_node(None, 't1')
     n2 = td._gen_node(n1, 't2')
     pytest.raises(InvalidDodoFile, td._gen_node, n2, 't1')
Esempio n. 38
0
 def test_no_deps(self):
     tasks = {'t1': Task('t1', None),
              }
     td = TaskDispatcher(tasks, [], None)
     n1 = td._gen_node(None, 't1')
     assert [tasks['t1']] == list(td._add_task(n1))