| OLD | NEW |
| 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 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 | 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. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 library test.src.task.driver_test; | 5 library analyzer.test.src.task.driver_test; |
| 6 | 6 |
| 7 import 'package:analyzer/exception/exception.dart'; |
| 7 import 'package:analyzer/src/context/cache.dart'; | 8 import 'package:analyzer/src/context/cache.dart'; |
| 8 import 'package:analyzer/src/generated/engine.dart' | 9 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'; | 10 import 'package:analyzer/src/task/driver.dart'; |
| 17 import 'package:analyzer/src/task/inputs.dart'; | 11 import 'package:analyzer/src/task/inputs.dart'; |
| 18 import 'package:analyzer/src/task/manager.dart'; | 12 import 'package:analyzer/src/task/manager.dart'; |
| 19 import 'package:analyzer/task/model.dart'; | 13 import 'package:analyzer/task/model.dart'; |
| 14 import 'package:test_reflective_loader/test_reflective_loader.dart'; |
| 20 import 'package:typed_mock/typed_mock.dart'; | 15 import 'package:typed_mock/typed_mock.dart'; |
| 21 import 'package:unittest/unittest.dart'; | 16 import 'package:unittest/unittest.dart'; |
| 22 | 17 |
| 23 import '../../generated/test_support.dart'; | 18 import '../../generated/test_support.dart'; |
| 24 import '../../reflective_tests.dart'; | |
| 25 import '../../utils.dart'; | 19 import '../../utils.dart'; |
| 26 import 'test_support.dart'; | 20 import 'test_support.dart'; |
| 27 | 21 |
| 28 main() { | 22 main() { |
| 29 initializeTestEnvironment(); | 23 initializeTestEnvironment(); |
| 30 runReflectiveTests(AnalysisDriverTest); | 24 defineReflectiveTests(AnalysisDriverTest); |
| 31 runReflectiveTests(CycleAwareDependencyWalkerTest); | 25 defineReflectiveTests(CycleAwareDependencyWalkerTest); |
| 32 runReflectiveTests(WorkItemTest); | 26 defineReflectiveTests(WorkItemTest); |
| 33 runReflectiveTests(WorkOrderTest); | 27 defineReflectiveTests(WorkOrderTest); |
| 34 } | 28 } |
| 35 | 29 |
| 36 class AbstractDriverTest { | 30 class AbstractDriverTest { |
| 37 TaskManager taskManager = new TaskManager(); | 31 TaskManager taskManager = new TaskManager(); |
| 38 List<WorkManager> workManagers = <WorkManager>[]; | 32 List<WorkManager> workManagers = <WorkManager>[]; |
| 39 InternalAnalysisContext context = new _InternalAnalysisContextMock(); | 33 InternalAnalysisContext context = new _InternalAnalysisContextMock(); |
| 40 AnalysisDriver analysisDriver; | 34 AnalysisDriver analysisDriver; |
| 41 | 35 |
| 42 void setUp() { | 36 void setUp() { |
| 43 context = new _InternalAnalysisContextMock(); | 37 context = new _InternalAnalysisContextMock(); |
| 44 analysisDriver = new AnalysisDriver(taskManager, workManagers, context); | 38 analysisDriver = new AnalysisDriver(taskManager, workManagers, context); |
| 39 when(context.aboutToComputeResult(anyObject, anyObject)).thenReturn(false); |
| 45 } | 40 } |
| 46 } | 41 } |
| 47 | 42 |
| 48 @reflectiveTest | 43 @reflectiveTest |
| 49 class AnalysisDriverTest extends AbstractDriverTest { | 44 class AnalysisDriverTest extends AbstractDriverTest { |
| 50 WorkManager workManager1 = new _WorkManagerMock(); | 45 WorkManager workManager1 = new _WorkManagerMock(); |
| 51 WorkManager workManager2 = new _WorkManagerMock(); | 46 WorkManager workManager2 = new _WorkManagerMock(); |
| 52 | 47 |
| 53 AnalysisTarget target1 = new TestSource('/1.dart'); | 48 AnalysisTarget target1 = new TestSource('/1.dart'); |
| 54 AnalysisTarget target2 = new TestSource('/2.dart'); | 49 AnalysisTarget target2 = new TestSource('/2.dart'); |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 122 | 117 |
| 123 test_createNextWorkOrder_none() { | 118 test_createNextWorkOrder_none() { |
| 124 _configureDescriptors12(); | 119 _configureDescriptors12(); |
| 125 when(workManager1.getNextResultPriority()) | 120 when(workManager1.getNextResultPriority()) |
| 126 .thenReturn(WorkOrderPriority.NONE); | 121 .thenReturn(WorkOrderPriority.NONE); |
| 127 when(workManager2.getNextResultPriority()) | 122 when(workManager2.getNextResultPriority()) |
| 128 .thenReturn(WorkOrderPriority.NONE); | 123 .thenReturn(WorkOrderPriority.NONE); |
| 129 expect(analysisDriver.createNextWorkOrder(), isNull); | 124 expect(analysisDriver.createNextWorkOrder(), isNull); |
| 130 } | 125 } |
| 131 | 126 |
| 127 test_createWorkOrderForResult_aboutToComputeResult() { |
| 128 AnalysisTarget target = new TestSource(); |
| 129 ResultDescriptor result = new ResultDescriptor('result', null); |
| 130 TaskDescriptor descriptor = new TaskDescriptor( |
| 131 'task', |
| 132 (context, target) => new TestAnalysisTask(context, target), |
| 133 (target) => {}, |
| 134 [result]); |
| 135 taskManager.addTaskDescriptor(descriptor); |
| 136 context.getCacheEntry(target).setState(result, CacheState.INVALID); |
| 137 // has result |
| 138 { |
| 139 when(context.aboutToComputeResult(anyObject, result)).thenReturn(true); |
| 140 WorkOrder workOrder = |
| 141 analysisDriver.createWorkOrderForResult(target, result); |
| 142 expect(workOrder, isNull); |
| 143 } |
| 144 // no result |
| 145 { |
| 146 when(context.aboutToComputeResult(anyObject, result)).thenReturn(false); |
| 147 WorkOrder workOrder = |
| 148 analysisDriver.createWorkOrderForResult(target, result); |
| 149 expect(workOrder, isNotNull); |
| 150 } |
| 151 } |
| 152 |
| 132 test_createWorkOrderForResult_error() { | 153 test_createWorkOrderForResult_error() { |
| 133 AnalysisTarget target = new TestSource(); | 154 AnalysisTarget target = new TestSource(); |
| 134 ResultDescriptor result = new ResultDescriptor('result', null); | 155 ResultDescriptor result = new ResultDescriptor('result', null); |
| 135 CaughtException exception = new CaughtException(null, null); | 156 CaughtException exception = new CaughtException(null, null); |
| 136 context | 157 context |
| 137 .getCacheEntry(target) | 158 .getCacheEntry(target) |
| 138 .setErrorState(exception, <ResultDescriptor>[result]); | 159 .setErrorState(exception, <ResultDescriptor>[result]); |
| 139 | 160 |
| 140 expect(analysisDriver.createWorkOrderForResult(target, result), isNull); | 161 expect(analysisDriver.createWorkOrderForResult(target, result), isNull); |
| 141 } | 162 } |
| (...skipping 17 matching lines...) Expand all Loading... |
| 159 taskManager.addTaskDescriptor(descriptor); | 180 taskManager.addTaskDescriptor(descriptor); |
| 160 context.getCacheEntry(target).setState(result, CacheState.INVALID); | 181 context.getCacheEntry(target).setState(result, CacheState.INVALID); |
| 161 | 182 |
| 162 WorkOrder workOrder = | 183 WorkOrder workOrder = |
| 163 analysisDriver.createWorkOrderForResult(target, result); | 184 analysisDriver.createWorkOrderForResult(target, result); |
| 164 expect(workOrder, isNotNull); | 185 expect(workOrder, isNotNull); |
| 165 } | 186 } |
| 166 | 187 |
| 167 test_createWorkOrderForResult_valid() { | 188 test_createWorkOrderForResult_valid() { |
| 168 AnalysisTarget target = new TestSource(); | 189 AnalysisTarget target = new TestSource(); |
| 169 ResultDescriptor result = new ResultDescriptor('result', null); | 190 ResultDescriptor<String> result = |
| 191 new ResultDescriptor<String>('result', null); |
| 170 context | 192 context |
| 171 .getCacheEntry(target) | 193 .getCacheEntry(target) |
| 172 .setValue(result, '', TargetedResult.EMPTY_LIST); | 194 .setValue(result, '', TargetedResult.EMPTY_LIST); |
| 173 | 195 |
| 174 expect(analysisDriver.createWorkOrderForResult(target, result), isNull); | 196 expect(analysisDriver.createWorkOrderForResult(target, result), isNull); |
| 175 } | 197 } |
| 176 | 198 |
| 177 test_createWorkOrderForTarget_complete_generalTarget_generalResult() { | 199 test_createWorkOrderForTarget_complete_generalTarget_generalResult() { |
| 178 _createWorkOrderForTarget(true, false, false); | 200 _createWorkOrderForTarget(true, false, false); |
| 179 } | 201 } |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 213 when(workManager1.getNextResult()) | 235 when(workManager1.getNextResult()) |
| 214 .thenReturn(new TargetedResult(target1, result1)); | 236 .thenReturn(new TargetedResult(target1, result1)); |
| 215 | 237 |
| 216 expect(analysisDriver.performAnalysisTask(), true); | 238 expect(analysisDriver.performAnalysisTask(), true); |
| 217 expect(analysisDriver.performAnalysisTask(), true); | 239 expect(analysisDriver.performAnalysisTask(), true); |
| 218 expect(analysisDriver.performAnalysisTask(), false); | 240 expect(analysisDriver.performAnalysisTask(), false); |
| 219 } | 241 } |
| 220 | 242 |
| 221 test_performAnalysisTask_infiniteLoop_handled() { | 243 test_performAnalysisTask_infiniteLoop_handled() { |
| 222 AnalysisTarget target = new TestSource(); | 244 AnalysisTarget target = new TestSource(); |
| 223 ResultDescriptor resultA = new ResultDescriptor('resultA', -1); | 245 ResultDescriptor<int> resultA = new ResultDescriptor<int>('resultA', -1); |
| 224 ResultDescriptor resultB = new ResultDescriptor('resultB', -2); | 246 ResultDescriptor<int> resultB = new ResultDescriptor<int>('resultB', -2); |
| 225 // configure tasks | 247 // configure tasks |
| 226 TestAnalysisTask task1; | 248 TestAnalysisTask task1; |
| 227 TestAnalysisTask task2; | 249 TestAnalysisTask task2; |
| 228 TaskDescriptor descriptor1 = new TaskDescriptor( | 250 TaskDescriptor descriptor1 = new TaskDescriptor( |
| 229 'task1', | 251 'task1', |
| 230 (context, target) => task1, | 252 (context, target) => task1, |
| 231 (target) => {'inputB': new SimpleTaskInput<int>(target, resultB)}, | 253 (target) => {'inputB': new SimpleTaskInput<int>(target, resultB)}, |
| 232 [resultA]); | 254 [resultA]); |
| 233 TaskDescriptor descriptor2 = new TaskDescriptor( | 255 TaskDescriptor descriptor2 = new TaskDescriptor( |
| 234 'task2', | 256 'task2', |
| (...skipping 27 matching lines...) Expand all Loading... |
| 262 expect(task2.dependencyCycle.map((workItem) => workItem.descriptor).toSet(), | 284 expect(task2.dependencyCycle.map((workItem) => workItem.descriptor).toSet(), |
| 263 expectedCycle); | 285 expectedCycle); |
| 264 CaughtException exception = context.getCacheEntry(target).exception; | 286 CaughtException exception = context.getCacheEntry(target).exception; |
| 265 expect(exception, isNull); | 287 expect(exception, isNull); |
| 266 expect(context.getCacheEntry(target).getValue(resultA), 10); | 288 expect(context.getCacheEntry(target).getValue(resultA), 10); |
| 267 expect(context.getCacheEntry(target).getValue(resultB), 20); | 289 expect(context.getCacheEntry(target).getValue(resultB), 20); |
| 268 } | 290 } |
| 269 | 291 |
| 270 test_performAnalysisTask_infiniteLoop_unhandled() { | 292 test_performAnalysisTask_infiniteLoop_unhandled() { |
| 271 AnalysisTarget target = new TestSource(); | 293 AnalysisTarget target = new TestSource(); |
| 272 ResultDescriptor resultA = new ResultDescriptor('resultA', -1); | 294 ResultDescriptor<int> resultA = new ResultDescriptor<int>('resultA', -1); |
| 273 ResultDescriptor resultB = new ResultDescriptor('resultB', -2); | 295 ResultDescriptor<int> resultB = new ResultDescriptor<int>('resultB', -2); |
| 274 // configure tasks | 296 // configure tasks |
| 275 TestAnalysisTask task1; | 297 TestAnalysisTask task1; |
| 276 TestAnalysisTask task2; | 298 TestAnalysisTask task2; |
| 277 TaskDescriptor descriptor1 = new TaskDescriptor( | 299 TaskDescriptor descriptor1 = new TaskDescriptor( |
| 278 'task1', | 300 'task1', |
| 279 (context, target) => task1, | 301 (context, target) => task1, |
| 280 (target) => {'inputB': new SimpleTaskInput<int>(target, resultB)}, | 302 (target) => {'inputB': new SimpleTaskInput<int>(target, resultB)}, |
| 281 [resultA]); | 303 [resultA]); |
| 282 TaskDescriptor descriptor2 = new TaskDescriptor( | 304 TaskDescriptor descriptor2 = new TaskDescriptor( |
| 283 'task2', | 305 'task2', |
| (...skipping 12 matching lines...) Expand all Loading... |
| 296 // prepare work order | 318 // prepare work order |
| 297 expect(analysisDriver.performAnalysisTask(), true); | 319 expect(analysisDriver.performAnalysisTask(), true); |
| 298 expect(analysisDriver.performAnalysisTask(), true); | 320 expect(analysisDriver.performAnalysisTask(), true); |
| 299 CaughtException exception = context.getCacheEntry(target).exception; | 321 CaughtException exception = context.getCacheEntry(target).exception; |
| 300 expect(exception, isNotNull); | 322 expect(exception, isNotNull); |
| 301 expect(exception.exception, new isInstanceOf<InfiniteTaskLoopException>()); | 323 expect(exception.exception, new isInstanceOf<InfiniteTaskLoopException>()); |
| 302 } | 324 } |
| 303 | 325 |
| 304 test_performAnalysisTask_inputsFirst() { | 326 test_performAnalysisTask_inputsFirst() { |
| 305 AnalysisTarget target = new TestSource(); | 327 AnalysisTarget target = new TestSource(); |
| 306 ResultDescriptor resultA = new ResultDescriptor('resultA', -1); | 328 ResultDescriptor<int> resultA = new ResultDescriptor<int>('resultA', -1); |
| 307 ResultDescriptor resultB = new ResultDescriptor('resultB', -2); | 329 ResultDescriptor<int> resultB = new ResultDescriptor<int>('resultB', -2); |
| 308 // configure tasks | 330 // configure tasks |
| 309 TestAnalysisTask task1; | 331 TestAnalysisTask task1; |
| 310 TestAnalysisTask task2; | 332 TestAnalysisTask task2; |
| 311 TaskDescriptor descriptor1 = new TaskDescriptor( | 333 TaskDescriptor descriptor1 = new TaskDescriptor( |
| 312 'task1', (context, target) => task1, (target) => {}, [resultA]); | 334 'task1', (context, target) => task1, (target) => {}, [resultA]); |
| 313 TaskDescriptor descriptor2 = new TaskDescriptor( | 335 TaskDescriptor descriptor2 = new TaskDescriptor( |
| 314 'task2', | 336 'task2', |
| 315 (context, target) => task2, | 337 (context, target) => task2, |
| 316 (target) => {'inputA': new SimpleTaskInput<int>(target, resultA)}, | 338 (target) => {'inputA': new SimpleTaskInput<int>(target, resultA)}, |
| 317 [resultB]); | 339 [resultB]); |
| (...skipping 25 matching lines...) Expand all Loading... |
| 343 } | 365 } |
| 344 | 366 |
| 345 test_performAnalysisTask_onResultComputed() { | 367 test_performAnalysisTask_onResultComputed() { |
| 346 AnalysisTarget target = new TestSource(); | 368 AnalysisTarget target = new TestSource(); |
| 347 ResultDescriptor result = new ResultDescriptor('result', null); | 369 ResultDescriptor result = new ResultDescriptor('result', null); |
| 348 TestAnalysisTask task; | 370 TestAnalysisTask task; |
| 349 TaskDescriptor descriptor = new TaskDescriptor( | 371 TaskDescriptor descriptor = new TaskDescriptor( |
| 350 'task', (context, target) => task, (target) => {}, [result]); | 372 'task', (context, target) => task, (target) => {}, [result]); |
| 351 task = new TestAnalysisTask(context, target, | 373 task = new TestAnalysisTask(context, target, |
| 352 descriptor: descriptor, value: 42); | 374 descriptor: descriptor, value: 42); |
| 353 WorkItem item = new WorkItem(context, target, descriptor, null); | 375 WorkItem item = new WorkItem(context, target, descriptor, null, 0, null); |
| 354 | 376 |
| 355 bool streamNotified = false; | 377 bool streamNotified = false; |
| 356 analysisDriver.onResultComputed(result).listen((event) { | 378 analysisDriver.onResultComputed(result).listen((event) { |
| 357 streamNotified = true; | 379 streamNotified = true; |
| 358 expect(event.context, same(context)); | 380 expect(event.context, same(context)); |
| 359 expect(event.target, same(target)); | 381 expect(event.target, same(target)); |
| 360 expect(event.descriptor, same(result)); | 382 expect(event.descriptor, same(result)); |
| 361 expect(event.value, 42); | 383 expect(event.value, 42); |
| 362 }); | 384 }); |
| 363 analysisDriver.performWorkItem(item); | 385 analysisDriver.performWorkItem(item); |
| 364 expect(streamNotified, isTrue); | 386 expect(streamNotified, isTrue); |
| 365 } | 387 } |
| 366 | 388 |
| 367 test_performWorkItem_exceptionInTask() { | 389 test_performWorkItem_exceptionInTask() { |
| 368 AnalysisTarget target = new TestSource(); | 390 AnalysisTarget target = new TestSource(); |
| 369 ResultDescriptor result = new ResultDescriptor('result', null); | 391 ResultDescriptor result = new ResultDescriptor('result', null); |
| 370 CaughtException exception = | 392 CaughtException exception = |
| 371 new CaughtException(new AnalysisException(), null); | 393 new CaughtException(new AnalysisException(), null); |
| 372 TestAnalysisTask task; | 394 TestAnalysisTask task; |
| 373 TaskDescriptor descriptor = new TaskDescriptor( | 395 TaskDescriptor descriptor = new TaskDescriptor( |
| 374 'task', (context, target) => task, (target) => {}, [result]); | 396 'task', (context, target) => task, (target) => {}, [result]); |
| 375 task = new TestAnalysisTask(context, target, | 397 task = new TestAnalysisTask(context, target, |
| 376 descriptor: descriptor, exception: exception); | 398 descriptor: descriptor, exception: exception); |
| 377 WorkItem item = new WorkItem(context, target, descriptor, null); | 399 WorkItem item = new WorkItem(context, target, descriptor, null, 0, null); |
| 378 | 400 |
| 379 analysisDriver.performWorkItem(item); | 401 analysisDriver.performWorkItem(item); |
| 380 CacheEntry targetEntry = context.getCacheEntry(item.target); | 402 CacheEntry targetEntry = context.getCacheEntry(item.target); |
| 381 expect(targetEntry.exception, exception); | 403 expect(targetEntry.exception, exception); |
| 382 expect(targetEntry.getState(result), CacheState.ERROR); | 404 expect(targetEntry.getState(result), CacheState.ERROR); |
| 383 } | 405 } |
| 384 | 406 |
| 385 test_performWorkItem_noException() { | 407 test_performWorkItem_noException() { |
| 386 AnalysisTarget target = new TestSource(); | 408 AnalysisTarget target = new TestSource(); |
| 387 ResultDescriptor result = new ResultDescriptor('result', null); | 409 ResultDescriptor result = new ResultDescriptor('result', null); |
| 388 TestAnalysisTask task; | 410 TestAnalysisTask task; |
| 389 TaskDescriptor descriptor = new TaskDescriptor( | 411 TaskDescriptor descriptor = new TaskDescriptor( |
| 390 'task', (context, target) => task, (target) => {}, [result]); | 412 'task', (context, target) => task, (target) => {}, [result]); |
| 391 task = new TestAnalysisTask(context, target, descriptor: descriptor); | 413 task = new TestAnalysisTask(context, target, descriptor: descriptor); |
| 392 WorkItem item = new WorkItem(context, target, descriptor, null); | 414 WorkItem item = new WorkItem(context, target, descriptor, null, 0, null); |
| 393 | 415 |
| 394 analysisDriver.performWorkItem(item); | 416 analysisDriver.performWorkItem(item); |
| 395 CacheEntry targetEntry = context.getCacheEntry(item.target); | 417 CacheEntry targetEntry = context.getCacheEntry(item.target); |
| 396 expect(targetEntry.exception, isNull); | 418 expect(targetEntry.exception, isNull); |
| 397 expect(targetEntry.getState(result), CacheState.VALID); | 419 expect(targetEntry.getState(result), CacheState.VALID); |
| 398 } | 420 } |
| 399 | 421 |
| 400 test_performWorkItem_preExistingException() { | 422 test_performWorkItem_preExistingException() { |
| 401 AnalysisTarget target = new TestSource(); | 423 AnalysisTarget target = new TestSource(); |
| 402 ResultDescriptor result = new ResultDescriptor('result', null); | 424 ResultDescriptor result = new ResultDescriptor('result', null); |
| 403 TaskDescriptor descriptor = new TaskDescriptor( | 425 TaskDescriptor descriptor = new TaskDescriptor( |
| 404 'task', | 426 'task', |
| 405 (context, target) => new TestAnalysisTask(context, target), | 427 (context, target) => new TestAnalysisTask(context, target), |
| 406 (target) => {}, | 428 (target) => {}, |
| 407 [result]); | 429 [result]); |
| 408 CaughtException exception = | 430 CaughtException exception = |
| 409 new CaughtException(new AnalysisException(), null); | 431 new CaughtException(new AnalysisException(), null); |
| 410 WorkItem item = new WorkItem(context, target, descriptor, null); | 432 WorkItem item = new WorkItem(context, target, descriptor, null, 0, null); |
| 411 item.exception = exception; | 433 item.exception = exception; |
| 412 | 434 |
| 413 analysisDriver.performWorkItem(item); | 435 analysisDriver.performWorkItem(item); |
| 414 CacheEntry targetEntry = context.getCacheEntry(item.target); | 436 CacheEntry targetEntry = context.getCacheEntry(item.target); |
| 415 expect(targetEntry.exception, exception); | 437 expect(targetEntry.exception, exception); |
| 416 expect(targetEntry.getState(result), CacheState.ERROR); | 438 expect(targetEntry.getState(result), CacheState.ERROR); |
| 417 } | 439 } |
| 418 | 440 |
| 419 test_reset() { | 441 test_reset() { |
| 420 ResultDescriptor inputResult = new ResultDescriptor('input', null); | 442 ResultDescriptor inputResult = new ResultDescriptor('input', null); |
| 421 TaskDescriptor descriptor = new TaskDescriptor( | 443 TaskDescriptor descriptor = new TaskDescriptor( |
| 422 'task', | 444 'task', |
| 423 (context, target) => new TestAnalysisTask(context, target), | 445 (context, target) => new TestAnalysisTask(context, target), |
| 424 (target) => {'one': inputResult.of(target)}, | 446 (target) => {'one': inputResult.of(target)}, |
| 425 [new ResultDescriptor('output', null)]); | 447 [new ResultDescriptor('output', null)]); |
| 426 analysisDriver.currentWorkOrder = | 448 analysisDriver.currentWorkOrder = new WorkOrder( |
| 427 new WorkOrder(taskManager, new WorkItem(null, null, descriptor, null)); | 449 taskManager, new WorkItem(null, null, descriptor, null, 0, null)); |
| 428 | 450 |
| 429 analysisDriver.reset(); | 451 analysisDriver.reset(); |
| 430 expect(analysisDriver.currentWorkOrder, isNull); | 452 expect(analysisDriver.currentWorkOrder, isNull); |
| 431 } | 453 } |
| 432 | 454 |
| 433 void _configureDescriptors12() { | 455 void _configureDescriptors12() { |
| 434 descriptor1 = new TaskDescriptor( | 456 descriptor1 = new TaskDescriptor( |
| 435 'task1', | 457 'task1', |
| 436 (context, target) => | 458 (context, target) => |
| 437 new TestAnalysisTask(context, target, descriptor: descriptor1), | 459 new TestAnalysisTask(context, target, descriptor: descriptor1), |
| (...skipping 13 matching lines...) Expand all Loading... |
| 451 /** | 473 /** |
| 452 * [complete] is `true` if the value of the result has already been computed. | 474 * [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 | 475 * [priorityTarget] is `true` if the target is in the list of priority |
| 454 * targets. | 476 * targets. |
| 455 * [priorityResult] is `true` if the result should only be computed for | 477 * [priorityResult] is `true` if the result should only be computed for |
| 456 * priority targets. | 478 * priority targets. |
| 457 */ | 479 */ |
| 458 _createWorkOrderForTarget( | 480 _createWorkOrderForTarget( |
| 459 bool complete, bool priorityTarget, bool priorityResult) { | 481 bool complete, bool priorityTarget, bool priorityResult) { |
| 460 AnalysisTarget target = new TestSource(); | 482 AnalysisTarget target = new TestSource(); |
| 461 ResultDescriptor result = new ResultDescriptor('result', null); | 483 ResultDescriptor<String> result = |
| 484 new ResultDescriptor<String>('result', null); |
| 462 TaskDescriptor descriptor = new TaskDescriptor( | 485 TaskDescriptor descriptor = new TaskDescriptor( |
| 463 'task', | 486 'task', |
| 464 (context, target) => new TestAnalysisTask(context, target), | 487 (context, target) => new TestAnalysisTask(context, target), |
| 465 (target) => {}, | 488 (target) => {}, |
| 466 [result]); | 489 [result]); |
| 467 if (priorityResult) { | 490 if (priorityResult) { |
| 468 taskManager.addPriorityResult(result); | 491 taskManager.addPriorityResult(result); |
| 469 } else { | 492 } else { |
| 470 taskManager.addGeneralResult(result); | 493 taskManager.addGeneralResult(result); |
| 471 } | 494 } |
| (...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 615 | 638 |
| 616 @reflectiveTest | 639 @reflectiveTest |
| 617 class WorkItemTest extends AbstractDriverTest { | 640 class WorkItemTest extends AbstractDriverTest { |
| 618 test_buildTask_complete() { | 641 test_buildTask_complete() { |
| 619 AnalysisTarget target = new TestSource(); | 642 AnalysisTarget target = new TestSource(); |
| 620 TaskDescriptor descriptor = new TaskDescriptor( | 643 TaskDescriptor descriptor = new TaskDescriptor( |
| 621 'task', | 644 'task', |
| 622 (context, target) => new TestAnalysisTask(context, target), | 645 (context, target) => new TestAnalysisTask(context, target), |
| 623 (target) => {}, | 646 (target) => {}, |
| 624 [new ResultDescriptor('output', null)]); | 647 [new ResultDescriptor('output', null)]); |
| 625 WorkItem item = new WorkItem(context, target, descriptor, null); | 648 WorkItem item = new WorkItem(context, target, descriptor, null, 0, null); |
| 626 AnalysisTask task = item.buildTask(); | 649 AnalysisTask task = item.buildTask(); |
| 627 expect(task, isNotNull); | 650 expect(task, isNotNull); |
| 628 } | 651 } |
| 629 | 652 |
| 630 test_buildTask_incomplete() { | 653 test_buildTask_incomplete() { |
| 631 AnalysisTarget target = new TestSource(); | 654 AnalysisTarget target = new TestSource(); |
| 632 ResultDescriptor inputResult = new ResultDescriptor('input', null); | 655 ResultDescriptor inputResult = new ResultDescriptor('input', null); |
| 633 List<ResultDescriptor> outputResults = <ResultDescriptor>[ | 656 List<ResultDescriptor> outputResults = <ResultDescriptor>[ |
| 634 new ResultDescriptor('output', null) | 657 new ResultDescriptor('output', null) |
| 635 ]; | 658 ]; |
| 636 TaskDescriptor descriptor = new TaskDescriptor( | 659 TaskDescriptor descriptor = new TaskDescriptor( |
| 637 'task', | 660 'task', |
| 638 (context, target) => | 661 (context, target) => |
| 639 new TestAnalysisTask(context, target, results: outputResults), | 662 new TestAnalysisTask(context, target, results: outputResults), |
| 640 (target) => {'one': inputResult.of(target)}, | 663 (target) => {'one': inputResult.of(target)}, |
| 641 outputResults); | 664 outputResults); |
| 642 WorkItem item = new WorkItem(context, target, descriptor, null); | 665 WorkItem item = new WorkItem(context, target, descriptor, null, 0, null); |
| 643 expect(() => item.buildTask(), throwsStateError); | 666 expect(() => item.buildTask(), throwsStateError); |
| 644 } | 667 } |
| 645 | 668 |
| 646 test_create() { | 669 test_create() { |
| 647 AnalysisTarget target = new TestSource(); | 670 AnalysisTarget target = new TestSource(); |
| 648 TaskDescriptor descriptor = new TaskDescriptor( | 671 TaskDescriptor descriptor = new TaskDescriptor( |
| 649 'task', null, (target) => {}, [new ResultDescriptor('result', null)]); | 672 'task', null, (target) => {}, [new ResultDescriptor('result', null)]); |
| 650 WorkItem item = new WorkItem(context, target, descriptor, null); | 673 WorkItem item = new WorkItem(context, target, descriptor, null, 0, null); |
| 651 expect(item, isNotNull); | 674 expect(item, isNotNull); |
| 652 expect(item.context, context); | 675 expect(item.context, context); |
| 653 expect(item.descriptor, descriptor); | 676 expect(item.descriptor, descriptor); |
| 654 expect(item.target, target); | 677 expect(item.target, target); |
| 655 } | 678 } |
| 656 | 679 |
| 680 test_gatherInputs_aboutToComputeResult_hasResult() { |
| 681 AnalysisTarget target = new TestSource(); |
| 682 ResultDescriptor resultA = new ResultDescriptor('resultA', null); |
| 683 ResultDescriptor resultB = new ResultDescriptor('resultB', null); |
| 684 // prepare tasks |
| 685 TaskDescriptor task1 = new TaskDescriptor( |
| 686 'task', |
| 687 (context, target) => |
| 688 new TestAnalysisTask(context, target, results: [resultA]), |
| 689 (target) => {}, |
| 690 [resultA]); |
| 691 TaskDescriptor task2 = new TaskDescriptor( |
| 692 'task', |
| 693 (context, target) => new TestAnalysisTask(context, target), |
| 694 (target) => {'one': resultA.of(target)}, |
| 695 [resultB]); |
| 696 taskManager.addTaskDescriptor(task1); |
| 697 taskManager.addTaskDescriptor(task2); |
| 698 // configure mocks |
| 699 when(context.aboutToComputeResult(anyObject, resultA)).thenReturn(true); |
| 700 // gather inputs |
| 701 WorkItem item = new WorkItem(context, target, task2, null, 0, null); |
| 702 WorkItem inputItem = item.gatherInputs(taskManager, []); |
| 703 expect(inputItem, isNull); |
| 704 } |
| 705 |
| 706 test_gatherInputs_aboutToComputeResult_noResult() { |
| 707 AnalysisTarget target = new TestSource(); |
| 708 ResultDescriptor resultA = new ResultDescriptor('resultA', null); |
| 709 ResultDescriptor resultB = new ResultDescriptor('resultB', null); |
| 710 // prepare tasks |
| 711 TaskDescriptor task1 = new TaskDescriptor( |
| 712 'task', |
| 713 (context, target) => |
| 714 new TestAnalysisTask(context, target, results: [resultA]), |
| 715 (target) => {}, |
| 716 [resultA]); |
| 717 TaskDescriptor task2 = new TaskDescriptor( |
| 718 'task', |
| 719 (context, target) => new TestAnalysisTask(context, target), |
| 720 (target) => {'one': resultA.of(target)}, |
| 721 [resultB]); |
| 722 taskManager.addTaskDescriptor(task1); |
| 723 taskManager.addTaskDescriptor(task2); |
| 724 // configure ResultProvider |
| 725 // configure mocks |
| 726 when(context.aboutToComputeResult(anyObject, resultA)).thenReturn(false); |
| 727 // gather inputs |
| 728 WorkItem item = new WorkItem(context, target, task2, null, 0, null); |
| 729 WorkItem inputItem = item.gatherInputs(taskManager, []); |
| 730 expect(inputItem, isNotNull); |
| 731 expect(inputItem.target, target); |
| 732 expect(inputItem.descriptor, task1); |
| 733 } |
| 734 |
| 657 test_gatherInputs_complete() { | 735 test_gatherInputs_complete() { |
| 658 AnalysisTarget target = new TestSource(); | 736 AnalysisTarget target = new TestSource(); |
| 659 TaskDescriptor descriptor = new TaskDescriptor( | 737 TaskDescriptor descriptor = new TaskDescriptor( |
| 660 'task', | 738 'task', |
| 661 (context, target) => new TestAnalysisTask(context, target), | 739 (context, target) => new TestAnalysisTask(context, target), |
| 662 (target) => {}, | 740 (target) => {}, |
| 663 [new ResultDescriptor('output', null)]); | 741 [new ResultDescriptor('output', null)]); |
| 664 WorkItem item = new WorkItem(context, target, descriptor, null); | 742 WorkItem item = new WorkItem(context, target, descriptor, null, 0, null); |
| 665 WorkItem result = item.gatherInputs(taskManager, []); | 743 WorkItem result = item.gatherInputs(taskManager, []); |
| 666 expect(result, isNull); | 744 expect(result, isNull); |
| 667 expect(item.exception, isNull); | 745 expect(item.exception, isNull); |
| 668 } | 746 } |
| 669 | 747 |
| 670 test_gatherInputs_incomplete() { | 748 test_gatherInputs_incomplete() { |
| 671 AnalysisTarget target = new TestSource(); | 749 AnalysisTarget target = new TestSource(); |
| 672 ResultDescriptor resultA = new ResultDescriptor('resultA', null); | 750 ResultDescriptor resultA = new ResultDescriptor('resultA', null); |
| 673 ResultDescriptor resultB = new ResultDescriptor('resultB', null); | 751 ResultDescriptor resultB = new ResultDescriptor('resultB', null); |
| 674 // prepare tasks | 752 // prepare tasks |
| 675 TaskDescriptor task1 = new TaskDescriptor( | 753 TaskDescriptor task1 = new TaskDescriptor( |
| 676 'task', | 754 'task', |
| 677 (context, target) => | 755 (context, target) => |
| 678 new TestAnalysisTask(context, target, results: [resultA]), | 756 new TestAnalysisTask(context, target, results: [resultA]), |
| 679 (target) => {}, | 757 (target) => {}, |
| 680 [resultA]); | 758 [resultA]); |
| 681 TaskDescriptor task2 = new TaskDescriptor( | 759 TaskDescriptor task2 = new TaskDescriptor( |
| 682 'task', | 760 'task', |
| 683 (context, target) => new TestAnalysisTask(context, target), | 761 (context, target) => new TestAnalysisTask(context, target), |
| 684 (target) => {'one': resultA.of(target)}, | 762 (target) => {'one': resultA.of(target)}, |
| 685 [resultB]); | 763 [resultB]); |
| 686 taskManager.addTaskDescriptor(task1); | 764 taskManager.addTaskDescriptor(task1); |
| 687 taskManager.addTaskDescriptor(task2); | 765 taskManager.addTaskDescriptor(task2); |
| 688 // gather inputs | 766 // gather inputs |
| 689 WorkItem item = new WorkItem(context, target, task2, null); | 767 WorkItem item = new WorkItem(context, target, task2, null, 0, null); |
| 690 WorkItem inputItem = item.gatherInputs(taskManager, []); | 768 WorkItem inputItem = item.gatherInputs(taskManager, []); |
| 691 expect(inputItem, isNotNull); | 769 expect(inputItem, isNotNull); |
| 692 } | 770 } |
| 693 | 771 |
| 694 test_gatherInputs_invalid() { | 772 test_gatherInputs_invalid() { |
| 695 AnalysisTarget target = new TestSource(); | 773 AnalysisTarget target = new TestSource(); |
| 696 ResultDescriptor inputResult = new ResultDescriptor('input', null); | 774 ResultDescriptor inputResult = new ResultDescriptor('input', null); |
| 697 TaskDescriptor descriptor = new TaskDescriptor( | 775 TaskDescriptor descriptor = new TaskDescriptor( |
| 698 'task', | 776 'task', |
| 699 (context, target) => new TestAnalysisTask(context, target), | 777 (context, target) => new TestAnalysisTask(context, target), |
| 700 (target) => {'one': inputResult.of(target)}, | 778 (target) => {'one': inputResult.of(target)}, |
| 701 [new ResultDescriptor('output', null)]); | 779 [new ResultDescriptor('output', null)]); |
| 702 WorkItem item = new WorkItem(context, target, descriptor, null); | 780 WorkItem item = new WorkItem(context, target, descriptor, null, 0, null); |
| 703 WorkItem result = item.gatherInputs(taskManager, []); | 781 WorkItem result = item.gatherInputs(taskManager, []); |
| 704 expect(result, isNull); | 782 expect(result, isNull); |
| 705 expect(item.exception, isNotNull); | 783 expect(item.exception, isNotNull); |
| 706 } | 784 } |
| 707 } | 785 } |
| 708 | 786 |
| 709 @reflectiveTest | 787 @reflectiveTest |
| 710 class WorkOrderTest extends EngineTestCase { | 788 class WorkOrderTest extends EngineTestCase { |
| 711 test_create() { | 789 test_create() { |
| 712 TaskManager manager = new TaskManager(); | 790 TaskManager manager = new TaskManager(); |
| 713 TaskDescriptor descriptor = new TaskDescriptor( | 791 TaskDescriptor descriptor = new TaskDescriptor( |
| 714 'task', null, (_) => {}, [new ResultDescriptor('result', null)]); | 792 'task', null, (_) => {}, [new ResultDescriptor('result', null)]); |
| 715 WorkOrder order = | 793 WorkOrder order = new WorkOrder( |
| 716 new WorkOrder(manager, new WorkItem(null, null, descriptor, null)); | 794 manager, new WorkItem(null, null, descriptor, null, 0, null)); |
| 717 expect(order, isNotNull); | 795 expect(order, isNotNull); |
| 718 expect(order.currentItems, isNull); | 796 expect(order.currentItems, isNull); |
| 719 expect(order.current, isNull); | 797 expect(order.current, isNull); |
| 720 } | 798 } |
| 721 | 799 |
| 722 test_moveNext() { | 800 test_moveNext() { |
| 723 TaskManager manager = new TaskManager(); | 801 TaskManager manager = new TaskManager(); |
| 724 TaskDescriptor descriptor = new TaskDescriptor( | 802 TaskDescriptor descriptor = new TaskDescriptor( |
| 725 'task', null, (_) => {}, [new ResultDescriptor('result', null)]); | 803 'task', null, (_) => {}, [new ResultDescriptor('result', null)]); |
| 726 WorkItem workItem = new WorkItem(null, null, descriptor, null); | 804 WorkItem workItem = new WorkItem(null, null, descriptor, null, 0, null); |
| 727 WorkOrder order = new WorkOrder(manager, workItem); | 805 WorkOrder order = new WorkOrder(manager, workItem); |
| 728 // "item" has no child items | 806 // "item" has no child items |
| 729 expect(order.moveNext(), isTrue); | 807 expect(order.moveNext(), isTrue); |
| 730 expect(order.current, workItem); | 808 expect(order.current, workItem); |
| 731 // done | 809 // done |
| 732 expect(order.moveNext(), isFalse); | 810 expect(order.moveNext(), isFalse); |
| 733 expect(order.current, isNull); | 811 expect(order.current, isNull); |
| 734 } | 812 } |
| 735 } | 813 } |
| 736 | 814 |
| 737 /** | 815 /** |
| 738 * A dummy [InternalAnalysisContext] that does not use [AnalysisDriver] itself, | 816 * A dummy [InternalAnalysisContext] that does not use [AnalysisDriver] itself, |
| 739 * but provides enough implementation for it to function. | 817 * but provides enough implementation for it to function. |
| 740 */ | 818 */ |
| 741 class _InternalAnalysisContextMock extends TypedMock | 819 class _InternalAnalysisContextMock extends TypedMock |
| 742 implements InternalAnalysisContext { | 820 implements InternalAnalysisContext { |
| 743 AnalysisCache analysisCache; | 821 AnalysisCache analysisCache; |
| 744 | 822 |
| 745 @override | 823 @override |
| 824 final AnalysisOptionsImpl analysisOptions = new AnalysisOptionsImpl(); |
| 825 |
| 826 @override |
| 746 List<AnalysisTarget> explicitTargets = <AnalysisTarget>[]; | 827 List<AnalysisTarget> explicitTargets = <AnalysisTarget>[]; |
| 747 | 828 |
| 748 @override | 829 @override |
| 749 List<AnalysisTarget> priorityTargets = <AnalysisTarget>[]; | 830 List<AnalysisTarget> priorityTargets = <AnalysisTarget>[]; |
| 750 | 831 |
| 751 _InternalAnalysisContextMock() { | 832 _InternalAnalysisContextMock() { |
| 752 analysisCache = new AnalysisCache([new UniversalCachePartition(this)]); | 833 analysisCache = new AnalysisCache([new UniversalCachePartition(this)]); |
| 753 } | 834 } |
| 754 | 835 |
| 755 @override | 836 @override |
| 756 CacheEntry getCacheEntry(AnalysisTarget target) { | 837 CacheEntry getCacheEntry(AnalysisTarget target) { |
| 757 CacheEntry entry = analysisCache.get(target); | 838 CacheEntry entry = analysisCache.get(target); |
| 758 if (entry == null) { | 839 if (entry == null) { |
| 759 entry = new CacheEntry(target); | 840 entry = new CacheEntry(target); |
| 760 analysisCache.put(entry); | 841 analysisCache.put(entry); |
| 761 } | 842 } |
| 762 return entry; | 843 return entry; |
| 763 } | 844 } |
| 764 | |
| 765 noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); | |
| 766 } | 845 } |
| 767 | 846 |
| 768 /** | 847 /** |
| 769 * Concrete class for testing [CycleAwareDependencyWalker] behavior. | 848 * Concrete class for testing [CycleAwareDependencyWalker] behavior. |
| 770 */ | 849 */ |
| 771 class _TestCycleAwareDependencyWalker extends CycleAwareDependencyWalker<int> { | 850 class _TestCycleAwareDependencyWalker extends CycleAwareDependencyWalker<int> { |
| 772 final Map<int, List<int>> graph; | 851 final Map<int, List<int>> graph; |
| 773 | 852 |
| 774 Set<int> evaluatedNodes = new Set<int>(); | 853 Set<int> evaluatedNodes = new Set<int>(); |
| 775 | 854 |
| 776 _TestCycleAwareDependencyWalker(this.graph, int startingNode) | 855 _TestCycleAwareDependencyWalker(this.graph, int startingNode) |
| 777 : super(startingNode); | 856 : super(startingNode); |
| 778 | 857 |
| 779 @override | 858 @override |
| 780 int getNextInput(int node, List<int> skipInputs) { | 859 int getNextInput(int node, List<int> skipInputs) { |
| 781 for (int dependency in graph[node]) { | 860 for (int dependency in graph[node]) { |
| 782 if (!skipInputs.contains(dependency) && | 861 if (!skipInputs.contains(dependency) && |
| 783 !evaluatedNodes.contains(dependency)) { | 862 !evaluatedNodes.contains(dependency)) { |
| 784 return dependency; | 863 return dependency; |
| 785 } | 864 } |
| 786 } | 865 } |
| 787 return null; | 866 return null; |
| 788 } | 867 } |
| 789 } | 868 } |
| 790 | 869 |
| 791 class _WorkManagerMock extends TypedMock implements WorkManager { | 870 class _WorkManagerMock extends TypedMock implements WorkManager {} |
| 792 noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); | |
| 793 } | |
| OLD | NEW |