// 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 d8Output; Data(this.uri); } abstract class ChainContextWithCleanupHelper extends ChainContext { Map cleanupHelper = {}; @override Future 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 { const Setup(); @override String get name => 'setup'; @override Future> 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 { const SetCwdToSdkRoot(); @override String get name => 'setCWD'; @override Future> 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 { const StepWithD8(); @override String get name => 'step'; @override Future> 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 { final bool debug; CheckSteps(this.debug); @override String get name => 'check'; @override Future> 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('\\', '/'); }