blob: efe053bc85596d7c6d739232930cad810c5c4bca [file] [log] [blame] [edit]
// 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.
import 'dart:io';
import 'package:code_assets/code_assets.dart';
import 'package:data_assets/data_assets.dart';
import 'package:hooks/hooks.dart' hide build, link;
import 'package:hooks_runner/hooks_runner.dart';
import 'package:hooks_runner/src/model/hook_result.dart';
import 'package:test/test.dart';
import '../helpers.dart';
import 'helpers.dart';
const Timeout longTimeout = Timeout(Duration(minutes: 5));
void main() async {
test('simple_link linking', timeout: longTimeout, () async {
await inTempDir((tempUri) async {
await copyTestProjects(targetUri: tempUri);
final packageUri = tempUri.resolve('simple_link/');
// First, run `pub get`, we need pub to resolve our dependencies.
await runPubGet(workingDirectory: packageUri, logger: logger);
final buildResult = (await buildDataAssets(
packageUri,
linkingEnabled: true,
)).success;
expect(buildResult.encodedAssets.length, 0);
final linkResult = (await link(
packageUri,
logger,
dartExecutable,
buildResult: buildResult,
buildAssetTypes: [BuildAssetType.data],
)).success;
expect(linkResult.encodedAssets.length, 2);
final buildNoLinkResult = (await buildDataAssets(
packageUri,
linkingEnabled: false,
)).success;
expect(buildNoLinkResult.encodedAssets.length, 4);
});
});
test('complex_link linking', timeout: longTimeout, () async {
await inTempDir((tempUri) async {
// From package:complex_link_helper.
const builtHelperAssets = [
'assets/data_helper_0.json',
'assets/data_helper_1.json',
];
const helperAssetsForLinking = [
'assets/data_helper_2.json',
'assets/data_helper_3.json',
];
// From package:complex_link.
const mainAssetsForLinking = ['assets/data_0.json', 'assets/data_1.json'];
final encodedAssetsForLinking = [
...helperAssetsForLinking,
...mainAssetsForLinking,
];
final linkedAssets = encodedAssetsForLinking.skip(1);
await copyTestProjects(targetUri: tempUri);
final packageUri = tempUri.resolve('complex_link/');
// First, run `pub get`, we need pub to resolve our dependencies.
await runPubGet(workingDirectory: packageUri, logger: logger);
final buildResult = (await buildDataAssets(
packageUri,
linkingEnabled: true,
)).success;
expect(
_getNames(buildResult.encodedAssets),
unorderedEquals(builtHelperAssets),
);
expect(
_getNames(buildResult.encodedAssetsForLinking['complex_link']!),
unorderedEquals(encodedAssetsForLinking),
);
final linkResult = (await link(
packageUri,
logger,
dartExecutable,
buildResult: buildResult,
buildAssetTypes: [BuildAssetType.data],
)).success;
expect(
_getNames(buildResult.encodedAssets),
unorderedEquals(builtHelperAssets),
);
expect(
_getNames(linkResult.encodedAssets),
unorderedEquals(linkedAssets),
);
});
});
test('link metadata', timeout: longTimeout, () async {
await inTempDir((tempUri) async {
await copyTestProjects(targetUri: tempUri);
final packageUri = tempUri.resolve('flag_app/');
// First, run `pub get`, we need pub to resolve our dependencies.
await runPubGet(workingDirectory: packageUri, logger: logger);
final buildResult = (await buildDataAssets(
packageUri,
linkingEnabled: true,
)).success;
expect(
_getNames(buildResult.encodedAssetsForLinking['fun_with_flags']!),
unorderedEquals(['assets/ca.txt', 'assets/fr.txt', 'assets/de.txt']),
);
final linkResult = (await link(
packageUri,
logger,
dartExecutable,
buildResult: buildResult,
buildAssetTypes: [BuildAssetType.data],
)).success;
expect(
_getNames(linkResult.encodedAssets),
unorderedEquals(['assets/fr.txt', 'assets/de.txt']),
);
});
});
/// Check that the metadata can't be passed from dependency upwards, so in the
/// wrong direction. This shouldn't work, as there is an ordering to the link
/// hooks.
test('link inverse order', timeout: longTimeout, () async {
await inTempDir((tempUri) async {
await copyTestProjects(targetUri: tempUri);
final packageUri = tempUri.resolve('link_inverse_app/');
// First, run `pub get`, we need pub to resolve our dependencies.
await runPubGet(workingDirectory: packageUri, logger: logger);
final logMessages = <String>[];
final linkResult = await link(
packageUri,
logger,
dartExecutable,
capturedLogs: logMessages,
buildResult: HookResult(),
buildAssetTypes: [BuildAssetType.data],
);
final fullLog = logMessages.join('\n');
expect(linkResult.isFailure, isTrue);
expect(linkResult.asFailure.failure, HooksRunnerFailure.hookRun);
expect(
fullLog,
contains('All good, the metadata cant swim against the current'),
);
});
});
if (Platform.isMacOS || Platform.isWindows) {
// https://github.com/dart-lang/native/issues/1376.
return;
}
test('treeshaking assets using CLinker', timeout: longTimeout, () async {
await inTempDir((tempUri) async {
await copyTestProjects(targetUri: tempUri);
final packageUri = tempUri.resolve('treeshaking_native_libs/');
// First, run `pub get`, we need pub to resolve our dependencies.
await runPubGet(workingDirectory: packageUri, logger: logger);
final buildResult = (await build(
packageUri,
logger,
dartExecutable,
linkingEnabled: true,
buildAssetTypes: [BuildAssetType.code],
)).success;
expect(buildResult.encodedAssets.length, 0);
expect(buildResult.encodedAssetsForLinking.length, 1);
final logMessages = <String>[];
final linkResult = (await link(
packageUri,
logger,
dartExecutable,
buildResult: buildResult,
capturedLogs: logMessages,
buildAssetTypes: [BuildAssetType.code],
)).success;
expect(linkResult.encodedAssets.length, 1);
expect(linkResult.encodedAssets.first.isCodeAsset, isTrue);
});
});
}
Iterable<String> _getNames(List<EncodedAsset> assets) =>
assets.where((e) => e.isDataAsset).map((e) => e.asDataAsset.name);