| Index: tools/testing/dart/utils.dart
|
| diff --git a/tools/testing/dart/utils.dart b/tools/testing/dart/utils.dart
|
| deleted file mode 100644
|
| index a1c4ecc5b55cc7b4083fa5d455bd2f39d18c938b..0000000000000000000000000000000000000000
|
| --- a/tools/testing/dart/utils.dart
|
| +++ /dev/null
|
| @@ -1,310 +0,0 @@
|
| -// Copyright (c) 2013, 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 utils;
|
| -
|
| -import 'dart:io';
|
| -import 'dart:convert';
|
| -
|
| -import 'path.dart';
|
| -
|
| -// This is the maximum time we expect stdout/stderr of subprocesses to deliver
|
| -// data after we've got the exitCode.
|
| -const Duration MAX_STDIO_DELAY = const Duration(seconds: 30);
|
| -
|
| -String MAX_STDIO_DELAY_PASSED_MESSAGE =
|
| -"""Not waiting for stdout/stderr from subprocess anymore
|
| -($MAX_STDIO_DELAY passed). Please note that this could be an indicator
|
| -that there is a hanging process which we were unable to kill.""";
|
| -
|
| -class DebugLogger {
|
| - static IOSink _sink;
|
| -
|
| - /**
|
| - * If [path] was null, the DebugLogger will write messages to stdout.
|
| - */
|
| - static init(Path path, {append: false}) {
|
| - if (path != null) {
|
| - var mode = append ? FileMode.APPEND : FileMode.WRITE;
|
| - _sink = new File(path.toNativePath()).openWrite(mode: mode);
|
| - }
|
| - }
|
| -
|
| - static void close() {
|
| - if (_sink != null) {
|
| - _sink.close();
|
| - _sink = null;
|
| - }
|
| - }
|
| -
|
| - static String _formatErrorMessage(String msg, error) {
|
| - if (error == null) return msg;
|
| - msg += ": $error";
|
| - // TODO(floitsch): once the dart-executable that is bundled
|
| - // with the Dart sources is updated, pass a trace parameter too and do:
|
| - // if (trace != null) msg += "\nStackTrace: $trace";
|
| - return msg;
|
| - }
|
| - static void info(String msg, [error]) {
|
| - msg = _formatErrorMessage(msg, error);
|
| - _print("$_datetime Info: $msg");
|
| - }
|
| -
|
| - static void warning(String msg, [error]) {
|
| - msg = _formatErrorMessage(msg, error);
|
| - _print("$_datetime Warning: $msg");
|
| - }
|
| -
|
| - static void error(String msg, [error]) {
|
| - msg = _formatErrorMessage(msg, error);
|
| - _print("$_datetime Error: $msg");
|
| - }
|
| -
|
| - static void _print(String msg) {
|
| - if (_sink != null) {
|
| - _sink.writeln(msg);
|
| - } else {
|
| - print(msg);
|
| - }
|
| - }
|
| -
|
| - static String get _datetime => "${new DateTime.now()}";
|
| -}
|
| -
|
| -String prettifyJson(Object json, {int startIndentation: 0, int shiftWidth: 6}) {
|
| - int currentIndentation = startIndentation;
|
| - var buffer = new StringBuffer();
|
| -
|
| - String indentationString() {
|
| - return new List.filled(currentIndentation, ' ').join('');
|
| - }
|
| -
|
| - addString(String s, {bool indentation: true, bool newLine: true}) {
|
| - if (indentation) {
|
| - buffer.write(indentationString());
|
| - }
|
| - buffer.write(s.replaceAll("\n", "\n${indentationString()}"));
|
| - if (newLine) buffer.write("\n");
|
| - }
|
| -
|
| - prettifyJsonInternal(
|
| - Object obj, {bool indentation: true, bool newLine: true}) {
|
| - if (obj is List) {
|
| - addString("[", indentation: indentation);
|
| - currentIndentation += shiftWidth;
|
| - for (var item in obj) {
|
| -
|
| - prettifyJsonInternal(item, indentation: indentation, newLine: false);
|
| - addString(",", indentation: false);
|
| - }
|
| - currentIndentation -= shiftWidth;
|
| - addString("]", indentation: indentation);
|
| - } else if (obj is Map) {
|
| - addString("{", indentation: indentation);
|
| - currentIndentation += shiftWidth;
|
| - for (var key in obj.keys) {
|
| - addString("$key: ", indentation: indentation, newLine: false);
|
| - currentIndentation += shiftWidth;
|
| - prettifyJsonInternal(obj[key], indentation: false);
|
| - currentIndentation -= shiftWidth;
|
| - }
|
| - currentIndentation -= shiftWidth;
|
| - addString("}", indentation: indentation, newLine: newLine);
|
| - } else {
|
| - addString("$obj", indentation: indentation, newLine: newLine);
|
| - }
|
| - }
|
| - prettifyJsonInternal(json);
|
| - return buffer.toString();
|
| -}
|
| -
|
| -
|
| -/**
|
| - * [areByteArraysEqual] compares a range of bytes from [buffer1] with a
|
| - * range of bytes from [buffer2].
|
| - *
|
| - * Returns [true] if the [count] bytes in [buffer1] (starting at
|
| - * [offset1]) match the [count] bytes in [buffer2] (starting at
|
| - * [offset2]).
|
| - * Otherwise [false] is returned.
|
| - */
|
| -bool areByteArraysEqual(List<int> buffer1, int offset1,
|
| - List<int> buffer2, int offset2,
|
| - int count) {
|
| - if ((offset1 + count) > buffer1.length ||
|
| - (offset2 + count) > buffer2.length) {
|
| - return false;
|
| - }
|
| -
|
| - for (var i = 0; i < count; i++) {
|
| - if (buffer1[offset1 + i] != buffer2[offset2 + i]) {
|
| - return false;
|
| - }
|
| - }
|
| - return true;
|
| -}
|
| -
|
| -/**
|
| - * [findBytes] searches for [pattern] in [data] beginning at [startPos].
|
| - *
|
| - * Returns [true] if [pattern] was found in [data].
|
| - * Otherwise [false] is returned.
|
| - */
|
| -int findBytes(List<int> data, List<int> pattern, [int startPos=0]) {
|
| - // TODO(kustermann): Use one of the fast string-matching algorithms!
|
| - for (int i = startPos; i < (data.length - pattern.length); i++) {
|
| - bool found = true;
|
| - for (int j = 0; j < pattern.length; j++) {
|
| - if (data[i + j] != pattern[j]) {
|
| - found = false;
|
| - break;
|
| - }
|
| - }
|
| - if (found) {
|
| - return i;
|
| - }
|
| - }
|
| - return -1;
|
| -}
|
| -
|
| -List<int> encodeUtf8(String string) {
|
| - return UTF8.encode(string);
|
| -}
|
| -
|
| -// TODO(kustermann,ricow): As soon we have a debug log we should log
|
| -// invalid utf8-encoded input to the log.
|
| -// Currently invalid bytes will be replaced by a replacement character.
|
| -String decodeUtf8(List<int> bytes) {
|
| - return UTF8.decode(bytes, allowMalformed: true);
|
| -}
|
| -
|
| -class Locations {
|
| - static String getBrowserLocation(String browserName,
|
| - Map globalConfiguration) {
|
| - var location = globalConfiguration[browserName];
|
| - if (location != null && location != '') {
|
| - return location;
|
| - }
|
| - var browserLocations = {
|
| - 'firefox': const {
|
| - 'windows': 'C:\\Program Files (x86)\\Mozilla Firefox\\firefox.exe',
|
| - 'linux': 'firefox',
|
| - 'macos': '/Applications/Firefox.app/Contents/MacOS/firefox'
|
| - },
|
| - 'chrome': const {
|
| - 'windows':
|
| - 'C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe',
|
| - 'macos':
|
| - '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome',
|
| - 'linux': 'google-chrome'
|
| - },
|
| - 'dartium': const {
|
| - 'windows': 'client\\tests\\dartium\\chrome.exe',
|
| - 'macos': 'client/tests/dartium/Chromium.app/Contents/MacOS/Chromium',
|
| - 'linux': 'client/tests/dartium/chrome'
|
| - },
|
| - 'safari': const {
|
| - 'macos': '/Applications/Safari.app/Contents/MacOS/Safari'
|
| - },
|
| - 'safarimobilesim': const {
|
| - 'macos': '/Applications/Xcode.app/Contents/Developer/Platforms/'
|
| - 'iPhoneSimulator.platform/Developer/Applications/'
|
| - 'iPhone Simulator.app/Contents/MacOS/iPhone Simulator'
|
| - },
|
| - 'ie9': const {
|
| - 'windows': 'C:\\Program Files\\Internet Explorer\\iexplore.exe'
|
| - },
|
| - 'ie10': const {
|
| - 'windows': 'C:\\Program Files\\Internet Explorer\\iexplore.exe'
|
| - },
|
| - 'ie11': const {
|
| - 'windows': 'C:\\Program Files\\Internet Explorer\\iexplore.exe'
|
| - }};
|
| - browserLocations['ff'] = browserLocations['firefox'];
|
| -
|
| - assert(browserLocations[browserName] != null);
|
| - location = browserLocations[browserName][Platform.operatingSystem];
|
| - if (location != null) {
|
| - return location;
|
| - } else {
|
| - throw '$browserName not supported on ${Platform.operatingSystem}';
|
| - }
|
| - }
|
| -}
|
| -
|
| -// This function is pretty stupid and only puts quotes around an argument if
|
| -// it the argument contains a space.
|
| -String escapeCommandLineArgument(String argument) {
|
| - if (argument.contains(' ')) {
|
| - return '"$argument"';
|
| - }
|
| - return argument;
|
| -}
|
| -
|
| -class HashCodeBuilder {
|
| - int _value = 0;
|
| -
|
| - void add(Object object) {
|
| - _value = ((_value * 31) ^ object.hashCode) & 0x3FFFFFFF;
|
| - }
|
| -
|
| - void addJson(Object object) {
|
| - if (object == null || object is num || object is String ||
|
| - object is Uri || object is bool) {
|
| - add(object);
|
| - } else if (object is List) {
|
| - object.forEach(addJson);
|
| - } else if (object is Map) {
|
| - for (var key in object.keys.toList()..sort()) {
|
| - addJson(key);
|
| - addJson(object[key]);
|
| - }
|
| - } else {
|
| - throw new Exception("Can't build hashcode for non json-like object "
|
| - "(${object.runtimeType})");
|
| - }
|
| - }
|
| -
|
| - int get value => _value;
|
| -}
|
| -
|
| -bool deepJsonCompare(Object a, Object b) {
|
| - if (a == null || a is num || a is String) {
|
| - return a == b;
|
| - } else if (a is List) {
|
| - if (b is List) {
|
| - if (a.length != b.length) return false;
|
| -
|
| - for (int i = 0; i < a.length; i++) {
|
| - if (!deepJsonCompare(a[i], b[i])) return false;
|
| - }
|
| - return true;
|
| - }
|
| - return false;
|
| - } else if (a is Map) {
|
| - if (b is Map) {
|
| - if (a.length != b.length) return false;
|
| -
|
| - for (var key in a.keys) {
|
| - if (!b.containsKey(key)) return false;
|
| - if (!deepJsonCompare(a[key], b[key])) return false;
|
| - }
|
| - return true;
|
| - }
|
| - return false;
|
| - } else {
|
| - throw new Exception("Can't compare two non json-like objects "
|
| - "(a: ${a.runtimeType}, b: ${b.runtimeType})");
|
| - }
|
| -}
|
| -
|
| -class UniqueObject {
|
| - static int _nextId = 1;
|
| - final int _hashCode;
|
| -
|
| - int get hashCode => _hashCode;
|
| - operator==(other) => other is UniqueObject && _hashCode == other._hashCode;
|
| -
|
| - UniqueObject() : _hashCode = ++_nextId;
|
| -}
|
|
|