eac4b2e0a3
R=brianwilkerson@google.com BUG= Review URL: https://codereview.chromium.org//904093002 git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@43564 260f80e4-7a28-3924-810f-c04153c831b5
183 lines
5.7 KiB
Dart
183 lines
5.7 KiB
Dart
// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
|
|
// for details. All rights reserved. Use of this source code is governed by a
|
|
// BSD-style license that can be found in the LICENSE file.
|
|
|
|
library test.operation.queue;
|
|
|
|
import 'package:analysis_server/src/analysis_server.dart';
|
|
import 'package:analysis_server/src/operation/operation.dart';
|
|
import 'package:analysis_server/src/operation/operation_analysis.dart';
|
|
import 'package:analysis_server/src/operation/operation_queue.dart';
|
|
import 'package:analyzer/src/generated/engine.dart';
|
|
import 'package:analyzer/src/generated/source.dart';
|
|
import 'package:typed_mock/typed_mock.dart';
|
|
import 'package:unittest/unittest.dart';
|
|
|
|
import '../mocks.dart';
|
|
import '../reflective_tests.dart';
|
|
|
|
|
|
main() {
|
|
groupSep = ' | ';
|
|
runReflectiveTests(ServerOperationQueueTest);
|
|
}
|
|
|
|
|
|
/**
|
|
* Return a [ServerOperation] mock with the given priority.
|
|
*/
|
|
ServerOperation mockOperation(ServerOperationPriority priority) {
|
|
ServerOperation operation = new _ServerOperationMock();
|
|
when(operation.priority).thenReturn(priority);
|
|
return operation;
|
|
}
|
|
|
|
|
|
class AnalysisContextMock extends TypedMock implements InternalAnalysisContext {
|
|
List<Source> prioritySources = <Source>[];
|
|
|
|
noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
|
|
}
|
|
|
|
|
|
class AnalysisServerMock extends TypedMock implements AnalysisServer {
|
|
noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
|
|
}
|
|
|
|
|
|
class ServerContextManagerMock extends TypedMock implements ServerContextManager
|
|
{
|
|
noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
|
|
}
|
|
|
|
|
|
@reflectiveTest
|
|
class ServerOperationQueueTest {
|
|
ServerOperationQueue queue = new ServerOperationQueue();
|
|
|
|
void test_clear() {
|
|
var operationA = mockOperation(ServerOperationPriority.ANALYSIS);
|
|
var operationB = mockOperation(ServerOperationPriority.ANALYSIS_CONTINUE);
|
|
queue.add(operationA);
|
|
queue.add(operationB);
|
|
// there are some operations
|
|
expect(queue.isEmpty, false);
|
|
// clear - no operations
|
|
queue.clear();
|
|
expect(queue.isEmpty, true);
|
|
}
|
|
|
|
void test_isEmpty_false() {
|
|
var operation = mockOperation(ServerOperationPriority.ANALYSIS);
|
|
queue.add(operation);
|
|
expect(queue.isEmpty, isFalse);
|
|
}
|
|
|
|
void test_isEmpty_true() {
|
|
expect(queue.isEmpty, isTrue);
|
|
}
|
|
|
|
void test_reschedule() {
|
|
var prioritySource = new MockSource();
|
|
var analysisContextA = new AnalysisContextMock();
|
|
var analysisContextB = new AnalysisContextMock();
|
|
var operationA = new PerformAnalysisOperation(analysisContextA, false);
|
|
var operationB = new PerformAnalysisOperation(analysisContextB, false);
|
|
queue.add(operationA);
|
|
queue.add(operationB);
|
|
// update priority sources and reschedule
|
|
analysisContextB.prioritySources = [prioritySource];
|
|
queue.reschedule();
|
|
// verify order
|
|
expect(queue.take(), operationB);
|
|
expect(queue.take(), operationA);
|
|
expect(queue.take(), isNull);
|
|
}
|
|
|
|
void test_sourceAboutToChange() {
|
|
Source sourceA = new _SourceMock();
|
|
Source sourceB = new _SourceMock();
|
|
var opA1 = new _SourceSensitiveOperationMock(sourceA);
|
|
var opA2 = new _SourceSensitiveOperationMock(sourceA);
|
|
var opB1 = new _SourceSensitiveOperationMock(sourceB);
|
|
var opB2 = new _SourceSensitiveOperationMock(sourceB);
|
|
queue.add(opA1);
|
|
queue.add(opB1);
|
|
queue.add(opA2);
|
|
queue.add(opB2);
|
|
queue.sourceAboutToChange(sourceA);
|
|
expect(queue.take(), same(opB1));
|
|
expect(queue.take(), same(opB2));
|
|
}
|
|
|
|
void test_take_continueAnalysisFirst() {
|
|
var analysisContext = new AnalysisContextMock();
|
|
var operationA = new PerformAnalysisOperation(analysisContext, false);
|
|
var operationB = new PerformAnalysisOperation(analysisContext, true);
|
|
queue.add(operationA);
|
|
queue.add(operationB);
|
|
expect(queue.take(), operationB);
|
|
expect(queue.take(), operationA);
|
|
expect(queue.take(), isNull);
|
|
}
|
|
|
|
void test_take_empty() {
|
|
expect(queue.take(), isNull);
|
|
}
|
|
|
|
void test_take_priorityContextFirst() {
|
|
var prioritySource = new MockSource();
|
|
var analysisContextA = new AnalysisContextMock();
|
|
var analysisContextB = new AnalysisContextMock();
|
|
analysisContextB.prioritySources = [prioritySource];
|
|
var operationA = new PerformAnalysisOperation(analysisContextA, false);
|
|
var operationB = new PerformAnalysisOperation(analysisContextB, false);
|
|
queue.add(operationA);
|
|
queue.add(operationB);
|
|
expect(queue.take(), operationB);
|
|
expect(queue.take(), operationA);
|
|
expect(queue.take(), isNull);
|
|
}
|
|
|
|
void test_take_useOperationPriorities() {
|
|
var operationA = mockOperation(ServerOperationPriority.ANALYSIS);
|
|
var operationB = mockOperation(ServerOperationPriority.ANALYSIS_CONTINUE);
|
|
var operationC = mockOperation(ServerOperationPriority.PRIORITY_ANALYSIS);
|
|
queue.add(operationA);
|
|
queue.add(operationB);
|
|
queue.add(operationC);
|
|
expect(queue.take(), operationC);
|
|
expect(queue.take(), operationB);
|
|
expect(queue.take(), operationA);
|
|
expect(queue.take(), isNull);
|
|
}
|
|
}
|
|
|
|
|
|
class _ServerOperationMock extends TypedMock implements ServerOperation {
|
|
noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
|
|
}
|
|
|
|
class _SourceMock extends TypedMock implements Source {
|
|
noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
|
|
}
|
|
|
|
class _SourceSensitiveOperationMock extends TypedMock implements
|
|
SourceSensitiveOperation {
|
|
final Source source;
|
|
|
|
_SourceSensitiveOperationMock(this.source);
|
|
|
|
@override
|
|
ServerOperationPriority get priority {
|
|
return ServerOperationPriority.ANALYSIS_NOTIFICATION;
|
|
}
|
|
|
|
noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
|
|
|
|
@override
|
|
bool shouldBeDiscardedOnSourceChange(Source source) {
|
|
return source == this.source;
|
|
}
|
|
}
|