Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(523)

Side by Side Diff: packages/analyzer/test/src/task/driver_test.dart

Issue 1400473008: Roll Observatory packages and add a roll script (Closed) Base URL: git@github.com:dart-lang/observatory_pub_packages.git@master
Patch Set: Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file.
4
5 library test.src.task.driver_test;
6
7 import 'package:analyzer/src/context/cache.dart';
8 import 'package:analyzer/src/generated/engine.dart'
9 hide
10 AnalysisCache,
11 AnalysisContextImpl,
12 AnalysisTask,
13 UniversalCachePartition,
14 WorkManager;
15 import 'package:analyzer/src/generated/java_engine.dart';
16 import 'package:analyzer/src/task/driver.dart';
17 import 'package:analyzer/src/task/inputs.dart';
18 import 'package:analyzer/src/task/manager.dart';
19 import 'package:analyzer/task/model.dart';
20 import 'package:typed_mock/typed_mock.dart';
21 import 'package:unittest/unittest.dart';
22
23 import '../../generated/test_support.dart';
24 import '../../reflective_tests.dart';
25 import '../../utils.dart';
26 import 'test_support.dart';
27
28 main() {
29 initializeTestEnvironment();
30 runReflectiveTests(AnalysisDriverTest);
31 runReflectiveTests(CycleAwareDependencyWalkerTest);
32 runReflectiveTests(WorkItemTest);
33 runReflectiveTests(WorkOrderTest);
34 }
35
36 class AbstractDriverTest {
37 TaskManager taskManager = new TaskManager();
38 List<WorkManager> workManagers = <WorkManager>[];
39 InternalAnalysisContext context = new _InternalAnalysisContextMock();
40 AnalysisDriver analysisDriver;
41
42 void setUp() {
43 context = new _InternalAnalysisContextMock();
44 analysisDriver = new AnalysisDriver(taskManager, workManagers, context);
45 }
46 }
47
48 @reflectiveTest
49 class AnalysisDriverTest extends AbstractDriverTest {
50 WorkManager workManager1 = new _WorkManagerMock();
51 WorkManager workManager2 = new _WorkManagerMock();
52
53 AnalysisTarget target1 = new TestSource('/1.dart');
54 AnalysisTarget target2 = new TestSource('/2.dart');
55
56 ResultDescriptor result1 = new ResultDescriptor('result1', -1);
57 ResultDescriptor result2 = new ResultDescriptor('result2', -2);
58
59 TaskDescriptor descriptor1;
60 TaskDescriptor descriptor2;
61
62 void setUp() {
63 super.setUp();
64 when(workManager1.getNextResultPriority())
65 .thenReturn(WorkOrderPriority.NONE);
66 when(workManager2.getNextResultPriority())
67 .thenReturn(WorkOrderPriority.NONE);
68
69 workManagers.add(workManager1);
70 workManagers.add(workManager2);
71 }
72
73 test_computeResult() {
74 AnalysisTarget target = new TestSource();
75 ResultDescriptor result = new ResultDescriptor('result', null);
76 TestAnalysisTask task;
77 TaskDescriptor descriptor = new TaskDescriptor(
78 'task', (context, target) => task, (target) => {}, [result]);
79 task = new TestAnalysisTask(context, target, descriptor: descriptor);
80 taskManager.addTaskDescriptor(descriptor);
81
82 analysisDriver.computeResult(target, result);
83 expect(context.getCacheEntry(target).getValue(result), 1);
84 }
85
86 test_create() {
87 expect(analysisDriver, isNotNull);
88 expect(analysisDriver.context, context);
89 expect(analysisDriver.currentWorkOrder, isNull);
90 expect(analysisDriver.taskManager, taskManager);
91 }
92
93 test_createNextWorkOrder_highLow() {
94 _configureDescriptors12();
95 when(workManager1.getNextResultPriority())
96 .thenReturn(WorkOrderPriority.PRIORITY);
97 when(workManager2.getNextResultPriority())
98 .thenReturn(WorkOrderPriority.NORMAL);
99 when(workManager1.getNextResult())
100 .thenReturn(new TargetedResult(target1, result1));
101 WorkOrder workOrder = analysisDriver.createNextWorkOrder();
102 expect(workOrder, isNotNull);
103 expect(workOrder.moveNext(), true);
104 expect(workOrder.current.target, target1);
105 expect(workOrder.current.descriptor, descriptor1);
106 }
107
108 test_createNextWorkOrder_lowHigh() {
109 _configureDescriptors12();
110 when(workManager1.getNextResultPriority())
111 .thenReturn(WorkOrderPriority.NORMAL);
112 when(workManager2.getNextResultPriority())
113 .thenReturn(WorkOrderPriority.PRIORITY);
114 when(workManager2.getNextResult())
115 .thenReturn(new TargetedResult(target1, result1));
116 WorkOrder workOrder = analysisDriver.createNextWorkOrder();
117 expect(workOrder, isNotNull);
118 expect(workOrder.moveNext(), true);
119 expect(workOrder.current.target, target1);
120 expect(workOrder.current.descriptor, descriptor1);
121 }
122
123 test_createNextWorkOrder_none() {
124 _configureDescriptors12();
125 when(workManager1.getNextResultPriority())
126 .thenReturn(WorkOrderPriority.NONE);
127 when(workManager2.getNextResultPriority())
128 .thenReturn(WorkOrderPriority.NONE);
129 expect(analysisDriver.createNextWorkOrder(), isNull);
130 }
131
132 test_createWorkOrderForResult_error() {
133 AnalysisTarget target = new TestSource();
134 ResultDescriptor result = new ResultDescriptor('result', null);
135 CaughtException exception = new CaughtException(null, null);
136 context
137 .getCacheEntry(target)
138 .setErrorState(exception, <ResultDescriptor>[result]);
139
140 expect(analysisDriver.createWorkOrderForResult(target, result), isNull);
141 }
142
143 test_createWorkOrderForResult_inProcess() {
144 AnalysisTarget target = new TestSource();
145 ResultDescriptor result = new ResultDescriptor('result', null);
146 context.getCacheEntry(target).setState(result, CacheState.IN_PROCESS);
147
148 expect(analysisDriver.createWorkOrderForResult(target, result), isNull);
149 }
150
151 test_createWorkOrderForResult_invalid() {
152 AnalysisTarget target = new TestSource();
153 ResultDescriptor result = new ResultDescriptor('result', null);
154 TaskDescriptor descriptor = new TaskDescriptor(
155 'task',
156 (context, target) => new TestAnalysisTask(context, target),
157 (target) => {},
158 [result]);
159 taskManager.addTaskDescriptor(descriptor);
160 context.getCacheEntry(target).setState(result, CacheState.INVALID);
161
162 WorkOrder workOrder =
163 analysisDriver.createWorkOrderForResult(target, result);
164 expect(workOrder, isNotNull);
165 }
166
167 test_createWorkOrderForResult_valid() {
168 AnalysisTarget target = new TestSource();
169 ResultDescriptor result = new ResultDescriptor('result', null);
170 context
171 .getCacheEntry(target)
172 .setValue(result, '', TargetedResult.EMPTY_LIST);
173
174 expect(analysisDriver.createWorkOrderForResult(target, result), isNull);
175 }
176
177 test_createWorkOrderForTarget_complete_generalTarget_generalResult() {
178 _createWorkOrderForTarget(true, false, false);
179 }
180
181 test_createWorkOrderForTarget_complete_generalTarget_priorityResult() {
182 _createWorkOrderForTarget(true, false, true);
183 }
184
185 test_createWorkOrderForTarget_complete_priorityTarget_generalResult() {
186 _createWorkOrderForTarget(true, true, false);
187 }
188
189 test_createWorkOrderForTarget_complete_priorityTarget_priorityResult() {
190 _createWorkOrderForTarget(true, true, true);
191 }
192
193 test_createWorkOrderForTarget_incomplete_generalTarget_generalResult() {
194 _createWorkOrderForTarget(false, false, false);
195 }
196
197 test_createWorkOrderForTarget_incomplete_generalTarget_priorityResult() {
198 _createWorkOrderForTarget(false, false, true);
199 }
200
201 test_createWorkOrderForTarget_incomplete_priorityTarget_generalResult() {
202 _createWorkOrderForTarget(false, true, false);
203 }
204
205 test_createWorkOrderForTarget_incomplete_priorityTarget_priorityResult() {
206 _createWorkOrderForTarget(false, true, true);
207 }
208
209 test_performAnalysisTask() {
210 _configureDescriptors12();
211 when(workManager1.getNextResultPriority()).thenReturnList(
212 <WorkOrderPriority>[WorkOrderPriority.NORMAL, WorkOrderPriority.NONE]);
213 when(workManager1.getNextResult())
214 .thenReturn(new TargetedResult(target1, result1));
215
216 expect(analysisDriver.performAnalysisTask(), true);
217 expect(analysisDriver.performAnalysisTask(), true);
218 expect(analysisDriver.performAnalysisTask(), false);
219 }
220
221 test_performAnalysisTask_infiniteLoop_handled() {
222 AnalysisTarget target = new TestSource();
223 ResultDescriptor resultA = new ResultDescriptor('resultA', -1);
224 ResultDescriptor resultB = new ResultDescriptor('resultB', -2);
225 // configure tasks
226 TestAnalysisTask task1;
227 TestAnalysisTask task2;
228 TaskDescriptor descriptor1 = new TaskDescriptor(
229 'task1',
230 (context, target) => task1,
231 (target) => {'inputB': new SimpleTaskInput<int>(target, resultB)},
232 [resultA]);
233 TaskDescriptor descriptor2 = new TaskDescriptor(
234 'task2',
235 (context, target) => task2,
236 (target) => {'inputA': new SimpleTaskInput<int>(target, resultA)},
237 [resultB]);
238 task1 = new TestAnalysisTask(context, target,
239 descriptor: descriptor1,
240 results: [resultA],
241 value: 10,
242 handlesDependencyCycles: true);
243 task2 = new TestAnalysisTask(context, target,
244 descriptor: descriptor2,
245 results: [resultB],
246 value: 20,
247 handlesDependencyCycles: true);
248 taskManager.addTaskDescriptor(descriptor1);
249 taskManager.addTaskDescriptor(descriptor2);
250 // configure WorkManager
251 when(workManager1.getNextResultPriority()).thenReturnList(
252 <WorkOrderPriority>[WorkOrderPriority.NORMAL, WorkOrderPriority.NONE]);
253 when(workManager1.getNextResult())
254 .thenReturn(new TargetedResult(target, resultB));
255 // prepare work order
256 while (analysisDriver.performAnalysisTask()) {}
257 Set<TaskDescriptor> expectedCycle = [descriptor1, descriptor2].toSet();
258 expect(task1.dependencyCycle, isNotNull);
259 expect(task1.dependencyCycle.map((workItem) => workItem.descriptor).toSet(),
260 expectedCycle);
261 expect(task2.dependencyCycle, isNotNull);
262 expect(task2.dependencyCycle.map((workItem) => workItem.descriptor).toSet(),
263 expectedCycle);
264 CaughtException exception = context.getCacheEntry(target).exception;
265 expect(exception, isNull);
266 expect(context.getCacheEntry(target).getValue(resultA), 10);
267 expect(context.getCacheEntry(target).getValue(resultB), 20);
268 }
269
270 test_performAnalysisTask_infiniteLoop_unhandled() {
271 AnalysisTarget target = new TestSource();
272 ResultDescriptor resultA = new ResultDescriptor('resultA', -1);
273 ResultDescriptor resultB = new ResultDescriptor('resultB', -2);
274 // configure tasks
275 TestAnalysisTask task1;
276 TestAnalysisTask task2;
277 TaskDescriptor descriptor1 = new TaskDescriptor(
278 'task1',
279 (context, target) => task1,
280 (target) => {'inputB': new SimpleTaskInput<int>(target, resultB)},
281 [resultA]);
282 TaskDescriptor descriptor2 = new TaskDescriptor(
283 'task2',
284 (context, target) => task2,
285 (target) => {'inputA': new SimpleTaskInput<int>(target, resultA)},
286 [resultB]);
287 task1 = new TestAnalysisTask(context, target, descriptor: descriptor1);
288 task2 = new TestAnalysisTask(context, target, descriptor: descriptor2);
289 taskManager.addTaskDescriptor(descriptor1);
290 taskManager.addTaskDescriptor(descriptor2);
291 // configure WorkManager
292 when(workManager1.getNextResultPriority()).thenReturnList(
293 <WorkOrderPriority>[WorkOrderPriority.NORMAL, WorkOrderPriority.NONE]);
294 when(workManager1.getNextResult())
295 .thenReturn(new TargetedResult(target, resultB));
296 // prepare work order
297 expect(analysisDriver.performAnalysisTask(), true);
298 expect(analysisDriver.performAnalysisTask(), true);
299 CaughtException exception = context.getCacheEntry(target).exception;
300 expect(exception, isNotNull);
301 expect(exception.exception, new isInstanceOf<InfiniteTaskLoopException>());
302 }
303
304 test_performAnalysisTask_inputsFirst() {
305 AnalysisTarget target = new TestSource();
306 ResultDescriptor resultA = new ResultDescriptor('resultA', -1);
307 ResultDescriptor resultB = new ResultDescriptor('resultB', -2);
308 // configure tasks
309 TestAnalysisTask task1;
310 TestAnalysisTask task2;
311 TaskDescriptor descriptor1 = new TaskDescriptor(
312 'task1', (context, target) => task1, (target) => {}, [resultA]);
313 TaskDescriptor descriptor2 = new TaskDescriptor(
314 'task2',
315 (context, target) => task2,
316 (target) => {'inputA': new SimpleTaskInput<int>(target, resultA)},
317 [resultB]);
318 task1 = new TestAnalysisTask(context, target,
319 descriptor: descriptor1, results: [resultA], value: 10);
320 task2 = new TestAnalysisTask(context, target,
321 descriptor: descriptor2, value: 20);
322 taskManager.addTaskDescriptor(descriptor1);
323 taskManager.addTaskDescriptor(descriptor2);
324 // configure WorkManager
325 when(workManager1.getNextResultPriority()).thenReturnList(
326 <WorkOrderPriority>[WorkOrderPriority.NORMAL, WorkOrderPriority.NONE]);
327 when(workManager1.getNextResult())
328 .thenReturn(new TargetedResult(target, resultB));
329 // prepare work order
330 expect(analysisDriver.performAnalysisTask(), true);
331 expect(context.getCacheEntry(target).getValue(resultA), -1);
332 expect(context.getCacheEntry(target).getValue(resultB), -2);
333 // compute resultA
334 expect(analysisDriver.performAnalysisTask(), true);
335 expect(context.getCacheEntry(target).getValue(resultA), 10);
336 expect(context.getCacheEntry(target).getValue(resultB), -2);
337 // compute resultB
338 expect(analysisDriver.performAnalysisTask(), true);
339 expect(context.getCacheEntry(target).getValue(resultA), 10);
340 expect(context.getCacheEntry(target).getValue(resultB), 20);
341 // done
342 expect(analysisDriver.performAnalysisTask(), false);
343 }
344
345 test_performAnalysisTask_onResultComputed() {
346 AnalysisTarget target = new TestSource();
347 ResultDescriptor result = new ResultDescriptor('result', null);
348 TestAnalysisTask task;
349 TaskDescriptor descriptor = new TaskDescriptor(
350 'task', (context, target) => task, (target) => {}, [result]);
351 task = new TestAnalysisTask(context, target,
352 descriptor: descriptor, value: 42);
353 WorkItem item = new WorkItem(context, target, descriptor, null);
354
355 bool streamNotified = false;
356 analysisDriver.onResultComputed(result).listen((event) {
357 streamNotified = true;
358 expect(event.context, same(context));
359 expect(event.target, same(target));
360 expect(event.descriptor, same(result));
361 expect(event.value, 42);
362 });
363 analysisDriver.performWorkItem(item);
364 expect(streamNotified, isTrue);
365 }
366
367 test_performWorkItem_exceptionInTask() {
368 AnalysisTarget target = new TestSource();
369 ResultDescriptor result = new ResultDescriptor('result', null);
370 CaughtException exception =
371 new CaughtException(new AnalysisException(), null);
372 TestAnalysisTask task;
373 TaskDescriptor descriptor = new TaskDescriptor(
374 'task', (context, target) => task, (target) => {}, [result]);
375 task = new TestAnalysisTask(context, target,
376 descriptor: descriptor, exception: exception);
377 WorkItem item = new WorkItem(context, target, descriptor, null);
378
379 analysisDriver.performWorkItem(item);
380 CacheEntry targetEntry = context.getCacheEntry(item.target);
381 expect(targetEntry.exception, exception);
382 expect(targetEntry.getState(result), CacheState.ERROR);
383 }
384
385 test_performWorkItem_noException() {
386 AnalysisTarget target = new TestSource();
387 ResultDescriptor result = new ResultDescriptor('result', null);
388 TestAnalysisTask task;
389 TaskDescriptor descriptor = new TaskDescriptor(
390 'task', (context, target) => task, (target) => {}, [result]);
391 task = new TestAnalysisTask(context, target, descriptor: descriptor);
392 WorkItem item = new WorkItem(context, target, descriptor, null);
393
394 analysisDriver.performWorkItem(item);
395 CacheEntry targetEntry = context.getCacheEntry(item.target);
396 expect(targetEntry.exception, isNull);
397 expect(targetEntry.getState(result), CacheState.VALID);
398 }
399
400 test_performWorkItem_preExistingException() {
401 AnalysisTarget target = new TestSource();
402 ResultDescriptor result = new ResultDescriptor('result', null);
403 TaskDescriptor descriptor = new TaskDescriptor(
404 'task',
405 (context, target) => new TestAnalysisTask(context, target),
406 (target) => {},
407 [result]);
408 CaughtException exception =
409 new CaughtException(new AnalysisException(), null);
410 WorkItem item = new WorkItem(context, target, descriptor, null);
411 item.exception = exception;
412
413 analysisDriver.performWorkItem(item);
414 CacheEntry targetEntry = context.getCacheEntry(item.target);
415 expect(targetEntry.exception, exception);
416 expect(targetEntry.getState(result), CacheState.ERROR);
417 }
418
419 test_reset() {
420 ResultDescriptor inputResult = new ResultDescriptor('input', null);
421 TaskDescriptor descriptor = new TaskDescriptor(
422 'task',
423 (context, target) => new TestAnalysisTask(context, target),
424 (target) => {'one': inputResult.of(target)},
425 [new ResultDescriptor('output', null)]);
426 analysisDriver.currentWorkOrder =
427 new WorkOrder(taskManager, new WorkItem(null, null, descriptor, null));
428
429 analysisDriver.reset();
430 expect(analysisDriver.currentWorkOrder, isNull);
431 }
432
433 void _configureDescriptors12() {
434 descriptor1 = new TaskDescriptor(
435 'task1',
436 (context, target) =>
437 new TestAnalysisTask(context, target, descriptor: descriptor1),
438 (target) => {},
439 [result1]);
440 taskManager.addTaskDescriptor(descriptor1);
441
442 descriptor2 = new TaskDescriptor(
443 'task2',
444 (context, target) =>
445 new TestAnalysisTask(context, target, descriptor: descriptor1),
446 (target) => {},
447 [result2]);
448 taskManager.addTaskDescriptor(descriptor2);
449 }
450
451 /**
452 * [complete] is `true` if the value of the result has already been computed.
453 * [priorityTarget] is `true` if the target is in the list of priority
454 * targets.
455 * [priorityResult] is `true` if the result should only be computed for
456 * priority targets.
457 */
458 _createWorkOrderForTarget(
459 bool complete, bool priorityTarget, bool priorityResult) {
460 AnalysisTarget target = new TestSource();
461 ResultDescriptor result = new ResultDescriptor('result', null);
462 TaskDescriptor descriptor = new TaskDescriptor(
463 'task',
464 (context, target) => new TestAnalysisTask(context, target),
465 (target) => {},
466 [result]);
467 if (priorityResult) {
468 taskManager.addPriorityResult(result);
469 } else {
470 taskManager.addGeneralResult(result);
471 }
472 taskManager.addTaskDescriptor(descriptor);
473 if (priorityTarget) {
474 context.priorityTargets.add(target);
475 } else {
476 context.explicitTargets.add(target);
477 }
478 if (complete) {
479 context
480 .getCacheEntry(target)
481 .setValue(result, '', TargetedResult.EMPTY_LIST);
482 } else {
483 context.getCacheEntry(target).setState(result, CacheState.INVALID);
484 }
485
486 WorkOrder workOrder =
487 analysisDriver.createWorkOrderForTarget(target, priorityTarget);
488 if (complete) {
489 expect(workOrder, isNull);
490 } else if (priorityResult) {
491 expect(workOrder, priorityTarget ? isNotNull : isNull);
492 } else {
493 expect(workOrder, isNotNull);
494 }
495 }
496 }
497
498 @reflectiveTest
499 class CycleAwareDependencyWalkerTest {
500 void checkGraph(Map<int, List<int>> graph, int startingNode,
501 List<StronglyConnectedComponent<int>> expectedResults) {
502 List<Set<int>> expectedResultsDisregardingOrder =
503 expectedResults.map((component) => component.nodes.toSet()).toList();
504 List<bool> expectedCycleIndicators =
505 expectedResults.map((component) => component.containsCycle).toList();
506 List<Set<int>> results = <Set<int>>[];
507 List<bool> cycleIndicators = <bool>[];
508 _TestCycleAwareDependencyWalker walker =
509 new _TestCycleAwareDependencyWalker(graph, startingNode);
510 while (true) {
511 StronglyConnectedComponent<int> nextStronglyConnectedComponent =
512 walker.getNextStronglyConnectedComponent();
513 if (nextStronglyConnectedComponent == null) {
514 break;
515 }
516 results.add(nextStronglyConnectedComponent.nodes.toSet());
517 cycleIndicators.add(nextStronglyConnectedComponent.containsCycle);
518 walker.evaluatedNodes.addAll(nextStronglyConnectedComponent.nodes);
519 }
520 expect(results, expectedResultsDisregardingOrder);
521 expect(cycleIndicators, expectedCycleIndicators);
522 }
523
524 StronglyConnectedComponent<int> cycle(List<int> nodes) =>
525 new StronglyConnectedComponent(nodes, true);
526
527 StronglyConnectedComponent<int> singleton(int node) =>
528 new StronglyConnectedComponent(<int>[node], false);
529
530 void test_complex_graph() {
531 checkGraph(
532 {
533 1: [2, 3],
534 2: [3, 4],
535 3: [],
536 4: [3, 5],
537 5: [2, 6],
538 6: [3, 4]
539 },
540 1,
541 [
542 singleton(3),
543 cycle([2, 4, 5, 6]),
544 singleton(1)
545 ]);
546 }
547
548 void test_cycle_depends_on_other_nodes() {
549 checkGraph(
550 {
551 1: [2, 3],
552 2: [4, 1],
553 3: [],
554 4: []
555 },
556 1,
557 [
558 singleton(4),
559 singleton(3),
560 cycle([1, 2])
561 ]);
562 }
563
564 void test_initial_node_depends_on_cycle() {
565 checkGraph(
566 {
567 1: [2],
568 2: [3],
569 3: [2]
570 },
571 1,
572 [
573 cycle([2, 3]),
574 singleton(1)
575 ]);
576 }
577
578 void test_simple_cycle() {
579 checkGraph(
580 {
581 1: [2],
582 2: [1]
583 },
584 1,
585 [
586 cycle([1, 2])
587 ]);
588 }
589
590 void test_simple_dependency_chain() {
591 checkGraph(
592 {
593 1: [2],
594 2: []
595 },
596 1,
597 [singleton(2), singleton(1)]);
598 }
599
600 void test_single_node() {
601 checkGraph({1: []}, 1, [singleton(1)]);
602 }
603
604 void test_single_node_cycle() {
605 checkGraph(
606 {
607 1: [1]
608 },
609 1,
610 [
611 cycle([1])
612 ]);
613 }
614 }
615
616 @reflectiveTest
617 class WorkItemTest extends AbstractDriverTest {
618 test_buildTask_complete() {
619 AnalysisTarget target = new TestSource();
620 TaskDescriptor descriptor = new TaskDescriptor(
621 'task',
622 (context, target) => new TestAnalysisTask(context, target),
623 (target) => {},
624 [new ResultDescriptor('output', null)]);
625 WorkItem item = new WorkItem(context, target, descriptor, null);
626 AnalysisTask task = item.buildTask();
627 expect(task, isNotNull);
628 }
629
630 test_buildTask_incomplete() {
631 AnalysisTarget target = new TestSource();
632 ResultDescriptor inputResult = new ResultDescriptor('input', null);
633 List<ResultDescriptor> outputResults = <ResultDescriptor>[
634 new ResultDescriptor('output', null)
635 ];
636 TaskDescriptor descriptor = new TaskDescriptor(
637 'task',
638 (context, target) =>
639 new TestAnalysisTask(context, target, results: outputResults),
640 (target) => {'one': inputResult.of(target)},
641 outputResults);
642 WorkItem item = new WorkItem(context, target, descriptor, null);
643 expect(() => item.buildTask(), throwsStateError);
644 }
645
646 test_create() {
647 AnalysisTarget target = new TestSource();
648 TaskDescriptor descriptor = new TaskDescriptor(
649 'task', null, (target) => {}, [new ResultDescriptor('result', null)]);
650 WorkItem item = new WorkItem(context, target, descriptor, null);
651 expect(item, isNotNull);
652 expect(item.context, context);
653 expect(item.descriptor, descriptor);
654 expect(item.target, target);
655 }
656
657 test_gatherInputs_complete() {
658 AnalysisTarget target = new TestSource();
659 TaskDescriptor descriptor = new TaskDescriptor(
660 'task',
661 (context, target) => new TestAnalysisTask(context, target),
662 (target) => {},
663 [new ResultDescriptor('output', null)]);
664 WorkItem item = new WorkItem(context, target, descriptor, null);
665 WorkItem result = item.gatherInputs(taskManager, []);
666 expect(result, isNull);
667 expect(item.exception, isNull);
668 }
669
670 test_gatherInputs_incomplete() {
671 AnalysisTarget target = new TestSource();
672 ResultDescriptor resultA = new ResultDescriptor('resultA', null);
673 ResultDescriptor resultB = new ResultDescriptor('resultB', null);
674 // prepare tasks
675 TaskDescriptor task1 = new TaskDescriptor(
676 'task',
677 (context, target) =>
678 new TestAnalysisTask(context, target, results: [resultA]),
679 (target) => {},
680 [resultA]);
681 TaskDescriptor task2 = new TaskDescriptor(
682 'task',
683 (context, target) => new TestAnalysisTask(context, target),
684 (target) => {'one': resultA.of(target)},
685 [resultB]);
686 taskManager.addTaskDescriptor(task1);
687 taskManager.addTaskDescriptor(task2);
688 // gather inputs
689 WorkItem item = new WorkItem(context, target, task2, null);
690 WorkItem inputItem = item.gatherInputs(taskManager, []);
691 expect(inputItem, isNotNull);
692 }
693
694 test_gatherInputs_invalid() {
695 AnalysisTarget target = new TestSource();
696 ResultDescriptor inputResult = new ResultDescriptor('input', null);
697 TaskDescriptor descriptor = new TaskDescriptor(
698 'task',
699 (context, target) => new TestAnalysisTask(context, target),
700 (target) => {'one': inputResult.of(target)},
701 [new ResultDescriptor('output', null)]);
702 WorkItem item = new WorkItem(context, target, descriptor, null);
703 WorkItem result = item.gatherInputs(taskManager, []);
704 expect(result, isNull);
705 expect(item.exception, isNotNull);
706 }
707 }
708
709 @reflectiveTest
710 class WorkOrderTest extends EngineTestCase {
711 test_create() {
712 TaskManager manager = new TaskManager();
713 TaskDescriptor descriptor = new TaskDescriptor(
714 'task', null, (_) => {}, [new ResultDescriptor('result', null)]);
715 WorkOrder order =
716 new WorkOrder(manager, new WorkItem(null, null, descriptor, null));
717 expect(order, isNotNull);
718 expect(order.currentItems, isNull);
719 expect(order.current, isNull);
720 }
721
722 test_moveNext() {
723 TaskManager manager = new TaskManager();
724 TaskDescriptor descriptor = new TaskDescriptor(
725 'task', null, (_) => {}, [new ResultDescriptor('result', null)]);
726 WorkItem workItem = new WorkItem(null, null, descriptor, null);
727 WorkOrder order = new WorkOrder(manager, workItem);
728 // "item" has no child items
729 expect(order.moveNext(), isTrue);
730 expect(order.current, workItem);
731 // done
732 expect(order.moveNext(), isFalse);
733 expect(order.current, isNull);
734 }
735 }
736
737 /**
738 * A dummy [InternalAnalysisContext] that does not use [AnalysisDriver] itself,
739 * but provides enough implementation for it to function.
740 */
741 class _InternalAnalysisContextMock extends TypedMock
742 implements InternalAnalysisContext {
743 AnalysisCache analysisCache;
744
745 @override
746 List<AnalysisTarget> explicitTargets = <AnalysisTarget>[];
747
748 @override
749 List<AnalysisTarget> priorityTargets = <AnalysisTarget>[];
750
751 _InternalAnalysisContextMock() {
752 analysisCache = new AnalysisCache([new UniversalCachePartition(this)]);
753 }
754
755 @override
756 CacheEntry getCacheEntry(AnalysisTarget target) {
757 CacheEntry entry = analysisCache.get(target);
758 if (entry == null) {
759 entry = new CacheEntry(target);
760 analysisCache.put(entry);
761 }
762 return entry;
763 }
764
765 noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
766 }
767
768 /**
769 * Concrete class for testing [CycleAwareDependencyWalker] behavior.
770 */
771 class _TestCycleAwareDependencyWalker extends CycleAwareDependencyWalker<int> {
772 final Map<int, List<int>> graph;
773
774 Set<int> evaluatedNodes = new Set<int>();
775
776 _TestCycleAwareDependencyWalker(this.graph, int startingNode)
777 : super(startingNode);
778
779 @override
780 int getNextInput(int node, List<int> skipInputs) {
781 for (int dependency in graph[node]) {
782 if (!skipInputs.contains(dependency) &&
783 !evaluatedNodes.contains(dependency)) {
784 return dependency;
785 }
786 }
787 return null;
788 }
789 }
790
791 class _WorkManagerMock extends TypedMock implements WorkManager {
792 noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
793 }
OLDNEW
« no previous file with comments | « packages/analyzer/test/src/task/dart_work_manager_test.dart ('k') | packages/analyzer/test/src/task/general_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698