Bug 1280231: refactor task kinds to task classes; r=jonasfj

MozReview-Commit-ID: 1cNukxBgfey
This commit is contained in:
Dustin J. Mitchell
2016-06-27 22:57:44 +00:00
parent 7a70524719
commit 95e890d6db
18 changed files with 201 additions and 194 deletions

View File

@@ -10,6 +10,7 @@ from ..optimize import optimize_task_graph, resolve_task_references
from ..optimize import annotate_task_graph, get_subgraph
from .. import types
from .. import graph
from .util import TestTask
class TestResolveTaskReferences(unittest.TestCase):
@@ -49,32 +50,29 @@ class TestResolveTaskReferences(unittest.TestCase):
KeyError,
"task 'subject' has no dependency with label 'no-such'",
lambda: resolve_task_references('subject', {'task-reference': '<no-such>'}, {})
)
)
class FakeKind(object):
def __init__(self, optimize_task):
self.optimize_task = optimize_task
class OptimizingTask(TestTask):
# the `optimize` method on this class is overridden direclty in the tests
# below.
pass
class TestOptimize(unittest.TestCase):
kind = None
def make_kind(self, optimize_task):
self.kind = FakeKind(optimize_task)
def make_task(self, label, task_def=None, optimized=None, task_id=None):
task_def = task_def or {'sample': 'task-def'}
task = types.Task(self.kind, label=label, task=task_def)
task = OptimizingTask(label=label, task=task_def)
task.optimized = optimized
task.task_id = task_id
return task
def make_graph(self, *tasks_and_edges):
tasks = {t.label: t for t in tasks_and_edges if isinstance(t, types.Task)}
edges = {e for e in tasks_and_edges if not isinstance(e, types.Task)}
tasks = {t.label: t for t in tasks_and_edges if isinstance(t, OptimizingTask)}
edges = {e for e in tasks_and_edges if not isinstance(e, OptimizingTask)}
return types.TaskGraph(tasks, graph.Graph(set(tasks), edges))
def assert_annotations(self, graph, **annotations):
@@ -82,12 +80,12 @@ class TestOptimize(unittest.TestCase):
return 'SLUGID' if task_id and len(task_id) == 22 else task_id
got_annotations = {
t.label: (t.optimized, repl(t.task_id)) for t in graph.tasks.itervalues()
}
}
self.assertEqual(got_annotations, annotations)
def test_annotate_task_graph_no_optimize(self):
"annotating marks everything as un-optimized if the kind returns that"
self.make_kind(lambda task, deps: (False, None))
OptimizingTask.optimize = lambda self: (False, None)
graph = self.make_graph(
self.make_task('task1'),
self.make_task('task2'),
@@ -101,20 +99,21 @@ class TestOptimize(unittest.TestCase):
task1=(False, None),
task2=(False, None),
task3=(False, None)
)
)
def test_annotate_task_graph_taskid_without_optimize(self):
"raises exception if kind returns a taskid without optimizing"
self.make_kind(lambda task, deps: (False, 'some-taskid'))
OptimizingTask.optimize = lambda self: (False, 'some-taskid')
graph = self.make_graph(self.make_task('task1'))
self.assertRaises(
Exception,
lambda: annotate_task_graph(graph, set(), graph.graph.named_links_dict(), {})
)
)
def test_annotate_task_graph_optimize_away_dependency(self):
"raises exception if kind optimizes away a task on which another depends"
self.make_kind(lambda task, deps: (True, None) if task.label == 'task1' else (False, None))
OptimizingTask.optimize = \
lambda self: (True, None) if self.label == 'task1' else (False, None)
graph = self.make_graph(
self.make_task('task1'),
self.make_task('task2'),
@@ -123,11 +122,11 @@ class TestOptimize(unittest.TestCase):
self.assertRaises(
Exception,
lambda: annotate_task_graph(graph, set(), graph.graph.named_links_dict(), {})
)
)
def test_annotate_task_graph_do_not_optimize(self):
"annotating marks everything as un-optimized if in do_not_optimize"
self.make_kind(lambda task, deps: (True, 'taskid'))
OptimizingTask.optimize = lambda self: (True, 'taskid')
graph = self.make_graph(
self.make_task('task1'),
self.make_task('task2'),
@@ -140,14 +139,13 @@ class TestOptimize(unittest.TestCase):
graph,
task1=(False, None),
task2=(False, None)
)
)
self.assertEqual
def test_annotate_task_graph_nos_propagate(self):
"annotating marks a task with a non-optimized dependency as non-optimized"
self.make_kind(
lambda task, deps: (False, None) if task.label == 'task1' else (True, 'taskid')
)
OptimizingTask.optimize = \
lambda self: (False, None) if self.label == 'task1' else (True, 'taskid')
graph = self.make_graph(
self.make_task('task1'),
self.make_task('task2'),
@@ -162,7 +160,7 @@ class TestOptimize(unittest.TestCase):
task1=(False, None),
task2=(False, None), # kind would have returned (True, 'taskid') here
task3=(True, 'taskid')
)
)
def test_get_subgraph_single_dep(self):
"when a single dependency is optimized, it is omitted from the graph"
@@ -225,7 +223,7 @@ class TestOptimize(unittest.TestCase):
'task2',
optimized=False,
task_def={'payload': {'task-reference': 'http://<build>/<test>'}}
),
),
('task2', 'task1', 'build'),
('task2', 'task3', 'test'),
self.make_task('task3', optimized=False),
@@ -243,9 +241,8 @@ class TestOptimize(unittest.TestCase):
def test_optimize(self):
"optimize_task_graph annotates and extracts the subgraph from a simple graph"
self.make_kind(
lambda task, deps: (True, 'dep1') if task.label == 'task1' else (False, None)
)
OptimizingTask.optimize = \
lambda self: (True, 'dep1') if self.label == 'task1' else (False, None)
input = self.make_graph(
self.make_task('task1'),
self.make_task('task2'),