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 {