blob: 534936a19c2714d0c3d33649423282bfe6d4d399 [file] [log] [blame]
// Copyright (c) 2023, 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' hide Link;
import 'dart:typed_data';
import 'package:compiler/compiler_api.dart';
import 'package:compiler/src/commandline_options.dart';
import 'package:compiler/src/compiler.dart';
import 'package:compiler/src/util/memory_compiler.dart';
import 'package:expect/async_helper.dart';
import 'package:expect/expect.dart';
const resultFilename = 'deferred.data';
const cfeFilename = 'cfe.dill';
const shardCount = 3;
void mainHelper(
String testGroup,
int shard,
List<String> flags,
List<String> args,
) {
if (shard < 0 || shard > shardCount) throw 'Invalid shard $shard.';
final generateGoldens = args.contains('-g');
asyncTest(() async {
await runTest(testGroup, shard, flags, generateGoldens: generateGoldens);
});
}
Future<void> runTest(
String testGroup,
int shard,
List<String> options, {
required bool generateGoldens,
}) async {
Directory dataDir = Directory.fromUri(Platform.script.resolve('data'));
Directory goldensDir = Directory.fromUri(
Platform.script.resolve('load_id_map_goldens/').resolve(testGroup),
);
final goldenFiles = goldensDir.listSync();
int counter = 0;
for (final testDir in dataDir.listSync()) {
if (testDir is! Directory) continue;
if (counter++ % shardCount != shard) continue;
final testName = testDir.uri.pathSegments.lastWhere((s) => s.isNotEmpty);
print('-- Testing deferred load id map for: $testName ($testGroup) --');
late Compiler compiler;
final testFiles = testDir.listSync();
final sourceFiles = <String, String>{};
for (final testFile in testFiles) {
sourceFiles[testFile.uri.pathSegments.last] = await (testFile as File)
.readAsString();
}
final cfeCollector = OutputCollector();
await runCompiler(
memorySourceFiles: sourceFiles,
options: ['${Flags.stage}=cfe', '--out=$cfeFilename', ...options],
outputProvider: cfeCollector,
beforeRun: (c) => compiler = c,
);
final cfeDill = Uint8List.fromList(
cfeCollector.binaryOutputMap.values.first.list,
);
final dillInputFiles = {cfeFilename: cfeDill};
final resultCollector = OutputCollector();
final compilerResult = await runCompiler(
memorySourceFiles: dillInputFiles,
outputProvider: resultCollector,
options: [
'${Flags.stage}=deferred-load-ids',
'${Flags.deferredLoadIdMapUri}=$resultFilename',
'${Flags.stage}=deferred-load-ids',
'--input-dill=memory:$cfeFilename',
...options,
],
beforeRun: (c) => compiler = c,
);
Expect.isTrue(compilerResult.isSuccess);
Expect.isNull(compiler.globalInference.resultsForTesting);
final result = resultCollector.getOutput(
resultFilename,
OutputType.deferredLoadIds,
);
Expect.isNotNull(result);
final goldenUri = goldensDir.uri.resolve('$testName.golden');
if (generateGoldens) {
File.fromUri(goldenUri).writeAsString(result.toString());
print('-- Updated golden for: $testName ($testGroup) --');
} else {
final expectedOutput =
await (goldenFiles.firstWhere((e) => e.path == goldenUri.path)
as File)
.readAsString();
Expect.equals(expectedOutput, result.toString());
}
}
}