blob: 5997d00b1869aac4032550c980cf72060daa6ae4 [file] [log] [blame]
// Copyright (c) 2024, 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.
@OnPlatform({'mac-os': Timeout.factor(2), 'windows': Timeout.factor(10)})
library;
import 'dart:convert';
import 'dart:io';
import 'package:code_assets/code_assets.dart';
import 'package:data_assets/data_assets.dart';
import 'package:hooks/hooks.dart';
import 'package:test/test.dart';
import '../build_runner/helpers.dart';
import '../helpers.dart';
void main() async {
const packageName = 'transformer';
test(
'transformer caching',
() => inTempDir((tempUri) async {
final packageUri = tempUri.resolve('$packageName/');
await copyTestProjects(
sourceUri: testDataUri.resolve('$packageName/'),
targetUri: packageUri,
);
await runPubGet(workingDirectory: packageUri, logger: logger);
final buildOutputUri = tempUri.resolve('build_output.json');
final outputDirectory = tempUri.resolve('out/');
await Directory.fromUri(outputDirectory).create();
final outputDirectoryShared = tempUri.resolve('out_shared/');
await Directory.fromUri(outputDirectoryShared).create();
final testTempUri = tempUri.resolve('test1/');
await Directory.fromUri(testTempUri).create();
final dartUri = Uri.file(Platform.resolvedExecutable);
late String stdout;
late BuildOutput output;
final targetOS = OS.current;
Future<void> runBuild(Architecture architecture) async {
final inputBuilder = BuildInputBuilder()
..setupShared(
packageName: packageName,
packageRoot: packageUri,
outputFile: buildOutputUri,
outputDirectoryShared: outputDirectoryShared,
)
..config.setupBuild(linkingEnabled: false)
..addExtension(DataAssetsExtension())
..addExtension(
CodeAssetExtension(
targetArchitecture: architecture,
targetOS: targetOS,
macOS: targetOS == OS.macOS
? MacOSCodeConfig(targetVersion: defaultMacOSVersion)
: null,
linkModePreference: LinkModePreference.dynamic,
),
);
final buildInputUri = testTempUri.resolve('build_input.json');
File.fromUri(
buildInputUri,
).writeAsStringSync(jsonEncode(inputBuilder.json));
final processResult = await Process.run(dartUri.toFilePath(), [
'hook/build.dart',
'--config=${buildInputUri.toFilePath()}',
], workingDirectory: packageUri.toFilePath());
if (processResult.exitCode != 0) {
print(processResult.stdout);
print(processResult.stderr);
print(processResult.exitCode);
}
expect(processResult.exitCode, 0);
stdout = processResult.stdout as String;
output = BuildOutput(
json.decode(await File.fromUri(buildOutputUri).readAsString())
as Map<String, Object?>,
);
}
await runBuild(Architecture.x64);
expect(
stdout,
stringContainsInOrder([
'Transformed 10 files.',
'Reused 0 cached files.',
]),
);
expect(
output.assets.data,
contains(
DataAsset(
file: outputDirectoryShared.resolve('data_transformed0.json'),
name: 'data_transformed0.json',
package: packageName,
),
),
);
expect(
output.dependencies,
containsAll([
packageUri.resolve('data/'),
packageUri.resolve('data/data0.json'),
]),
);
await File.fromUri(
packageUri.resolve('data/data0.json'),
).writeAsString(jsonEncode({'foo': 'bar'}));
// Run the build for a different architecture.
// This should use the caching inside the hook.
await runBuild(Architecture.arm64);
expect(
stdout,
stringContainsInOrder([
'Transformed 1 files.',
'Reused 9 cached files.',
]),
);
}),
);
}