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

Unified Diff: test/watcher_test.dart

Issue 5885170347409408: Add location information to watchers to make them more debuggable. (Closed) Base URL: git@github.com:dart-lang/web-ui.git@master
Patch Set: Created 7 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « pubspec.yaml ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: test/watcher_test.dart
diff --git a/test/watcher_test.dart b/test/watcher_test.dart
index 111f211bc582e3a020448d7016235235a2286213..4290fc835935b93b81e2a263c42327295ed86963 100644
--- a/test/watcher_test.dart
+++ b/test/watcher_test.dart
@@ -9,6 +9,8 @@ import 'dart:collection';
import 'package:unittest/compact_vm_config.dart';
import 'package:unittest/unittest.dart';
import 'package:web_ui/watcher.dart';
+import 'package:logging/logging.dart';
+import 'package:stack_trace/stack_trace.dart';
main() {
useCompactVMConfiguration();
@@ -104,6 +106,120 @@ main() {
expect(newValue, 14);
stop();
});
+
+ test('loop is detected', () {
+ int x = 0;
+ var oldValue;
+ var newValue;
+ var stop = watch(() => x, expectAsync1((e) {
+ x++;
+ oldValue = e.oldValue;
+ newValue = e.newValue;
+ }, count: maxNumIterations));
+ var subscription = Logger.root.onRecord.listen(expectAsync1((record) {
+ expect(record.message, startsWith('Possible loop in watchers'));
+ }));
+ x = 1;
+ dispatch();
+ expect(oldValue, maxNumIterations - 1);
+ expect(newValue, maxNumIterations);
+ stop();
+ subscription.cancel();
+ });
+
+ group('loops can be debugged', () {
+ var messages;
+ var subscription;
+ setUp(() {
+ verboseDebugMessages = true;
+ messages = [];
+ subscription = Logger.root.onRecord.listen((record) {
+ messages.add(record.message);
+ });
+ });
+
+ tearDown(() {
+ subscription.cancel();
+ verboseDebugMessages = false;
+ });
+
+ test('no debug name', () {
+ int x = 0;
+ var oldValue;
+ var newValue;
+ // Note: the next line number (151) is recorded in the debug messages
+ var stop = watch(() => x, expectAsync1((e) {
+ x++;
+ oldValue = e.oldValue;
+ newValue = e.newValue;
+ }, count: maxNumIterations));
+ x = 1;
+ dispatch();
+ expect(oldValue, maxNumIterations - 1);
+ expect(newValue, maxNumIterations);
+ expect(messages.length, maxNumIterations + 1);
+
+ // First message contains details of the definition of a callback:
+ var first = messages.first;
+ expect(first, contains('defined at'));
+ expect(first, contains('watcher_test.dart:151:25'));
+
+ // The id is based on some global numbering, read the id, and see that
+ // it is mentioned on every other message:
+ var regExp = new RegExp('(\\(id: #[0-9]*\\))');
+ var match = regExp.firstMatch(first);
+ expect(match, isNotNull);
+ var id = match.group(1);
+ for (int i = 1; i < maxNumIterations - 1; i++) {
+ expect(messages[i], 'watcher updated: <unnamed> $id');
+ }
+ expect(messages.last, startsWith('Possible loop in watchers'));
+ stop();
+ });
+
+ test('debug name provided', () {
+ readCurrentStackTrace = () {
+ try { throw "" ; } catch (e, trace) {
+ return new Trace.from(trace).terse.toString();
+ }
+ };
+ var messages = [];
+ var subscription = Logger.root.onRecord.listen((record) {
+ messages.add(record.message);
+ });
+ int x = 0;
+ var oldValue;
+ var newValue;
+ // Note: the next line number (194) is recorded in the debug messages
+ var stop = watch(() => x, expectAsync1((e) {
+ x++;
+ oldValue = e.oldValue;
+ newValue = e.newValue;
+ }, count: maxNumIterations), 'my-debug-name');
+ x = 1;
+ dispatch();
+ expect(oldValue, maxNumIterations - 1);
+ expect(newValue, maxNumIterations);
+ expect(messages.length, maxNumIterations + 1);
+
+ // First message contains details of the definition of a callback:
+ var first = messages.first;
+ expect(first, contains('defined at'));
+ expect(first, contains('watcher_test.dart 194:25'));
+
+ // The id is based on some global numbering, read the id, and see that
+ // it is mentioned on every other message:
+ var regExp = new RegExp('my-debug-name (\\(id: #[0-9]*\\))');
+ var match = regExp.firstMatch(first);
+ expect(match, isNotNull);
+ var id = match.group(1);
+ for (int i = 1; i < maxNumIterations - 1; i++) {
+ expect(messages[i], 'watcher updated: my-debug-name $id');
+ }
+ expect(messages.last, startsWith('Possible loop in watchers'));
+ stop();
+ });
+ });
});
group('fields', () {
« no previous file with comments | « pubspec.yaml ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698