| Index: tools/testing/dart/browser_perf_testing/lib/browser_perf_testing.dart
 | 
| diff --git a/tools/testing/dart/browser_perf_testing/lib/browser_perf_testing.dart b/tools/testing/dart/browser_perf_testing/lib/browser_perf_testing.dart
 | 
| new file mode 100644
 | 
| index 0000000000000000000000000000000000000000..2a79ab81ab5a650bf48d9f54b2babdd0ce00d949
 | 
| --- /dev/null
 | 
| +++ b/tools/testing/dart/browser_perf_testing/lib/browser_perf_testing.dart
 | 
| @@ -0,0 +1,146 @@
 | 
| +// Copyright (c) 2014, 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.
 | 
| +
 | 
| +/// Dart script to launch performance tests without WebDriver/Selenium.
 | 
| +///
 | 
| +/// WARNING: Although this is laid out like a package, it is not really a
 | 
| +/// package since it relies on test.dart files!
 | 
| +library browser_perf_testing;
 | 
| +
 | 
| +import '../../browser_controller.dart';
 | 
| +import '../../utils.dart';
 | 
| +import '../../http_server.dart';
 | 
| +import 'dart:async';
 | 
| +import 'dart:io';
 | 
| +import 'dart:convert';
 | 
| +import 'package:path/path.dart' as path;
 | 
| +import 'package:args/args.dart' as args_parser;
 | 
| +
 | 
| +final String ADDRESS = '127.0.0.1';
 | 
| +
 | 
| +/// A map that is passed to the testing framework to specify what ports the
 | 
| +/// browser controller runs on.
 | 
| +final Map SERVER_CONFIG = {
 | 
| +  'test_driver_port': 0,
 | 
| +  'test_driver_error_port': 0
 | 
| +};
 | 
| +
 | 
| +void main (List<String> args) {
 | 
| +  var options = _parseArguments(args);
 | 
| +
 | 
| +  // Start a server to serve the entire repo: the http server is available on
 | 
| +  // window.location.port.
 | 
| +  var servers = new TestingServers(
 | 
| +      new Path('/Users/efortuna/dart-git2/dart/xcodebuild/ReleaseIA32'),
 | 
| +      false, options['browser'], path.dirname(path.dirname(path.dirname(
 | 
| +      path.dirname(path.dirname(path.dirname(Platform.script.path)))))));
 | 
| +  servers.startServers(ADDRESS).then((_) {
 | 
| +    _runPerfTests(options, servers);
 | 
| +  });
 | 
| +}
 | 
| +
 | 
| +/// Helper function to parse the arguments for this file.
 | 
| +Map _parseArguments(List<String> args) {
 | 
| +  var parser =  new args_parser.ArgParser();
 | 
| +  parser.addOption('browser', defaultsTo: 'chrome', help: 'Name of the browser'
 | 
| +      ' to run this test with.');
 | 
| +  parser.addOption('termination_test_file', defaultsTo:
 | 
| +      '/root_dart/samples/third_party/dromaeo/dromaeo_end_condition.js',
 | 
| +      help: 'Path to a javascript file that contains the function '
 | 
| +      '"testIsComplete" tests whether the performance test has finished '
 | 
| +      'running. This is in a form that can be served up by '
 | 
| +      'http_server.dart, so it begins with /root_dart or some other server '
 | 
| +      'understood prefix.');
 | 
| +  parser.addOption('test_path', defaultsTo:
 | 
| +      '/root_dart/samples/third_party/dromaeo/index-js.html?jsANDqueryORjs'
 | 
| +      'ANDtraverseORjsANDattributes', help: 'Path to the performance test we '
 | 
| +      'wish to run. This is in a form that can be served up by '
 | 
| +      'http_server.dart, so it begins with /root_dart or some other server '
 | 
| +      'understood prefix.');
 | 
| +  parser.addOption('checked', defaultsTo: false,
 | 
| +      help: 'Run this test in checked mode.');
 | 
| +  parser.addFlag('help', abbr: 'h', negatable: false, callback: (help) {
 | 
| +    if (help) {
 | 
| +      print(parser.getUsage());
 | 
| +      exit(0);
 | 
| +    };
 | 
| +  });
 | 
| +  parser.addOption('timeout', defaultsTo: 300,
 | 
| +      help: 'Maximum amount of time to let a test run, in seconds.');
 | 
| +  return parser.parse(args);
 | 
| +}
 | 
| +
 | 
| +void _runPerfTests(Map options, TestingServers servers) {
 | 
| +  var browserName = options['browser'];
 | 
| +
 | 
| +  var testRunner = new BrowserTestRunner(SERVER_CONFIG, ADDRESS, browserName, 1,
 | 
| +      checkedMode: options['checked'],
 | 
| +      testingServer: new BrowserPerfTestingServer(browserName,
 | 
| +      options['termination_test_file'], servers.port));
 | 
| +
 | 
| +  var url = 'http://$ADDRESS:${servers.port}${options["test_path"]}';
 | 
| +
 | 
| +  BrowserTest browserTest = new BrowserTest(url,
 | 
| +      (BrowserTestOutput output) {
 | 
| +        var eventQueue = JSON.decode(output.lastKnownMessage);
 | 
| +        var lastEvent = eventQueue.last;
 | 
| +        var lines = lastEvent['value'].split('\n');
 | 
| +        for (var line in lines) {
 | 
| +          print(line);
 | 
| +        }
 | 
| +        testRunner.terminate();
 | 
| +        servers.stopServers();
 | 
| +      }, options['timeout']);
 | 
| +
 | 
| +  testRunner.start().then((started) {
 | 
| +    if (started) {
 | 
| +      testRunner.queueTest(browserTest);
 | 
| +    } else {
 | 
| +      print("Issue starting browser test runner $started");
 | 
| +      exit(1);
 | 
| +    }
 | 
| +  });
 | 
| +}
 | 
| +
 | 
| +/// Server for controlling and running performance tests. Note the tests
 | 
| +/// themselves are served on the local file system (to eliminate any additional
 | 
| +/// potential sources of lag), but we need a server to communicate when the test
 | 
| +/// is done.
 | 
| +class BrowserPerfTestingServer extends BrowserTestingServer {
 | 
| +  // Path to the script containing the ending condition of the performance test,
 | 
| +  // in the form of /root_dart, /root_build, or some other, as per the form of
 | 
| +  // url expected from http_server.dart.
 | 
| +  String endConditionScript;
 | 
| +  /// Port number to access the server serving the whole Dart repository.
 | 
| +  int repoPort;
 | 
| +
 | 
| +  BrowserPerfTestingServer(String browserName, this.endConditionScript,
 | 
| +      this.repoPort) : super(SERVER_CONFIG, ADDRESS,
 | 
| +      !Browser.BROWSERS_WITH_WINDOW_SUPPORT.contains(browserName));
 | 
| +
 | 
| +  /// We create a slightly modified version of the original browser_controller
 | 
| +  /// driver page.
 | 
| +  String getDriverPage(String browserId) {
 | 
| +    var orig = super.getDriverPage(browserId);
 | 
| +    //TODO(efortuna): Hacky!
 | 
| +    var insertIndex = orig.indexOf('<script type');
 | 
| +    var otherInsert = orig.indexOf('} else {',
 | 
| +        orig.indexOf('if (isStatusUpdate)'));
 | 
| +    var result = orig.substring(0, insertIndex) + """
 | 
| +    <!-- To create a performance test, you must write a script that provides an
 | 
| +  ending condition for the particular test, in the form /root_dart/foo (or
 | 
| +  whatever base from http_server). // TODO not hard code.-->
 | 
| +  <script src="http://$localIp:$repoPort$endConditionScript"></script>
 | 
| +""" + orig.substring(insertIndex, otherInsert) + """
 | 
| +            if (testIsComplete(msg)) {
 | 
| +              var obj = new Object();
 | 
| +              obj['message'] = msg;
 | 
| +              obj['is_first_message'] = false;
 | 
| +              obj['is_status_update'] = false;
 | 
| +              obj['is_done'] = true;
 | 
| +              window.postMessage(JSON.stringify(obj), '*');
 | 
| +            }""" + orig.substring(otherInsert);
 | 
| +    return result;
 | 
| +  }
 | 
| +}
 | 
| 
 |