Index: utils/testrunner/run_process_task.dart |
=================================================================== |
--- utils/testrunner/run_process_task.dart (revision 0) |
+++ utils/testrunner/run_process_task.dart (revision 0) |
@@ -0,0 +1,75 @@ |
+// 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. |
+ |
+/** A pipeline task to run a process and capture the output. */ |
+class RunProcessTask extends PipelineTask { |
+ String commandTemplate; |
+ List argumentTemplates; |
+ int timeout; |
+ |
+ void init(String commandTemplate, List argumentTemplates, int timeout) { |
+ this.commandTemplate = commandTemplate; |
+ this.argumentTemplates = argumentTemplates; |
+ this.timeout = timeout; |
+ } |
+ |
+ RunProcessTask(); |
+ |
+ void execute(Path testfile, List stdout, List stderr, bool logging, |
+ Function exitHandler) { |
+ var cmd = expandMacros(commandTemplate, testfile); |
+ List args = new List(); |
+ for (var i = 0; i < argumentTemplates.length; i++) { |
+ args.add(expandMacros(argumentTemplates[i], testfile)); |
+ } |
+ |
+ if (logging) { |
+ stdout.add('Running $cmd ${Strings.join(args, " ")}'); |
+ } |
+ var timer = null; |
+ var process = Process.start(cmd, args); |
+ process.onStart = () { |
+ timer = new Timer(1000 * timeout, (t) { |
+ timer = null; |
+ process.kill(); |
+ }); |
+ }; |
+ process.onExit = (exitCode) { |
+ if (timer != null) { |
+ timer.cancel(); |
+ } |
+ process.close(); |
+ exitHandler(exitCode); |
+ }; |
+ process.onError = (e) { |
+ print("Error starting process:"); |
+ print(" Command: $cmd"); |
+ print(" Error: $e"); |
+ exitHandler(-1); |
+ }; |
+ |
+ StringInputStream stdoutStringStream = |
+ new StringInputStream(process.stdout); |
+ StringInputStream stderrStringStream = |
+ new StringInputStream(process.stderr); |
+ stdoutStringStream.onLine = makeReadHandler(stdoutStringStream, stdout); |
+ stderrStringStream.onLine = makeReadHandler(stderrStringStream, stderr); |
+ } |
+ |
+ Function makeReadHandler(StringInputStream source, List<String> destination) { |
+ return () { |
+ if (source.closed) return; |
+ var line = source.readLine(); |
+ while (null != line) { |
+ if (config.immediateOutput && line.startsWith('###')) { |
+ _outStream.writeString(line.substring(3)); |
+ _outStream.writeString('\n'); |
+ } else { |
+ destination.add(line); |
+ } |
+ line = source.readLine(); |
+ } |
+ }; |
+ } |
+} |