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

Side by Side Diff: lib/src/runner/browser/server.dart

Issue 1087303004: Add support for user-defined HTML files. (Closed) Base URL: git@github.com:dart-lang/test@master
Patch Set: Code review changes 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
« no previous file with comments | « lib/pub_serve.dart ('k') | pubspec.yaml » ('j') | 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) 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.browser.server; 5 library test.runner.browser.server;
6 6
7 import 'dart:async'; 7 import 'dart:async';
8 import 'dart:convert'; 8 import 'dart:convert';
9 import 'dart:io'; 9 import 'dart:io';
10 10
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after
144 144
145 /// Starts the underlying server. 145 /// Starts the underlying server.
146 Future _load() { 146 Future _load() {
147 var cascade = new shelf.Cascade() 147 var cascade = new shelf.Cascade()
148 .add(_webSocketHandler.handler); 148 .add(_webSocketHandler.handler);
149 149
150 if (_pubServeUrl == null) { 150 if (_pubServeUrl == null) {
151 cascade = cascade 151 cascade = cascade
152 .add(_createPackagesHandler()) 152 .add(_createPackagesHandler())
153 .add(_jsHandler.handler) 153 .add(_jsHandler.handler)
154 .add(_wrapperHandler) 154 .add(createStaticHandler(_root))
155 .add(createStaticHandler(_root)); 155 .add(_wrapperHandler);
156 } 156 }
157 157
158 var pipeline = new shelf.Pipeline() 158 var pipeline = new shelf.Pipeline()
159 .addMiddleware(nestingMiddleware(_secret)) 159 .addMiddleware(nestingMiddleware(_secret))
160 .addHandler(cascade.handler); 160 .addHandler(cascade.handler);
161 161
162 return shelf_io.serve(pipeline, 'localhost', 0).then((server) { 162 return shelf_io.serve(pipeline, 'localhost', 0).then((server) {
163 _server = server; 163 _server = server;
164 }); 164 });
165 } 165 }
(...skipping 15 matching lines...) Expand all
181 shelfChange(request, path: p.url.joinAll(segments.take(i + 1)))); 181 shelfChange(request, path: p.url.joinAll(segments.take(i + 1))));
182 } 182 }
183 183
184 return new shelf.Response.notFound("Not found."); 184 return new shelf.Response.notFound("Not found.");
185 }; 185 };
186 } 186 }
187 187
188 /// A handler that serves wrapper files used to bootstrap tests. 188 /// A handler that serves wrapper files used to bootstrap tests.
189 shelf.Response _wrapperHandler(shelf.Request request) { 189 shelf.Response _wrapperHandler(shelf.Request request) {
190 var path = p.fromUri(shelfUrl(request)); 190 var path = p.fromUri(shelfUrl(request));
191 var withoutExtensions = p.withoutExtension(p.withoutExtension(path));
192 var base = p.basename(withoutExtensions);
193 191
194 if (path.endsWith(".browser_test.dart")) { 192 if (path.endsWith(".browser_test.dart")) {
195 return new shelf.Response.ok(''' 193 return new shelf.Response.ok('''
196 import "package:test/src/runner/browser/iframe_listener.dart"; 194 import "package:test/src/runner/browser/iframe_listener.dart";
197 195
198 import "$base" as test; 196 import "${p.basename(p.withoutExtension(p.withoutExtension(path)))}" as test;
199 197
200 void main() { 198 void main() {
201 IframeListener.start(() => test.main); 199 IframeListener.start(() => test.main);
202 } 200 }
203 ''', headers: {'Content-Type': 'application/dart'}); 201 ''', headers: {'Content-Type': 'application/dart'});
204 } 202 }
205 203
206 if (path.endsWith(".browser_test.html")) { 204 if (path.endsWith(".html")) {
207 // TODO(nweiz): support user-authored HTML files. 205 var test = p.withoutExtension(path) + ".dart";
206
207 // Link to the Dart wrapper on Dartium and the compiled JS version
208 // elsewhere.
209 var script = request.headers['user-agent'].contains('(Dart)')
210 ? 'type="application/dart" '
211 'src="${HTML_ESCAPE.convert(test)}.browser_test.dart"'
212 : 'src="${HTML_ESCAPE.convert(test)}.browser_test.dart.js"';
213
208 return new shelf.Response.ok(''' 214 return new shelf.Response.ok('''
209 <!DOCTYPE html> 215 <!DOCTYPE html>
210 <html> 216 <html>
211 <head> 217 <head>
212 <title>${HTML_ESCAPE.convert(base)}.dart Test</title> 218 <title>${HTML_ESCAPE.convert(test)} Test</title>
213 <script type="application/dart" 219 <script $script></script>
214 src="${HTML_ESCAPE.convert(base)}.browser_test.dart">
215 </script>
216 <script src="packages/browser/dart.js"></script>
217 </head> 220 </head>
218 </html> 221 </html>
219 ''', headers: {'Content-Type': 'text/html'}); 222 ''', headers: {'Content-Type': 'text/html'});
220 } 223 }
221 224
222 return new shelf.Response.notFound('Not found.'); 225 return new shelf.Response.notFound('Not found.');
223 } 226 }
224 227
225 /// Loads the test suite at [path] on the browser [browser]. 228 /// Loads the test suite at [path] on the browser [browser].
226 /// 229 ///
227 /// This will start a browser to load the suite if one isn't already running. 230 /// This will start a browser to load the suite if one isn't already running.
228 /// Throws an [ArgumentError] if [browser] isn't a browser platform. 231 /// Throws an [ArgumentError] if [browser] isn't a browser platform.
229 Future<Suite> loadSuite(String path, TestPlatform browser, 232 Future<Suite> loadSuite(String path, TestPlatform browser,
230 Metadata metadata) { 233 Metadata metadata) {
231 if (!browser.isBrowser) { 234 if (!browser.isBrowser) {
232 throw new ArgumentError("$browser is not a browser."); 235 throw new ArgumentError("$browser is not a browser.");
233 } 236 }
234 237
238 var htmlPath = p.withoutExtension(path) + '.html';
239 if (new File(htmlPath).existsSync() &&
240 !new File(htmlPath).readAsStringSync()
241 .contains('packages/test/dart.js')) {
242 throw new LoadException(
243 path,
244 '"${htmlPath}" must contain <script src="packages/test/dart.js">'
245 '</script>.');
246 }
247
235 return new Future.sync(() { 248 return new Future.sync(() {
236 if (_pubServeUrl != null) { 249 if (_pubServeUrl != null) {
237 var suitePrefix = p.relative(path, from: p.join(_root, 'test')) + 250 var suitePrefix = p.withoutExtension(
238 '.browser_test'; 251 p.relative(path, from: p.join(_root, 'test')));
239 var jsUrl = _pubServeUrl.resolve('$suitePrefix.dart.js'); 252 var jsUrl = _pubServeUrl.resolve(
240 return _pubServeSuite(path, jsUrl).then((_) => 253 '$suitePrefix.dart.browser_test.dart.js');
241 _pubServeUrl.resolve('$suitePrefix.html')); 254 return _pubServeSuite(path, jsUrl)
255 .then((_) => _pubServeUrl.resolveUri(p.toUri('$suitePrefix.html')));
242 } 256 }
243 257
244 return new Future.sync(() => browser.isJS ? _compileSuite(path) : null) 258 return new Future.sync(() => browser.isJS ? _compileSuite(path) : null)
245 .then((_) { 259 .then((_) {
246 if (_closed) return null; 260 if (_closed) return null;
247 return url.resolveUri( 261 return url.resolveUri(p.toUri(
248 p.toUri(p.relative(path, from: _root) + ".browser_test.html")); 262 p.withoutExtension(p.relative(path, from: _root)) + ".html"));
249 }); 263 });
250 }).then((suiteUrl) { 264 }).then((suiteUrl) {
251 if (_closed) return null; 265 if (_closed) return null;
252 266
253 // TODO(nweiz): Don't start the browser until all the suites are compiled. 267 // TODO(nweiz): Don't start the browser until all the suites are compiled.
254 return _browserManagerFor(browser).then((browserManager) { 268 return _browserManagerFor(browser).then((browserManager) {
255 if (_closed) return null; 269 if (_closed) return null;
256 return browserManager.loadSuite(path, suiteUrl, metadata); 270 return browserManager.loadSuite(path, suiteUrl, metadata);
257 }).then((suite) { 271 }).then((suite) {
258 if (_closed) return null; 272 if (_closed) return null;
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after
399 if (_pubServeUrl == null) { 413 if (_pubServeUrl == null) {
400 new Directory(_compiledDir).deleteSync(recursive: true); 414 new Directory(_compiledDir).deleteSync(recursive: true);
401 } else { 415 } else {
402 _http.close(); 416 _http.close();
403 } 417 }
404 418
405 _closeCompleter.complete(); 419 _closeCompleter.complete();
406 }).catchError(_closeCompleter.completeError); 420 }).catchError(_closeCompleter.completeError);
407 } 421 }
408 } 422 }
OLDNEW
« no previous file with comments | « lib/pub_serve.dart ('k') | pubspec.yaml » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698