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

Side by Side Diff: lib/src/runner/reporter/compact.dart

Issue 1212313005: Continuously update the compact reporter's clock. (Closed) Base URL: git@github.com:dart-lang/test@master
Patch Set: Created 5 years, 5 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
« no previous file with comments | « no previous file | test/runner/compact_reporter_test.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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.runner.reporter.compact; 5 library test.runner.reporter.compact;
6 6
7 import 'dart:async';
7 import 'dart:io'; 8 import 'dart:io';
8 import 'dart:isolate'; 9 import 'dart:isolate';
9 10
10 import '../../backend/live_test.dart'; 11 import '../../backend/live_test.dart';
11 import '../../backend/state.dart'; 12 import '../../backend/state.dart';
12 import '../../utils.dart'; 13 import '../../utils.dart';
13 import '../engine.dart'; 14 import '../engine.dart';
14 import '../load_exception.dart'; 15 import '../load_exception.dart';
15 import '../load_suite.dart'; 16 import '../load_suite.dart';
16 17
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
57 58
58 /// Whether the path to each test's suite should be printed. 59 /// Whether the path to each test's suite should be printed.
59 final bool _printPath; 60 final bool _printPath;
60 61
61 /// Whether the platform each test is running on should be printed. 62 /// Whether the platform each test is running on should be printed.
62 final bool _printPlatform; 63 final bool _printPlatform;
63 64
64 /// A stopwatch that tracks the duration of the full run. 65 /// A stopwatch that tracks the duration of the full run.
65 final _stopwatch = new Stopwatch(); 66 final _stopwatch = new Stopwatch();
66 67
68 /// A timer that triggers printing updated time information.
69 Timer _timer;
70
67 /// The size of `_engine.passed` last time a progress notification was 71 /// The size of `_engine.passed` last time a progress notification was
68 /// printed. 72 /// printed.
69 int _lastProgressPassed; 73 int _lastProgressPassed;
70 74
71 /// The size of `_engine.skipped` last time a progress notification was printe d. 75 /// The size of `_engine.skipped` last time a progress notification was printe d.
72 int _lastProgressSkipped; 76 int _lastProgressSkipped;
73 77
74 /// The size of `_engine.failed` last time a progress notification was 78 /// The size of `_engine.failed` last time a progress notification was
75 /// printed. 79 /// printed.
76 int _lastProgressFailed; 80 int _lastProgressFailed;
77 81
82 /// The duration of the test run in seconds last time a progress notification
83 /// was printed.
84 int _lastProgressElapsed;
85
78 /// The message printed for the last progress notification. 86 /// The message printed for the last progress notification.
79 String _lastProgressMessage; 87 String _lastProgressMessage;
80 88
81 // Whether a newline has been printed since the last progress line. 89 // Whether a newline has been printed since the last progress line.
82 var _printedNewline = true; 90 var _printedNewline = true;
83 91
84 /// Watches the tests run by [engine] and prints their results to the 92 /// Watches the tests run by [engine] and prints their results to the
85 /// terminal. 93 /// terminal.
86 /// 94 ///
87 /// If [color] is `true`, this will use terminal colors; if it's `false`, it 95 /// If [color] is `true`, this will use terminal colors; if it's `false`, it
(...skipping 22 matching lines...) Expand all
110 _yellow = color ? '\u001b[33m' : '', 118 _yellow = color ? '\u001b[33m' : '',
111 _gray = color ? '\u001b[1;30m' : '', 119 _gray = color ? '\u001b[1;30m' : '',
112 _bold = color ? '\u001b[1m' : '', 120 _bold = color ? '\u001b[1m' : '',
113 _noColor = color ? '\u001b[0m' : '' { 121 _noColor = color ? '\u001b[0m' : '' {
114 _engine.onTestStarted.listen(_onTestStarted); 122 _engine.onTestStarted.listen(_onTestStarted);
115 _engine.success.then(_onDone); 123 _engine.success.then(_onDone);
116 } 124 }
117 125
118 /// A callback called when the engine begins running [liveTest]. 126 /// A callback called when the engine begins running [liveTest].
119 void _onTestStarted(LiveTest liveTest) { 127 void _onTestStarted(LiveTest liveTest) {
120 if (!_stopwatch.isRunning) _stopwatch.start(); 128 if (_timer == null) {
129 _stopwatch.start();
130 /// Keep updating the time even when nothing else is happening.
131 _timer = new Timer.periodic(new Duration(seconds: 1),
132 (_) => _progressLine(_lastProgressMessage));
133 }
121 134
122 // If this is the first test to start, print a progress line so the user 135 // If this is the first test to start, print a progress line so the user
123 // knows what's running. It's possible that the active test may not be 136 // knows what's running. It's possible that the active test may not be
124 // [liveTest] because the engine doesn't always surface load tests. 137 // [liveTest] because the engine doesn't always surface load tests.
125 if (_engine.active.length == 1 && _engine.active.first == liveTest) { 138 if (_engine.active.length == 1 && _engine.active.first == liveTest) {
126 _progressLine(_description(liveTest)); 139 _progressLine(_description(liveTest));
127 } 140 }
128 _printedNewline = false; 141 _printedNewline = false;
129 142
130 liveTest.onStateChange.listen((state) => _onStateChange(liveTest, state)); 143 liveTest.onStateChange.listen((state) => _onStateChange(liveTest, state));
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
188 error.innerError is! String) { 201 error.innerError is! String) {
189 print(indent(terseChain(stackTrace).toString())); 202 print(indent(terseChain(stackTrace).toString()));
190 } 203 }
191 } 204 }
192 205
193 /// A callback called when the engine is finished running tests. 206 /// A callback called when the engine is finished running tests.
194 /// 207 ///
195 /// [success] will be `true` if all tests passed, `false` if some tests 208 /// [success] will be `true` if all tests passed, `false` if some tests
196 /// failed, and `null` if the engine was closed prematurely. 209 /// failed, and `null` if the engine was closed prematurely.
197 void _onDone(bool success) { 210 void _onDone(bool success) {
211 _timer.cancel();
212 _timer = null;
213 _stopwatch.stop();
214
198 // A null success value indicates that the engine was closed before the 215 // A null success value indicates that the engine was closed before the
199 // tests finished running, probably because of a signal from the user. We 216 // tests finished running, probably because of a signal from the user. We
200 // shouldn't print summary information, we should just make sure the 217 // shouldn't print summary information, we should just make sure the
201 // terminal cursor is on its own line. 218 // terminal cursor is on its own line.
202 if (success == null) { 219 if (success == null) {
203 if (!_printedNewline) print(""); 220 if (!_printedNewline) print("");
204 _printedNewline = true; 221 _printedNewline = true;
205 return; 222 return;
206 } 223 }
207 224
(...skipping 16 matching lines...) Expand all
224 print(''); 241 print('');
225 } 242 }
226 } 243 }
227 244
228 /// Prints a line representing the current state of the tests. 245 /// Prints a line representing the current state of the tests.
229 /// 246 ///
230 /// [message] goes after the progress report, and may be truncated to fit the 247 /// [message] goes after the progress report, and may be truncated to fit the
231 /// entire line within [_lineLength]. If [color] is passed, it's used as the 248 /// entire line within [_lineLength]. If [color] is passed, it's used as the
232 /// color for [message]. 249 /// color for [message].
233 bool _progressLine(String message, {String color}) { 250 bool _progressLine(String message, {String color}) {
251 var elapsed = _stopwatch.elapsed.inSeconds;
252
234 // Print nothing if nothing has changed since the last progress line. 253 // Print nothing if nothing has changed since the last progress line.
235 if (_engine.passed.length == _lastProgressPassed && 254 if (_engine.passed.length == _lastProgressPassed &&
236 _engine.skipped.length == _lastProgressSkipped && 255 _engine.skipped.length == _lastProgressSkipped &&
237 _engine.failed.length == _lastProgressFailed && 256 _engine.failed.length == _lastProgressFailed &&
257 elapsed == _lastProgressElapsed &&
238 message == _lastProgressMessage) { 258 message == _lastProgressMessage) {
239 return false; 259 return false;
240 } 260 }
241 261
242 _lastProgressPassed = _engine.passed.length; 262 _lastProgressPassed = _engine.passed.length;
243 _lastProgressSkipped = _engine.skipped.length; 263 _lastProgressSkipped = _engine.skipped.length;
244 _lastProgressFailed = _engine.failed.length; 264 _lastProgressFailed = _engine.failed.length;
265 _lastProgressElapsed = elapsed;
245 _lastProgressMessage = message; 266 _lastProgressMessage = message;
246 267
247 if (color == null) color = ''; 268 if (color == null) color = '';
248 var duration = _stopwatch.elapsed; 269 var duration = _stopwatch.elapsed;
249 var buffer = new StringBuffer(); 270 var buffer = new StringBuffer();
250 271
251 // \r moves back to the beginning of the current line. 272 // \r moves back to the beginning of the current line.
252 buffer.write('\r${_timeString(duration)} '); 273 buffer.write('\r${_timeString(duration)} ');
253 buffer.write(_green); 274 buffer.write(_green);
254 buffer.write('+'); 275 buffer.write('+');
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
304 325
305 if (_printPlatform && liveTest.suite.platform != null) { 326 if (_printPlatform && liveTest.suite.platform != null) {
306 name = "[${liveTest.suite.platform}] $name"; 327 name = "[${liveTest.suite.platform}] $name";
307 } 328 }
308 329
309 if (liveTest.suite is LoadSuite) name = "$_bold$_gray$name$_noColor"; 330 if (liveTest.suite is LoadSuite) name = "$_bold$_gray$name$_noColor";
310 331
311 return name; 332 return name;
312 } 333 }
313 } 334 }
OLDNEW
« no previous file with comments | « no previous file | test/runner/compact_reporter_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698