blob: a7d027900d5aed188fd761a67ce840e88c9d1250 [file] [log] [blame]
// 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(),
});
}