blob: 43df6f438c6aef1d01319d59527e9bbbf8a4bc28 [file] [log] [blame]
// Copyright (c) 2017, 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 status_files.log_parser;
import 'record.dart';
final RegExp _stackRE = new RegExp('#[0-9]* ');
final RegExp _assertionFileRE = new RegExp(r"'file:[^']*/sdk/pkg/");
final String _assertionFileReplacement = r"'file:*/pkg/";
/// Extracts test records from a test.py [log].
List<Record> parse(String log) {
var records = <Record>[];
var suite;
var test;
var config;
var expected;
var actual;
var reason;
var fullReason; // lines before stack, usually multiline reason.
var stack = <String>[];
var paragraph = []; // collector of lines for fullReason.
bool reproIsNext = false;
for (var line in log.split('\n')) {
if (line.startsWith("FAILED: ")) {
int lastSlash = line.lastIndexOf('/');
// Some tests (particularly the html tests) have "group names" with spaces
// in them. So we find the test name by the space just before the last
// slash.
int space = line.substring(0, lastSlash).lastIndexOf(' ');
test = line.substring(space + 1).trim();
suite = '';
var slash = test.indexOf('/');
if (slash > 0) {
suite = test.substring(0, slash).trim();
test = test.substring(slash + 1).trim();
}
config = line
.substring("FAILED: ".length, space)
.replaceAll('release_ia32', '')
.replaceAll('release_x64', '');
}
if (line.startsWith("Expected: ")) {
expected = line.substring("Expected: ".length).trim();
}
if (line.startsWith("Actual: ")) {
actual = line.substring("Actual: ".length).trim();
}
if (line.startsWith("The compiler crashed:")) {
reason = line.substring("The compiler crashed:".length).trim();
reason = reason.replaceFirst(_assertionFileRE, _assertionFileReplacement);
paragraph.clear();
}
if (line.startsWith(_stackRE)) {
stack.add(line);
fullReason ??= paragraph.take(5).join('\n');
paragraph.clear();
} else {
paragraph.add(line);
}
if (reproIsNext) {
records.add(new Record(suite, test, config, expected, actual, reason,
line.trim(), fullReason, stack));
suite = test = config = expected = actual = reason = null;
stack = [];
fullReason = null;
paragraph.clear();
reproIsNext = false;
}
if (line.startsWith("--- Re-run this test:")) {
reproIsNext = true;
}
}
return records;
}