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

Unified Diff: utils/testrunner/http_server_test_runner.dart

Issue 10966020: Added support for running an HTTP server during the test and being able to serve up static files. L… (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 8 years, 3 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « utils/testrunner/html_wrap_task.dart ('k') | utils/testrunner/options.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: utils/testrunner/http_server_test_runner.dart
===================================================================
--- utils/testrunner/http_server_test_runner.dart (revision 0)
+++ utils/testrunner/http_server_test_runner.dart (revision 0)
@@ -0,0 +1,119 @@
+// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#library('server');
+#import('dart:io');
+#import('../../pkg/args/lib/args.dart');
+
+/** A simple HTTP server. Currently handles serving static files. */
+class HttpTestServer {
+ HttpServer server;
+
+ /** If set, serve up static files from this directory. */
+ String staticFileDirectory;
+
+ /* A common subset of all possible MIME types. */
+ static const MIME_TYPES = const {
+ 'json' : 'applicaton/json',
+ 'js' : 'application/javascript',
+ 'cgm' : 'image/cgm',
+ 'g3fax': 'image/g3fax',
+ 'gif' : 'image/gif',
+ 'jpeg' : 'image/jpeg',
+ 'jpg' : 'image/jpeg',
+ 'png' : 'image/png',
+ 'tif' : 'image/tiff',
+ 'tiff' : 'image/tiff',
+ 'ac3' : 'audio/ac3',
+ 'mp3' : 'audio/mpeg',
+ 'ogg' : 'audio/ogg',
+ 'css' : 'text/css',
+ 'csv' : 'text/csv',
+ 'htm' : 'text/html',
+ 'html' : 'text/html',
+ 'txt' : 'text/plain',
+ 'rtf' : 'text/rtf',
+ 'mp4' : 'video/mp4',
+ 'qt' : 'video/quicktime',
+ 'vc1' : 'video/vc1'
+ };
+
+ HttpTestServer(port, this.staticFileDirectory) {
+ server = new HttpServer();
+ server.listen("127.0.0.1", port);
+ server.onError = (e) {
+ };
+ server.defaultRequestHandler =
+ (HttpRequest request, HttpResponse response) {
+ try {
+ if (staticFileDirectory != null) {
+ String fname = request.path;
+ String path = '$staticFileDirectory$fname';
+ File f = new File(path);
+ if (f.existsSync()) {
+ var p = path.substring(path.lastIndexOf('.') + 1).toLowerCase();
+ if (MIME_TYPES.containsKey(p)) {
+ var ct = MIME_TYPES[p];
+ var idx = ct.indexOf('/');
+ response.headers.contentType =
+ new ContentType(ct.substring(0, idx),
+ ct.substring(idx + 1));
+ }
Søren Gjesse 2012/09/21 07:08:09 These two lines are not needed. The default status
+ response.statusCode = HttpStatus.OK;
+ response.reasonPhrase = "OK";
Søren Gjesse 2012/09/21 07:08:09 Here you can just do f.openInputStream().pipe(r
+ var content = f.readAsBytesSync();
+ response.outputStream.write(content);
+ response.outputStream.close();
+ } else {
+ response.statusCode = HttpStatus.NOT_FOUND;
Søren Gjesse 2012/09/21 07:08:09 No need to set reason phrase.
+ response.reasonPhrase = "Not Found";
+ response.outputStream.close();
+ }
+ }
+ } catch(e,s) {
+ response.statusCode = HttpStatus.INTERNAL_SERVER_ERROR;
+ response.reasonPhrase = "$e";
Søren Gjesse 2012/09/21 07:08:09 Maybe add response.writeString(s.toString());
+ response.outputStream.close();
+ }
+ };
+ }
+
+ void addHandler(Function matcher, handler) {
+ if (handler is Function) {
+ server.addRequestHandler(matcher, handler);
+ } else {
+ server.addRequestHandler(matcher, handler.onRequest);
+ }
+ }
+
+ void close() {
+ server.close();
+ }
+}
+
+ArgParser getOptionParser() {
+ var parser = new ArgParser();
+ parser.addOption('port', abbr: 'p',
+ help: 'Set the server listening port.',
+ defaultsTo: '80');
+
+ parser.addOption('root', abbr: 'r',
+ help: 'Set the directory for static files.',
+ defaultsTo: '/tmp');
+ return parser;
+}
+
+main() {
+ var optionsParser = getOptionParser();
+ try {
+ var argResults = optionsParser.parse(new Options().arguments);
+ var server = new HttpTestServer(
+ int.parse(argResults['port']),
+ argResults['root']);
+ } catch (e) {
+ print(e);
+ print('Usage: http_server_test_runner.dart <options>');
+ print(optionsParser.getUsage());
+ }
+}
« no previous file with comments | « utils/testrunner/html_wrap_task.dart ('k') | utils/testrunner/options.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698