OLD | NEW |
| (Empty) |
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | |
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. | |
4 | |
5 /// Dart script to launch performance tests without WebDriver/Selenium. | |
6 /// | |
7 /// WARNING: Although this is laid out like a package, it is not really a | |
8 /// package since it relies on test.dart files! | |
9 library browser_perf_testing; | |
10 | |
11 import '../../browser_controller.dart'; | |
12 import '../../utils.dart'; | |
13 import '../../http_server.dart'; | |
14 import 'dart:async'; | |
15 import 'dart:io'; | |
16 import 'dart:convert'; | |
17 import 'package:path/path.dart' as path; | |
18 import 'package:args/args.dart' as args_parser; | |
19 | |
20 final String ADDRESS = '127.0.0.1'; | |
21 | |
22 /// A map that is passed to the testing framework to specify what ports the | |
23 /// browser controller runs on. | |
24 final Map SERVER_CONFIG = { | |
25 'test_driver_port': 0, | |
26 'test_driver_error_port': 0 | |
27 }; | |
28 | |
29 void main (List<String> args) { | |
30 var options = _parseArguments(args); | |
31 | |
32 // Start a server to serve the entire repo: the http server is available on | |
33 // window.location.port. | |
34 var servers = new TestingServers( | |
35 new Path('/Users/efortuna/dart-git2/dart/xcodebuild/ReleaseIA32'), | |
36 false, options['browser'], path.dirname(path.dirname(path.dirname( | |
37 path.dirname(path.dirname(path.dirname(Platform.script.path))))))); | |
38 servers.startServers(ADDRESS).then((_) { | |
39 _runPerfTests(options, servers); | |
40 }); | |
41 } | |
42 | |
43 /// Helper function to parse the arguments for this file. | |
44 Map _parseArguments(List<String> args) { | |
45 var parser = new args_parser.ArgParser(); | |
46 parser.addOption('browser', defaultsTo: 'chrome', help: 'Name of the browser' | |
47 ' to run this test with.'); | |
48 parser.addOption('termination_test_file', defaultsTo: | |
49 '/root_dart/samples/third_party/dromaeo/dromaeo_end_condition.js', | |
50 help: 'Path to a javascript file that contains the function ' | |
51 '"testIsComplete" tests whether the performance test has finished ' | |
52 'running. This is in a form that can be served up by ' | |
53 'http_server.dart, so it begins with /root_dart or some other server ' | |
54 'understood prefix.'); | |
55 parser.addOption('test_path', defaultsTo: | |
56 '/root_dart/samples/third_party/dromaeo/index-js.html?jsANDqueryORjs' | |
57 'ANDtraverseORjsANDattributes', help: 'Path to the performance test we ' | |
58 'wish to run. This is in a form that can be served up by ' | |
59 'http_server.dart, so it begins with /root_dart or some other server ' | |
60 'understood prefix.'); | |
61 parser.addOption('checked', defaultsTo: false, | |
62 help: 'Run this test in checked mode.'); | |
63 parser.addFlag('help', abbr: 'h', negatable: false, callback: (help) { | |
64 if (help) { | |
65 print(parser.getUsage()); | |
66 exit(0); | |
67 }; | |
68 }); | |
69 parser.addOption('timeout', defaultsTo: 300, | |
70 help: 'Maximum amount of time to let a test run, in seconds.'); | |
71 return parser.parse(args); | |
72 } | |
73 | |
74 void _runPerfTests(Map options, TestingServers servers) { | |
75 var browserName = options['browser']; | |
76 | |
77 var testRunner = new BrowserTestRunner(SERVER_CONFIG, ADDRESS, browserName, 1, | |
78 checkedMode: options['checked'], | |
79 testingServer: new BrowserPerfTestingServer(browserName, | |
80 options['termination_test_file'], servers.port)); | |
81 | |
82 var url = 'http://$ADDRESS:${servers.port}${options["test_path"]}'; | |
83 | |
84 BrowserTest browserTest = new BrowserTest(url, | |
85 (BrowserTestOutput output) { | |
86 var eventQueue = JSON.decode(output.lastKnownMessage); | |
87 var lastEvent = eventQueue.last; | |
88 var lines = lastEvent['value'].split('\n'); | |
89 for (var line in lines) { | |
90 print(line); | |
91 } | |
92 testRunner.terminate(); | |
93 servers.stopServers(); | |
94 }, options['timeout']); | |
95 | |
96 testRunner.start().then((started) { | |
97 if (started) { | |
98 testRunner.queueTest(browserTest); | |
99 } else { | |
100 print("Issue starting browser test runner $started"); | |
101 exit(1); | |
102 } | |
103 }); | |
104 } | |
105 | |
106 /// Server for controlling and running performance tests. Note the tests | |
107 /// themselves are served on the local file system (to eliminate any additional | |
108 /// potential sources of lag), but we need a server to communicate when the test | |
109 /// is done. | |
110 class BrowserPerfTestingServer extends BrowserTestingServer { | |
111 // Path to the script containing the ending condition of the performance test, | |
112 // in the form of /root_dart, /root_build, or some other, as per the form of | |
113 // url expected from http_server.dart. | |
114 String endConditionScript; | |
115 /// Port number to access the server serving the whole Dart repository. | |
116 int repoPort; | |
117 | |
118 BrowserPerfTestingServer(String browserName, this.endConditionScript, | |
119 this.repoPort) : super(SERVER_CONFIG, ADDRESS, | |
120 !Browser.BROWSERS_WITH_WINDOW_SUPPORT.contains(browserName)); | |
121 | |
122 /// We create a slightly modified version of the original browser_controller | |
123 /// driver page. | |
124 String getDriverPage(String browserId) { | |
125 var orig = super.getDriverPage(browserId); | |
126 //TODO(efortuna): Hacky! | |
127 var insertIndex = orig.indexOf('<script type'); | |
128 var otherInsert = orig.indexOf('} else {', | |
129 orig.indexOf('if (isStatusUpdate)')); | |
130 var result = orig.substring(0, insertIndex) + """ | |
131 <!-- To create a performance test, you must write a script that provides an | |
132 ending condition for the particular test, in the form /root_dart/foo (or | |
133 whatever base from http_server). // TODO not hard code.--> | |
134 <script src="http://$localIp:$repoPort$endConditionScript"></script> | |
135 """ + orig.substring(insertIndex, otherInsert) + """ | |
136 if (testIsComplete(msg)) { | |
137 var obj = new Object(); | |
138 obj['message'] = msg; | |
139 obj['is_first_message'] = false; | |
140 obj['is_status_update'] = false; | |
141 obj['is_done'] = true; | |
142 window.postMessage(JSON.stringify(obj), '*'); | |
143 }""" + orig.substring(otherInsert); | |
144 return result; | |
145 } | |
146 } | |
OLD | NEW |