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

Side by Side Diff: test/runner/runner_test.dart

Issue 1083433002: More gracefully handle load errors. (Closed) Base URL: git@github.com:dart-lang/test@master
Patch Set: Created 5 years, 8 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
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 @TestOn("vm") 5 @TestOn("vm")
6 6
7 import 'dart:io'; 7 import 'dart:io';
8 import 'dart:math' as math; 8 import 'dart:math' as math;
9 9
10 import 'package:path/path.dart' as p; 10 import 'package:path/path.dart' as p;
11 import 'package:test/src/util/exit_codes.dart' as exit_codes; 11 import 'package:test/src/util/exit_codes.dart' as exit_codes;
kevmoo 2015/04/10 21:23:32 now unused
nweiz 2015/04/10 21:54:57 Done.
12 import 'package:test/src/util/io.dart'; 12 import 'package:test/src/util/io.dart';
13 import 'package:test/test.dart'; 13 import 'package:test/test.dart';
14 14
15 import '../io.dart'; 15 import '../io.dart';
16 16
17 String _sandbox; 17 String _sandbox;
18 18
19 final _success = """ 19 final _success = """
20 import 'dart:async'; 20 import 'dart:async';
21 21
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
80 var result = _runUnittest(["--asdf"]); 80 var result = _runUnittest(["--asdf"]);
81 expect(result.stderr, equals(""" 81 expect(result.stderr, equals("""
82 Could not find an option named "asdf". 82 Could not find an option named "asdf".
83 83
84 $_usage""")); 84 $_usage"""));
85 expect(result.exitCode, equals(exit_codes.usage)); 85 expect(result.exitCode, equals(exit_codes.usage));
86 }); 86 });
87 87
88 test("a non-existent file is passed", () { 88 test("a non-existent file is passed", () {
89 var result = _runUnittest(["file"]); 89 var result = _runUnittest(["file"]);
90 expect(result.stderr, equals('Failed to load "file": Does not exist.\n')); 90 expect(result.stdout, allOf([
91 expect(result.exitCode, equals(exit_codes.data)); 91 contains('-1: load error'),
92 contains('Failed to load "file": Does not exist.')
93 ]));
94 expect(result.exitCode, equals(1));
92 }); 95 });
93 96
94 test("the default directory doesn't exist", () { 97 test("the default directory doesn't exist", () {
95 var result = _runUnittest([]); 98 var result = _runUnittest([]);
96 expect(result.stderr, equals( 99 expect(result.stderr, equals("""
97 'Failed to load "test": No test files were passed and the default ' 100 No test files were passed and the default "test/" directory doesn't exist.
98 'directory doesn\'t exist.\n')); 101
102 $_usage"""));
99 expect(result.exitCode, equals(exit_codes.data)); 103 expect(result.exitCode, equals(exit_codes.data));
100 }); 104 });
101 105
102 test("a test file fails to load", () { 106 test("a test file fails to load", () {
103 var testPath = p.join(_sandbox, "test.dart"); 107 var testPath = p.join(_sandbox, "test.dart");
104 new File(testPath).writeAsStringSync("invalid Dart file"); 108 new File(testPath).writeAsStringSync("invalid Dart file");
105 var result = _runUnittest(["test.dart"]); 109 var result = _runUnittest(["test.dart"]);
106 110
107 expect(result.stderr, equals( 111 expect(result.stdout, allOf([
108 'Failed to load "${p.relative(testPath, from: _sandbox)}":\n' 112 contains('-1: load error'),
109 "line 1 pos 1: unexpected token 'invalid'\n" 113 contains(
110 "invalid Dart file\n" 114 ' Failed to load "${p.relative(testPath, from: _sandbox)}":\n'
111 "^\n")); 115 " line 1 pos 1: unexpected token 'invalid'\n"
112 expect(result.exitCode, equals(exit_codes.data)); 116 " invalid Dart file\n"
117 " ^\n")
118 ]));
119 expect(result.exitCode, equals(1));
113 }); 120 });
114 121
115 // This is slightly different from the above test because it's an error 122 // This is slightly different from the above test because it's an error
116 // that's caught first by the analyzer when it's used to parse the file. 123 // that's caught first by the analyzer when it's used to parse the file.
117 test("a test file fails to parse", () { 124 test("a test file fails to parse", () {
118 var testPath = p.join(_sandbox, "test.dart"); 125 var testPath = p.join(_sandbox, "test.dart");
119 new File(testPath).writeAsStringSync("@TestOn)"); 126 new File(testPath).writeAsStringSync("@TestOn)");
120 var result = _runUnittest(["test.dart"]); 127 var result = _runUnittest(["test.dart"]);
121 128
122 expect(result.stderr, equals( 129 expect(result.stdout, allOf([
123 'Failed to load "${p.relative(testPath, from: _sandbox)}":\n' 130 contains('-1: load error'),
124 "line 1 pos 8: unexpected token ')'\n" 131 contains(
125 "@TestOn)\n" 132 ' Failed to load "${p.relative(testPath, from: _sandbox)}":\n'
126 " ^\n")); 133 " line 1 pos 8: unexpected token ')'\n"
127 expect(result.exitCode, equals(exit_codes.data)); 134 " @TestOn)\n"
135 " ^\n")
136 ]));
137 expect(result.exitCode, equals(1));
128 }); 138 });
129 139
130 test("an annotation's structure is invalid", () { 140 test("an annotation's structure is invalid", () {
131 var testPath = p.join(_sandbox, "test.dart"); 141 var testPath = p.join(_sandbox, "test.dart");
132 new File(testPath).writeAsStringSync("@TestOn()\nlibrary foo;"); 142 new File(testPath).writeAsStringSync("@TestOn()\nlibrary foo;");
133 var result = _runUnittest(["test.dart"]); 143 var result = _runUnittest(["test.dart"]);
134 144
135 expect(result.stderr, equals( 145 expect(result.stdout, allOf([
136 'Failed to load "${p.relative(testPath, from: _sandbox)}":\n' 146 contains('-1: load error'),
137 "Error on line 1, column 8: TestOn takes one argument.\n" 147 contains(
138 "@TestOn()\n" 148 ' Failed to load "${p.relative(testPath, from: _sandbox)}":\n'
139 " ^^\n")); 149 " Error on line 1, column 8: TestOn takes one argument.\n"
140 expect(result.exitCode, equals(exit_codes.data)); 150 " @TestOn()\n"
151 " ^^\n")
152 ]));
153 expect(result.exitCode, equals(1));
141 }); 154 });
142 155
143 test("an annotation's contents are invalid", () { 156 test("an annotation's contents are invalid", () {
144 var testPath = p.join(_sandbox, "test.dart"); 157 var testPath = p.join(_sandbox, "test.dart");
145 new File(testPath).writeAsStringSync("@TestOn('zim')\nlibrary foo;"); 158 new File(testPath).writeAsStringSync("@TestOn('zim')\nlibrary foo;");
146 var result = _runUnittest(["test.dart"]); 159 var result = _runUnittest(["test.dart"]);
147 160
148 expect(result.stderr, equals( 161 expect(result.stdout, allOf([
149 'Failed to load "${p.relative(testPath, from: _sandbox)}":\n' 162 contains('-1: load error'),
150 "Error on line 1, column 10: Undefined variable.\n" 163 contains(
151 "@TestOn('zim')\n" 164 ' Failed to load "${p.relative(testPath, from: _sandbox)}":\n'
152 " ^^^\n")); 165 " Error on line 1, column 10: Undefined variable.\n"
153 expect(result.exitCode, equals(exit_codes.data)); 166 " @TestOn('zim')\n"
167 " ^^^\n")
168 ]));
169 expect(result.exitCode, equals(1));
154 }); 170 });
155 171
156 test("a test file throws", () { 172 test("a test file throws", () {
157 var testPath = p.join(_sandbox, "test.dart"); 173 var testPath = p.join(_sandbox, "test.dart");
158 new File(testPath).writeAsStringSync("void main() => throw 'oh no';"); 174 new File(testPath).writeAsStringSync("void main() => throw 'oh no';");
159 175
160 var result = _runUnittest(["test.dart"]); 176 var result = _runUnittest(["test.dart"]);
161 expect(result.stderr, startsWith( 177 expect(result.stdout, allOf([
162 'Failed to load "${p.relative(testPath, from: _sandbox)}": oh no\n')); 178 contains('-1: load error'),
163 expect(result.exitCode, equals(exit_codes.data)); 179 contains(
180 'Failed to load "${p.relative(testPath, from: _sandbox)}": oh no')
181 ]));
182 expect(result.exitCode, equals(1));
164 }); 183 });
165 184
166 test("a test file doesn't have a main defined", () { 185 test("a test file doesn't have a main defined", () {
167 var testPath = p.join(_sandbox, "test.dart"); 186 var testPath = p.join(_sandbox, "test.dart");
168 new File(testPath).writeAsStringSync("void foo() {}"); 187 new File(testPath).writeAsStringSync("void foo() {}");
169 188
170 var result = _runUnittest(["test.dart"]); 189 var result = _runUnittest(["test.dart"]);
171 expect(result.stderr, startsWith( 190 expect(result.stdout, allOf([
172 'Failed to load "${p.relative(testPath, from: _sandbox)}": No ' 191 contains('-1: load error'),
173 'top-level main() function defined.\n')); 192 contains(
174 expect(result.exitCode, equals(exit_codes.data)); 193 'Failed to load "${p.relative(testPath, from: _sandbox)}": No '
194 'top-level main() function defined.')
195 ]));
196 expect(result.exitCode, equals(1));
175 }); 197 });
176 198
177 test("a test file has a non-function main", () { 199 test("a test file has a non-function main", () {
178 var testPath = p.join(_sandbox, "test.dart"); 200 var testPath = p.join(_sandbox, "test.dart");
179 new File(testPath).writeAsStringSync("int main;"); 201 new File(testPath).writeAsStringSync("int main;");
180 202
181 var result = _runUnittest(["test.dart"]); 203 var result = _runUnittest(["test.dart"]);
182 expect(result.stderr, startsWith( 204 expect(result.stdout, allOf([
183 'Failed to load "${p.relative(testPath, from: _sandbox)}": Top-level ' 205 contains('-1: load error'),
184 'main getter is not a function.\n')); 206 contains(
185 expect(result.exitCode, equals(exit_codes.data)); 207 'Failed to load "${p.relative(testPath, from: _sandbox)}": '
208 'Top-level main getter is not a function.')
209 ]));
210 expect(result.exitCode, equals(1));
186 }); 211 });
187 212
188 test("a test file has a main with arguments", () { 213 test("a test file has a main with arguments", () {
189 var testPath = p.join(_sandbox, "test.dart"); 214 var testPath = p.join(_sandbox, "test.dart");
190 new File(testPath).writeAsStringSync("void main(arg) {}"); 215 new File(testPath).writeAsStringSync("void main(arg) {}");
191 216
192 var result = _runUnittest(["test.dart"]); 217 var result = _runUnittest(["test.dart"]);
193 expect(result.stderr, startsWith( 218 expect(result.stdout, allOf([
194 'Failed to load "${p.relative(testPath, from: _sandbox)}": Top-level ' 219 contains('-1: load error'),
195 'main() function takes arguments.\n')); 220 contains(
196 expect(result.exitCode, equals(exit_codes.data)); 221 'Failed to load "${p.relative(testPath, from: _sandbox)}": '
222 'Top-level main() function takes arguments.')
223 ]));
224 expect(result.exitCode, equals(1));
225 });
226
227 test("multiple load errors occur", () {
228 var testPath = p.join(_sandbox, "test.dart");
229 new File(testPath).writeAsStringSync("invalid Dart file");
230 var result = _runUnittest(["test.dart", "nonexistent.dart"]);
231
232 expect(result.stdout, allOf([
233 contains('test.dart: load error'),
234 contains(
235 ' Failed to load "test.dart":\n'
236 " line 1 pos 1: unexpected token 'invalid'\n"
237 " invalid Dart file\n"
238 " ^\n"),
239 contains('nonexistent.dart: load error'),
240 contains('Failed to load "nonexistent.dart": Does not exist.')
241 ]));
197 }); 242 });
198 243
199 // TODO(nweiz): test what happens when a test file is unreadable once issue 244 // TODO(nweiz): test what happens when a test file is unreadable once issue
200 // 15078 is fixed. 245 // 15078 is fixed.
201 }); 246 });
202 247
203 group("runs successful tests", () { 248 group("runs successful tests", () {
204 test("defined in a single file", () { 249 test("defined in a single file", () {
205 new File(p.join(_sandbox, "test.dart")).writeAsStringSync(_success); 250 new File(p.join(_sandbox, "test.dart")).writeAsStringSync(_success);
206 var result = _runUnittest(["test.dart"]); 251 var result = _runUnittest(["test.dart"]);
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
269 test("directly", () { 314 test("directly", () {
270 new File(p.join(_sandbox, "test.dart")).writeAsStringSync(_failure); 315 new File(p.join(_sandbox, "test.dart")).writeAsStringSync(_failure);
271 var result = _runDart([ 316 var result = _runDart([
272 "--package-root=${p.join(packageDir, 'packages')}", 317 "--package-root=${p.join(packageDir, 'packages')}",
273 "test.dart" 318 "test.dart"
274 ]); 319 ]);
275 expect(result.stdout, contains("Some tests failed.")); 320 expect(result.stdout, contains("Some tests failed."));
276 }); 321 });
277 }); 322 });
278 323
324 test("runs tests even when a file fails to load", () {
325 new File(p.join(_sandbox, "test.dart")).writeAsStringSync(_success);
326 var result = _runUnittest(["test.dart", "nonexistent.dart"]);
327 expect(result.stdout, contains("+1 -1: Some tests failed."));
328 expect(result.exitCode, equals(1));
329 });
330
279 group("flags:", () { 331 group("flags:", () {
280 test("with the --color flag, uses colors", () { 332 test("with the --color flag, uses colors", () {
281 new File(p.join(_sandbox, "test.dart")).writeAsStringSync(_failure); 333 new File(p.join(_sandbox, "test.dart")).writeAsStringSync(_failure);
282 var result = _runUnittest(["--color", "test.dart"]); 334 var result = _runUnittest(["--color", "test.dart"]);
283 // This is the color code for red. 335 // This is the color code for red.
284 expect(result.stdout, contains("\u001b[31m")); 336 expect(result.stdout, contains("\u001b[31m"));
285 }); 337 });
286 338
287 group("with the --name flag,", () { 339 group("with the --name flag,", () {
288 test("selects tests with matching names", () { 340 test("selects tests with matching names", () {
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
322 }); 374 });
323 375
324 test("produces an error when no tests match", () { 376 test("produces an error when no tests match", () {
325 new File(p.join(_sandbox, "test.dart")).writeAsStringSync(_success); 377 new File(p.join(_sandbox, "test.dart")).writeAsStringSync(_success);
326 378
327 var result = _runUnittest(["--name", "no match", "test.dart"]); 379 var result = _runUnittest(["--name", "no match", "test.dart"]);
328 expect(result.stderr, 380 expect(result.stderr,
329 contains('No tests match regular expression "no match".')); 381 contains('No tests match regular expression "no match".'));
330 expect(result.exitCode, equals(exit_codes.data)); 382 expect(result.exitCode, equals(exit_codes.data));
331 }); 383 });
384
385 test("doesn't filter out load exceptions", () {
386 var result = _runUnittest(["--name", "name", "file"]);
387 expect(result.stdout, allOf([
388 contains('-1: load error'),
389 contains('Failed to load "file": Does not exist.')
390 ]));
391 expect(result.exitCode, equals(1));
392 });
332 }); 393 });
333 394
334 group("with the --plain-name flag,", () { 395 group("with the --plain-name flag,", () {
335 test("selects tests with matching names", () { 396 test("selects tests with matching names", () {
336 new File(p.join(_sandbox, "test.dart")).writeAsStringSync(""" 397 new File(p.join(_sandbox, "test.dart")).writeAsStringSync("""
337 import 'dart:async'; 398 import 'dart:async';
338 399
339 import 'package:test/test.dart'; 400 import 'package:test/test.dart';
340 401
341 void main() { 402 void main() {
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
378 }); 439 });
379 }); 440 });
380 }); 441 });
381 } 442 }
382 443
383 ProcessResult _runUnittest(List<String> args) => 444 ProcessResult _runUnittest(List<String> args) =>
384 runUnittest(args, workingDirectory: _sandbox); 445 runUnittest(args, workingDirectory: _sandbox);
385 446
386 ProcessResult _runDart(List<String> args) => 447 ProcessResult _runDart(List<String> args) =>
387 runDart(args, workingDirectory: _sandbox); 448 runDart(args, workingDirectory: _sandbox);
OLDNEW
« test/runner/browser/compiler_pool_test.dart ('K') | « test/runner/pub_serve_test.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698