diff --git a/packages/flutter_tools/test/integration.shard/flutter_build_windows_test.dart b/packages/flutter_tools/test/integration.shard/flutter_build_windows_test.dart new file mode 100644 index 0000000000..2db718db4e --- /dev/null +++ b/packages/flutter_tools/test/integration.shard/flutter_build_windows_test.dart @@ -0,0 +1,116 @@ +// 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 'dart:io' as io; + +import 'package:file/file.dart'; +import 'package:file_testing/file_testing.dart'; +import 'package:flutter_tools/src/base/io.dart'; + +import '../src/common.dart'; +import 'test_utils.dart'; + +void main() { + late Directory tempDir; + late Directory projectRoot; + late String flutterBin; + late Directory releaseDir; + late File exeFile; + + group('flutter build windows command', () { + setUpAll(() { + tempDir = createResolvedTempDirectorySync('build_windows_test.'); + flutterBin = fileSystem.path.join( + getFlutterRoot(), + 'bin', + 'flutter', + ); + processManager.runSync([flutterBin, 'config', + '--enable-windows-desktop', + ]); + + processManager.runSync([ + flutterBin, + ...getLocalEngineArguments(), + 'create', + 'hello', + ], workingDirectory: tempDir.path); + + projectRoot = tempDir.childDirectory('hello'); + + releaseDir = fileSystem.directory(fileSystem.path.join( + projectRoot.path, + 'build', + 'windows', + 'runner', + 'Release', + )); + + exeFile = fileSystem.file(fileSystem.path.join( + releaseDir.path, + 'hello.exe', + )); + }); + + tearDownAll(() { + tryToDelete(tempDir); + }); + + testWithoutContext('flutter build windows creates exe', () { + final ProcessResult result = processManager.runSync([ + flutterBin, + ...getLocalEngineArguments(), + 'build', + 'windows', + '--no-pub', + ], workingDirectory: projectRoot.path); + + expect(result.exitCode, 0); + expect(releaseDir, exists); + expect(exeFile, exists); + + // Default exe has version 1.0.0 + final String fileVersion = _getFileVersion(exeFile); + final String productVersion = _getProductVersion(exeFile); + + expect(fileVersion, equals('1.0.0.0')); + expect(productVersion, equals('1.0.0')); + }); + }, skip: !io.Platform.isWindows); // [intended] Windows integration build. +} + +String _getFileVersion(File file) { + // FileVersionInfo's FileVersion property excludes the private part, + // so this recreates the file version using the individual parts. + final ProcessResult result = Process.runSync( + 'powershell.exe -command " ' + '\$v = [System.Diagnostics.FileVersionInfo]::GetVersionInfo(\\"${file.path}\\"); ' + r'Write-Output \"$($v.FileMajorPart).$($v.FileMinorPart).$($v.FileBuildPart).$($v.FilePrivatePart)\" ' + '"', + [] + ); + + if (result.exitCode != 0) { + throw Exception('GetVersionInfo failed.'); + } + + // Trim trailing new line. + final String output = result.stdout as String; + return output.trim(); +} + +String _getProductVersion(File file) { + final ProcessResult result = Process.runSync( + 'powershell.exe -command "[System.Diagnostics.FileVersionInfo]::GetVersionInfo(\\"${file.path}\\").ProductVersion"', + [] + ); + + if (result.exitCode != 0) { + throw Exception('GetVersionInfo failed.'); + } + + // Trim trailing new line. + final String output = result.stdout as String; + return output.trim(); +}