1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
from __future__ import absolute_import, print_function, unicode_literals
import unittest
from ..generator import TaskGraphGenerator, Kind
from .. import graph
from ..task import base
from mozunit import main
class FakeTask(base.Task):
def __init__(self, **kwargs):
self.i = kwargs.pop('i')
super(FakeTask, self).__init__(**kwargs)
@classmethod
def load_tasks(cls, kind, path, config, parameters, loaded_tasks):
return [cls(kind=kind,
label='{}-t-{}'.format(kind, i),
attributes={'tasknum': str(i)},
task={},
i=i)
for i in range(3)]
def get_dependencies(self, full_task_set):
i = self.i
if i > 0:
return [('{}-t-{}'.format(self.kind, i - 1), 'prev')]
else:
return []
def optimize(self, params):
return False, None
class FakeKind(Kind):
def _get_impl_class(self):
return FakeTask
def load_tasks(self, parameters, loaded_tasks):
FakeKind.loaded_kinds.append(self.name)
return super(FakeKind, self).load_tasks(parameters, loaded_tasks)
class WithFakeKind(TaskGraphGenerator):
def _load_kinds(self):
for kind_name, deps in self.parameters['kinds']:
yield FakeKind(
kind_name, '/fake',
{'kind-dependencies': deps} if deps else {})
class TestGenerator(unittest.TestCase):
def maketgg(self, target_tasks=None, kinds=[('fake', [])]):
FakeKind.loaded_kinds = []
self.target_tasks = target_tasks or []
def target_tasks_method(full_task_graph, parameters):
return self.target_tasks
return WithFakeKind('/root', {'kinds': kinds}, target_tasks_method)
def test_kind_ordering(self):
"When task kinds depend on each other, they are loaded in postorder"
self.tgg = self.maketgg(kinds=[
('fake3', ['fake2', 'fake1']),
('fake2', ['fake1']),
('fake1', []),
])
self.tgg._run_until('full_task_set')
self.assertEqual(FakeKind.loaded_kinds, ['fake1', 'fake2', 'fake3'])
def test_full_task_set(self):
"The full_task_set property has all tasks"
self.tgg = self.maketgg()
self.assertEqual(self.tgg.full_task_set.graph,
graph.Graph({'fake-t-0', 'fake-t-1', 'fake-t-2'}, set()))
self.assertEqual(sorted(self.tgg.full_task_set.tasks.keys()),
sorted(['fake-t-0', 'fake-t-1', 'fake-t-2']))
def test_full_task_graph(self):
"The full_task_graph property has all tasks, and links"
self.tgg = self.maketgg()
self.assertEqual(self.tgg.full_task_graph.graph,
graph.Graph({'fake-t-0', 'fake-t-1', 'fake-t-2'},
{
('fake-t-1', 'fake-t-0', 'prev'),
('fake-t-2', 'fake-t-1', 'prev'),
}))
self.assertEqual(sorted(self.tgg.full_task_graph.tasks.keys()),
sorted(['fake-t-0', 'fake-t-1', 'fake-t-2']))
def test_target_task_set(self):
"The target_task_set property has the targeted tasks"
self.tgg = self.maketgg(['fake-t-1'])
self.assertEqual(self.tgg.target_task_set.graph,
graph.Graph({'fake-t-1'}, set()))
self.assertEqual(self.tgg.target_task_set.tasks.keys(),
['fake-t-1'])
def test_target_task_graph(self):
"The target_task_graph property has the targeted tasks and deps"
self.tgg = self.maketgg(['fake-t-1'])
self.assertEqual(self.tgg.target_task_graph.graph,
graph.Graph({'fake-t-0', 'fake-t-1'},
{('fake-t-1', 'fake-t-0', 'prev')}))
self.assertEqual(sorted(self.tgg.target_task_graph.tasks.keys()),
sorted(['fake-t-0', 'fake-t-1']))
def test_optimized_task_graph(self):
"The optimized task graph contains task ids"
self.tgg = self.maketgg(['fake-t-2'])
tid = self.tgg.label_to_taskid
self.assertEqual(
self.tgg.optimized_task_graph.graph,
graph.Graph({tid['fake-t-0'], tid['fake-t-1'], tid['fake-t-2']}, {
(tid['fake-t-1'], tid['fake-t-0'], 'prev'),
(tid['fake-t-2'], tid['fake-t-1'], 'prev'),
}))
if __name__ == '__main__':
main()
|