Skip to content

Commit c638d3f

Browse files
authored
[native_assets_cli] Refactor testCodeBuildHook (#2242)
1 parent ca7bd6b commit c638d3f

34 files changed

+145
-175
lines changed

pkgs/native_assets_builder/lib/src/build_runner/build_runner.dart

+2-2
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ class NativeAssetsBuildRunner {
150150
userDefines: loadedUserDefines?[package.name],
151151
);
152152

153-
final input = BuildInput(inputBuilder.json);
153+
final input = inputBuilder.build();
154154
final errors = [
155155
...await validateBuildInput(input),
156156
for (final e in extensions) ...await e.validateBuildInput(input),
@@ -256,7 +256,7 @@ class NativeAssetsBuildRunner {
256256
recordedUsesFile: resourcesFile?.uri,
257257
);
258258

259-
final input = LinkInput(inputBuilder.json);
259+
final input = inputBuilder.build();
260260
final errors = [
261261
...await validateLinkInput(input),
262262
for (final e in extensions) ...await e.validateLinkInput(input),

pkgs/native_assets_builder/test/test_data/native_dynamic_linking_test.dart

+1-2
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import 'dart:io';
1010

1111
import 'package:native_assets_cli/code_assets.dart';
1212
import 'package:native_assets_cli/code_assets_builder.dart';
13-
import 'package:native_assets_cli/native_assets_cli.dart';
1413
import 'package:native_assets_cli/native_assets_cli_builder.dart';
1514
import 'package:test/test.dart';
1615

@@ -60,7 +59,7 @@ void main() async {
6059
File.fromUri(
6160
buildInputUri,
6261
).writeAsStringSync(jsonEncode(inputBuilder.json));
63-
outputDirectory = BuildInput(inputBuilder.json).outputDirectory;
62+
outputDirectory = inputBuilder.build().outputDirectory;
6463

6564
await runPubGet(workingDirectory: testPackageUri, logger: logger);
6665

pkgs/native_assets_builder/test_data/native_add_duplicate/hook/build.dart

+1-2
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import 'package:logging/logging.dart';
66
import 'package:native_assets_cli/code_assets.dart';
77
import 'package:native_assets_cli/code_assets_builder.dart';
88
import 'package:native_assets_cli/native_assets_cli.dart';
9-
import 'package:native_assets_cli/native_assets_cli_builder.dart';
109
import 'package:native_toolchain_c/native_toolchain_c.dart';
1110

1211
void main(List<String> arguments) async {
@@ -30,7 +29,7 @@ void main(List<String> arguments) async {
3029
print('${record.level.name}: ${record.time}: ${record.message}');
3130
}),
3231
);
33-
final tempBuildOutput = BuildOutput(outputBuilder.json);
32+
final tempBuildOutput = outputBuilder.build();
3433
output.assets.code.add(
3534
tempBuildOutput.assets.code.single,
3635
// Send dylib to linking if linking is enabled.

pkgs/native_assets_cli/example/build/download_asset/tool/build.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -100,5 +100,5 @@ BuildInput createBuildInput(
100100
macOS: MacOSCodeConfig(targetVersion: macOSTargetVersion),
101101
),
102102
);
103-
return BuildInput(inputBuilder.json);
103+
return inputBuilder.build();
104104
}

pkgs/native_assets_cli/example/build/local_asset/pubspec.yaml

+1
Original file line numberDiff line numberDiff line change
@@ -16,5 +16,6 @@ dependencies:
1616

1717
dev_dependencies:
1818
ffigen: ^18.0.0
19+
file_testing: ^3.0.2
1920
lints: ^5.1.1
2021
test: ^1.25.15

pkgs/native_assets_cli/example/build/local_asset/test/build_test.dart

+10-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22
// for details. All rights reserved. Use of this source code is governed by a
33
// BSD-style license that can be found in the LICENSE file.
44

5+
import 'dart:io';
6+
7+
import 'package:file_testing/file_testing.dart';
58
import 'package:native_assets_cli/code_assets_builder.dart';
69
import 'package:native_assets_cli/code_assets_testing.dart';
710
import 'package:test/test.dart';
@@ -12,9 +15,15 @@ void main() async {
1215
test('test my build hook', () async {
1316
await testCodeBuildHook(
1417
mainMethod: build.main,
15-
check: (_, output) {
18+
check: (input, output) {
19+
expect(output.assets.encodedAssets.length, equals(1));
1620
expect(output.assets.code, isNotEmpty);
1721
expect(output.assets.code.first.id, 'package:local_asset/asset.txt');
22+
expect(File.fromUri(output.assets.code.first.file!), exists);
23+
expect(
24+
output.dependencies,
25+
equals([input.packageRoot.resolve('assets/asset.txt')]),
26+
);
1827
},
1928
);
2029
});

pkgs/native_assets_cli/lib/code_assets_builder.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,5 @@
66
library;
77

88
export 'src/code_assets/config.dart'
9-
show CodeAssetBuildInputBuilder, CodeAssetBuildOutput, CodeAssetLinkOutput;
9+
show CodeAssetBuildOutput, CodeAssetLinkOutput;
1010
export 'src/code_assets/extension.dart';

pkgs/native_assets_cli/lib/src/code_assets/config.dart

-1
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,6 @@ extension type CodeAssetLinkOutputBuilderAdd._(
182182

183183
/// Extension to initialize code specific configuration on link/build inputs.
184184
extension CodeAssetBuildInputBuilder on HookConfigBuilder {
185-
@Deprecated('Prefer using input.addExtension(CodeExtension(...)).')
186185
void setupCode({
187186
required Architecture targetArchitecture,
188187
required OS targetOS,

pkgs/native_assets_cli/lib/src/code_assets/extension.dart

-1
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,6 @@ final class CodeAssetExtension implements ProtocolExtension {
4646

4747
void _setupConfig(HookInputBuilder input) {
4848
input.config.addBuildAssetTypes([CodeAssetType.type]);
49-
// ignore: deprecated_member_use_from_same_package
5049
input.config.setupCode(
5150
targetArchitecture: targetArchitecture,
5251
targetOS: targetOS,

pkgs/native_assets_cli/lib/src/code_assets/testing.dart

+27-29
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,9 @@
55
import 'dart:async';
66

77
import '../config.dart';
8+
import '../encoded_asset.dart';
89
import '../test.dart';
9-
import '../validation.dart';
10+
import '../user_defines.dart';
1011
import 'architecture.dart';
1112
import 'c_compiler_config.dart';
1213
import 'config.dart';
@@ -15,8 +16,9 @@ import 'ios_sdk.dart';
1516
import 'link_mode_preference.dart';
1617
import 'os.dart';
1718

18-
/// Validate a code build hook; this will throw an exception on validation
19-
/// errors.
19+
/// Validates a code build hook.
20+
///
21+
/// This method will throw an exception on validation errors.
2022
///
2123
/// This is intended to be used from tests, e.g.:
2224
///
@@ -27,25 +29,33 @@ import 'os.dart';
2729
/// );
2830
/// });
2931
/// ```
32+
///
33+
/// The hook is run in isolation. No user-defines are read from the pubspec,
34+
/// they must be provided via [userDefines]. No other hooks are run, if the hook
35+
/// requires assets from other build hooks, the must be provided in [assets].
3036
Future<void> testCodeBuildHook({
31-
// ignore: inference_failure_on_function_return_type
32-
required Function(List<String> arguments) mainMethod,
37+
required FutureOr<void> Function(List<String> arguments) mainMethod,
3338
required FutureOr<void> Function(BuildInput, BuildOutput) check,
39+
bool? linkingEnabled,
3440
Architecture? targetArchitecture,
3541
OS? targetOS,
36-
IOSSdk? targetIOSSdk,
37-
int? targetIOSVersion,
38-
int? targetMacOSVersion,
39-
int? targetAndroidNdkApi,
42+
IOSSdk? targetIOSSdk = IOSSdk.iPhoneOS,
43+
int? targetIOSVersion = 17,
44+
int? targetMacOSVersion = 13,
45+
int? targetAndroidNdkApi = 30,
4046
CCompilerConfig? cCompiler,
41-
LinkModePreference? linkModePreference,
42-
bool? linkingEnabled,
47+
LinkModePreference? linkModePreference = LinkModePreference.dynamic,
48+
// TODO(https://github.com/dart-lang/native/issues/2241): Cleanup how the
49+
// following parameters are passed in.
50+
PackageUserDefines? userDefines,
51+
Map<String, List<EncodedAsset>>? assets,
4352
}) async {
53+
targetOS ??= OS.current;
4454
final extension = CodeAssetExtension(
45-
linkModePreference: linkModePreference ?? LinkModePreference.dynamic,
55+
linkModePreference: linkModePreference!,
4656
cCompiler: cCompiler,
4757
targetArchitecture: targetArchitecture ?? Architecture.current,
48-
targetOS: targetOS ?? OS.current,
58+
targetOS: targetOS,
4959
iOS: targetOS == OS.iOS
5060
? IOSCodeConfig(
5161
targetSdk: targetIOSSdk!,
@@ -61,22 +71,10 @@ Future<void> testCodeBuildHook({
6171
);
6272
await testBuildHook(
6373
mainMethod: mainMethod,
64-
extraInputSetup: (input) {
65-
input.addExtension(extension);
66-
},
67-
check: (input, output) async {
68-
final validationErrors = await extension.validateBuildOutput(
69-
input,
70-
output,
71-
);
72-
if (validationErrors.isNotEmpty) {
73-
throw ValidationFailure(
74-
'encountered build output validation issues: $validationErrors',
75-
);
76-
}
77-
78-
await check(input, output);
79-
},
74+
check: check,
8075
linkingEnabled: linkingEnabled,
76+
userDefines: userDefines,
77+
assets: assets,
78+
extensions: [extension],
8179
);
8280
}

pkgs/native_assets_cli/lib/src/config.dart

+8-5
Original file line numberDiff line numberDiff line change
@@ -152,11 +152,6 @@ sealed class HookInputBuilder {
152152
void setupShared({
153153
required Uri packageRoot,
154154
required String packageName,
155-
@Deprecated(
156-
'This parameter is not read in `HookInput`. '
157-
'It must still be provided to accommodate `HookInput`s in hooks using an '
158-
'older version of this package.',
159-
)
160155
required Uri outputDirectoryShared,
161156
required Uri outputFile,
162157
PackageUserDefines? userDefines,
@@ -264,6 +259,8 @@ final class BuildInputBuilder extends HookInputBuilder {
264259
@override
265260
void addExtension(ProtocolExtension extension) =>
266261
extension.setupBuildInput(this);
262+
263+
BuildInput build() => BuildInput(json);
267264
}
268265

269266
final class HookConfigBuilder {
@@ -337,6 +334,8 @@ final class LinkInputBuilder extends HookInputBuilder {
337334
@override
338335
void addExtension(ProtocolExtension extension) =>
339336
extension.setupLinkInput(this);
337+
338+
LinkInput build() => LinkInput(json);
340339
}
341340

342341
List<EncodedAsset> _parseAssets(List<AssetSyntax>? assets) => assets == null
@@ -476,6 +475,8 @@ class BuildOutputBuilder extends HookOutputBuilder {
476475
@override
477476
BuildOutputSyntax get _syntax =>
478477
BuildOutputSyntax.fromJson(super._syntax.json);
478+
479+
BuildOutput build() => BuildOutput(json);
479480
}
480481

481482
extension type MetadataOutputBuilder._(BuildOutputBuilder _output) {
@@ -655,6 +656,8 @@ extension type LinkOutputAssets._(LinkOutput _output) {
655656
class LinkOutputBuilder extends HookOutputBuilder {
656657
EncodedAssetLinkOutputBuilder get assets =>
657658
EncodedAssetLinkOutputBuilder._(this);
659+
660+
LinkOutput build() => LinkOutput(json);
658661
}
659662

660663
/// Extension for the lower-level API to add [EncodedAsset]s to

pkgs/native_assets_cli/lib/src/test.dart

+44-13
Original file line numberDiff line numberDiff line change
@@ -9,25 +9,39 @@ import 'dart:io';
99
import 'package:yaml/yaml.dart';
1010

1111
import 'config.dart';
12+
import 'encoded_asset.dart';
13+
import 'extension.dart';
14+
import 'user_defines.dart';
1215
import 'validation.dart';
1316

14-
/// Validate a build hook; this will throw an exception on validation errors.
17+
/// Validates a build hook.
18+
///
19+
/// This method will throw an exception on validation errors.
1520
///
1621
/// This is intended to be used from tests, e.g.:
1722
///
1823
/// ```
1924
/// test('test my build hook', () async {
20-
/// await testCodeBuildHook(
25+
/// await testBuildHook(
2126
/// ...
2227
/// );
2328
/// });
2429
/// ```
30+
///
31+
/// The hook is run in isolation. No user-defines are read from the pubspec,
32+
/// they must be provided via [userDefines]. No other hooks are run, if the hook
33+
/// requires assets from other build hooks, the must be provided in [assets].
2534
Future<void> testBuildHook({
26-
required void Function(BuildInputBuilder) extraInputSetup,
2735
required FutureOr<void> Function(List<String> arguments) mainMethod,
2836
required FutureOr<void> Function(BuildInput input, BuildOutput output) check,
2937
bool? linkingEnabled,
38+
required List<ProtocolExtension> extensions,
39+
// TODO(https://github.com/dart-lang/native/issues/2241): Cleanup how the
40+
// following parameters are passed in.
41+
PackageUserDefines? userDefines,
42+
Map<String, List<EncodedAsset>>? assets,
3043
}) async {
44+
linkingEnabled ??= false;
3145
const keepTempKey = 'KEEP_TEMPORARY_DIRECTORIES';
3246

3347
final tempDir = await Directory.systemTemp.createTemp();
@@ -37,11 +51,9 @@ Future<void> testBuildHook({
3751
final tempUri = Directory(
3852
await tempDir.resolveSymbolicLinks(),
3953
).uri.normalizePath();
40-
final outputDirectory = tempUri.resolve('output/');
4154
final outputDirectoryShared = tempUri.resolve('output_shared/');
4255
final outputFile = tempUri.resolve('output.json');
4356

44-
await Directory.fromUri(outputDirectory).create();
4557
await Directory.fromUri(outputDirectoryShared).create();
4658

4759
final inputBuilder = BuildInputBuilder();
@@ -51,26 +63,45 @@ Future<void> testBuildHook({
5163
packageName: _readPackageNameFromPubspec(),
5264
outputFile: outputFile,
5365
outputDirectoryShared: outputDirectoryShared,
66+
userDefines: userDefines,
5467
)
55-
..config.setupBuild(linkingEnabled: true);
56-
extraInputSetup(inputBuilder);
68+
..setupBuildInput(assets: assets)
69+
..config.setupBuild(linkingEnabled: linkingEnabled);
70+
for (final extension in extensions) {
71+
extension.setupBuildInput(inputBuilder);
72+
}
73+
final input = inputBuilder.build();
5774

58-
final input = BuildInput(inputBuilder.json);
75+
final inputErrors = [
76+
for (final extension in extensions)
77+
...await extension.validateBuildInput(input),
78+
];
79+
if (inputErrors.isNotEmpty) {
80+
throw ValidationFailure(
81+
'Encountered build input validation issues: $inputErrors',
82+
);
83+
}
5984

6085
final inputUri = tempUri.resolve('input.json');
6186
_writeJsonTo(inputUri, input.json);
6287
await mainMethod(['--config=${inputUri.toFilePath()}']);
6388
final output = BuildOutput(_readJsonFrom(input.outputFile));
6489

65-
// Test conformance of protocol invariants.
66-
final validationErrors = await validateBuildOutput(input, output);
67-
if (validationErrors.isNotEmpty) {
90+
final outputErrors = [
91+
...await validateBuildOutput(input, output),
92+
for (final extension in extensions) ...[
93+
...await extension.validateBuildOutput(input, output),
94+
...await extension.validateApplicationAssets(
95+
output.assets.encodedAssets,
96+
),
97+
],
98+
];
99+
if (outputErrors.isNotEmpty) {
68100
throw ValidationFailure(
69-
'encountered build output validation issues: $validationErrors',
101+
'Encountered build output validation issues: $inputErrors',
70102
);
71103
}
72104

73-
// Run user-defined tests.
74105
await check(input, output);
75106
} finally {
76107
final keepTempDir = (Platform.environment[keepTempKey] ?? '').isNotEmpty;

pkgs/native_assets_cli/test/api/build_test.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ void main() async {
3939
outputDirectoryShared: outputDirectoryShared,
4040
)
4141
..config.setupBuild(linkingEnabled: false);
42-
input = BuildInput(inputBuilder.json);
42+
input = inputBuilder.build();
4343

4444
final inputJson = json.encode(input.json);
4545
buildInputUri = tempUri.resolve('input.json');

pkgs/native_assets_cli/test/build_input_test.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ void main() async {
7373
..config.addBuildAssetTypes(['my-asset-type'])
7474
..config.setupBuild(linkingEnabled: false)
7575
..setupBuildInput(assets: assets);
76-
final input = BuildInput(inputBuilder.json);
76+
final input = inputBuilder.build();
7777

7878
expect(input.json, inputJson);
7979
expect(json.decode(input.toString()), inputJson);

0 commit comments

Comments
 (0)