mirror of
https://github.com/flutter/flutter.git
synced 2025-06-03 00:51:18 +00:00

Almost all of the code is just adopting to changes to the APIs of `package:native_assets_builder`, `package:native_assets_cli` and `package:native_toolchain_c` There's only two semantic changes * Removes a test that checks for a verification error if a build hook produces a static library if the preferred linking mode is dynamic: => The test is written in a very hacky way. By monkey patching the build config.json that flutter build actually made. This monkey patching relies on package:cli_config which is now no longer used. => The actual code that checks for this mismatch lives in dart-lang/native repository and is tested there. So there's really no need to duplicate that. * The `package:native_assets_builder` no longer knows about code assets. This is something a user of that package (e.g. flutter tools) adds. Now the dry-run functionality will invoke build hooks who produce code assets without an architecture. => The `package:native_assets_builder` used to expand such a code asset to N different code assets (one for each supported architecture) => This logic was now moved to flutter tools. => In the near future we're going to this dry-run complexity, which will then also get rid of this uglyness (of expanding to all archs of an OS).
304 lines
11 KiB
Dart
304 lines
11 KiB
Dart
// Copyright 2014 The Flutter Authors. 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:file/file.dart';
|
|
import 'package:file/memory.dart';
|
|
import 'package:file_testing/file_testing.dart';
|
|
import 'package:flutter_tools/src/artifacts.dart';
|
|
import 'package:flutter_tools/src/base/file_system.dart';
|
|
import 'package:flutter_tools/src/base/logger.dart';
|
|
import 'package:flutter_tools/src/build_info.dart';
|
|
import 'package:flutter_tools/src/build_system/build_system.dart';
|
|
import 'package:flutter_tools/src/features.dart';
|
|
import 'package:flutter_tools/src/globals.dart' as globals;
|
|
import 'package:flutter_tools/src/isolated/native_assets/native_assets.dart';
|
|
import 'package:native_assets_cli/code_assets_builder.dart' hide BuildMode;
|
|
import 'package:package_config/package_config_types.dart';
|
|
|
|
import '../../src/common.dart';
|
|
import '../../src/context.dart';
|
|
import '../../src/fakes.dart';
|
|
import 'fake_native_assets_build_runner.dart';
|
|
|
|
void main() {
|
|
late FakeProcessManager processManager;
|
|
late Environment environment;
|
|
late Artifacts artifacts;
|
|
late FileSystem fileSystem;
|
|
late BufferLogger logger;
|
|
late Uri projectUri;
|
|
|
|
setUp(() {
|
|
processManager = FakeProcessManager.empty();
|
|
logger = BufferLogger.test();
|
|
artifacts = Artifacts.test();
|
|
fileSystem = MemoryFileSystem.test();
|
|
environment = Environment.test(
|
|
fileSystem.currentDirectory,
|
|
inputs: <String, String>{},
|
|
artifacts: artifacts,
|
|
processManager: processManager,
|
|
fileSystem: fileSystem,
|
|
logger: logger,
|
|
);
|
|
environment.buildDir.createSync(recursive: true);
|
|
projectUri = environment.projectDir.uri;
|
|
});
|
|
|
|
testUsingContext('dry run with no package config', overrides: <Type, Generator>{
|
|
ProcessManager: () => FakeProcessManager.empty(),
|
|
}, () async {
|
|
expect(
|
|
await runFlutterSpecificDartDryRunOnPlatforms(
|
|
projectUri: projectUri,
|
|
fileSystem: fileSystem,
|
|
targetPlatforms: <TargetPlatform>[TargetPlatform.windows_x64],
|
|
buildRunner: FakeFlutterNativeAssetsBuildRunner(
|
|
hasPackageConfigResult: false,
|
|
),
|
|
),
|
|
null,
|
|
);
|
|
expect(
|
|
(globals.logger as BufferLogger).traceText,
|
|
contains('No package config found. Skipping native assets compilation.'),
|
|
);
|
|
});
|
|
|
|
testUsingContext('build with no package config', overrides: <Type, Generator>{
|
|
ProcessManager: () => FakeProcessManager.empty(),
|
|
}, () async {
|
|
final Uri nonFlutterTesterAssetUri = environment.buildDir.childFile('native_assets.yaml').uri;
|
|
await runFlutterSpecificDartBuild(
|
|
environmentDefines: <String, String>{
|
|
kBuildMode: BuildMode.debug.cliName,
|
|
},
|
|
targetPlatform: TargetPlatform.windows_x64,
|
|
projectUri: projectUri,
|
|
nativeAssetsYamlUri: nonFlutterTesterAssetUri,
|
|
fileSystem: fileSystem,
|
|
buildRunner: FakeFlutterNativeAssetsBuildRunner(
|
|
hasPackageConfigResult: false,
|
|
),
|
|
);
|
|
expect(
|
|
(globals.logger as BufferLogger).traceText,
|
|
contains('No package config found. Skipping native assets compilation.'),
|
|
);
|
|
});
|
|
|
|
testUsingContext('dry run for multiple OSes with no package config', overrides: <Type, Generator>{
|
|
ProcessManager: () => FakeProcessManager.empty(),
|
|
}, () async {
|
|
await runFlutterSpecificDartDryRunOnPlatforms(
|
|
projectUri: projectUri,
|
|
fileSystem: fileSystem,
|
|
targetPlatforms: <TargetPlatform>[
|
|
TargetPlatform.windows_x64,
|
|
TargetPlatform.darwin,
|
|
TargetPlatform.ios,
|
|
],
|
|
buildRunner: FakeFlutterNativeAssetsBuildRunner(
|
|
hasPackageConfigResult: false,
|
|
),
|
|
);
|
|
expect(
|
|
(globals.logger as BufferLogger).traceText,
|
|
contains('No package config found. Skipping native assets compilation.'),
|
|
);
|
|
});
|
|
|
|
testUsingContext('dry run with assets but not enabled', overrides: <Type, Generator>{
|
|
ProcessManager: () => FakeProcessManager.empty(),
|
|
}, () async {
|
|
final File packageConfig = environment.projectDir.childFile('.dart_tool/package_config.json');
|
|
await packageConfig.parent.create();
|
|
await packageConfig.create();
|
|
expect(
|
|
() => runFlutterSpecificDartDryRunOnPlatforms(
|
|
projectUri: projectUri,
|
|
fileSystem: fileSystem,
|
|
targetPlatforms: <TargetPlatform>[TargetPlatform.windows_x64],
|
|
buildRunner: FakeFlutterNativeAssetsBuildRunner(
|
|
packagesWithNativeAssetsResult: <Package>[
|
|
Package('bar', projectUri),
|
|
],
|
|
),
|
|
),
|
|
throwsToolExit(
|
|
message: 'Package(s) bar require the native assets feature to be enabled. '
|
|
'Enable using `flutter config --enable-native-assets`.',
|
|
),
|
|
);
|
|
});
|
|
|
|
testUsingContext('dry run with assets', overrides: <Type, Generator>{
|
|
FeatureFlags: () => TestFeatureFlags(isNativeAssetsEnabled: true),
|
|
ProcessManager: () => FakeProcessManager.empty(),
|
|
}, () async {
|
|
final File packageConfig = environment.projectDir.childFile('.dart_tool/package_config.json');
|
|
await packageConfig.parent.create();
|
|
await packageConfig.create();
|
|
final FakeFlutterNativeAssetsBuildRunner buildRunner = FakeFlutterNativeAssetsBuildRunner(
|
|
packagesWithNativeAssetsResult: <Package>[
|
|
Package('bar', projectUri),
|
|
],
|
|
buildDryRunResult: FakeFlutterNativeAssetsBuilderResult.fromAssets(
|
|
codeAssets: <CodeAsset>[
|
|
CodeAsset(
|
|
package: 'bar',
|
|
name: 'bar.dart',
|
|
linkMode: DynamicLoadingBundled(),
|
|
os: OS.windows,
|
|
file: Uri.file('bar.dll'),
|
|
),
|
|
],
|
|
),
|
|
);
|
|
final Uri? nativeAssetsYaml = await runFlutterSpecificDartDryRunOnPlatforms(
|
|
projectUri: projectUri,
|
|
fileSystem: fileSystem,
|
|
targetPlatforms: <TargetPlatform>[TargetPlatform.windows_x64],
|
|
buildRunner: buildRunner,
|
|
);
|
|
expect(
|
|
(globals.logger as BufferLogger).traceText,
|
|
stringContainsInOrder(<String>[
|
|
'Dry running native assets for windows.',
|
|
'Dry running native assets for windows done.',
|
|
]),
|
|
);
|
|
expect(
|
|
nativeAssetsYaml,
|
|
projectUri.resolve('build/native_assets/windows/native_assets.yaml'),
|
|
);
|
|
expect(
|
|
await fileSystem.file(nativeAssetsYaml).readAsString(),
|
|
contains('package:bar/bar.dart'),
|
|
);
|
|
expect(buildRunner.buildDryRunInvocations, 1);
|
|
});
|
|
|
|
testUsingContext('build with assets but not enabled', overrides: <Type, Generator>{
|
|
ProcessManager: () => FakeProcessManager.empty(),
|
|
}, () async {
|
|
final File packageConfig = environment.projectDir.childFile('.dart_tool/package_config.json');
|
|
final Uri nonFlutterTesterAssetUri = environment.buildDir.childFile('native_assets.yaml').uri;
|
|
await packageConfig.parent.create();
|
|
await packageConfig.create();
|
|
expect(
|
|
() => runFlutterSpecificDartBuild(
|
|
environmentDefines: <String, String>{
|
|
kBuildMode: BuildMode.debug.cliName,
|
|
},
|
|
targetPlatform: TargetPlatform.windows_x64,
|
|
projectUri: projectUri,
|
|
nativeAssetsYamlUri: nonFlutterTesterAssetUri,
|
|
fileSystem: fileSystem,
|
|
buildRunner: FakeFlutterNativeAssetsBuildRunner(
|
|
packagesWithNativeAssetsResult: <Package>[
|
|
Package('bar', projectUri),
|
|
],
|
|
),
|
|
),
|
|
throwsToolExit(
|
|
message: 'Package(s) bar require the native assets feature to be enabled. '
|
|
'Enable using `flutter config --enable-native-assets`.',
|
|
),
|
|
);
|
|
});
|
|
|
|
testUsingContext('build no assets', overrides: <Type, Generator>{
|
|
FeatureFlags: () => TestFeatureFlags(isNativeAssetsEnabled: true),
|
|
ProcessManager: () => FakeProcessManager.empty(),
|
|
}, () async {
|
|
final File packageConfig = environment.projectDir.childFile('.dart_tool/package_config.json');
|
|
final Uri nonFlutterTesterAssetUri = environment.buildDir.childFile('native_assets.yaml').uri;
|
|
await packageConfig.parent.create();
|
|
await packageConfig.create();
|
|
final (_, Uri nativeAssetsYaml) = await runFlutterSpecificDartBuild(
|
|
environmentDefines: <String, String>{
|
|
kBuildMode: BuildMode.debug.cliName,
|
|
},
|
|
targetPlatform: TargetPlatform.windows_x64,
|
|
projectUri: projectUri,
|
|
nativeAssetsYamlUri: nonFlutterTesterAssetUri,
|
|
fileSystem: fileSystem,
|
|
buildRunner: FakeFlutterNativeAssetsBuildRunner(
|
|
packagesWithNativeAssetsResult: <Package>[
|
|
Package('bar', projectUri),
|
|
],
|
|
),
|
|
);
|
|
expect(nativeAssetsYaml, nonFlutterTesterAssetUri);
|
|
expect(
|
|
await fileSystem.file(nativeAssetsYaml).readAsString(),
|
|
isNot(contains('package:bar/bar.dart')),
|
|
);
|
|
expect(
|
|
environment.projectDir.childDirectory('build').childDirectory('native_assets').childDirectory('windows'),
|
|
exists,
|
|
);
|
|
});
|
|
|
|
testUsingContext('Native assets dry run error', overrides: <Type, Generator>{
|
|
FeatureFlags: () => TestFeatureFlags(isNativeAssetsEnabled: true),
|
|
ProcessManager: () => FakeProcessManager.empty(),
|
|
}, () async {
|
|
final File packageConfig =
|
|
environment.projectDir.childFile('.dart_tool/package_config.json');
|
|
await packageConfig.parent.create();
|
|
await packageConfig.create();
|
|
expect(
|
|
() => runFlutterSpecificDartDryRunOnPlatforms(
|
|
projectUri: projectUri,
|
|
fileSystem: fileSystem,
|
|
targetPlatforms: <TargetPlatform>[TargetPlatform.windows_x64],
|
|
buildRunner: FakeFlutterNativeAssetsBuildRunner(
|
|
packagesWithNativeAssetsResult: <Package>[
|
|
Package('bar', projectUri),
|
|
],
|
|
buildDryRunResult: null,
|
|
),
|
|
),
|
|
throwsToolExit(
|
|
message:
|
|
'Building (dry run) native assets failed. See the logs for more details.',
|
|
),
|
|
);
|
|
});
|
|
|
|
testUsingContext('Native assets build error', overrides: <Type, Generator>{
|
|
FeatureFlags: () => TestFeatureFlags(isNativeAssetsEnabled: true),
|
|
ProcessManager: () => FakeProcessManager.empty(),
|
|
}, () async {
|
|
final File packageConfig =
|
|
environment.projectDir.childFile('.dart_tool/package_config.json');
|
|
final Uri nonFlutterTesterAssetUri = environment.buildDir.childFile('native_assets.yaml').uri;
|
|
await packageConfig.parent.create();
|
|
await packageConfig.create();
|
|
expect(
|
|
() => runFlutterSpecificDartBuild(
|
|
environmentDefines: <String, String>{
|
|
kBuildMode: BuildMode.debug.cliName,
|
|
},
|
|
targetPlatform: TargetPlatform.linux_x64,
|
|
projectUri: projectUri,
|
|
nativeAssetsYamlUri: nonFlutterTesterAssetUri,
|
|
fileSystem: fileSystem,
|
|
buildRunner: FakeFlutterNativeAssetsBuildRunner(
|
|
packagesWithNativeAssetsResult: <Package>[
|
|
Package('bar', projectUri),
|
|
],
|
|
buildResult: null,
|
|
),
|
|
),
|
|
throwsToolExit(
|
|
message:
|
|
'Building native assets failed. See the logs for more details.',
|
|
),
|
|
);
|
|
});
|
|
}
|