Skip to content

Commit 8e5e88d

Browse files
author
Anna Gringauze
committed
Make tests to fail on timeout with a descriptive message
1 parent 6e0d0de commit 8e5e88d

File tree

2 files changed

+93
-90
lines changed

2 files changed

+93
-90
lines changed

dwds/lib/src/version.dart

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dwds/test/events_test.dart

Lines changed: 92 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,31 @@ final context = TestContext();
2727
void main() {
2828
Future initialEvents;
2929

30+
Matcher matchesEvent(String type, Map<String, Object> payload) {
31+
return isA<DwdsEvent>()
32+
.having((e) => e.type, 'type', type)
33+
.having((e) => e.payload.keys, 'payload.keys', payload.keys)
34+
.having((e) => e.payload.values, 'payload.values', payload.values);
35+
}
36+
37+
Stream<DwdsEvent> pipe(Stream<DwdsEvent> stream, {Timeout timeout}) {
38+
var controller = StreamController<DwdsEvent>();
39+
unawaited(stream
40+
.forEach(controller.add)
41+
.timeout(timeout?.duration ?? const Duration(seconds: 20))
42+
.catchError((_) {})
43+
.then((value) => controller.close()));
44+
return controller.stream;
45+
}
46+
3047
setUpAll(() async {
3148
setCurrentLogWriter();
3249
initialEvents = expectLater(
33-
eventStream,
34-
emitsThrough(predicate((DwdsEvent event) =>
35-
event.type == DwdsEventKind.compilerUpdateDependencies &&
36-
event.payload['elapsedMilliseconds'] != null)));
50+
pipe(eventStream, timeout: const Timeout.factor(5)),
51+
emitsThrough(matchesEvent(DwdsEventKind.compilerUpdateDependencies, {
52+
'entrypoint': 'hello_world/main.dart.bootstrap.js',
53+
'elapsedMilliseconds': isNotNull
54+
})));
3755
await context.setUp(
3856
serveDevTools: true,
3957
enableExpressionEvaluation: true,
@@ -47,38 +65,29 @@ void main() {
4765
test('emits DEVTOOLS_LAUNCH event', () async {
4866
// The events stream is a broadcast stream so start listening before the
4967
// action.
50-
var events = expectLater(
51-
context.testServer.dwds.events,
52-
emitsThrough(predicate(
53-
(DwdsEvent event) => event.type == DwdsEventKind.devtoolsLaunch)));
68+
var events = expectLater(pipe(context.testServer.dwds.events),
69+
emitsThrough(matchesEvent(DwdsEventKind.devtoolsLaunch, {})));
5470
await context.webDriver.driver.keyboard.sendChord([Keyboard.alt, 'd']);
5571
await events;
5672
});
5773

5874
test('emits DEBUGGER_READY event', () async {
5975
// The events stream is a broadcast stream so start listening before the
6076
// action.
61-
var events = expectLater(
62-
context.testServer.dwds.events,
63-
emitsThrough(predicate(
64-
(DwdsEvent event) => event.type == DwdsEventKind.debuggerReady)));
77+
var events = expectLater(pipe(context.testServer.dwds.events),
78+
emitsThrough(matchesEvent(DwdsEventKind.debuggerReady, {})));
6579
await context.webDriver.driver.keyboard.sendChord([Keyboard.alt, 'd']);
6680
await events;
67-
},
68-
skip:
69-
'https://github.com/dart-lang/webdev/issues/1406'); // Not implemented yet.
81+
}, skip: 'https://github.com/dart-lang/webdev/issues/1406');
7082

7183
test('events can be listened to multiple times', () async {
7284
context.testServer.dwds.events.listen((_) {});
7385
context.testServer.dwds.events.listen((_) {});
7486
});
7587

7688
test('can emit event through service extension', () async {
77-
var events = expectLater(
78-
context.testServer.dwds.events,
79-
emitsThrough(predicate((DwdsEvent event) =>
80-
event.type == 'foo-event' && event.payload['data'] == 1234)));
81-
89+
var events = expectLater(pipe(context.testServer.dwds.events),
90+
emitsThrough(matchesEvent('foo-event', {'data': 1234})));
8291
var response = await context.debugConnection.vmService
8392
.callServiceExtension('ext.dwds.emitEvent', args: {
8493
'type': 'foo-event',
@@ -90,11 +99,10 @@ void main() {
9099

91100
test('can receive DevtoolsEvent and emit DEBUGGER_READY event', () async {
92101
var events = expectLater(
93-
context.testServer.dwds.events,
94-
emitsThrough(predicate((DwdsEvent event) =>
95-
event.type == DwdsEventKind.debuggerReady &&
96-
event.payload['elapsedMilliseconds'] != null)));
97-
102+
pipe(context.testServer.dwds.events),
103+
emitsThrough(matchesEvent(DwdsEventKind.debuggerReady, {
104+
'elapsedMilliseconds': isNotNull,
105+
})));
98106
var response = await context.debugConnection.vmService
99107
.callServiceExtension('ext.dwds.sendEvent', args: {
100108
'type': 'DevtoolsEvent',
@@ -122,14 +130,12 @@ void main() {
122130
test('emits EVALUATE events on evaluation success', () async {
123131
var expression = "helloString('world')";
124132
var events = expectLater(
125-
context.testServer.dwds.events,
126-
emitsThrough(predicate((DwdsEvent event) =>
127-
event.type == DwdsEventKind.evaluate &&
128-
event.payload['expression'] == expression &&
129-
event.payload['success'] == true &&
130-
event.payload['error'] == null &&
131-
event.payload['exception'] == null &&
132-
event.payload['elapsedMilliseconds'] != null)));
133+
pipe(context.testServer.dwds.events),
134+
emitsThrough(matchesEvent(DwdsEventKind.evaluate, {
135+
'expression': expression,
136+
'success': isTrue,
137+
'elapsedMilliseconds': isNotNull,
138+
})));
133139
await service.evaluate(
134140
isolate.id,
135141
bootstrap.id,
@@ -145,14 +151,13 @@ void main() {
145151
test('emits EVALUATE events on evaluation failure', () async {
146152
var expression = 'some-bad-expression';
147153
var events = expectLater(
148-
context.testServer.dwds.events,
149-
emitsThrough(predicate((DwdsEvent event) =>
150-
event.type == DwdsEventKind.evaluate &&
151-
event.payload['expression'] == expression &&
152-
event.payload['success'] == false &&
153-
event.payload['error'] is ErrorRef &&
154-
event.payload['exception'] == null &&
155-
event.payload['elapsedMilliseconds'] != null)));
154+
pipe(context.testServer.dwds.events),
155+
emitsThrough(matchesEvent(DwdsEventKind.evaluate, {
156+
'expression': expression,
157+
'success': isFalse,
158+
'error': isA<ErrorRef>(),
159+
'elapsedMilliseconds': isNotNull,
160+
})));
156161
await service.evaluate(
157162
isolate.id,
158163
bootstrap.id,
@@ -185,22 +190,21 @@ void main() {
185190
});
186191

187192
test('emits EVALUATE_IN_FRAME events on RPC error', () async {
193+
var expression = 'some-bad-expression';
188194
var events = expectLater(
189-
context.testServer.dwds.events,
190-
emitsThrough(predicate((DwdsEvent event) =>
191-
event.type == DwdsEventKind.evaluateInFrame &&
192-
event.payload['success'] == false &&
193-
event.payload['error'] == null &&
194-
event.payload['elapsedMilliseconds'] != null &&
195-
event.payload['exception'] is RPCError &&
196-
(event.payload['exception'] as RPCError)
197-
.message
198-
.contains('program is not paused'))));
195+
pipe(context.testServer.dwds.events),
196+
emitsThrough(matchesEvent(DwdsEventKind.evaluateInFrame, {
197+
'expression': expression,
198+
'success': isFalse,
199+
'exception': isA<RPCError>().having(
200+
(e) => e.message, 'message', contains('program is not paused')),
201+
'elapsedMilliseconds': isNotNull,
202+
})));
199203
try {
200204
await service.evaluateInFrame(
201205
isolateId,
202206
0,
203-
'some-bad-expression',
207+
expression,
204208
);
205209
} catch (_) {}
206210
await events;
@@ -216,19 +220,20 @@ void main() {
216220

217221
// Evaluation succeeds and return ErrorRef containing compilation error,
218222
// so event is marked as success.
223+
var expression = 'some-bad-expression';
219224
var events = expectLater(
220-
context.testServer.dwds.events,
221-
emitsThrough(predicate((DwdsEvent event) =>
222-
event.type == DwdsEventKind.evaluateInFrame &&
223-
event.payload['success'] == false &&
224-
event.payload['error'] is ErrorRef &&
225-
event.payload['exception'] == null &&
226-
event.payload['elapsedMilliseconds'] != null)));
225+
pipe(context.testServer.dwds.events),
226+
emitsThrough(matchesEvent(DwdsEventKind.evaluateInFrame, {
227+
'expression': expression,
228+
'success': isFalse,
229+
'error': isA<ErrorRef>(),
230+
'elapsedMilliseconds': isNotNull,
231+
})));
227232
try {
228233
await service.evaluateInFrame(
229234
isolateId,
230235
0,
231-
'some-bad-expression',
236+
expression,
232237
);
233238
} catch (_) {
234239
} finally {
@@ -249,13 +254,12 @@ void main() {
249254
// Evaluation succeeds and return InstanceRef,
250255
// so event is marked as success.
251256
var events = expectLater(
252-
context.testServer.dwds.events,
253-
emitsThrough(predicate((DwdsEvent event) =>
254-
event.type == DwdsEventKind.evaluateInFrame &&
255-
event.payload['success'] == true &&
256-
event.payload['error'] == null &&
257-
event.payload['exception'] == null &&
258-
event.payload['elapsedMilliseconds'] != null)));
257+
pipe(context.testServer.dwds.events),
258+
emitsThrough(matchesEvent(DwdsEventKind.evaluateInFrame, {
259+
'expression': 'true',
260+
'success': isTrue,
261+
'elapsedMilliseconds': isNotNull,
262+
})));
259263
try {
260264
await service.evaluateInFrame(
261265
isolateId,
@@ -288,12 +292,10 @@ void main() {
288292

289293
test('emits GET_SOURCE_REPORT events', () async {
290294
var events = expectLater(
291-
context.testServer.dwds.events,
292-
emitsThrough(
293-
predicate((DwdsEvent event) =>
294-
event.type == DwdsEventKind.getSourceReport &&
295-
event.payload['elapsedMilliseconds'] != null),
296-
));
295+
pipe(context.testServer.dwds.events),
296+
emitsThrough(matchesEvent(DwdsEventKind.getSourceReport, {
297+
'elapsedMilliseconds': isNotNull,
298+
})));
297299
await service.getSourceReport(
298300
isolateId, [SourceReportKind.kPossibleBreakpoints],
299301
scriptId: mainScript.id);
@@ -312,10 +314,10 @@ void main() {
312314

313315
test('emits GET_SCRIPTS events', () async {
314316
var events = expectLater(
315-
context.testServer.dwds.events,
316-
emitsThrough(predicate((DwdsEvent event) =>
317-
event.type == DwdsEventKind.getScripts &&
318-
event.payload['elapsedMilliseconds'] != null)));
317+
pipe(context.testServer.dwds.events),
318+
emitsThrough(matchesEvent(DwdsEventKind.getScripts, {
319+
'elapsedMilliseconds': isNotNull,
320+
})));
319321
await service.getScripts(isolateId);
320322
await events;
321323
});
@@ -332,10 +334,10 @@ void main() {
332334

333335
test('emits GET_ISOLATE events', () async {
334336
var events = expectLater(
335-
context.testServer.dwds.events,
336-
emitsThrough(predicate((DwdsEvent event) =>
337-
event.type == DwdsEventKind.getIsolate &&
338-
event.payload['elapsedMilliseconds'] != null)));
337+
pipe(context.testServer.dwds.events),
338+
emitsThrough(matchesEvent(DwdsEventKind.getIsolate, {
339+
'elapsedMilliseconds': isNotNull,
340+
})));
339341
await service.getIsolate(isolateId);
340342
await events;
341343
});
@@ -348,10 +350,10 @@ void main() {
348350

349351
test('emits GET_VM events', () async {
350352
var events = expectLater(
351-
context.testServer.dwds.events,
352-
emitsThrough(predicate((DwdsEvent event) =>
353-
event.type == DwdsEventKind.getVM &&
354-
event.payload['elapsedMilliseconds'] != null)));
353+
pipe(context.testServer.dwds.events),
354+
emitsThrough(matchesEvent(DwdsEventKind.getVM, {
355+
'elapsedMilliseconds': isNotNull,
356+
})));
355357
await service.getVM();
356358
await events;
357359
});
@@ -388,10 +390,11 @@ void main() {
388390

389391
test('emits RESUME events', () async {
390392
var events = expectLater(
391-
context.testServer.dwds.events,
392-
emitsThrough(predicate((DwdsEvent event) =>
393-
event.type == DwdsEventKind.resume &&
394-
event.payload['elapsedMilliseconds'] != null)));
393+
pipe(context.testServer.dwds.events),
394+
emitsThrough(matchesEvent(DwdsEventKind.resume, {
395+
'step': 'Into',
396+
'elapsedMilliseconds': isNotNull,
397+
})));
395398
await service.resume(isolateId, step: 'Into');
396399
await events;
397400
});

0 commit comments

Comments
 (0)