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 library test.runner.loader; | 5 library test.runner.loader; |
6 | 6 |
7 import 'dart:async'; | 7 import 'dart:async'; |
8 import 'dart:io'; | 8 import 'dart:io'; |
9 import 'dart:isolate'; | 9 import 'dart:isolate'; |
10 | 10 |
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
128 if (!metadata.testOn.evaluate(platform, os: currentOS)) { | 128 if (!metadata.testOn.evaluate(platform, os: currentOS)) { |
129 return new Future.value(); | 129 return new Future.value(); |
130 } | 130 } |
131 | 131 |
132 return new Future.sync(() { | 132 return new Future.sync(() { |
133 if (_pubServeUrl != null && !p.isWithin('test', path)) { | 133 if (_pubServeUrl != null && !p.isWithin('test', path)) { |
134 throw new LoadException(path, | 134 throw new LoadException(path, |
135 'When using "pub serve", all test files must be in test/.'); | 135 'When using "pub serve", all test files must be in test/.'); |
136 } | 136 } |
137 | 137 |
138 if (platform.isBrowser) return _loadBrowserFile(path, platform); | 138 if (platform == TestPlatform.vm) return _loadVmFile(path, metadata); |
139 assert(platform == TestPlatform.vm); | 139 assert(platform.isBrowser); |
140 return _loadVmFile(path); | 140 return _loadBrowserFile(path, platform, metadata); |
141 }).then((suite) { | 141 }).then((suite) { |
142 if (suite == null) return; | 142 if (suite == null) return; |
143 | 143 |
144 controller.add(suite | 144 controller.add(suite.filter(platform, os: currentOS)); |
145 .change(metadata: metadata).filter(platform, os: currentOS)); | |
146 }).catchError(controller.addError); | 145 }).catchError(controller.addError); |
147 }).then((_) => controller.close()); | 146 }).then((_) => controller.close()); |
148 | 147 |
149 return controller.stream; | 148 return controller.stream; |
150 } | 149 } |
151 | 150 |
152 /// Load the test suite at [path] in a browser. | 151 /// Load the test suite at [path] in [platform]. |
153 Future<Suite> _loadBrowserFile(String path, TestPlatform platform) => | 152 /// |
| 153 /// [metadata] is the suite-level metadata for the test. |
| 154 Future<Suite> _loadBrowserFile(String path, TestPlatform platform, |
| 155 Metadata metadata) => |
154 _browserServer.then((browserServer) => | 156 _browserServer.then((browserServer) => |
155 browserServer.loadSuite(path, platform)); | 157 browserServer.loadSuite(path, platform, metadata)); |
156 | 158 |
157 /// Load the test suite at [path] in VM isolate. | 159 /// Load the test suite at [path] in VM isolate. |
158 Future<Suite> _loadVmFile(String path) { | 160 /// |
| 161 /// [metadata] is the suite-level metadata for the test. |
| 162 Future<Suite> _loadVmFile(String path, Metadata metadata) { |
159 var receivePort = new ReceivePort(); | 163 var receivePort = new ReceivePort(); |
160 | 164 |
161 return new Future.sync(() { | 165 return new Future.sync(() { |
162 if (_pubServeUrl != null) { | 166 if (_pubServeUrl != null) { |
163 var url = _pubServeUrl.resolve( | 167 var url = _pubServeUrl.resolve( |
164 p.relative(path, from: 'test') + '.vm_test.dart'); | 168 p.relative(path, from: 'test') + '.vm_test.dart'); |
165 return Isolate.spawnUri(url, [], {'reply': receivePort.sendPort}) | 169 return Isolate.spawnUri(url, [], { |
166 .then((isolate) => new IsolateWrapper(isolate, () {})) | 170 'reply': receivePort.sendPort, |
| 171 'metadata': metadata.serialize() |
| 172 }).then((isolate) => new IsolateWrapper(isolate, () {})) |
167 .catchError((error, stackTrace) { | 173 .catchError((error, stackTrace) { |
168 if (error is! IsolateSpawnException) throw error; | 174 if (error is! IsolateSpawnException) throw error; |
169 | 175 |
170 if (error.message.contains("OS Error: Connection refused")) { | 176 if (error.message.contains("OS Error: Connection refused")) { |
171 throw new LoadException(path, | 177 throw new LoadException(path, |
172 "Error getting $url: Connection refused\n" | 178 "Error getting $url: Connection refused\n" |
173 'Make sure "pub serve" is running.'); | 179 'Make sure "pub serve" is running.'); |
174 } else if (error.message.contains("404 Not Found")) { | 180 } else if (error.message.contains("404 Not Found")) { |
175 throw new LoadException(path, | 181 throw new LoadException(path, |
176 "Error getting $url: 404 Not Found\n" | 182 "Error getting $url: 404 Not Found\n" |
177 'Make sure "pub serve" is serving the test/ directory.'); | 183 'Make sure "pub serve" is serving the test/ directory.'); |
178 } | 184 } |
179 | 185 |
180 throw new LoadException(path, error); | 186 throw new LoadException(path, error); |
181 }); | 187 }); |
182 } else { | 188 } else { |
183 return runInIsolate(''' | 189 return runInIsolate(''' |
| 190 import "package:test/src/backend/metadata.dart"; |
184 import "package:test/src/runner/vm/isolate_listener.dart"; | 191 import "package:test/src/runner/vm/isolate_listener.dart"; |
185 | 192 |
186 import "${p.toUri(p.absolute(path))}" as test; | 193 import "${p.toUri(p.absolute(path))}" as test; |
187 | 194 |
188 void main(_, Map message) { | 195 void main(_, Map message) { |
189 var sendPort = message['reply']; | 196 var sendPort = message['reply']; |
190 IsolateListener.start(sendPort, () => test.main); | 197 var metadata = new Metadata.deserialize(message['metadata']); |
| 198 IsolateListener.start(sendPort, metadata, () => test.main); |
191 } | 199 } |
192 ''', { | 200 ''', { |
193 'reply': receivePort.sendPort | 201 'reply': receivePort.sendPort, |
| 202 'metadata': metadata.serialize() |
194 }, packageRoot: _packageRoot); | 203 }, packageRoot: _packageRoot); |
195 } | 204 } |
196 }).catchError((error, stackTrace) { | 205 }).catchError((error, stackTrace) { |
197 receivePort.close(); | 206 receivePort.close(); |
198 if (error is LoadException) throw error; | 207 if (error is LoadException) throw error; |
199 return new Future.error(new LoadException(path, error), stackTrace); | 208 return new Future.error(new LoadException(path, error), stackTrace); |
200 }).then((isolate) { | 209 }).then((isolate) { |
201 _isolates.add(isolate); | 210 _isolates.add(isolate); |
202 return receivePort.first; | 211 return receivePort.first; |
203 }).then((response) { | 212 }).then((response) { |
204 if (response["type"] == "loadException") { | 213 if (response["type"] == "loadException") { |
205 return new Future.error(new LoadException(path, response["message"])); | 214 return new Future.error(new LoadException(path, response["message"])); |
206 } else if (response["type"] == "error") { | 215 } else if (response["type"] == "error") { |
207 var asyncError = RemoteException.deserialize(response["error"]); | 216 var asyncError = RemoteException.deserialize(response["error"]); |
208 return new Future.error( | 217 return new Future.error( |
209 new LoadException(path, asyncError.error), | 218 new LoadException(path, asyncError.error), |
210 asyncError.stackTrace); | 219 asyncError.stackTrace); |
211 } | 220 } |
212 | 221 |
213 return new Suite(response["tests"].map((test) { | 222 return new Suite(response["tests"].map((test) { |
214 var metadata = new Metadata.deserialize(test['metadata']); | 223 var testMetadata = new Metadata.deserialize(test['metadata']); |
215 return new IsolateTest(test['name'], metadata, test['sendPort']); | 224 return new IsolateTest(test['name'], testMetadata, test['sendPort']); |
216 }), path: path, platform: "VM"); | 225 }), metadata: metadata, path: path, platform: "VM"); |
217 }); | 226 }); |
218 } | 227 } |
219 | 228 |
220 /// Closes the loader and releases all resources allocated by it. | 229 /// Closes the loader and releases all resources allocated by it. |
221 Future close() { | 230 Future close() { |
222 for (var isolate in _isolates) { | 231 for (var isolate in _isolates) { |
223 isolate.kill(); | 232 isolate.kill(); |
224 } | 233 } |
225 _isolates.clear(); | 234 _isolates.clear(); |
226 | 235 |
227 if (_browserServerCompleter == null) return new Future.value(); | 236 if (_browserServerCompleter == null) return new Future.value(); |
228 return _browserServer.then((browserServer) => browserServer.close()); | 237 return _browserServer.then((browserServer) => browserServer.close()); |
229 } | 238 } |
230 } | 239 } |
OLD | NEW |