Index: tools/testing/dart/record_and_replay.dart |
diff --git a/tools/testing/dart/record_and_replay.dart b/tools/testing/dart/record_and_replay.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..fd5df685908f78409e881cf8064ec9358061a9b4 |
--- /dev/null |
+++ b/tools/testing/dart/record_and_replay.dart |
@@ -0,0 +1,126 @@ |
+// 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 record_and_replay; |
+ |
+import 'dart:io'; |
+import 'dart:json' as json; |
+import 'dart:utf'; |
+ |
+import 'test_runner.dart'; |
+ |
+/* |
+ * Json files look like this: |
+ * |
+ * [ |
+ * { |
+ * 'name' : '...', |
+ * 'configuration' : '...', |
+ * 'command' : { |
+ * 'timeout_limit' : 60, |
+ * 'executable' : '...', |
+ * 'arguments' : ['arg1, 'arg2', '...'], |
+ * }, |
+ * 'command_output' : { |
+ * 'exit_code' : 42, |
+ * 'stdout' : '...', |
+ * 'stderr' : '...', |
+ * 'duration' : 1.5, |
+ * 'did_timeout' : false, |
+ * }, |
+ * }, |
+ * .... |
+ * ] |
+ */ |
+ |
+ |
+class TestCaseRecorder { |
+ Path _outputPath; |
+ List<Map> _recordedCommandInvocations = []; |
+ var _cwd; |
+ |
+ TestCaseRecorder(this._outputPath) { |
+ _cwd = new Directory.current().path; |
+ } |
+ |
+ void nextTestCase(TestCase testCase) { |
+ assert(testCase.commands.length == 1); |
+ |
+ var command = testCase.commands[0]; |
+ assert(command.environment == null); |
+ |
+ var arguments = []; |
+ for (var rawArgument in command.arguments) { |
+ if (rawArgument.startsWith(_cwd)) { |
+ var relative = new Path(rawArgument).relativeTo(new Path(_cwd)); |
+ arguments.add(relative.toNativePath()); |
+ } else { |
+ arguments.add(rawArgument); |
+ } |
+ } |
+ |
+ var commandExecution = { |
+ 'name' : testCase.displayName, |
+ 'configuration' : testCase.configurationString, |
+ 'command' : { |
+ 'timeout_limit' : testCase.timeout, |
+ 'executable' : command.executable, |
+ 'arguments' : arguments, |
+ }, |
+ }; |
+ _recordedCommandInvocations.add(commandExecution); |
+ } |
+ |
+ void finish() { |
+ var file = new File.fromPath(_outputPath); |
+ var jsonString = json.stringify(_recordedCommandInvocations); |
+ file.writeAsStringSync(jsonString); |
+ print("TestCaseRecorder: written all TestCases to ${_outputPath}"); |
+ } |
+} |
+ |
+class TestCaseOutputArchive { |
+ Map<String, Map> _testCaseOutputRecords; |
+ |
+ void loadFromPath(Path recordingPath) { |
+ var file = new File.fromPath(recordingPath); |
+ var testCases = json.parse(file.readAsStringSync()); |
+ _testCaseOutputRecords = {}; |
+ for (var testCase in testCases) { |
+ var key = _indexKey(testCase['configuration'], testCase['name']); |
+ _testCaseOutputRecords[key] = testCase['command_output']; |
+ } |
+ } |
+ |
+ CommandOutput outputOf(TestCase testCase) { |
+ var key = _indexKey(testCase.configurationString, testCase.displayName); |
+ var command_output = _testCaseOutputRecords[key]; |
+ if (command_output == null) { |
+ print("Sorry, but there is no command output for " |
+ "${testCase.displayName}"); |
+ |
+ exit(42); |
+ } |
+ |
+ double seconds = command_output['duration']; |
+ var duration = new Duration(seconds: seconds.round(), |
+ milliseconds: (seconds/1000).round()); |
+ var commandOutput = new CommandOutput.fromCase( |
+ testCase, |
+ testCase.commands.first, |
+ command_output['exit_code'], |
+ false, |
+ command_output['did_timeout'], |
+ encodeUtf8(command_output['stdout']), |
+ encodeUtf8(command_output['stderr']), |
+ duration, |
+ false); |
+ return commandOutput; |
+ } |
+ |
+ String _indexKey(String configuration, String name) { |
+ return "${configuration}__$name"; |
+ } |
+} |
+ |