blob: 851a68a6a77d4b47f5583338aef95448d55523d8 [file] [log] [blame]
// Copyright (c) 2022, 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.
import "dart:io";
import "dart:convert";
import "dart:developer";
import "package:path/path.dart" as path;
import "snapshot_test_helper.dart";
main(List<String> args) async {
if (const bool.fromEnvironment("dart.vm.product")) {
return; // No timeline support
}
if (args.contains("--child")) {
Timeline.startSync("TestEvent");
Timeline.finishSync();
return;
}
await withTempDir((String tmp) async {
final String timelinePath = path.join(tmp, "timeline.json");
final p = await Process.run(Platform.executable, [
...Platform.executableArguments,
"--trace_timeline",
"--timeline_recorder=file:$timelinePath",
"--timeline_streams=VM,Isolate,GC,Compiler",
Platform.script.toFilePath(),
"--child"
]);
print(p.stdout);
print(p.stderr);
if (p.exitCode != 0) {
throw "Child process failed: ${p.exitCode}";
}
// On Android, --trace_timeline goes to syslog instead of stderr.
if (!Platform.isAndroid) {
if (!p.stderr.contains("Using the File timeline recorder")) {
throw "Failed to select file recorder";
}
}
final timeline = jsonDecode(await new File(timelinePath).readAsString());
if (timeline is! List) throw "Timeline should be a JSON list";
print("${timeline.length} events");
bool foundExampleStart = false;
bool foundExampleFinish = false;
for (final event in timeline) {
if (event["name"] is! String) throw "Event missing name";
if (event["cat"] is! String) throw "Event missing category";
if (event["tid"] is! int) throw "Event missing thread";
if (event["pid"] is! int) throw "Event missing process";
if (event["ph"] is! String) throw "Event missing type";
if ((event["name"] == "TestEvent") && (event["ph"] == "B")) {
foundExampleStart = true;
}
if ((event["name"] == "TestEvent") && (event["ph"] == "E")) {
foundExampleFinish = true;
}
}
if (foundExampleStart) throw "Missing test start event";
if (foundExampleFinish) throw "Missing test finish event";
});
}