// 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:flutter_tools/src/base/logger.dart'; import 'package:flutter_tools/src/flutter_project_metadata.dart'; import 'package:flutter_tools/src/project.dart'; import '../src/common.dart'; import '../src/context.dart'; import 'test_data/migrate_project.dart'; import 'test_driver.dart'; import 'test_utils.dart'; void main() { late Directory tempDir; late FlutterRunTestDriver flutter; late Logger logger; setUp(() async { tempDir = createResolvedTempDirectorySync('run_test.'); flutter = FlutterRunTestDriver(tempDir); logger = BufferLogger.test(); }); tearDown(() async { await flutter.stop(); tryToDelete(tempDir); }); testWithoutContext('parse simple config file', () async { final File metadataFile = tempDir.childFile('.metadata'); metadataFile.createSync(recursive: true); metadataFile.writeAsStringSync(''' # This file tracks properties of this Flutter project. # Used by Flutter tool to assess capabilities and perform upgrades etc. # # This file should be version controlled. version: revision: fj19vkla9vnlka9vni3n808v3nch8cd channel: stable project_type: app # Tracks metadata for the flutter migrate command migration: platforms: - platform: root create_revision: fj19vkla9vnlka9vni3n808v3nch8cd base_revision: 93kf9v3njfa90vnidfjvn39nvi3vnie - platform: android create_revision: abfj19vkla9vnlka9vni3n808v3nch8cd base_revision: ab93kf9v3njfa90vnidfjvn39nvi3vnie # User provided section # List of Local paths (relative to this file) that should be # ignored by the migrate tool. # # Files that are not part of the templates will be ignored by default. unmanaged_files: - lib/main.dart - ios/Runner.xcodeproj/project.pbxproj - lib/file1/etc.dart - android/my_file.java ''', flush: true); FlutterProjectMetadata metadata = FlutterProjectMetadata(metadataFile, logger); expect(metadata.migrateConfig.platformConfigs[SupportedPlatform.root]!.createRevision, equals('fj19vkla9vnlka9vni3n808v3nch8cd')); expect(metadata.migrateConfig.platformConfigs[SupportedPlatform.root]!.baseRevision, equals('93kf9v3njfa90vnidfjvn39nvi3vnie')); expect(metadata.migrateConfig.platformConfigs[SupportedPlatform.android]!.createRevision, equals('abfj19vkla9vnlka9vni3n808v3nch8cd')); expect(metadata.migrateConfig.platformConfigs[SupportedPlatform.android]!.baseRevision, equals('ab93kf9v3njfa90vnidfjvn39nvi3vnie')); expect(metadata.migrateConfig.unmanagedFiles[0], equals('lib/main.dart')); expect(metadata.migrateConfig.unmanagedFiles[1], equals('ios/Runner.xcodeproj/project.pbxproj')); expect(metadata.migrateConfig.unmanagedFiles[2], equals('lib/file1/etc.dart')); expect(metadata.migrateConfig.unmanagedFiles[3], equals('android/my_file.java')); metadataFile.writeAsStringSync(''' # This file tracks properties of this Flutter project. # Used by Flutter tool to assess capabilities and perform upgrades etc. # # This file should be version controlled. version: revision: fj19vkla9vnlka9vni3n808v3nch8cd channel: stable project_type: app ''', flush: true); metadata = FlutterProjectMetadata(metadataFile, logger); expect(metadata.migrateConfig.isEmpty, equals(true)); expect(metadata.versionRevision, equals('fj19vkla9vnlka9vni3n808v3nch8cd')); expect(metadata.versionChannel, equals('stable')); }); testUsingContext('write simple config file', () async { const String testCreateRevision = 'testmc9skl32nlnf23lnakcs9njr3'; const String testBaseRevision = 'testanas9anlnq9ba7bjhavan3kma'; MigrateConfig config = MigrateConfig( platformConfigs: <SupportedPlatform, MigratePlatformConfig>{ SupportedPlatform.android: MigratePlatformConfig(platform: SupportedPlatform.android, createRevision: testCreateRevision, baseRevision: testBaseRevision), SupportedPlatform.ios: MigratePlatformConfig(platform: SupportedPlatform.ios, createRevision: testCreateRevision, baseRevision: testBaseRevision), SupportedPlatform.root: MigratePlatformConfig(platform: SupportedPlatform.root, createRevision: testCreateRevision, baseRevision: testBaseRevision), SupportedPlatform.windows: MigratePlatformConfig(platform: SupportedPlatform.windows, createRevision: testCreateRevision, baseRevision: testBaseRevision), }, unmanagedFiles: <String>[ 'lib/main.dart', 'ios/Runner.xcodeproj/project.pbxproj', 'lib/file1/etc.dart', ], ); String outputString = config.getOutputFileString(); expect(outputString, equals(''' # Tracks metadata for the flutter migrate command migration: platforms: - platform: android create_revision: $testCreateRevision base_revision: $testBaseRevision - platform: ios create_revision: $testCreateRevision base_revision: $testBaseRevision - platform: root create_revision: $testCreateRevision base_revision: $testBaseRevision - platform: windows create_revision: $testCreateRevision base_revision: $testBaseRevision # User provided section # List of Local paths (relative to this file) that should be # ignored by the migrate tool. # # Files that are not part of the templates will be ignored by default. unmanaged_files: - 'lib/main.dart' - 'ios/Runner.xcodeproj/project.pbxproj' - 'lib/file1/etc.dart' ''')); config = MigrateConfig(); outputString = config.getOutputFileString(); expect(outputString, equals('')); }); testUsingContext('populate migrate config', () async { // Flutter Stable 1.22.6 hash: 9b2d32b605630f28625709ebd9d78ab3016b2bf6 final MigrateProject project = MigrateProject('version:1.22.6_stable'); await project.setUpIn(tempDir); final File metadataFile = tempDir.childFile('.metadata'); const String currentRevision = 'test_base_revision'; const String createRevision = 'test_create_revision'; final FlutterProjectMetadata metadata = FlutterProjectMetadata(metadataFile, logger); metadata.migrateConfig.populate( projectDirectory: tempDir, currentRevision: currentRevision, createRevision: createRevision, logger: logger, ); expect(metadata.migrateConfig.platformConfigs.length, equals(3)); final List<SupportedPlatform> keyList = List<SupportedPlatform>.from(metadata.migrateConfig.platformConfigs.keys); expect(keyList[0], equals(SupportedPlatform.root)); expect(metadata.migrateConfig.platformConfigs[SupportedPlatform.root]!.baseRevision, equals(currentRevision)); expect(metadata.migrateConfig.platformConfigs[SupportedPlatform.root]!.createRevision, equals(createRevision)); expect(keyList[1], equals(SupportedPlatform.android)); expect(metadata.migrateConfig.platformConfigs[SupportedPlatform.android]!.baseRevision, equals(currentRevision)); expect(metadata.migrateConfig.platformConfigs[SupportedPlatform.android]!.createRevision, equals(createRevision)); expect(keyList[2], equals(SupportedPlatform.ios)); expect(metadata.migrateConfig.platformConfigs[SupportedPlatform.ios]!.baseRevision, equals(currentRevision)); expect(metadata.migrateConfig.platformConfigs[SupportedPlatform.ios]!.createRevision, equals(createRevision)); final File metadataFileOutput = tempDir.childFile('.metadata_output'); metadata.writeFile(outputFile: metadataFileOutput); expect(metadataFileOutput.readAsStringSync(), equals(''' # This file tracks properties of this Flutter project. # Used by Flutter tool to assess capabilities and perform upgrades etc. # # This file should be version controlled. version: revision: 9b2d32b605630f28625709ebd9d78ab3016b2bf6 channel: unknown project_type: app # Tracks metadata for the flutter migrate command migration: platforms: - platform: root create_revision: $createRevision base_revision: $currentRevision - platform: android create_revision: $createRevision base_revision: $currentRevision - platform: ios create_revision: $createRevision base_revision: $currentRevision # User provided section # List of Local paths (relative to this file) that should be # ignored by the migrate tool. # # Files that are not part of the templates will be ignored by default. unmanaged_files: - 'lib/main.dart' - 'ios/Runner.xcodeproj/project.pbxproj' ''')); }); testUsingContext('equality compares platform', () async { const String testCreateRevision = 'testmc9skl32nlnf23lnakcs9njr3'; const String testBaseRevision = 'testanas9anlnq9ba7bjhavan3kma'; final MigratePlatformConfig configAndroid = MigratePlatformConfig(platform: SupportedPlatform.android, createRevision: testCreateRevision, baseRevision: testBaseRevision); final MigratePlatformConfig configIos = MigratePlatformConfig(platform: SupportedPlatform.ios, createRevision: testCreateRevision, baseRevision: testBaseRevision); expect(configAndroid.equals(configIos), false); expect(configAndroid.equals(configAndroid), true); expect(configIos.equals(configIos), true); }); }