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

Side by Side Diff: tests/compiler/dart2js/sourcemaps/stacktrace_test.dart

Issue 2510073002: Provide source map info for simple async methods. (Closed)
Patch Set: Created 4 years, 1 month 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 | « tests/compiler/dart2js/sourcemaps/sourcemap_html_helper.dart ('k') | no next file » | 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) 2016, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2016, 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 import 'dart:async'; 5 import 'dart:async';
6 import 'dart:convert'; 6 import 'dart:convert';
7 import 'dart:io'; 7 import 'dart:io';
8 8
9 import 'package:async_helper/async_helper.dart'; 9 import 'package:async_helper/async_helper.dart';
10 import 'package:compiler/compiler_new.dart'; 10 import 'package:compiler/compiler_new.dart';
11 import 'package:compiler/src/apiimpl.dart'; 11 import 'package:compiler/src/apiimpl.dart';
12 import 'package:compiler/src/commandline_options.dart'; 12 import 'package:compiler/src/commandline_options.dart';
13 import 'package:compiler/src/dart2js.dart' as entry; 13 import 'package:compiler/src/dart2js.dart' as entry;
14 import 'package:expect/expect.dart'; 14 import 'package:expect/expect.dart';
15 import 'package:source_maps/source_maps.dart'; 15 import 'package:source_maps/source_maps.dart';
16 import 'package:source_maps/src/utils.dart'; 16 import 'package:source_maps/src/utils.dart';
17 17
18 import '../source_map_validator_helper.dart'; 18 import '../source_map_validator_helper.dart';
19 19
20 const String EXCEPTION_MARKER = '>ExceptionMarker<'; 20 const String EXCEPTION_MARKER = '>ExceptionMarker<';
21 const String INPUT_FILE_NAME = 'in.dart'; 21 const String INPUT_FILE_NAME = 'in.dart';
22 22
23 const List<String> TESTS = const <String>[ 23 const List<String> TESTS = const <String>[
24 ''' 24 '''
25 main() { 25 main() {
26 @{1:main}throw '$EXCEPTION_MARKER'; 26 @{1:main}throw '$EXCEPTION_MARKER';
27 } 27 }
28 ''', 28 ''',
29 ''' 29 '''
30 import 'package:expect/expect.dart';
30 main() { 31 main() {
31 @{1:main}test(); 32 @{1:main}test();
32 } 33 }
34 @NoInline()
33 test() { 35 test() {
34 @{2:test}throw '$EXCEPTION_MARKER'; 36 @{2:test}throw '$EXCEPTION_MARKER';
35 } 37 }
36 ''', 38 ''',
37 ''' 39 '''
40 import 'package:expect/expect.dart';
38 main() { 41 main() {
39 @{1:main}Class.test(); 42 @{1:main}Class.test();
40 } 43 }
41 class Class { 44 class Class {
45 @NoInline()
42 static test() { 46 static test() {
43 @{2:Class.test}throw '$EXCEPTION_MARKER'; 47 @{2:Class.test}throw '$EXCEPTION_MARKER';
44 } 48 }
45 } 49 }
46 ''', 50 ''',
47 ''' 51 '''
52 import 'package:expect/expect.dart';
48 main() { 53 main() {
49 var c = new Class(); 54 var c = new Class();
50 c.@{1:main}test(); 55 c.@{1:main}test();
51 } 56 }
52 class Class { 57 class Class {
58 @NoInline()
53 test() { 59 test() {
54 @{2:Class.test}throw '$EXCEPTION_MARKER'; 60 @{2:Class.test}throw '$EXCEPTION_MARKER';
55 } 61 }
56 } 62 }
57 ''', 63 ''',
58 ''' 64 '''
59 import 'package:expect/expect.dart'; 65 import 'package:expect/expect.dart';
60 main() { 66 main() {
61 var c = @{1:main}new Class(); 67 var c = @{1:main}new Class();
62 } 68 }
63 class Class { 69 class Class {
64 @NoInline() 70 @NoInline()
65 Class() { 71 Class() {
66 @{2:Class}throw '$EXCEPTION_MARKER'; 72 @{2:Class}throw '$EXCEPTION_MARKER';
67 } 73 }
68 } 74 }
69 ''', 75 ''',
76 '''
77 import 'package:expect/expect.dart';
78 main() {
79 @{1:main}test();
80 }
81 @NoInline()
82 test() {
83 try {
84 @{2:test}throw '$EXCEPTION_MARKER';
85 } finally {
86 }
87 }
88 ''',
89 '''
90 import 'package:expect/expect.dart';
91 main() {
92 @{1:main}test();
93 }
94 @NoInline()
95 test() {
96 try {
97 @{2:test}throw '$EXCEPTION_MARKER';
98 } on Error catch (e) {
99 }
100 }
101 ''',
102 '''
103 import 'package:expect/expect.dart';
104 main() {
105 @{1:main}test();
106 }
107 @NoInline()
108 test() {
109 try {
110 @{2:test}throw '$EXCEPTION_MARKER';
111 } on String catch (e) {
112 rethrow;
113 }
114 }
115 ''',
116 '''
117 import 'package:expect/expect.dart';
118 main() {
119 test(); // This call is no longer on the stack when the error is thrown.
120 }
121 @NoInline()
122 test() async {
123 @{1:test}throw '$EXCEPTION_MARKER';
124 }
125 ''',
126 '''
127 import 'package:expect/expect.dart';
128 main() {
129 test1();
130 }
131 @NoInline()
132 test1() async {
133 // This call is no longer on the stack when the error is thrown.
Siggi Cherem (dart-lang) 2016/11/17 15:20:54 if you are relying on this, consider adding one ex
Johnni Winther 2016/11/18 08:22:08 I'd rather have the test fail if this changes. Hav
Siggi Cherem (dart-lang) 2016/11/18 15:31:38 At that point we would be only testing exceptions
Johnni Winther 2016/11/21 08:44:20 Yes. I realize that the test wouldn't break from s
134 await test2();
135 }
136 @NoInline()
137 test2() async {
138 @{1:test2}throw '$EXCEPTION_MARKER';
139 }
140 ''',
141 '''
142 import 'package:expect/expect.dart';
143 main() {
144 test1();
145 }
146 @NoInline()
147 test1() async {
148 @{1:test1}test2();
149 }
150 @NoInline()
151 test2() {
152 @{2:test2}throw '$EXCEPTION_MARKER';
153 }
154 ''',
70 ]; 155 ];
71 156
72 class Test { 157 class Test {
73 final String code; 158 final String code;
74 final List<StackTraceLine> expectedLines; 159 final List<StackTraceLine> expectedLines;
75 160
76 Test(this.code, this.expectedLines); 161 Test(this.code, this.expectedLines);
77 } 162 }
78 163
79 const int _LF = 0x0A; 164 const int _LF = 0x0A;
80 const int _CR = 0x0D; 165 const int _CR = 0x0D;
81 const int _LBRACE = 0x7B; 166 const int _LBRACE = 0x7B;
82 167
83
84 Test processTestCode(String code) { 168 Test processTestCode(String code) {
85 StringBuffer codeBuffer = new StringBuffer(); 169 StringBuffer codeBuffer = new StringBuffer();
86 Map<int, StackTraceLine> stackTraceMap = <int, StackTraceLine>{}; 170 Map<int, StackTraceLine> stackTraceMap = <int, StackTraceLine>{};
87 int index = 0; 171 int index = 0;
88 int lineNo = 1; 172 int lineNo = 1;
89 int columnNo = 1; 173 int columnNo = 1;
90 while (index < code.length) { 174 while (index < code.length) {
91 int charCode = code.codeUnitAt(index); 175 int charCode = code.codeUnitAt(index);
92 switch (charCode) { 176 switch (charCode) {
93 case _LF: 177 case _LF:
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
128 List<StackTraceLine> expectedLines = <StackTraceLine>[]; 212 List<StackTraceLine> expectedLines = <StackTraceLine>[];
129 for (int stackTraceIndex in (stackTraceMap.keys.toList()..sort()).reversed) { 213 for (int stackTraceIndex in (stackTraceMap.keys.toList()..sort()).reversed) {
130 expectedLines.add(stackTraceMap[stackTraceIndex]); 214 expectedLines.add(stackTraceMap[stackTraceIndex]);
131 } 215 }
132 return new Test(codeBuffer.toString(), expectedLines); 216 return new Test(codeBuffer.toString(), expectedLines);
133 } 217 }
134 218
135 void main(List<String> arguments) { 219 void main(List<String> arguments) {
136 asyncTest(() async { 220 asyncTest(() async {
137 for (String code in TESTS) { 221 for (String code in TESTS) {
138 await runTest(processTestCode(code)); 222 await runTest(processTestCode(code), verbose: arguments.contains('-v'));
139 } 223 }
140 }); 224 });
141 } 225 }
142 226
143 Future runTest(Test test) async { 227 Future runTest(Test test, {bool verbose: false}) async {
144 Directory tmpDir = await createTempDir(); 228 Directory tmpDir = await createTempDir();
145 String input = '${tmpDir.path}/$INPUT_FILE_NAME'; 229 String input = '${tmpDir.path}/$INPUT_FILE_NAME';
146 new File(input).writeAsStringSync(test.code); 230 new File(input).writeAsStringSync(test.code);
147 String output = '${tmpDir.path}/out.js'; 231 String output = '${tmpDir.path}/out.js';
148 List<String> arguments = [ 232 List<String> arguments = [
149 '-o$output', 233 '-o$output',
150 '--library-root=sdk', 234 '--library-root=sdk',
151 '--packages=${Platform.packageConfig}', 235 '--packages=${Platform.packageConfig}',
152 Flags.useNewSourceInfo, 236 Flags.useNewSourceInfo,
153 input, 237 input,
154 ]; 238 ];
155 print("--------------------------------------------------------------------"); 239 print("--------------------------------------------------------------------");
156 print("Compiling dart2js ${arguments.join(' ')}\n${test.code}"); 240 print("Compiling dart2js ${arguments.join(' ')}\n${test.code}");
157 CompilationResult compilationResult = await entry.internalMain(arguments); 241 CompilationResult compilationResult = await entry.internalMain(arguments);
158 Expect.isTrue(compilationResult.isSuccess, 242 Expect.isTrue(compilationResult.isSuccess,
159 "Unsuccessful compilation of test:\n${test.code}"); 243 "Unsuccessful compilation of test:\n${test.code}");
160 CompilerImpl compiler = compilationResult.compiler; 244 CompilerImpl compiler = compilationResult.compiler;
161 SingleMapping sourceMap = new SingleMapping.fromJson( 245 SingleMapping sourceMap = new SingleMapping.fromJson(
162 JSON.decode(new File('$output.map').readAsStringSync())); 246 JSON.decode(new File('$output.map').readAsStringSync()));
163 247
164 print("Running d8 $output"); 248 print("Running d8 $output");
165 ProcessResult runResult = 249 ProcessResult runResult = Process.runSync(d8executable,
166 Process.runSync(d8executable, [output]); 250 ['sdk/lib/_internal/js_runtime/lib/preambles/d8.js', output]);
167 String out = '${runResult.stderr}\n${runResult.stdout}'; 251 String out = '${runResult.stderr}\n${runResult.stdout}';
252 if (verbose) {
253 print('d8 output:');
254 print(out);
255 }
168 List<String> lines = out.split(new RegExp(r'(\r|\n|\r\n)')); 256 List<String> lines = out.split(new RegExp(r'(\r|\n|\r\n)'));
169 List<StackTraceLine> jsStackTrace = <StackTraceLine>[]; 257 List<StackTraceLine> jsStackTrace = <StackTraceLine>[];
170 bool seenMarker = false; 258 bool seenMarker = false;
171 for (String line in lines) { 259 for (String line in lines) {
172 if (seenMarker) { 260 if (seenMarker) {
173 line = line.trim(); 261 line = line.trim();
174 if (line.startsWith('at ')) { 262 if (line.startsWith('at ')) {
175 jsStackTrace.add(new StackTraceLine.fromText(line)); 263 jsStackTrace.add(new StackTraceLine.fromText(line));
176 } 264 }
177 } else if (line == EXCEPTION_MARKER) { 265 } else if (line == EXCEPTION_MARKER) {
(...skipping 25 matching lines...) Expand all
203 for (StackTraceLine line in dartStackTrace) { 291 for (StackTraceLine line in dartStackTrace) {
204 if (expectedIndex < test.expectedLines.length) { 292 if (expectedIndex < test.expectedLines.length) {
205 StackTraceLine expectedLine = test.expectedLines[expectedIndex]; 293 StackTraceLine expectedLine = test.expectedLines[expectedIndex];
206 if (line.methodName == expectedLine.methodName && 294 if (line.methodName == expectedLine.methodName &&
207 line.lineNo == expectedLine.lineNo && 295 line.lineNo == expectedLine.lineNo &&
208 line.columnNo == expectedLine.columnNo) { 296 line.columnNo == expectedLine.columnNo) {
209 expectedIndex++; 297 expectedIndex++;
210 } 298 }
211 } 299 }
212 } 300 }
301 if (verbose) {
302 print('JavaScript stacktrace:');
303 print(jsStackTrace.join('\n'));
304 print('Dart stacktrace:');
305 print(dartStackTrace.join('\n'));
306 }
213 Expect.equals( 307 Expect.equals(
214 expectedIndex, 308 expectedIndex,
215 test.expectedLines.length, 309 test.expectedLines.length,
216 "Missing stack trace lines for test:\n${test.code}\n" 310 "Missing stack trace lines for test:\n${test.code}\n"
217 "Actual:\n${dartStackTrace.join('\n')}\n" 311 "Actual:\n${dartStackTrace.join('\n')}\n"
218 "Expected:\n${test.expectedLines.join('\n')}\n"); 312 "Expected:\n${test.expectedLines.join('\n')}\n");
219 313
220 print("Deleting '${tmpDir.path}'."); 314 print("Deleting '${tmpDir.path}'.");
221 tmpDir.deleteSync(recursive: true); 315 tmpDir.deleteSync(recursive: true);
222 } 316 }
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
334 /// Returns the path of the d8 executable. 428 /// Returns the path of the d8 executable.
335 String get d8executable { 429 String get d8executable {
336 if (Platform.isWindows) { 430 if (Platform.isWindows) {
337 return 'third_party/d8/windows/d8.exe'; 431 return 'third_party/d8/windows/d8.exe';
338 } else if (Platform.isLinux) { 432 } else if (Platform.isLinux) {
339 return 'third_party/d8/linux/d8'; 433 return 'third_party/d8/linux/d8';
340 } else if (Platform.isMacOS) { 434 } else if (Platform.isMacOS) {
341 return 'third_party/d8/macos/d8'; 435 return 'third_party/d8/macos/d8';
342 } 436 }
343 throw new UnsupportedError('Unsupported platform.'); 437 throw new UnsupportedError('Unsupported platform.');
344 } 438 }
OLDNEW
« no previous file with comments | « tests/compiler/dart2js/sourcemaps/sourcemap_html_helper.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698