| OLD | NEW |
| 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 // TODO(nweiz): Remove this tag when we can get [packageDir] working without it | 5 // TODO(nweiz): Remove this tag when we can get [packageDir] working without it |
| 6 // (dart-lang/sdk#24022). | 6 // (dart-lang/sdk#24022). |
| 7 library test.test.io; | 7 library test.test.io; |
| 8 | 8 |
| 9 import 'dart:async'; | 9 import 'dart:async'; |
| 10 import 'dart:convert'; | |
| 11 import 'dart:io'; | 10 import 'dart:io'; |
| 12 | 11 |
| 13 import 'package:path/path.dart' as p; | 12 import 'package:path/path.dart' as p; |
| 14 import 'package:scheduled_test/descriptor.dart' as d; | 13 import 'package:scheduled_test/descriptor.dart' as d; |
| 15 import 'package:scheduled_test/scheduled_process.dart'; | 14 import 'package:scheduled_test/scheduled_process.dart'; |
| 16 import 'package:scheduled_test/scheduled_stream.dart'; | 15 import 'package:scheduled_test/scheduled_stream.dart'; |
| 17 import 'package:scheduled_test/scheduled_test.dart'; | 16 import 'package:scheduled_test/scheduled_test.dart'; |
| 18 import 'package:test/src/util/io.dart'; | 17 import 'package:test/src/util/io.dart'; |
| 19 import 'package:yaml/yaml.dart'; | |
| 20 | 18 |
| 21 /// The path to the root directory of the `test` package. | 19 /// The path to the root directory of the `test` package. |
| 22 final String packageDir = p.dirname(p.dirname(libraryPath(#test.test.io))); | 20 final String packageDir = p.dirname(p.dirname(libraryPath(#test.test.io))); |
| 23 | 21 |
| 24 /// The path to the `pub` executable in the current Dart SDK. | 22 /// The path to the `pub` executable in the current Dart SDK. |
| 25 final _pubPath = p.absolute(p.join( | 23 final _pubPath = p.absolute(p.join( |
| 26 p.dirname(Platform.resolvedExecutable), | 24 p.dirname(Platform.resolvedExecutable), |
| 27 Platform.isWindows ? 'pub.bat' : 'pub')); | 25 Platform.isWindows ? 'pub.bat' : 'pub')); |
| 28 | 26 |
| 29 /// The platform-specific message emitted when a nonexistent file is loaded. | 27 /// The platform-specific message emitted when a nonexistent file is loaded. |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 97 /// | 95 /// |
| 98 /// This expects each string in [strings] to match a different string in the | 96 /// This expects each string in [strings] to match a different string in the |
| 99 /// stream. | 97 /// stream. |
| 100 StreamMatcher containsInOrder(Iterable<String> strings) => | 98 StreamMatcher containsInOrder(Iterable<String> strings) => |
| 101 inOrder(strings.map((string) => consumeThrough(contains(string)))); | 99 inOrder(strings.map((string) => consumeThrough(contains(string)))); |
| 102 | 100 |
| 103 /// Runs the test executable with the package root set properly. | 101 /// Runs the test executable with the package root set properly. |
| 104 /// | 102 /// |
| 105 /// If [forwardStdio] is true, the standard output and error from the process | 103 /// If [forwardStdio] is true, the standard output and error from the process |
| 106 /// will be printed as part of the parent test. This is used for debugging. | 104 /// will be printed as part of the parent test. This is used for debugging. |
| 107 ScheduledProcess runTest(List args, {String reporter, | 105 ScheduledProcess runTest(List<String> args, {String reporter, |
| 108 int concurrency, Map<String, String> environment, | 106 int concurrency, Map<String, String> environment, |
| 109 bool forwardStdio: false}) { | 107 bool forwardStdio: false}) { |
| 110 concurrency ??= 1; | 108 concurrency ??= 1; |
| 111 | 109 |
| 112 var allArgs = [ | 110 var allArgs = [ |
| 113 p.absolute(p.join(packageDir, 'bin/test.dart')), | 111 p.absolute(p.join(packageDir, 'bin/test.dart')), |
| 114 "--package-root=${p.join(packageDir, 'packages')}", | 112 "--package-root=${p.join(packageDir, 'packages')}", |
| 115 "--concurrency=$concurrency" | 113 "--concurrency=$concurrency" |
| 116 ]; | 114 ]; |
| 117 if (reporter != null) allArgs.add("--reporter=$reporter"); | 115 if (reporter != null) allArgs.add("--reporter=$reporter"); |
| 118 allArgs.addAll(args); | 116 allArgs.addAll(args); |
| 119 | 117 |
| 120 if (environment == null) environment = {}; | 118 if (environment == null) environment = {}; |
| 121 environment.putIfAbsent("_DART_TEST_TESTING", () => "true"); | 119 environment.putIfAbsent("_DART_TEST_TESTING", () => "true"); |
| 122 | 120 |
| 123 var process = runDart(allArgs, | 121 var process = runDart(allArgs, |
| 124 environment: environment, | 122 environment: environment, |
| 125 description: "dart bin/test.dart"); | 123 description: "dart bin/test.dart"); |
| 126 | 124 |
| 127 if (forwardStdio) { | 125 if (forwardStdio) { |
| 128 process.stdoutStream().listen(print); | 126 process.stdoutStream().listen(print); |
| 129 process.stderrStream().listen(print); | 127 process.stderrStream().listen(print); |
| 130 } | 128 } |
| 131 | 129 |
| 132 return process; | 130 return process; |
| 133 } | 131 } |
| 134 | 132 |
| 135 /// Runs Dart. | 133 /// Runs Dart. |
| 136 ScheduledProcess runDart(List args, {Map<String, String> environment, | 134 ScheduledProcess runDart(List<String> args, {Map<String, String> environment, |
| 137 String description}) { | 135 String description}) { |
| 138 var allArgs = Platform.executableArguments.map((arg) { | 136 var allArgs = Platform.executableArguments.map((arg) { |
| 139 // The package root might be relative, so we need to make it absolute if | 137 // The package root might be relative, so we need to make it absolute if |
| 140 // we're going to run in a different working directory. | 138 // we're going to run in a different working directory. |
| 141 if (!arg.startsWith("--package-root=")) return arg; | 139 if (!arg.startsWith("--package-root=")) return arg; |
| 142 return "--package-root=" + | 140 return "--package-root=" + |
| 143 p.absolute(p.fromUri(arg.substring("--package-root=".length))); | 141 p.absolute(p.fromUri(arg.substring("--package-root=".length))); |
| 144 }).toList()..addAll(args); | 142 }).toList()..addAll(args); |
| 145 | 143 |
| 146 return new ScheduledProcess.start( | 144 return new ScheduledProcess.start( |
| 147 p.absolute(Platform.resolvedExecutable), allArgs, | 145 p.absolute(Platform.resolvedExecutable), allArgs, |
| 148 workingDirectory: _sandbox, | 146 workingDirectory: _sandbox, |
| 149 environment: environment, | 147 environment: environment, |
| 150 description: description); | 148 description: description); |
| 151 } | 149 } |
| 152 | 150 |
| 153 /// Runs Pub. | 151 /// Runs Pub. |
| 154 ScheduledProcess runPub(List args, {Map<String, String> environment}) { | 152 ScheduledProcess runPub(List args, {Map<String, String> environment}) { |
| 155 return new ScheduledProcess.start( | 153 return new ScheduledProcess.start( |
| 156 _pubPath, args, | 154 _pubPath, args, |
| 157 workingDirectory: _sandbox, | 155 workingDirectory: _sandbox, |
| 158 environment: environment, | 156 environment: environment, |
| 159 description: "pub ${args.first}"); | 157 description: "pub ${args.first}"); |
| 160 } | 158 } |
| 161 | 159 |
| 162 /// Runs "pub serve". | 160 /// Runs "pub serve". |
| 163 /// | 161 /// |
| 164 /// This returns assigns [_pubServePort] to a future that will complete to the | 162 /// This returns assigns [_pubServePort] to a future that will complete to the |
| 165 /// port of the "pub serve" instance. | 163 /// port of the "pub serve" instance. |
| 166 ScheduledProcess runPubServe({List args, String workingDirectory, | 164 ScheduledProcess runPubServe({List<String> args, String workingDirectory, |
| 167 Map<String, String> environment}) { | 165 Map<String, String> environment}) { |
| 168 _pubServePortCompleter = new Completer(); | 166 _pubServePortCompleter = new Completer(); |
| 169 currentSchedule.onComplete.schedule(() => _pubServePortCompleter = null); | 167 currentSchedule.onComplete.schedule(() => _pubServePortCompleter = null); |
| 170 | 168 |
| 171 var allArgs = ['serve', '--port', '0']; | 169 var allArgs = ['serve', '--port', '0']; |
| 172 if (args != null) allArgs.addAll(args); | 170 if (args != null) allArgs.addAll(args); |
| 173 | 171 |
| 174 var pub = runPub(allArgs, environment: environment); | 172 var pub = runPub(allArgs, environment: environment); |
| 175 | 173 |
| 176 schedule(() async { | 174 schedule(() async { |
| 177 var match; | 175 var match; |
| 178 while (match == null) { | 176 while (match == null) { |
| 179 var line = await pub.stdout.next(); | 177 var line = await pub.stdout.next(); |
| 180 match = _servingRegExp.firstMatch(line); | 178 match = _servingRegExp.firstMatch(line); |
| 181 } | 179 } |
| 182 _pubServePortCompleter.complete(int.parse(match[1])); | 180 _pubServePortCompleter.complete(int.parse(match[1])); |
| 183 }, "waiting for pub serve to emit its port number"); | 181 }, "waiting for pub serve to emit its port number"); |
| 184 | 182 |
| 185 return pub; | 183 return pub; |
| 186 } | 184 } |
| OLD | NEW |