Skip to content

Commit 5d69a60

Browse files
committed
Let tests mock the list of feature flags
1 parent c04cd2b commit 5d69a60

10 files changed

Lines changed: 63 additions & 29 deletions

File tree

‎packages/flutter_tools/lib/src/commands/config.dart‎

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ class ConfigCommand extends FlutterCommand {
6767
hide: !verboseHelp,
6868
help: 'Print config values as json.',
6969
);
70-
for (final Feature feature in allFeatures) {
70+
for (final Feature feature in featureFlags.allFeatures) {
7171
final String? configSetting = feature.configSetting;
7272
if (configSetting == null) {
7373
continue;
@@ -132,7 +132,7 @@ class ConfigCommand extends FlutterCommand {
132132
}
133133

134134
if (boolArg('clear-features')) {
135-
for (final Feature feature in allFeatures) {
135+
for (final Feature feature in featureFlags.allFeatures) {
136136
final String? configSetting = feature.configSetting;
137137
if (configSetting != null) {
138138
globals.config.removeValue(configSetting);
@@ -188,7 +188,7 @@ class ConfigCommand extends FlutterCommand {
188188
_updateConfig('build-dir', buildDir);
189189
}
190190

191-
for (final Feature feature in allFeatures) {
191+
for (final Feature feature in featureFlags.allFeatures) {
192192
final String? configSetting = feature.configSetting;
193193
if (configSetting == null) {
194194
continue;
@@ -247,14 +247,14 @@ class ConfigCommand extends FlutterCommand {
247247
String get settingsText {
248248
final Map<String, Feature> featuresByName = <String, Feature>{};
249249
final String channel = globals.flutterVersion.channel;
250-
for (final Feature feature in allFeatures) {
250+
for (final Feature feature in featureFlags.allFeatures) {
251251
final String? configSetting = feature.configSetting;
252252
if (configSetting != null) {
253253
featuresByName[configSetting] = feature;
254254
}
255255
}
256256
final Set<String> keys = <String>{
257-
...allFeatures.map((Feature e) => e.configSetting).whereType<String>(),
257+
...featureFlags.allFeatures.map((Feature e) => e.configSetting).whereType<String>(),
258258
...globals.config.keys,
259259
};
260260
final Iterable<String> settings = keys.map<String>((String key) {

‎packages/flutter_tools/lib/src/features.dart‎

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -60,29 +60,29 @@ abstract class FeatureFlags {
6060
///
6161
/// Prefer using one of the specific getters above instead of this API.
6262
bool isEnabled(Feature feature);
63-
}
6463

65-
/// All current Flutter feature flags.
66-
const List<Feature> allFeatures = <Feature>[
67-
flutterWebFeature,
68-
flutterLinuxDesktopFeature,
69-
flutterMacOSDesktopFeature,
70-
flutterWindowsDesktopFeature,
71-
flutterAndroidFeature,
72-
flutterIOSFeature,
73-
flutterFuchsiaFeature,
74-
flutterCustomDevicesFeature,
75-
cliAnimation,
76-
nativeAssets,
77-
swiftPackageManager,
78-
explicitPackageDependencies,
79-
];
64+
/// All current Flutter feature flags.
65+
List<Feature> get allFeatures => const <Feature>[
66+
flutterWebFeature,
67+
flutterLinuxDesktopFeature,
68+
flutterMacOSDesktopFeature,
69+
flutterWindowsDesktopFeature,
70+
flutterAndroidFeature,
71+
flutterIOSFeature,
72+
flutterFuchsiaFeature,
73+
flutterCustomDevicesFeature,
74+
cliAnimation,
75+
nativeAssets,
76+
swiftPackageManager,
77+
explicitPackageDependencies,
78+
];
79+
}
8080

8181
/// All current Flutter feature flags that can be configured.
8282
///
8383
/// [Feature.configSetting] is not `null`.
8484
Iterable<Feature> get allConfigurableFeatures =>
85-
allFeatures.where((Feature feature) => feature.configSetting != null);
85+
featureFlags.allFeatures.where((Feature feature) => feature.configSetting != null);
8686

8787
/// The [Feature] for flutter web.
8888
const Feature flutterWebFeature = Feature.fullyEnabled(

‎packages/flutter_tools/lib/src/flutter_features.dart‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ mixin FlutterFeatureFlagsIsEnabled implements FeatureFlags {
5656
bool get isExplicitPackageDependenciesEnabled => isEnabled(explicitPackageDependencies);
5757
}
5858

59-
interface class FlutterFeatureFlags with FlutterFeatureFlagsIsEnabled implements FeatureFlags {
59+
interface class FlutterFeatureFlags extends FeatureFlags with FlutterFeatureFlagsIsEnabled {
6060
FlutterFeatureFlags({
6161
required FlutterVersion flutterVersion,
6262
required FlutterFeaturesConfig featuresConfig,

‎packages/flutter_tools/lib/src/reporting/unified_analytics.dart‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ Analytics getAnalytics({
6262
/// Uses the [Config] object to get enabled features.
6363
String? getEnabledFeatures(Config config) {
6464
// Create string with all enabled features to send as user property
65-
final Iterable<Feature> enabledFeatures = allFeatures.where((Feature feature) {
65+
final Iterable<Feature> enabledFeatures = featureFlags.allFeatures.where((Feature feature) {
6666
final String? configSetting = feature.configSetting;
6767
return configSetting != null && config.getValue(configSetting) == true;
6868
});

‎packages/flutter_tools/lib/src/reporting/usage.dart‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ class _DefaultUsage implements Usage {
191191
);
192192
// For each flutter experimental feature, record a session value in a comma
193193
// separated list.
194-
final String enabledFeatures = allFeatures
194+
final String enabledFeatures = featureFlags.allFeatures
195195
.where((Feature feature) {
196196
final String? configSetting = feature.configSetting;
197197
return configSetting != null && globals.config.getValue(configSetting) == true;

‎packages/flutter_tools/test/commands.shard/hermetic/config_test.dart‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ void main() {
5454
expect(
5555
testLogger.statusText,
5656
'All Settings:\n'
57-
'${allFeatures.where((Feature e) => e.configSetting != null).map((Feature e) => ' ${e.configSetting}: (Not set)').join('\n')}'
57+
'${featureFlags.allFeatures.where((Feature e) => e.configSetting != null).map((Feature e) => ' ${e.configSetting}: (Not set)').join('\n')}'
5858
'\n\n',
5959
);
6060
});

‎packages/flutter_tools/test/general.shard/features_test.dart‎

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,19 @@ void main() {
124124
FileSystem: createFsWithPubspec,
125125
},
126126
);
127+
128+
testUsingContext('Test feature flags match feature flags', () {
129+
final FeatureFlags testFeatureFlags = TestFeatureFlags();
130+
131+
expect(featureFlags.allFeatures.length, equals(testFeatureFlags.allFeatures.length));
132+
133+
final List<String> featureNames =
134+
featureFlags.allFeatures.map((Feature feature) => feature.name).toList();
135+
final List<String> testFeatureNames =
136+
testFeatureFlags.allFeatures.map((Feature feature) => feature.name).toList();
137+
138+
expect(featureNames, unorderedEquals(testFeatureNames));
139+
});
127140
});
128141

129142
group('Linux Destkop', () {
@@ -459,4 +472,7 @@ final class _TestIsGetterForwarding with FlutterFeatureFlagsIsEnabled {
459472
bool isEnabled(Feature feature) {
460473
return feature == shouldInvoke;
461474
}
475+
476+
@override
477+
List<Feature> get allFeatures => throw UnimplementedError();
462478
}

‎packages/flutter_tools/test/general.shard/unified_analytics_test.dart‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import 'package:flutter_tools/src/reporting/unified_analytics.dart';
88
import 'package:unified_analytics/unified_analytics.dart';
99

1010
import '../src/common.dart';
11+
import '../src/context.dart';
1112
import '../src/fakes.dart';
1213

1314
void main() {
@@ -30,12 +31,12 @@ void main() {
3031
});
3132

3233
group('Unit testing util:', () {
33-
test('getEnabledFeatures is null', () {
34+
testUsingContext('getEnabledFeatures is null', () {
3435
final String? enabledFeatures = getEnabledFeatures(config);
3536
expect(enabledFeatures, isNull);
3637
});
3738

38-
testWithoutContext('getEnabledFeatures not null', () {
39+
testUsingContext('getEnabledFeatures not null', () {
3940
config.setValue('cli-animations', true);
4041

4142
final String? enabledFeatures = getEnabledFeatures(config);

‎packages/flutter_tools/test/integration.shard/command_output_test.dart‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import 'package:flutter_tools/src/base/io.dart';
99
import 'package:flutter_tools/src/features.dart';
1010

1111
import '../src/common.dart';
12+
import '../src/context.dart';
1213
import 'test_utils.dart';
1314

1415
// This test file does not use [getLocalEngineArguments] because it is testing
@@ -58,7 +59,7 @@ void main() {
5859
expect(result.stdout, contains('Shutdown hooks complete'));
5960
});
6061

61-
testWithoutContext('flutter config --list contains all features', () async {
62+
testUsingContext('flutter config --list contains all features', () async {
6263
final ProcessResult result = await processManager.run(<String>[flutterBin, 'config', '--list']);
6364

6465
// contains all of the experiments in features.dart

‎packages/flutter_tools/test/src/fakes.dart‎

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -549,6 +549,22 @@ class TestFeatureFlags implements FeatureFlags {
549549
_ => false,
550550
};
551551
}
552+
553+
@override
554+
List<Feature> get allFeatures => const <Feature>[
555+
flutterWebFeature,
556+
flutterLinuxDesktopFeature,
557+
flutterMacOSDesktopFeature,
558+
flutterWindowsDesktopFeature,
559+
flutterAndroidFeature,
560+
flutterIOSFeature,
561+
flutterFuchsiaFeature,
562+
flutterCustomDevicesFeature,
563+
cliAnimation,
564+
nativeAssets,
565+
swiftPackageManager,
566+
explicitPackageDependencies,
567+
];
552568
}
553569

554570
class FakeOperatingSystemUtils extends Fake implements OperatingSystemUtils {

0 commit comments

Comments
 (0)