Bug 1280231: refactor task kinds to task classes; r=jonasfj
MozReview-Commit-ID: 1cNukxBgfey
This commit is contained in:
@@ -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'),
|
||||
|
||||
Reference in New Issue
Block a user