Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright (c) 2012, 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 /** The default pipeline code for running a test file. */ | |
| 6 #library('pipeline'); | |
|
Siggi Cherem (dart-lang)
2012/09/28 01:53:51
FYI - you might want to start switching to the new
gram
2012/10/01 21:10:51
I'd like to punt on that for now and do that when
| |
| 7 #import('dart:isolate'); | |
| 8 #import('dart:io'); | |
| 9 #source('pipeline_utils.dart'); | |
| 10 | |
| 11 /** | |
| 12 * The configuration passed in to the pipeline runner; this essentially | |
| 13 * contains all the command line arguments passded to testrunner plus some | |
| 14 * synthesized ones. | |
| 15 */ | |
| 16 Map config; | |
| 17 | |
| 18 /** Paths to the various generated temporary files. */ | |
| 19 var tempDartFile = null; | |
| 20 var tempHtmlFile = null; | |
| 21 var tempChildDartFile = null; | |
| 22 var tempJsFile = null; | |
| 23 var tempChildJsFile = null; | |
| 24 | |
| 25 /** | |
| 26 * Path to the Dart script file referenced from the HTML wrapper (or | |
| 27 * that is compiled to a Javascript file referenced from the HTML wrapper). | |
| 28 */ | |
| 29 var sourceFile = null; | |
| 30 | |
| 31 /** Path to the script file referenced from the HTML wrapper (Dart or JS). */ | |
| 32 var scriptFile = null; | |
| 33 | |
| 34 /** MIME type of the script. */ | |
| 35 var scriptType; | |
| 36 | |
| 37 /** Process id for the HTTP server. */ | |
| 38 var serverId; | |
| 39 | |
| 40 void main() { | |
| 41 port.receive((cfg, replyPort) { | |
| 42 config = cfg; | |
| 43 initPipeline(replyPort); | |
| 44 wrapStage(); | |
| 45 }); | |
| 46 } | |
| 47 | |
| 48 /** Initial pipeline stage - generates Dart and HTML wrapper files. */ | |
| 49 wrapStage() { | |
| 50 var testFile = config["testfile"]; | |
| 51 // Generate names for the generated wrapper files. | |
| 52 tempDartFile = createTempName(config["tempdir"], testFile, '.dart'); | |
| 53 if (config["runtime"] != 'vm') { | |
| 54 tempHtmlFile = createTempName(config["tempdir"], testFile, '.html'); | |
|
Siggi Cherem (dart-lang)
2012/09/28 01:53:51
<< fix indent - here and several other places belo
gram
2012/10/01 21:10:51
Again, I don't see this.
| |
| 55 if (config["layout"]) { | |
| 56 tempChildDartFile = | |
| 57 createTempName(config["tempdir"], testFile, '-child.dart'); | |
| 58 } | |
| 59 if (config["runtime"] == 'drt-js') { | |
|
Siggi Cherem (dart-lang)
2012/09/28 01:53:51
<<
gram
2012/10/01 21:10:51
ditto
| |
| 60 tempJsFile = createTempName(config["tempdir"], testFile, '.js'); | |
| 61 if (config.layout) { | |
| 62 tempChildJsFile = | |
| 63 createTempName(config["tempdir"], testFile, '-child.js'); | |
| 64 } | |
| 65 } | |
| 66 } | |
| 67 | |
| 68 // Create the test controller Dart wrapper. | |
| 69 var directives, extras; | |
| 70 | |
| 71 if (config["layout"]) { | |
| 72 directives = ''' | |
| 73 #import('dart:uri'); | |
| 74 #import('dart:io'); | |
| 75 #import('dart:math'); | |
| 76 #source('${config["runnerDir"]}/layout_test_controller.dart'); | |
| 77 '''; | |
| 78 extras = ''' | |
| 79 sourceDir = '${config["expectedDirectory"]}'; | |
| 80 baseUrl = 'file://$tempHtmlFile'; | |
| 81 tprint = (msg) => print('###\$msg'); | |
| 82 notifyDone = (e) => exit(e); | |
|
Siggi Cherem (dart-lang)
2012/09/28 01:53:51
this one surprised me (I was expecting the postMes
gram
2012/10/01 21:10:51
No, the layout tests are split between a controlle
| |
| 83 '''; | |
| 84 } else if (config["runtime"] == "vm") { | |
| 85 directives = ''' | |
| 86 #import('dart:io'); | |
| 87 #import('dart:isolate'); | |
| 88 #import('${config["unittest"]}', prefix:'unittest'); | |
| 89 #import('${config["testfile"]}', prefix: 'test'); | |
| 90 #source('${config["runnerDir"]}/standard_test_runner.dart'); | |
| 91 '''; | |
| 92 extras = ''' | |
| 93 includeFilters = ${config["include"]}; | |
| 94 excludeFilters = ${config["exclude"]}; | |
| 95 tprint = (msg) => print('###\$msg'); | |
| 96 notifyDone = (e) => exit(e); | |
| 97 '''; | |
| 98 } else { | |
| 99 directives = ''' | |
| 100 #import('dart:html'); | |
| 101 #import('dart:isolate'); | |
| 102 #import('${config["unittest"]}', prefix:'unittest'); | |
| 103 #import('${config["testfile"]}', prefix: 'test'); | |
| 104 #source('${config["runnerDir"]}/standard_test_runner.dart'); | |
| 105 '''; | |
| 106 extras = ''' | |
| 107 includeFilters = ${config["include"]}; | |
| 108 excludeFilters = ${config["exclude"]}; | |
| 109 tprint = (msg) => query('#console').addText('###\$msg\\n'); | |
| 110 notifyDone = (e) => window.postMessage('done', '*'); | |
| 111 '''; | |
| 112 } | |
| 113 | |
| 114 var action = 'process(test.main, unittest.runTests)'; | |
| 115 if (config["layout-text"]) { | |
| 116 action = 'runTextLayoutTests()'; | |
| 117 } else if (config["layout-pixel"]) { | |
| 118 action = 'runPixelLayoutTests()'; | |
| 119 } else if (config["list-tests"]) { | |
| 120 action = 'process(test.main, listTests)'; | |
| 121 } else if (config["list-groups"]) { | |
| 122 action = 'process(test.main, listGroups)'; | |
| 123 } else if (config["isolate"]) { | |
| 124 action = 'process(test.main, runIsolateTests)'; | |
| 125 } | |
| 126 | |
| 127 logMessage('Creating $tempDartFile'); | |
| 128 writeFile(tempDartFile, ''' | |
| 129 #library('test_controller'); | |
| 130 $directives | |
| 131 | |
| 132 main() { | |
| 133 immediate = ${config["immediate"]}; | |
| 134 includeTime = ${config["time"]}; | |
| 135 passFormat = '${config["pass-format"]}'; | |
| 136 failFormat = '${config["fail-format"]}'; | |
| 137 errorFormat = '${config["error-format"]}'; | |
| 138 listFormat = '${config["list-format"]}'; | |
| 139 regenerate = ${config["regenerate"]}; | |
| 140 summarize = ${config["summary"]}; | |
| 141 testfile = '$testFile'; | |
| 142 drt = '${config["drt"]}'; | |
| 143 $extras | |
| 144 $action; | |
| 145 } | |
| 146 '''); | |
| 147 | |
| 148 // Create the child wrapper for layout tests. | |
| 149 if (config["layout"]) { | |
| 150 logMessage('Creating $tempChildDartFile'); | |
| 151 writeFile(tempChildDartFile, ''' | |
| 152 #library('layout_test'); | |
| 153 #import('dart:math'); | |
| 154 #import('dart:isolate'); | |
| 155 #import('dart:html'); | |
| 156 #import('dart:uri'); | |
| 157 #import('${config["unittest"]}', prefix:'unittest'); | |
| 158 #import('$testFile', prefix: 'test'); | |
| 159 #source('${config["runnerDir"]}/layout_test_runner.dart'); | |
| 160 | |
| 161 main() { | |
| 162 includeFilters = ${config["include"]}; | |
| 163 excludeFilters = ${config["exclude"]}; | |
| 164 runTests(test.main); | |
| 165 } | |
| 166 '''); | |
| 167 } | |
| 168 | |
| 169 | |
| 170 // Create the HTML wrapper and compile to Javascript if necessary. | |
| 171 var isJavascript = config["runtime"] == 'drt-js'; | |
| 172 if (config["runtime"] == 'drt-dart' || isJavascript) { | |
| 173 var bodyElements, runAsText; | |
| 174 | |
| 175 if (config["layout"]) { | |
| 176 sourceFile = tempChildDartFile; | |
| 177 scriptFile = isJavascript ? tempChildJsFile : tempChildDartFile; | |
| 178 bodyElements = ''; | |
| 179 } else { | |
| 180 sourceFile = tempDartFile; | |
| 181 scriptFile = isJavascript ? tempJsFile : tempDartFile; | |
| 182 bodyElements = '<div id="container"></div><pre id="console"></pre>'; | |
| 183 runAsText = "window.testRunner.dumpAsText();"; | |
| 184 } | |
| 185 scriptType = isJavascript ? 'text/javascript' : 'application/dart'; | |
| 186 | |
| 187 if (config["runtime"] == 'drt-dart' || isJavascript) { | |
| 188 logMessage('Creating $tempHtmlFile'); | |
| 189 writeFile(tempHtmlFile, ''' | |
| 190 <!DOCTYPE html> | |
| 191 <html> | |
| 192 <head> | |
| 193 <meta charset="utf-8"> | |
| 194 <title>$testFile</title> | |
| 195 <link rel="stylesheet" href="${config["runnerDir"]}/testrunner.css"> | |
| 196 <script type='text/javascript'> | |
| 197 if (window.testRunner) { | |
|
Siggi Cherem (dart-lang)
2012/09/28 01:53:51
should we move this to a .js file that is always i
gram
2012/10/01 21:10:51
There is some string interpolation here so no; we
| |
| 198 function handleMessage(m) { | |
| 199 if (m.data == 'done') { | |
| 200 window.testRunner.notifyDone(); | |
| 201 } | |
| 202 } | |
| 203 window.testRunner.waitUntilDone(); | |
| 204 $runAsText | |
| 205 window.addEventListener("message", handleMessage, false); | |
| 206 } | |
| 207 if (!$isJavascript && navigator.webkitStartDart) { | |
| 208 navigator.webkitStartDart(); | |
| 209 } | |
| 210 </script> | |
| 211 </head> | |
| 212 <body> | |
| 213 $bodyElements | |
| 214 <script type='$scriptType' src='$scriptFile'></script> | |
| 215 </script> | |
| 216 <script | |
| 217 src="http://dart.googlecode.com/svn/branches/bleeding_edge/dart/client/dart.js"> | |
| 218 </script> | |
| 219 </body> | |
| 220 </html> | |
| 221 '''); | |
| 222 } | |
| 223 } | |
| 224 compileStage(isJavascript); | |
| 225 } | |
| 226 | |
| 227 /** Second stage of pipeline - compiles Dart to Javascript if needed. */ | |
| 228 compileStage(isJavascript) { | |
| 229 if (isJavascript) { // Compile the Dart file. | |
| 230 if (config["checked"]) { | |
| 231 runCommand(config["dart2js"], | |
| 232 [ '--enable_checked_mode', '--out=$scriptFile', '$sourceFile' ]). | |
| 233 then(runTestStage); | |
| 234 } else { | |
| 235 runCommand(config["dart2js"], | |
| 236 [ '--out=$scriptFile', '$sourceFile' ]). | |
| 237 then(runTestStage); | |
| 238 } | |
| 239 } else { | |
| 240 runTestStage(); | |
| 241 } | |
| 242 } | |
| 243 | |
| 244 /** Third stage of pipeline - runs the tests. */ | |
| 245 runTestStage() { | |
| 246 if (config["server"]) { // Start the HTTP server. | |
| 247 serverId = startProcess(config["dart"], | |
| 248 [ '${config["runnerDir"]}/http_server_test_runner.dart', | |
| 249 '--port=${config["port"]}', | |
| 250 '--root=${config["root"]}']); | |
| 251 } | |
| 252 | |
| 253 var cmd, args; | |
| 254 if (config["runtime"] == 'vm' || config["layout"]) { // Run the tests. | |
| 255 if (config["checked"]) { | |
| 256 cmd = config["dart"]; | |
| 257 args = [ '--enable_asserts', '--enable_type_checks', tempDartFile ]; | |
| 258 } else { | |
| 259 cmd = config["dart"]; | |
| 260 args = [ tempDartFile ]; | |
| 261 } | |
| 262 } else { | |
| 263 cmd = config["drt"]; | |
| 264 args = [ '--no-timeout', tempHtmlFile ]; | |
| 265 } | |
| 266 runCommand(cmd, args, config["timeout"]).then(cleanupStage); | |
| 267 } | |
| 268 | |
| 269 /** | |
| 270 * Final stage of the pipeline - clean up generated files and notify | |
| 271 * the originator that started the isolate. | |
| 272 */ | |
| 273 cleanupStage(exitcode) { | |
| 274 if (config["server"]) { // Stop the HTTP server. | |
| 275 stopProcess(serverId); | |
| 276 } | |
| 277 | |
| 278 if (!config["keep_files"]) { // Remove the temporary files. | |
| 279 cleanup(tempDartFile); | |
| 280 cleanup(tempHtmlFile); | |
| 281 cleanup(tempJsFile); | |
| 282 cleanup(tempChildDartFile); | |
| 283 cleanup(tempChildJsFile); | |
| 284 } | |
| 285 completePipeline(exitcode); | |
| 286 } | |
| OLD | NEW |