error_reporting_test.dart 11.9 KB
Newer Older
1 2 3 4 5 6 7
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'dart:async';

import 'package:flutter/foundation.dart';
8
import '../flutter_test_alternative.dart';
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37

dynamic getAssertionErrorWithMessage() {
  try {
    assert(false, 'Message goes here.');
  } catch (e) {
    return e;
  }
  throw 'assert failed';
}

dynamic getAssertionErrorWithoutMessage() {
  try {
    assert(false);
  } catch (e) {
    return e;
  }
  throw 'assert failed';
}

dynamic getAssertionErrorWithLongMessage() {
  try {
    assert(false, 'word ' * 100);
  } catch (e) {
    return e;
  }
  throw 'assert failed';
}

Future<StackTrace> getSampleStack() async {
38
  return await Future<StackTrace>.sync(() => StackTrace.current);
39 40
}

41
Future<void> main() async {
42 43 44 45 46 47 48 49 50 51 52 53 54
  final List<String> console = <String>[];

  final StackTrace sampleStack = await getSampleStack();

  test('Error reporting - pretest', () async {
    expect(debugPrint, equals(debugPrintThrottled));
    debugPrint = (String message, { int wrapWidth }) {
      console.add(message);
    };
  });

  test('Error reporting - assert with message', () async {
    expect(console, isEmpty);
55
    FlutterError.dumpErrorToConsole(FlutterErrorDetails(
56 57 58 59 60 61 62 63 64
      exception: getAssertionErrorWithMessage(),
      stack: sampleStack,
      library: 'error handling test',
      context: 'testing the error handling logic',
      informationCollector: (StringBuffer information) {
        information.writeln('line 1 of extra information');
        information.writeln('line 2 of extra information\n'); // the double trailing newlines here are intentional
      },
    ));
65
    expect(console.join('\n'), matches(
66 67 68
      '^══╡ EXCEPTION CAUGHT BY ERROR HANDLING TEST ╞═══════════════════════════════════════════════════════\n'
      'The following assertion was thrown testing the error handling logic:\n'
      'Message goes here\\.\n'
69
      '\'[^\']+flutter/test/foundation/error_reporting_test\\.dart\': Failed assertion: line [0-9]+ pos [0-9]+: \'false\'\n'
70 71 72 73
      '\n'
      'Either the assertion indicates an error in the framework itself, or we should provide substantially '
      'more information in this error message to help you determine and fix the underlying cause\\.\n'
      'In either case, please report this assertion by filing a bug on GitHub:\n'
74
      '  https://github\\.com/flutter/flutter/issues/new\\?template=BUG\\.md\n'
75 76
      '\n'
      'When the exception was thrown, this was the stack:\n'
77 78
      '#0      getSampleStack\\.<anonymous closure> \\([^)]+flutter/test/foundation/error_reporting_test\\.dart:[0-9]+:[0-9]+\\)\n'
      '#2      getSampleStack \\([^)]+flutter/test/foundation/error_reporting_test\\.dart:[0-9]+:[0-9]+\\)\n'
79
      '<asynchronous suspension>\n' // TODO(ianh): https://github.com/flutter/flutter/issues/4021
80
      '#3      main \\([^)]+flutter/test/foundation/error_reporting_test\\.dart:[0-9]+:[0-9]+\\)\n'
81 82 83 84 85 86
      '(.+\n)+' // TODO(ianh): when fixing #4021, also filter out frames from the test infrastructure below the first call to our main()
      '\\(elided [0-9]+ frames from package dart:async\\)\n'
      '\n'
      'line 1 of extra information\n'
      'line 2 of extra information\n'
      '════════════════════════════════════════════════════════════════════════════════════════════════════\$',
87
    ));
88
    console.clear();
89
    FlutterError.dumpErrorToConsole(FlutterErrorDetails(
90 91 92 93 94 95 96 97 98
      exception: getAssertionErrorWithMessage(),
    ));
    expect(console.join('\n'), 'Another exception was thrown: Message goes here.');
    console.clear();
    FlutterError.resetErrorCount();
  });

  test('Error reporting - assert with long message', () async {
    expect(console, isEmpty);
99
    FlutterError.dumpErrorToConsole(FlutterErrorDetails(
100 101
      exception: getAssertionErrorWithLongMessage(),
    ));
102
    expect(console.join('\n'), matches(
103 104 105 106 107 108 109
      '^══╡ EXCEPTION CAUGHT BY FLUTTER FRAMEWORK ╞═════════════════════════════════════════════════════════\n'
      'The following assertion was thrown:\n'
      'word word word word word word word word word word word word word word word word word word word word '
      'word word word word word word word word word word word word word word word word word word word word '
      'word word word word word word word word word word word word word word word word word word word word '
      'word word word word word word word word word word word word word word word word word word word word '
      'word word word word word word word word word word word word word word word word word word word word\n'
110
      '\'[^\']+flutter/test/foundation/error_reporting_test\\.dart\': Failed assertion: line [0-9]+ pos [0-9]+: \'false\'\n'
111 112 113 114
      '\n'
      'Either the assertion indicates an error in the framework itself, or we should provide substantially '
      'more information in this error message to help you determine and fix the underlying cause\\.\n'
      'In either case, please report this assertion by filing a bug on GitHub:\n'
115
      '  https://github\\.com/flutter/flutter/issues/new\\?template=BUG\\.md\n'
116
      '════════════════════════════════════════════════════════════════════════════════════════════════════\$',
117
    ));
118
    console.clear();
119
    FlutterError.dumpErrorToConsole(FlutterErrorDetails(
120 121 122 123 124 125 126 127 128
      exception: getAssertionErrorWithLongMessage(),
    ));
    expect(
      console.join('\n'),
      'Another exception was thrown: '
      'word word word word word word word word word word word word word word word word word word word word '
      'word word word word word word word word word word word word word word word word word word word word '
      'word word word word word word word word word word word word word word word word word word word word '
      'word word word word word word word word word word word word word word word word word word word word '
129
      'word word word word word word word word word word word word word word word word word word word word',
130 131 132 133 134 135 136
    );
    console.clear();
    FlutterError.resetErrorCount();
  });

  test('Error reporting - assert with no message', () async {
    expect(console, isEmpty);
137
    FlutterError.dumpErrorToConsole(FlutterErrorDetails(
138 139 140 141 142 143 144 145 146
      exception: getAssertionErrorWithoutMessage(),
      stack: sampleStack,
      library: 'error handling test',
      context: 'testing the error handling logic',
      informationCollector: (StringBuffer information) {
        information.writeln('line 1 of extra information');
        information.writeln('line 2 of extra information\n'); // the double trailing newlines here are intentional
      },
    ));
147
    expect(console.join('\n'), matches(
148 149
      '^══╡ EXCEPTION CAUGHT BY ERROR HANDLING TEST ╞═══════════════════════════════════════════════════════\n'
      'The following assertion was thrown testing the error handling logic:\n'
150
      '\'[^\']+flutter/test/foundation/error_reporting_test\\.dart\': Failed assertion: line [0-9]+ pos [0-9]+: \'false\': is not true\\.\n'
151 152 153 154
      '\n'
      'Either the assertion indicates an error in the framework itself, or we should provide substantially '
      'more information in this error message to help you determine and fix the underlying cause\\.\n'
      'In either case, please report this assertion by filing a bug on GitHub:\n'
155
      '  https://github\\.com/flutter/flutter/issues/new\\?template=BUG\\.md\n'
156 157
      '\n'
      'When the exception was thrown, this was the stack:\n'
158 159
      '#0      getSampleStack\\.<anonymous closure> \\([^)]+flutter/test/foundation/error_reporting_test\\.dart:[0-9]+:[0-9]+\\)\n'
      '#2      getSampleStack \\([^)]+flutter/test/foundation/error_reporting_test\\.dart:[0-9]+:[0-9]+\\)\n'
160
      '<asynchronous suspension>\n' // TODO(ianh): https://github.com/flutter/flutter/issues/4021
161
      '#3      main \\([^)]+flutter/test/foundation/error_reporting_test\\.dart:[0-9]+:[0-9]+\\)\n'
162 163 164 165 166 167
      '(.+\n)+' // TODO(ianh): when fixing #4021, also filter out frames from the test infrastructure below the first call to our main()
      '\\(elided [0-9]+ frames from package dart:async\\)\n'
      '\n'
      'line 1 of extra information\n'
      'line 2 of extra information\n'
      '════════════════════════════════════════════════════════════════════════════════════════════════════\$',
168
    ));
169
    console.clear();
170
    FlutterError.dumpErrorToConsole(FlutterErrorDetails(
171 172
      exception: getAssertionErrorWithoutMessage(),
    ));
173
    expect(console.join('\n'), matches('Another exception was thrown: \'[^\']+flutter/test/foundation/error_reporting_test\\.dart\': Failed assertion: line [0-9]+ pos [0-9]+: \'false\': is not true\\.'));
174 175 176 177 178 179
    console.clear();
    FlutterError.resetErrorCount();
  });

  test('Error reporting - NoSuchMethodError', () async {
    expect(console, isEmpty);
180 181
    final dynamic exception = NoSuchMethodError(5, #foo, <dynamic>[2, 4], null); // ignore: deprecated_member_use
    FlutterError.dumpErrorToConsole(FlutterErrorDetails(
182 183
      exception: exception,
    ));
184
    expect(console.join('\n'), matches(
185 186 187 188 189
      '^══╡ EXCEPTION CAUGHT BY FLUTTER FRAMEWORK ╞═════════════════════════════════════════════════════════\n'
      'The following NoSuchMethodError was thrown:\n'
      'Receiver: 5\n'
      'Tried calling: foo = 2, 4\n'
      '════════════════════════════════════════════════════════════════════════════════════════════════════\$',
190
    ));
191
    console.clear();
192
    FlutterError.dumpErrorToConsole(FlutterErrorDetails(
193 194 195 196 197 198 199 200 201
      exception: exception,
    ));
    expect(console.join('\n'), 'Another exception was thrown: NoSuchMethodError: Receiver: 5');
    console.clear();
    FlutterError.resetErrorCount();
  });

  test('Error reporting - NoSuchMethodError', () async {
    expect(console, isEmpty);
202
    FlutterError.dumpErrorToConsole(const FlutterErrorDetails(
203 204
      exception: 'hello',
    ));
205
    expect(console.join('\n'), matches(
206 207 208 209
      '^══╡ EXCEPTION CAUGHT BY FLUTTER FRAMEWORK ╞═════════════════════════════════════════════════════════\n'
      'The following message was thrown:\n'
      'hello\n'
      '════════════════════════════════════════════════════════════════════════════════════════════════════\$',
210
    ));
211
    console.clear();
212
    FlutterError.dumpErrorToConsole(const FlutterErrorDetails(
213 214 215 216 217 218 219 220 221 222 223 224
      exception: 'hello again',
    ));
    expect(console.join('\n'), 'Another exception was thrown: hello again');
    console.clear();
    FlutterError.resetErrorCount();
  });

  test('Error reporting - posttest', () async {
    expect(console, isEmpty);
    debugPrint = debugPrintThrottled;
  });
}