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

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

Powered by Google App Engine
This is Rietveld 408576698