blob: 160b4c5628031c0af49def44096d91cb45ef15e1 [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/file.dart';
import 'package:file/memory.dart';
import 'package:flutter_tools/src/base/logger.dart';
import 'package:flutter_tools/src/base/terminal.dart';
import 'package:flutter_tools/src/cmake_project.dart';
import 'package:flutter_tools/src/windows/migrations/build_architecture_migration.dart';
import 'package:test/fake.dart';
import '../../../src/common.dart';
void main () {
group('Windows Flutter build architecture migration', () {
late MemoryFileSystem memoryFileSystem;
late BufferLogger testLogger;
late FakeWindowsProject mockProject;
late File cmakeFile;
late Directory buildDirectory;
setUp(() {
memoryFileSystem = MemoryFileSystem.test();
cmakeFile = memoryFileSystem.file('CMakeLists.txt');
buildDirectory = memoryFileSystem.directory('x64');
testLogger = BufferLogger(
terminal: Terminal.test(),
outputPreferences: OutputPreferences.test(),
);
mockProject = FakeWindowsProject(cmakeFile);
});
testWithoutContext('delete old runner directory', () async {
buildDirectory.createSync();
final Directory oldRunnerDirectory =
buildDirectory
.parent
.childDirectory('runner');
oldRunnerDirectory.createSync();
final File executable = oldRunnerDirectory.childFile('program.exe');
executable.createSync();
expect(oldRunnerDirectory.existsSync(), isTrue);
final BuildArchitectureMigration migration = BuildArchitectureMigration(
mockProject,
buildDirectory,
testLogger,
);
await migration.migrate();
expect(oldRunnerDirectory.existsSync(), isFalse);
expect(testLogger.traceText,
contains(
'Deleting previous build folder ./runner.\n'
'New binaries can be found in x64/runner.\n'
)
);
expect(testLogger.statusText, isEmpty);
});
testWithoutContext('skipped if CMake file is missing', () async {
final BuildArchitectureMigration migration = BuildArchitectureMigration(
mockProject,
buildDirectory,
testLogger,
);
await migration.migrate();
expect(cmakeFile.existsSync(), isFalse);
expect(testLogger.traceText,
contains('windows/flutter/CMakeLists.txt file not found, skipping build architecture migration'));
expect(testLogger.statusText, isEmpty);
});
testWithoutContext('skipped if nothing to migrate', () async {
const String cmakeFileContents = 'Nothing to migrate';
cmakeFile.writeAsStringSync(cmakeFileContents);
final DateTime cmakeUpdatedAt = cmakeFile.lastModifiedSync();
final BuildArchitectureMigration buildArchitectureMigration = BuildArchitectureMigration(
mockProject,
buildDirectory,
testLogger,
);
await buildArchitectureMigration.migrate();
expect(cmakeFile.lastModifiedSync(), cmakeUpdatedAt);
expect(cmakeFile.readAsStringSync(), cmakeFileContents);
expect(testLogger.statusText, isEmpty);
});
testWithoutContext('skipped if already migrated', () async {
const String cmakeFileContents =
'# TODO: Move the rest of this into files in ephemeral. See\n'
'# https://github.com/flutter/flutter/issues/57146.\n'
'set(WRAPPER_ROOT "\${EPHEMERAL_DIR}/cpp_client_wrapper")\n'
'\n'
'# Set fallback configurations for older versions of the flutter tool.\n'
'if (NOT DEFINED FLUTTER_TARGET_PLATFORM)\n'
' set(FLUTTER_TARGET_PLATFORM "windows-x64")\n'
'endif()\n'
'\n'
'# === Flutter Library ===\n'
'...\n'
'add_custom_command(\n'
' OUTPUT \${FLUTTER_LIBRARY} \${FLUTTER_LIBRARY_HEADERS}\n'
' \${CPP_WRAPPER_SOURCES_CORE} \${CPP_WRAPPER_SOURCES_PLUGIN}\n'
' \${CPP_WRAPPER_SOURCES_APP}\n'
' \${PHONY_OUTPUT}\n'
' COMMAND \${CMAKE_COMMAND} -E env\n'
' \${FLUTTER_TOOL_ENVIRONMENT}\n'
' "\${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.bat"\n'
' \${FLUTTER_TARGET_PLATFORM} \$<CONFIG>\n'
' VERBATIM\n'
')\n';
cmakeFile.writeAsStringSync(cmakeFileContents);
final DateTime cmakeUpdatedAt = cmakeFile.lastModifiedSync();
final BuildArchitectureMigration buildArchitectureMigration = BuildArchitectureMigration(
mockProject,
buildDirectory,
testLogger,
);
await buildArchitectureMigration.migrate();
expect(cmakeFile.lastModifiedSync(), cmakeUpdatedAt);
expect(cmakeFile.readAsStringSync(), cmakeFileContents);
expect(testLogger.statusText, isEmpty);
});
testWithoutContext('skipped if already migrated (CRLF)', () async {
const String cmakeFileContents =
'# TODO: Move the rest of this into files in ephemeral. See\r\n'
'# https://github.com/flutter/flutter/issues/57146.\r\n'
'set(WRAPPER_ROOT "\${EPHEMERAL_DIR}/cpp_client_wrapper")\r\n'
'\r\n'
'# Set fallback configurations for older versions of the flutter tool.\r\n'
'if (NOT DEFINED FLUTTER_TARGET_PLATFORM)\r\n'
' set(FLUTTER_TARGET_PLATFORM "windows-x64")\r\n'
'endif()\r\n'
'\r\n'
'# === Flutter Library ===\r\n'
'...\r\n'
'add_custom_command(\r\n'
' OUTPUT \${FLUTTER_LIBRARY} \${FLUTTER_LIBRARY_HEADERS}\r\n'
' \${CPP_WRAPPER_SOURCES_CORE} \${CPP_WRAPPER_SOURCES_PLUGIN}\r\n'
' \${CPP_WRAPPER_SOURCES_APP}\r\n'
' \${PHONY_OUTPUT}\r\n'
' COMMAND \${CMAKE_COMMAND} -E env\r\n'
' \${FLUTTER_TOOL_ENVIRONMENT}\r\n'
' "\${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.bat"\r\n'
' \${FLUTTER_TARGET_PLATFORM} \$<CONFIG>\r\n'
' VERBATIM\r\n'
')\r\n';
cmakeFile.writeAsStringSync(cmakeFileContents);
final DateTime cmakeUpdatedAt = cmakeFile.lastModifiedSync();
final BuildArchitectureMigration buildArchitectureMigration = BuildArchitectureMigration(
mockProject,
buildDirectory,
testLogger,
);
await buildArchitectureMigration.migrate();
expect(cmakeFile.lastModifiedSync(), cmakeUpdatedAt);
expect(cmakeFile.readAsStringSync(), cmakeFileContents);
expect(testLogger.statusText, isEmpty);
});
testWithoutContext('migrates project to set the target platform', () async {
cmakeFile.writeAsStringSync(
'# TODO: Move the rest of this into files in ephemeral. See\n'
'# https://github.com/flutter/flutter/issues/57146.\n'
'set(WRAPPER_ROOT "\${EPHEMERAL_DIR}/cpp_client_wrapper")\n'
'\n'
'# === Flutter Library ===\n'
'...\n'
'add_custom_command(\n'
' OUTPUT \${FLUTTER_LIBRARY} \${FLUTTER_LIBRARY_HEADERS}\n'
' \${CPP_WRAPPER_SOURCES_CORE} \${CPP_WRAPPER_SOURCES_PLUGIN}\n'
' \${CPP_WRAPPER_SOURCES_APP}\n'
' \${PHONY_OUTPUT}\n'
' COMMAND \${CMAKE_COMMAND} -E env\n'
' \${FLUTTER_TOOL_ENVIRONMENT}\n'
' "\${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.bat"\n'
' windows-x64 \$<CONFIG>\n'
' VERBATIM\n'
')\n'
);
final BuildArchitectureMigration buildArchitectureMigration = BuildArchitectureMigration(
mockProject,
buildDirectory,
testLogger,
);
await buildArchitectureMigration.migrate();
expect(cmakeFile.readAsStringSync(),
'# TODO: Move the rest of this into files in ephemeral. See\n'
'# https://github.com/flutter/flutter/issues/57146.\n'
'set(WRAPPER_ROOT "\${EPHEMERAL_DIR}/cpp_client_wrapper")\n'
'\n'
'# Set fallback configurations for older versions of the flutter tool.\n'
'if (NOT DEFINED FLUTTER_TARGET_PLATFORM)\n'
' set(FLUTTER_TARGET_PLATFORM "windows-x64")\n'
'endif()\n'
'\n'
'# === Flutter Library ===\n'
'...\n'
'add_custom_command(\n'
' OUTPUT \${FLUTTER_LIBRARY} \${FLUTTER_LIBRARY_HEADERS}\n'
' \${CPP_WRAPPER_SOURCES_CORE} \${CPP_WRAPPER_SOURCES_PLUGIN}\n'
' \${CPP_WRAPPER_SOURCES_APP}\n'
' \${PHONY_OUTPUT}\n'
' COMMAND \${CMAKE_COMMAND} -E env\n'
' \${FLUTTER_TOOL_ENVIRONMENT}\n'
' "\${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.bat"\n'
' \${FLUTTER_TARGET_PLATFORM} \$<CONFIG>\n'
' VERBATIM\n'
')\n'
);
expect(testLogger.statusText, contains('windows/flutter/CMakeLists.txt does not use FLUTTER_TARGET_PLATFORM, updating.'));
});
testWithoutContext('migrates project to set the target platform (CRLF)', () async {
cmakeFile.writeAsStringSync(
'# TODO: Move the rest of this into files in ephemeral. See\r\n'
'# https://github.com/flutter/flutter/issues/57146.\r\n'
'set(WRAPPER_ROOT "\${EPHEMERAL_DIR}/cpp_client_wrapper")\r\n'
'\r\n'
'# === Flutter Library ===\r\n'
'...\r\n'
'add_custom_command(\r\n'
' OUTPUT \${FLUTTER_LIBRARY} \${FLUTTER_LIBRARY_HEADERS}\r\n'
' \${CPP_WRAPPER_SOURCES_CORE} \${CPP_WRAPPER_SOURCES_PLUGIN}\r\n'
' \${CPP_WRAPPER_SOURCES_APP}\r\n'
' \${PHONY_OUTPUT}\r\n'
' COMMAND \${CMAKE_COMMAND} -E env\r\n'
' \${FLUTTER_TOOL_ENVIRONMENT}\r\n'
' "\${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.bat"\r\n'
' windows-x64 \$<CONFIG>\r\n'
' VERBATIM\r\n'
')\r\n'
);
final BuildArchitectureMigration buildArchitectureMigration = BuildArchitectureMigration(
mockProject,
buildDirectory,
testLogger,
);
await buildArchitectureMigration.migrate();
expect(cmakeFile.readAsStringSync(),
'# TODO: Move the rest of this into files in ephemeral. See\r\n'
'# https://github.com/flutter/flutter/issues/57146.\r\n'
'set(WRAPPER_ROOT "\${EPHEMERAL_DIR}/cpp_client_wrapper")\r\n'
'\r\n'
'# Set fallback configurations for older versions of the flutter tool.\r\n'
'if (NOT DEFINED FLUTTER_TARGET_PLATFORM)\r\n'
' set(FLUTTER_TARGET_PLATFORM "windows-x64")\r\n'
'endif()\r\n'
'\r\n'
'# === Flutter Library ===\r\n'
'...\r\n'
'add_custom_command(\r\n'
' OUTPUT \${FLUTTER_LIBRARY} \${FLUTTER_LIBRARY_HEADERS}\r\n'
' \${CPP_WRAPPER_SOURCES_CORE} \${CPP_WRAPPER_SOURCES_PLUGIN}\r\n'
' \${CPP_WRAPPER_SOURCES_APP}\r\n'
' \${PHONY_OUTPUT}\r\n'
' COMMAND \${CMAKE_COMMAND} -E env\r\n'
' \${FLUTTER_TOOL_ENVIRONMENT}\r\n'
' "\${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.bat"\r\n'
' \${FLUTTER_TARGET_PLATFORM} \$<CONFIG>\r\n'
' VERBATIM\r\n'
')\r\n'
);
expect(testLogger.statusText, contains('windows/flutter/CMakeLists.txt does not use FLUTTER_TARGET_PLATFORM, updating.'));
});
});
}
class FakeWindowsProject extends Fake implements WindowsProject {
FakeWindowsProject(this.managedCmakeFile);
@override
final File managedCmakeFile;
}