Let tests mock the list of feature flags
diff --git a/packages/flutter_tools/lib/src/commands/config.dart b/packages/flutter_tools/lib/src/commands/config.dart index dac09a2..9778141 100644 --- a/packages/flutter_tools/lib/src/commands/config.dart +++ b/packages/flutter_tools/lib/src/commands/config.dart
@@ -67,7 +67,7 @@ hide: !verboseHelp, help: 'Print config values as json.', ); - for (final Feature feature in allFeatures) { + for (final Feature feature in featureFlags.allFeatures) { final String? configSetting = feature.configSetting; if (configSetting == null) { continue; @@ -132,7 +132,7 @@ } if (boolArg('clear-features')) { - for (final Feature feature in allFeatures) { + for (final Feature feature in featureFlags.allFeatures) { final String? configSetting = feature.configSetting; if (configSetting != null) { globals.config.removeValue(configSetting); @@ -188,7 +188,7 @@ _updateConfig('build-dir', buildDir); } - for (final Feature feature in allFeatures) { + for (final Feature feature in featureFlags.allFeatures) { final String? configSetting = feature.configSetting; if (configSetting == null) { continue; @@ -247,14 +247,14 @@ String get settingsText { final Map<String, Feature> featuresByName = <String, Feature>{}; final String channel = globals.flutterVersion.channel; - for (final Feature feature in allFeatures) { + for (final Feature feature in featureFlags.allFeatures) { final String? configSetting = feature.configSetting; if (configSetting != null) { featuresByName[configSetting] = feature; } } final Set<String> keys = <String>{ - ...allFeatures.map((Feature e) => e.configSetting).whereType<String>(), + ...featureFlags.allFeatures.map((Feature e) => e.configSetting).whereType<String>(), ...globals.config.keys, }; final Iterable<String> settings = keys.map<String>((String key) {
diff --git a/packages/flutter_tools/lib/src/features.dart b/packages/flutter_tools/lib/src/features.dart index d548d2b..c1c3d4a 100644 --- a/packages/flutter_tools/lib/src/features.dart +++ b/packages/flutter_tools/lib/src/features.dart
@@ -60,28 +60,28 @@ /// /// Prefer using one of the specific getters above instead of this API. bool isEnabled(Feature feature); -} -/// All current Flutter feature flags. -const List<Feature> allFeatures = <Feature>[ - flutterWebFeature, - flutterLinuxDesktopFeature, - flutterMacOSDesktopFeature, - flutterWindowsDesktopFeature, - flutterAndroidFeature, - flutterIOSFeature, - flutterFuchsiaFeature, - flutterCustomDevicesFeature, - cliAnimation, - nativeAssets, - swiftPackageManager, -]; + /// All current Flutter feature flags. + List<Feature> get allFeatures => const <Feature>[ + flutterWebFeature, + flutterLinuxDesktopFeature, + flutterMacOSDesktopFeature, + flutterWindowsDesktopFeature, + flutterAndroidFeature, + flutterIOSFeature, + flutterFuchsiaFeature, + flutterCustomDevicesFeature, + cliAnimation, + nativeAssets, + swiftPackageManager, + ]; +} /// All current Flutter feature flags that can be configured. /// /// [Feature.configSetting] is not `null`. Iterable<Feature> get allConfigurableFeatures => - allFeatures.where((Feature feature) => feature.configSetting != null); + featureFlags.allFeatures.where((Feature feature) => feature.configSetting != null); /// The [Feature] for flutter web. const Feature flutterWebFeature = Feature.fullyEnabled(
diff --git a/packages/flutter_tools/lib/src/flutter_features.dart b/packages/flutter_tools/lib/src/flutter_features.dart index a55f54c..79253c1 100644 --- a/packages/flutter_tools/lib/src/flutter_features.dart +++ b/packages/flutter_tools/lib/src/flutter_features.dart
@@ -61,7 +61,7 @@ bool get isExplicitPackageDependenciesEnabled => true; } -interface class FlutterFeatureFlags with FlutterFeatureFlagsIsEnabled implements FeatureFlags { +interface class FlutterFeatureFlags extends FeatureFlags with FlutterFeatureFlagsIsEnabled { FlutterFeatureFlags({ required FlutterVersion flutterVersion, required FlutterFeaturesConfig featuresConfig,
diff --git a/packages/flutter_tools/lib/src/reporting/unified_analytics.dart b/packages/flutter_tools/lib/src/reporting/unified_analytics.dart index 1d490e3..a21be16 100644 --- a/packages/flutter_tools/lib/src/reporting/unified_analytics.dart +++ b/packages/flutter_tools/lib/src/reporting/unified_analytics.dart
@@ -62,7 +62,7 @@ /// Uses the [Config] object to get enabled features. String? getEnabledFeatures(Config config) { // Create string with all enabled features to send as user property - final Iterable<Feature> enabledFeatures = allFeatures.where((Feature feature) { + final Iterable<Feature> enabledFeatures = featureFlags.allFeatures.where((Feature feature) { final String? configSetting = feature.configSetting; return configSetting != null && config.getValue(configSetting) == true; });
diff --git a/packages/flutter_tools/lib/src/reporting/usage.dart b/packages/flutter_tools/lib/src/reporting/usage.dart index 397552a..bdcbac5 100644 --- a/packages/flutter_tools/lib/src/reporting/usage.dart +++ b/packages/flutter_tools/lib/src/reporting/usage.dart
@@ -191,7 +191,7 @@ ); // For each flutter experimental feature, record a session value in a comma // separated list. - final String enabledFeatures = allFeatures + final String enabledFeatures = featureFlags.allFeatures .where((Feature feature) { final String? configSetting = feature.configSetting; return configSetting != null && globals.config.getValue(configSetting) == true;
diff --git a/packages/flutter_tools/test/commands.shard/hermetic/config_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/config_test.dart index 1874565..2a061d0 100644 --- a/packages/flutter_tools/test/commands.shard/hermetic/config_test.dart +++ b/packages/flutter_tools/test/commands.shard/hermetic/config_test.dart
@@ -54,7 +54,7 @@ expect( testLogger.statusText, 'All Settings:\n' - '${allFeatures.where((Feature e) => e.configSetting != null).map((Feature e) => ' ${e.configSetting}: (Not set)').join('\n')}' + '${featureFlags.allFeatures.where((Feature e) => e.configSetting != null).map((Feature e) => ' ${e.configSetting}: (Not set)').join('\n')}' '\n\n', ); });
diff --git a/packages/flutter_tools/test/general.shard/features_test.dart b/packages/flutter_tools/test/general.shard/features_test.dart index d8fe50e..65ed19f 100644 --- a/packages/flutter_tools/test/general.shard/features_test.dart +++ b/packages/flutter_tools/test/general.shard/features_test.dart
@@ -124,6 +124,19 @@ FileSystem: createFsWithPubspec, }, ); + + testUsingContext('Test feature flags match feature flags', () { + final FeatureFlags testFeatureFlags = TestFeatureFlags(); + + expect(featureFlags.allFeatures.length, equals(testFeatureFlags.allFeatures.length)); + + final List<String> featureNames = + featureFlags.allFeatures.map((Feature feature) => feature.name).toList(); + final List<String> testFeatureNames = + testFeatureFlags.allFeatures.map((Feature feature) => feature.name).toList(); + + expect(featureNames, unorderedEquals(testFeatureNames)); + }); }); group('Linux Destkop', () { @@ -441,4 +454,7 @@ bool isEnabled(Feature feature) { return feature == shouldInvoke; } + + @override + List<Feature> get allFeatures => throw UnimplementedError(); }
diff --git a/packages/flutter_tools/test/general.shard/unified_analytics_test.dart b/packages/flutter_tools/test/general.shard/unified_analytics_test.dart index 0f7195a..0362b15 100644 --- a/packages/flutter_tools/test/general.shard/unified_analytics_test.dart +++ b/packages/flutter_tools/test/general.shard/unified_analytics_test.dart
@@ -8,6 +8,7 @@ import 'package:unified_analytics/unified_analytics.dart'; import '../src/common.dart'; +import '../src/context.dart'; import '../src/fakes.dart'; void main() { @@ -30,12 +31,12 @@ }); group('Unit testing util:', () { - test('getEnabledFeatures is null', () { + testUsingContext('getEnabledFeatures is null', () { final String? enabledFeatures = getEnabledFeatures(config); expect(enabledFeatures, isNull); }); - testWithoutContext('getEnabledFeatures not null', () { + testUsingContext('getEnabledFeatures not null', () { config.setValue('cli-animations', true); final String? enabledFeatures = getEnabledFeatures(config);
diff --git a/packages/flutter_tools/test/integration.shard/command_output_test.dart b/packages/flutter_tools/test/integration.shard/command_output_test.dart index 9c26e18..7b6b640 100644 --- a/packages/flutter_tools/test/integration.shard/command_output_test.dart +++ b/packages/flutter_tools/test/integration.shard/command_output_test.dart
@@ -9,6 +9,7 @@ import 'package:flutter_tools/src/features.dart'; import '../src/common.dart'; +import '../src/context.dart'; import 'test_utils.dart'; // This test file does not use [getLocalEngineArguments] because it is testing @@ -58,7 +59,7 @@ expect(result.stdout, contains('Shutdown hooks complete')); }); - testWithoutContext('flutter config --list contains all features', () async { + testUsingContext('flutter config --list contains all features', () async { final ProcessResult result = await processManager.run(<String>[flutterBin, 'config', '--list']); // contains all of the experiments in features.dart
diff --git a/packages/flutter_tools/test/src/fakes.dart b/packages/flutter_tools/test/src/fakes.dart index fada2a4..562f541 100644 --- a/packages/flutter_tools/test/src/fakes.dart +++ b/packages/flutter_tools/test/src/fakes.dart
@@ -548,6 +548,21 @@ _ => false, }; } + + @override + List<Feature> get allFeatures => const <Feature>[ + flutterWebFeature, + flutterLinuxDesktopFeature, + flutterMacOSDesktopFeature, + flutterWindowsDesktopFeature, + flutterAndroidFeature, + flutterIOSFeature, + flutterFuchsiaFeature, + flutterCustomDevicesFeature, + cliAnimation, + nativeAssets, + swiftPackageManager, + ]; } class FakeOperatingSystemUtils extends Fake implements OperatingSystemUtils {