| // 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/migrations/cmake_custom_command_migration.dart'; |
| import 'package:test/fake.dart'; |
| |
| import '../../src/common.dart'; |
| |
| void main () { |
| group('CMake project migration', () { |
| group('migrate add_custom_command() to use VERBATIM', () { |
| late MemoryFileSystem memoryFileSystem; |
| late BufferLogger testLogger; |
| late FakeCmakeProject mockCmakeProject; |
| late File managedCmakeFile; |
| |
| setUp(() { |
| memoryFileSystem = MemoryFileSystem.test(); |
| managedCmakeFile = memoryFileSystem.file('CMakeLists.txtx'); |
| |
| testLogger = BufferLogger( |
| terminal: Terminal.test(), |
| outputPreferences: OutputPreferences.test(), |
| ); |
| |
| mockCmakeProject = FakeCmakeProject(managedCmakeFile); |
| }); |
| |
| testWithoutContext('skipped if files are missing', () { |
| final CmakeCustomCommandMigration cmakeProjectMigration = CmakeCustomCommandMigration( |
| mockCmakeProject, |
| testLogger, |
| ); |
| cmakeProjectMigration.migrate(); |
| expect(managedCmakeFile.existsSync(), isFalse); |
| |
| expect(testLogger.traceText, contains('CMake project not found, skipping add_custom_command() VERBATIM migration')); |
| expect(testLogger.statusText, isEmpty); |
| }); |
| |
| testWithoutContext('skipped if nothing to migrate', () { |
| const String contents = 'Nothing to migrate'; |
| managedCmakeFile.writeAsStringSync(contents); |
| final DateTime projectLastModified = managedCmakeFile.lastModifiedSync(); |
| |
| final CmakeCustomCommandMigration cmakeProjectMigration = CmakeCustomCommandMigration( |
| mockCmakeProject, |
| testLogger, |
| ); |
| cmakeProjectMigration.migrate(); |
| |
| expect(managedCmakeFile.lastModifiedSync(), projectLastModified); |
| expect(managedCmakeFile.readAsStringSync(), contents); |
| |
| expect(testLogger.statusText, isEmpty); |
| }); |
| |
| testWithoutContext('skipped if already migrated', () { |
| const String contents = r''' |
| add_custom_command( |
| OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} |
| ${CMAKE_CURRENT_BINARY_DIR}/_phony_ |
| COMMAND ${CMAKE_COMMAND} -E env |
| ${FLUTTER_TOOL_ENVIRONMENT} |
| "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.sh" |
| ${FLUTTER_TARGET_PLATFORM} ${CMAKE_BUILD_TYPE} |
| VERBATIM |
| ) |
| '''; |
| managedCmakeFile.writeAsStringSync(contents); |
| final DateTime projectLastModified = managedCmakeFile.lastModifiedSync(); |
| |
| final CmakeCustomCommandMigration cmakeProjectMigration = CmakeCustomCommandMigration( |
| mockCmakeProject, |
| testLogger, |
| ); |
| cmakeProjectMigration.migrate(); |
| |
| expect(managedCmakeFile.lastModifiedSync(), projectLastModified); |
| expect(managedCmakeFile.readAsStringSync(), contents); |
| |
| expect(testLogger.statusText, isEmpty); |
| }); |
| |
| testWithoutContext('is migrated to use VERBATIM', () { |
| managedCmakeFile.writeAsStringSync(r''' |
| add_custom_command( |
| OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} |
| ${CMAKE_CURRENT_BINARY_DIR}/_phony_ |
| COMMAND ${CMAKE_COMMAND} -E env |
| ${FLUTTER_TOOL_ENVIRONMENT} |
| "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.sh" |
| ${FLUTTER_TARGET_PLATFORM} ${CMAKE_BUILD_TYPE} |
| ) |
| '''); |
| |
| final CmakeCustomCommandMigration cmakeProjectMigration = CmakeCustomCommandMigration( |
| mockCmakeProject, |
| testLogger, |
| ); |
| cmakeProjectMigration.migrate(); |
| |
| expect(managedCmakeFile.readAsStringSync(), r''' |
| add_custom_command( |
| OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} |
| ${CMAKE_CURRENT_BINARY_DIR}/_phony_ |
| COMMAND ${CMAKE_COMMAND} -E env |
| ${FLUTTER_TOOL_ENVIRONMENT} |
| "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.sh" |
| ${FLUTTER_TARGET_PLATFORM} ${CMAKE_BUILD_TYPE} |
| VERBATIM |
| ) |
| '''); |
| |
| expect(testLogger.statusText, contains('add_custom_command() missing VERBATIM or FLUTTER_TARGET_PLATFORM, updating.')); |
| }); |
| |
| testWithoutContext('is migrated to use FLUTTER_TARGET_PLATFORM', () { |
| managedCmakeFile.writeAsStringSync(r''' |
| add_custom_command( |
| OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} |
| ${CMAKE_CURRENT_BINARY_DIR}/_phony_ |
| COMMAND ${CMAKE_COMMAND} -E env |
| ${FLUTTER_TOOL_ENVIRONMENT} |
| "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.sh" |
| linux-x64 ${CMAKE_BUILD_TYPE} |
| VERBATIM |
| ) |
| '''); |
| |
| final CmakeCustomCommandMigration cmakeProjectMigration = CmakeCustomCommandMigration( |
| mockCmakeProject, |
| testLogger, |
| ); |
| cmakeProjectMigration.migrate(); |
| |
| expect(managedCmakeFile.readAsStringSync(), r''' |
| add_custom_command( |
| OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} |
| ${CMAKE_CURRENT_BINARY_DIR}/_phony_ |
| COMMAND ${CMAKE_COMMAND} -E env |
| ${FLUTTER_TOOL_ENVIRONMENT} |
| "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.sh" |
| ${FLUTTER_TARGET_PLATFORM} ${CMAKE_BUILD_TYPE} |
| VERBATIM |
| ) |
| '''); |
| |
| expect(testLogger.statusText, contains('add_custom_command() missing VERBATIM or FLUTTER_TARGET_PLATFORM, updating.')); |
| }); |
| }); |
| }); |
| } |
| |
| class FakeCmakeProject extends Fake implements CmakeBasedProject { |
| FakeCmakeProject(this.managedCmakeFile); |
| |
| @override |
| final File managedCmakeFile; |
| } |