| // 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/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/build_system/depfile.dart'; |
| import 'package:flutter_tools/src/build_system/targets/common.dart'; |
| import 'package:flutter_tools/src/build_system/targets/windows.dart'; |
| import 'package:flutter_tools/src/convert.dart'; |
| |
| import '../../../src/common.dart'; |
| import '../../../src/context.dart'; |
| |
| void main() { |
| testWithoutContext('UnpackWindows copies files to the correct windows/ cache directory', () async { |
| final Artifacts artifacts = Artifacts.test(); |
| final FileSystem fileSystem = MemoryFileSystem.test(style: FileSystemStyle.windows); |
| final Environment environment = Environment.test( |
| fileSystem.currentDirectory, |
| artifacts: artifacts, |
| processManager: FakeProcessManager.any(), |
| fileSystem: fileSystem, |
| logger: BufferLogger.test(), |
| defines: <String, String>{ |
| kBuildMode: 'debug', |
| }, |
| ); |
| final DepfileService depfileService = DepfileService( |
| logger: BufferLogger.test(), |
| fileSystem: fileSystem, |
| ); |
| environment.buildDir.createSync(recursive: true); |
| |
| final String windowsDesktopPath = artifacts.getArtifactPath(Artifact.windowsDesktopPath, platform: TargetPlatform.windows_x64, mode: BuildMode.debug); |
| final String windowsCppClientWrapper = artifacts.getArtifactPath(Artifact.windowsCppClientWrapper, platform: TargetPlatform.windows_x64, mode: BuildMode.debug); |
| final String icuData = artifacts.getArtifactPath(Artifact.icuData, platform: TargetPlatform.windows_x64); |
| final List<String> requiredFiles = <String>[ |
| '$windowsDesktopPath\\flutter_export.h', |
| '$windowsDesktopPath\\flutter_messenger.h', |
| '$windowsDesktopPath\\flutter_windows.dll', |
| '$windowsDesktopPath\\flutter_windows.dll.exp', |
| '$windowsDesktopPath\\flutter_windows.dll.lib', |
| '$windowsDesktopPath\\flutter_windows.dll.pdb', |
| '$windowsDesktopPath\\flutter_plugin_registrar.h', |
| '$windowsDesktopPath\\flutter_texture_registrar.h', |
| '$windowsDesktopPath\\flutter_windows.h', |
| icuData, |
| '$windowsCppClientWrapper\\foo', |
| r'C:\packages\flutter_tools\lib\src\build_system\targets\windows.dart', |
| ]; |
| |
| for (final String path in requiredFiles) { |
| fileSystem.file(path).createSync(recursive: true); |
| } |
| fileSystem.directory('windows').createSync(); |
| |
| await const UnpackWindows().build(environment); |
| |
| // Output files are copied correctly. |
| expect(fileSystem.file(r'C:\windows\flutter\ephemeral\flutter_export.h'), exists); |
| expect(fileSystem.file(r'C:\windows\flutter\ephemeral\flutter_messenger.h'), exists); |
| expect(fileSystem.file(r'C:\windows\flutter\ephemeral\flutter_windows.dll'), exists); |
| expect(fileSystem.file(r'C:\windows\flutter\ephemeral\flutter_windows.dll.exp'), exists); |
| expect(fileSystem.file(r'C:\windows\flutter\ephemeral\flutter_windows.dll.lib'), exists); |
| expect(fileSystem.file(r'C:\windows\flutter\ephemeral\flutter_windows.dll.pdb'), exists); |
| expect(fileSystem.file(r'C:\windows\flutter\ephemeral\flutter_export.h'), exists); |
| expect(fileSystem.file(r'C:\windows\flutter\ephemeral\flutter_messenger.h'), exists); |
| expect(fileSystem.file(r'C:\windows\flutter\ephemeral\flutter_plugin_registrar.h'), exists); |
| expect(fileSystem.file(r'C:\windows\flutter\ephemeral\flutter_texture_registrar.h'), exists); |
| expect(fileSystem.file(r'C:\windows\flutter\ephemeral\flutter_windows.h'), exists); |
| expect(fileSystem.file('C:\\windows\\flutter\\ephemeral\\$icuData'), exists); |
| expect(fileSystem.file('C:\\windows\\flutter\\ephemeral\\$windowsCppClientWrapper\\foo'), exists); |
| |
| final File outputDepfile = environment.buildDir |
| .childFile('windows_engine_sources.d'); |
| |
| // Depfile is created correctly. |
| expect(outputDepfile, exists); |
| |
| final List<String> inputPaths = depfileService.parse(outputDepfile) |
| .inputs.map((File file) => file.path).toList(); |
| final List<String> outputPaths = depfileService.parse(outputDepfile) |
| .outputs.map((File file) => file.path).toList(); |
| |
| // Depfile has expected sources. |
| expect(inputPaths, unorderedEquals(<String>[ |
| '$windowsDesktopPath\\flutter_export.h', |
| '$windowsDesktopPath\\flutter_messenger.h', |
| '$windowsDesktopPath\\flutter_windows.dll', |
| '$windowsDesktopPath\\flutter_windows.dll.exp', |
| '$windowsDesktopPath\\flutter_windows.dll.lib', |
| '$windowsDesktopPath\\flutter_windows.dll.pdb', |
| '$windowsDesktopPath\\flutter_plugin_registrar.h', |
| '$windowsDesktopPath\\flutter_texture_registrar.h', |
| '$windowsDesktopPath\\flutter_windows.h', |
| icuData, |
| '$windowsCppClientWrapper\\foo', |
| ])); |
| expect(outputPaths, unorderedEquals(<String>[ |
| r'C:\windows\flutter\ephemeral\flutter_export.h', |
| r'C:\windows\flutter\ephemeral\flutter_messenger.h', |
| r'C:\windows\flutter\ephemeral\flutter_windows.dll', |
| r'C:\windows\flutter\ephemeral\flutter_windows.dll.exp', |
| r'C:\windows\flutter\ephemeral\flutter_windows.dll.lib', |
| r'C:\windows\flutter\ephemeral\flutter_windows.dll.pdb', |
| r'C:\windows\flutter\ephemeral\flutter_plugin_registrar.h', |
| r'C:\windows\flutter\ephemeral\flutter_texture_registrar.h', |
| r'C:\windows\flutter\ephemeral\flutter_windows.h', |
| 'C:\\windows\\flutter\\ephemeral\\$icuData', |
| 'C:\\windows\\flutter\\ephemeral\\$windowsCppClientWrapper\\foo', |
| ])); |
| }); |
| |
| // AssetBundleFactory still uses context injection |
| late FileSystem fileSystem; |
| |
| setUp(() { |
| fileSystem = MemoryFileSystem.test(style: FileSystemStyle.windows); |
| }); |
| |
| testUsingContext('DebugBundleWindowsAssets creates correct bundle structure', () async { |
| final Environment environment = Environment.test( |
| fileSystem.currentDirectory, |
| artifacts: Artifacts.test(), |
| processManager: FakeProcessManager.any(), |
| fileSystem: fileSystem, |
| logger: BufferLogger.test(), |
| defines: <String, String>{ |
| kBuildMode: 'debug', |
| }, |
| inputs: <String, String>{ |
| kBundleSkSLPath: 'bundle.sksl', |
| }, |
| engineVersion: '2', |
| ); |
| |
| environment.buildDir.childFile('app.dill').createSync(recursive: true); |
| // sksl bundle |
| fileSystem.file('bundle.sksl').writeAsStringSync(json.encode( |
| <String, Object>{ |
| 'engineRevision': '2', |
| 'platform': 'ios', |
| 'data': <String, Object>{ |
| 'A': 'B', |
| }, |
| }, |
| )); |
| |
| await const DebugBundleWindowsAssets().build(environment); |
| |
| // Depfile is created and dill is copied. |
| expect(environment.buildDir.childFile('flutter_assets.d'), exists); |
| expect(fileSystem.file(r'C:\flutter_assets\kernel_blob.bin'), exists); |
| expect(fileSystem.file(r'C:\flutter_assets\AssetManifest.json'), exists); |
| expect(fileSystem.file(r'C:\flutter_assets\io.flutter.shaders.json'), exists); |
| expect(fileSystem.file(r'C:\flutter_assets\io.flutter.shaders.json').readAsStringSync(), '{"data":{"A":"B"}}'); |
| }, overrides: <Type, Generator>{ |
| FileSystem: () => fileSystem, |
| ProcessManager: () => FakeProcessManager.any(), |
| }); |
| |
| testUsingContext('ProfileBundleWindowsAssets creates correct bundle structure', () async { |
| final Environment environment = Environment.test( |
| fileSystem.currentDirectory, |
| artifacts: Artifacts.test(), |
| processManager: FakeProcessManager.any(), |
| fileSystem: fileSystem, |
| logger: BufferLogger.test(), |
| defines: <String, String>{ |
| kBuildMode: 'profile', |
| } |
| ); |
| |
| environment.buildDir.childFile('app.so').createSync(recursive: true); |
| |
| await const WindowsAotBundle(AotElfProfile(TargetPlatform.windows_x64)).build(environment); |
| await const ProfileBundleWindowsAssets().build(environment); |
| |
| // Depfile is created and so is copied. |
| expect(environment.buildDir.childFile('flutter_assets.d'), exists); |
| expect(fileSystem.file(r'C:\windows\app.so'), exists); |
| expect(fileSystem.file(r'C:\flutter_assets\kernel_blob.bin').existsSync(), false); |
| expect(fileSystem.file(r'C:\flutter_assets\AssetManifest.json'), exists); |
| }, overrides: <Type, Generator>{ |
| FileSystem: () => fileSystem, |
| ProcessManager: () => FakeProcessManager.any(), |
| }); |
| |
| testUsingContext('ReleaseBundleWindowsAssets creates correct bundle structure', () async { |
| final Environment environment = Environment.test( |
| fileSystem.currentDirectory, |
| artifacts: Artifacts.test(), |
| processManager: FakeProcessManager.any(), |
| fileSystem: fileSystem, |
| logger: BufferLogger.test(), |
| defines: <String, String>{ |
| kBuildMode: 'release', |
| } |
| ); |
| |
| environment.buildDir.childFile('app.so').createSync(recursive: true); |
| |
| await const WindowsAotBundle(AotElfRelease(TargetPlatform.windows_x64)).build(environment); |
| await const ReleaseBundleWindowsAssets().build(environment); |
| |
| // Depfile is created and so is copied. |
| expect(environment.buildDir.childFile('flutter_assets.d'), exists); |
| expect(fileSystem.file(r'C:\windows\app.so'), exists); |
| expect(fileSystem.file(r'C:\flutter_assets\kernel_blob.bin').existsSync(), false); |
| expect(fileSystem.file(r'C:\flutter_assets\AssetManifest.json'), exists); |
| }, overrides: <Type, Generator>{ |
| FileSystem: () => fileSystem, |
| ProcessManager: () => FakeProcessManager.any(), |
| }); |
| } |