blob: d5749680847ece94c89a6594ae51b1be1454df1d [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.
import 'dart:io';
import 'package:_fe_analyzer_shared/src/testing/annotated_code_helper.dart';
import 'package:path/path.dart' as p;
import 'package:sourcemap_testing/src/stepping_helper.dart';
import 'package:testing/testing.dart';
class Data {
Uri uri;
late Directory outDir;
late String testFileName;
late AnnotatedCode code;
late List<String> d8Output;
Data(this.uri);
}
abstract class ChainContextWithCleanupHelper extends ChainContext {
Map<TestDescription, Data> cleanupHelper = {};
@override
Future<void> cleanUp(TestDescription description, Result result) {
if (debugging() && result.outcome != Expectation.Pass) {
print('Not cleaning up: Running in debug-mode for non-passing test.');
return Future.value();
}
var data = cleanupHelper.remove(description);
data?.outDir.deleteSync(recursive: true);
return Future.value();
}
bool debugging() => false;
}
class Setup extends Step<TestDescription, Data, ChainContext> {
const Setup();
@override
String get name => 'setup';
@override
Future<Result<Data>> run(TestDescription input, ChainContext context) async {
var data = Data(input.uri);
if (context is ChainContextWithCleanupHelper) {
context.cleanupHelper[input] = data;
}
return pass(data);
}
}
class SetCwdToSdkRoot extends Step<Data, Data, ChainContext> {
const SetCwdToSdkRoot();
@override
String get name => 'setCWD';
@override
Future<Result<Data>> run(Data input, ChainContext context) async {
// stacktrace_helper assumes CWD is the sdk root dir.
Directory.current = sdkRoot;
return pass(input);
}
}
class StepWithD8 extends Step<Data, Data, ChainContext> {
const StepWithD8();
@override
String get name => 'step';
@override
Future<Result<Data>> run(Data data, ChainContext context) async {
var outWrapperPath = p.join(data.outDir.path, 'wrapper.js');
var runResult = runD8AndStep(data.outDir.path, data.testFileName, data.code,
['--module', outWrapperPath]);
data.d8Output = (runResult.stdout as String).split('\n');
return pass(data);
}
}
class CheckSteps extends Step<Data, Data, ChainContext> {
final bool debug;
CheckSteps(this.debug);
@override
String get name => 'check';
@override
Future<Result<Data>> run(Data data, ChainContext context) async {
checkD8Steps(data.outDir.path, data.d8Output, data.code, debug: debug);
return pass(data);
}
}
File findInOutDir(String relative) {
var outerDir = sdkRoot!.path;
for (var outDir in const [
'out/ReleaseX64',
'xcodebuild/ReleaseX64',
'xcodebuild/ReleaseARM64'
]) {
var tryPath = p.join(outerDir, outDir, relative);
var file = File(tryPath);
if (file.existsSync()) return file;
}
throw "Couldn't find $relative. Try building more targets.";
}
String get dartExecutable {
return Platform.resolvedExecutable;
}
String uriPathForwardSlashed(Uri uri) {
return uri.toFilePath().replaceAll('\\', '/');
}