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

Side by Side Diff: pkg/analysis_server/test/operation/operation_queue_test.dart

Issue 904093002: Discard pending notifications on the same source change. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 5 years, 10 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2014, 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.operation.queue; 5 library test.operation.queue;
6 6
7 import 'package:analysis_server/src/analysis_server.dart'; 7 import 'package:analysis_server/src/analysis_server.dart';
8 import 'package:analysis_server/src/operation/operation.dart'; 8 import 'package:analysis_server/src/operation/operation.dart';
9 import 'package:analysis_server/src/operation/operation_analysis.dart'; 9 import 'package:analysis_server/src/operation/operation_analysis.dart';
10 import 'package:analysis_server/src/operation/operation_queue.dart'; 10 import 'package:analysis_server/src/operation/operation_queue.dart';
11 import 'package:analyzer/src/generated/engine.dart'; 11 import 'package:analyzer/src/generated/engine.dart';
12 import 'package:analyzer/src/generated/source.dart';
12 import 'package:typed_mock/typed_mock.dart'; 13 import 'package:typed_mock/typed_mock.dart';
13 import 'package:unittest/unittest.dart'; 14 import 'package:unittest/unittest.dart';
15
14 import '../mocks.dart'; 16 import '../mocks.dart';
15 import 'package:analyzer/src/generated/source.dart'; 17 import '../reflective_tests.dart';
18
16 19
17 main() { 20 main() {
18 groupSep = ' | '; 21 groupSep = ' | ';
19 22 runReflectiveTests(ServerOperationQueueTest);
20 group('ServerOperationQueue', () {
21 ServerOperationQueue queue;
22
23 setUp(() {
24 queue = new ServerOperationQueue();
25 });
26
27 test('clear', () {
28 var operationA = mockOperation(ServerOperationPriority.ANALYSIS);
29 var operationB = mockOperation(ServerOperationPriority.ANALYSIS_CONTINUE);
30 queue.add(operationA);
31 queue.add(operationB);
32 // there are some operations
33 expect(queue.isEmpty, false);
34 // clear - no operations
35 queue.clear();
36 expect(queue.isEmpty, true);
37 });
38
39 group('isEmpty', () {
40 test('true', () {
41 expect(queue.isEmpty, isTrue);
42 });
43
44 test('false', () {
45 var operation = mockOperation(ServerOperationPriority.ANALYSIS);
46 queue.add(operation);
47 expect(queue.isEmpty, isFalse);
48 });
49 });
50
51 group('take', () {
52 test('empty', () {
53 expect(queue.take(), isNull);
54 });
55
56 test('use operation priorities', () {
57 var operationA = mockOperation(ServerOperationPriority.ANALYSIS);
58 var operationB =
59 mockOperation(ServerOperationPriority.ANALYSIS_CONTINUE);
60 var operationC =
61 mockOperation(ServerOperationPriority.PRIORITY_ANALYSIS);
62 queue.add(operationA);
63 queue.add(operationB);
64 queue.add(operationC);
65 expect(queue.take(), operationC);
66 expect(queue.take(), operationB);
67 expect(queue.take(), operationA);
68 expect(queue.take(), isNull);
69 });
70
71 test('continue analysis first', () {
72 var analysisContext = new AnalysisContextMock();
73 var operationA = new PerformAnalysisOperation(analysisContext, false);
74 var operationB = new PerformAnalysisOperation(analysisContext, true);
75 queue.add(operationA);
76 queue.add(operationB);
77 expect(queue.take(), operationB);
78 expect(queue.take(), operationA);
79 expect(queue.take(), isNull);
80 });
81
82 test('priority context first', () {
83 var prioritySource = new MockSource();
84 var analysisContextA = new AnalysisContextMock();
85 var analysisContextB = new AnalysisContextMock();
86 analysisContextB.prioritySources = [prioritySource];
87 var operationA = new PerformAnalysisOperation(analysisContextA, false);
88 var operationB = new PerformAnalysisOperation(analysisContextB, false);
89 queue.add(operationA);
90 queue.add(operationB);
91 expect(queue.take(), operationB);
92 expect(queue.take(), operationA);
93 expect(queue.take(), isNull);
94 });
95
96 test('reschedule', () {
97 var prioritySource = new MockSource();
98 var analysisContextA = new AnalysisContextMock();
99 var analysisContextB = new AnalysisContextMock();
100 var operationA = new PerformAnalysisOperation(analysisContextA, false);
101 var operationB = new PerformAnalysisOperation(analysisContextB, false);
102 queue.add(operationA);
103 queue.add(operationB);
104 // update priority sources and reschedule
105 analysisContextB.prioritySources = [prioritySource];
106 queue.reschedule();
107 // verify order
108 expect(queue.take(), operationB);
109 expect(queue.take(), operationA);
110 expect(queue.take(), isNull);
111 });
112 });
113 });
114 } 23 }
115 24
116 25
117 /** 26 /**
118 * Return a [ServerOperation] mock with the given priority. 27 * Return a [ServerOperation] mock with the given priority.
119 */ 28 */
120 ServerOperation mockOperation(ServerOperationPriority priority) { 29 ServerOperation mockOperation(ServerOperationPriority priority) {
121 ServerOperation operation = new ServerOperationMock(); 30 ServerOperation operation = new _ServerOperationMock();
122 when(operation.priority).thenReturn(priority); 31 when(operation.priority).thenReturn(priority);
123 return operation; 32 return operation;
124 } 33 }
125 34
126 35
127 class AnalysisContextMock extends TypedMock implements InternalAnalysisContext { 36 class AnalysisContextMock extends TypedMock implements InternalAnalysisContext {
128 List<Source> prioritySources = <Source>[]; 37 List<Source> prioritySources = <Source>[];
129 38
130 noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); 39 noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
131 } 40 }
132 41
42
133 class AnalysisServerMock extends TypedMock implements AnalysisServer { 43 class AnalysisServerMock extends TypedMock implements AnalysisServer {
134 noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); 44 noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
135 } 45 }
136 46
47
137 class ServerContextManagerMock extends TypedMock implements ServerContextManager 48 class ServerContextManagerMock extends TypedMock implements ServerContextManager
138 { 49 {
139 noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); 50 noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
140 } 51 }
141 52
142 class ServerOperationMock extends TypedMock implements ServerOperation { 53
54 @reflectiveTest
55 class ServerOperationQueueTest {
56 ServerOperationQueue queue = new ServerOperationQueue();
57
58 void test_clear() {
59 var operationA = mockOperation(ServerOperationPriority.ANALYSIS);
60 var operationB = mockOperation(ServerOperationPriority.ANALYSIS_CONTINUE);
61 queue.add(operationA);
62 queue.add(operationB);
63 // there are some operations
64 expect(queue.isEmpty, false);
65 // clear - no operations
66 queue.clear();
67 expect(queue.isEmpty, true);
68 }
69
70 void test_isEmpty_false() {
71 var operation = mockOperation(ServerOperationPriority.ANALYSIS);
72 queue.add(operation);
73 expect(queue.isEmpty, isFalse);
74 }
75
76 void test_isEmpty_true() {
77 expect(queue.isEmpty, isTrue);
78 }
79
80 void test_reschedule() {
81 var prioritySource = new MockSource();
82 var analysisContextA = new AnalysisContextMock();
83 var analysisContextB = new AnalysisContextMock();
84 var operationA = new PerformAnalysisOperation(analysisContextA, false);
85 var operationB = new PerformAnalysisOperation(analysisContextB, false);
86 queue.add(operationA);
87 queue.add(operationB);
88 // update priority sources and reschedule
89 analysisContextB.prioritySources = [prioritySource];
90 queue.reschedule();
91 // verify order
92 expect(queue.take(), operationB);
93 expect(queue.take(), operationA);
94 expect(queue.take(), isNull);
95 }
96
97 void test_sourceAboutToChange() {
98 Source sourceA = new _SourceMock();
99 Source sourceB = new _SourceMock();
100 var opA1 = new _SourceSensitiveOperationMock(sourceA);
101 var opA2 = new _SourceSensitiveOperationMock(sourceA);
102 var opB1 = new _SourceSensitiveOperationMock(sourceB);
103 var opB2 = new _SourceSensitiveOperationMock(sourceB);
104 queue.add(opA1);
105 queue.add(opB1);
106 queue.add(opA2);
107 queue.add(opB2);
108 queue.sourceAboutToChange(sourceA);
109 expect(queue.take(), same(opB1));
110 expect(queue.take(), same(opB2));
111 }
112
113 void test_take_continueAnalysisFirst() {
114 var analysisContext = new AnalysisContextMock();
115 var operationA = new PerformAnalysisOperation(analysisContext, false);
116 var operationB = new PerformAnalysisOperation(analysisContext, true);
117 queue.add(operationA);
118 queue.add(operationB);
119 expect(queue.take(), operationB);
120 expect(queue.take(), operationA);
121 expect(queue.take(), isNull);
122 }
123
124 void test_take_empty() {
125 expect(queue.take(), isNull);
126 }
127
128 void test_take_priorityContextFirst() {
129 var prioritySource = new MockSource();
130 var analysisContextA = new AnalysisContextMock();
131 var analysisContextB = new AnalysisContextMock();
132 analysisContextB.prioritySources = [prioritySource];
133 var operationA = new PerformAnalysisOperation(analysisContextA, false);
134 var operationB = new PerformAnalysisOperation(analysisContextB, false);
135 queue.add(operationA);
136 queue.add(operationB);
137 expect(queue.take(), operationB);
138 expect(queue.take(), operationA);
139 expect(queue.take(), isNull);
140 }
141
142 void test_take_useOperationPriorities() {
143 var operationA = mockOperation(ServerOperationPriority.ANALYSIS);
144 var operationB = mockOperation(ServerOperationPriority.ANALYSIS_CONTINUE);
145 var operationC = mockOperation(ServerOperationPriority.PRIORITY_ANALYSIS);
146 queue.add(operationA);
147 queue.add(operationB);
148 queue.add(operationC);
149 expect(queue.take(), operationC);
150 expect(queue.take(), operationB);
151 expect(queue.take(), operationA);
152 expect(queue.take(), isNull);
153 }
154 }
155
156
157 class _ServerOperationMock extends TypedMock implements ServerOperation {
143 noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); 158 noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
144 } 159 }
160
161 class _SourceMock extends TypedMock implements Source {
162 noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
163 }
164
165 class _SourceSensitiveOperationMock extends TypedMock implements
166 SourceSensitiveOperation {
167 final Source source;
168
169 _SourceSensitiveOperationMock(this.source);
170
171 @override
172 ServerOperationPriority get priority {
173 return ServerOperationPriority.ANALYSIS_NOTIFICATION;
174 }
175
176 noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
177
178 @override
179 bool shouldBeDiscardedOnSourceChange(Source source) {
180 return source == this.source;
181 }
182 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698