blob: 15903ee5eada1b8d155c9adfcdd70246bb500d83 [file] [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 'package:code_assets/code_assets.dart';
import 'package:data_assets/data_assets.dart';
import 'package:hooks/hooks.dart';
import 'package:test/test.dart';
import 'helpers.dart';
void main() {
test('checksum', () async {
// metadata, cc, link vs build, metadata, haslink
final checksums = <String>[];
final inputs = <String, Object?>{};
for (final hook in ['build', 'link']) {
for (final linking in [true, if (hook == 'build') false]) {
for (final assetTypes in [
[BuildAssetType.code],
[BuildAssetType.code, BuildAssetType.data],
[BuildAssetType.data],
]) {
for (final os in [
OS.android,
if (assetTypes.contains(BuildAssetType.code)) OS.iOS,
if (assetTypes.contains(BuildAssetType.code)) OS.macOS,
]) {
for (final architecture in [
Architecture.arm64,
if (assetTypes.contains(BuildAssetType.code)) Architecture.x64,
]) {
for (final targetVersion in [
if (os == OS.android) 30,
if (os == OS.iOS) flutteriOSHighestBestEffort,
if (os == OS.iOS) flutteriOSHighestSupported,
if (os == OS.macOS) defaultMacOSVersion,
]) {
for (final iOSSdk in [
if (architecture == Architecture.arm64 && os == OS.iOS)
IOSSdk.iPhoneOS,
IOSSdk.iPhoneSimulator,
]) {
final builder = BuildInputBuilder();
if (hook == 'build') {
builder.config.setupBuild(linkingEnabled: linking);
}
if (assetTypes.contains(BuildAssetType.code)) {
builder.addExtension(
CodeAssetExtension(
targetArchitecture: architecture,
targetOS: os,
android: os == OS.android
? AndroidCodeConfig(targetNdkApi: targetVersion)
: null,
macOS: os == OS.macOS
? MacOSCodeConfig(targetVersion: targetVersion)
: null,
iOS: os == OS.iOS
? IOSCodeConfig(
targetVersion: targetVersion,
targetSdk: iOSSdk,
)
: null,
linkModePreference: LinkModePreference.dynamic,
),
);
}
if (assetTypes.contains(BuildAssetType.data)) {
builder.addExtension(DataAssetsExtension());
}
final checksum = builder.computeChecksum();
checksums.add(checksum);
if (inputs[checksum] != null) {
expect(builder.json['config'], inputs[checksum]);
}
inputs[checksum] = builder.json['config'];
}
}
}
}
}
}
}
// As all variants have something different, we expect the checksums to be
// unique.
expect(checksums.toSet().length, checksums.length);
// If format or algorithm for checksumming changes we'd like to know (by
// needing to update this list).
final expectedChecksums = <String>[
'61ab5ef403',
'e3a77db8c8',
'e7a12aac9e',
'cf1dd12731',
'ad93ea8c70',
'38c7c121e0',
'c08bfcfb82',
'e1270f247e',
'e78c9baa33',
'9ad4121bad',
'e5e00070ef',
'838b8de06f',
'589ee41a4f',
'4746317758',
'61773dc007',
'cbdc799766',
'81ab30daef',
'c3b5b08d9d',
'817d7a4498',
'43bf049e1e',
'edeadb00c1',
'c31e4bfcd5',
'ab4f63c8d2',
'2ef2c44c95',
'553911c581',
'bab035bb05',
'c011395901',
'e9f7fadde6',
'ebba044d32',
'0b282c055b',
'9a8e06eeda',
'75515f1094',
'c86127d13e',
'4667534582',
'f94ee3512b',
'799b09a9cb',
'1c2bddd1f0',
'af00c3aa52',
'c1505e20a9',
'31f2609c73',
'7cd688235b',
'81bac5e642',
'1a78f75ee1',
'9d6adcd09c',
'55fc558767',
'9edb0db4a6',
'd30575bba4',
'29d89c1c64',
'a304174ba2',
'7e55d4def0',
'89bed1462b',
'3d6cb53899',
'f33556a6cb',
'20cf1a9119',
'6b965e4744',
'64fffab256',
'b4c4b511d1',
'20a0433b2e',
'517b3c6690',
'ebc520c76a',
'7769c411f1',
'1baf5b978e',
'9fe464ec31',
];
printOnFailure('final expectedChecksums = <String>[');
printOnFailure(checksums.map((e) => " '$e',").join('\n'));
printOnFailure('];');
for (var i = 0; i < checksums.length; ++i) {
expect(checksums[i], expectedChecksums[i]);
}
});
}
const flutteriOSHighestBestEffort = 16;
const flutteriOSHighestSupported = 17;
enum BuildAssetType { code, data }