blob: 9b841dbaae58864e71d2c8adad823124d23ca1fa [file] [log] [blame]
// 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:flutter_tools/src/base/config.dart';
import 'package:flutter_tools/src/base/logger.dart';
import 'package:flutter_tools/src/base/platform.dart';
import 'package:flutter_tools/src/features.dart';
import 'package:flutter_tools/src/flutter_features_config.dart';
import 'package:flutter_tools/src/flutter_manifest.dart';
import '../src/common.dart';
const _noConfigFeature = Feature(name: 'example');
const _configOnlyFeature = Feature(name: 'example', configSetting: 'enable-flag');
const _envOnlyFeature = Feature(name: 'example', environmentOverride: 'ENABLE_FLAG');
const _configAndEnvFeature = Feature(
name: 'example',
configSetting: 'enable-flag',
environmentOverride: 'ENABLE_FLAG',
);
void main() {
bool? isEnabled(
Feature feature, {
Map<String, String> environment = const <String, String>{},
Map<String, Object> globalConfig = const <String, Object>{},
String? projectManifest,
}) {
final globalConfigReader = Config.test();
for (final MapEntry<String, Object>(:String key, :Object value) in globalConfig.entries) {
globalConfigReader.setValue(key, value);
}
final logger = BufferLogger.test();
final FlutterManifest? flutterManifest = projectManifest != null
? FlutterManifest.createFromString(projectManifest, logger: logger)
: FlutterManifest.empty(logger: logger);
if (flutterManifest == null) {
fail(logger.errorText);
}
final featuresConfig = FlutterFeaturesConfig(
globalConfig: globalConfigReader,
platform: FakePlatform(environment: <String, String>{...environment}),
projectManifest: flutterManifest,
);
return featuresConfig.isEnabled(feature);
}
test('returns null if cannot be overriden', () {
expect(
isEnabled(
_noConfigFeature,
environment: <String, String>{'ENABLE_FLAG': 'true'},
globalConfig: <String, Object>{'enable-flag': true},
projectManifest: '''
flutter:
config:
enable-flag: true
''',
),
isNull,
);
});
test('returns null if every source is omitted', () {
expect(isEnabled(_configAndEnvFeature), isNull);
});
test('overrides from local manifest', () {
expect(
isEnabled(
_configOnlyFeature,
projectManifest: '''
flutter:
config:
enable-flag: true
''',
),
isTrue,
);
});
test('local manifest config must be a map', () {
expect(
() => isEnabled(
_configOnlyFeature,
projectManifest: '''
flutter:
config: true
''',
),
throwsToolExit(message: 'must be a map'),
);
});
test('local manifest value must be a boolean', () {
expect(
() => isEnabled(
_configOnlyFeature,
projectManifest: '''
flutter:
config:
enable-flag: NOT-A-BOOLEAN
''',
),
throwsToolExit(message: 'must be a boolean'),
);
});
test('overrides from global configuration', () {
expect(
isEnabled(_configOnlyFeature, globalConfig: <String, Object>{'enable-flag': true}),
isTrue,
);
});
test('global configuration value must be a boolean', () {
expect(
() => isEnabled(
_configOnlyFeature,
globalConfig: <String, Object>{'enable-flag': 'NOT-A-BOOLEAN'},
),
throwsToolExit(message: 'must be a boolean'),
);
});
test('overrides from local manifest take precedence over global configuration', () {
expect(
isEnabled(
_configOnlyFeature,
projectManifest: '''
flutter:
config:
enable-flag: true
''',
globalConfig: <String, Object>{'enable-flag': false},
),
isTrue,
);
});
test('overrides from environment', () {
expect(
isEnabled(_envOnlyFeature, environment: <String, String>{'ENABLE_FLAG': 'true'}),
isTrue,
);
});
test('overrides from environment are case insensitive', () {
expect(
isEnabled(_envOnlyFeature, environment: <String, String>{'ENABLE_FLAG': 'tRuE'}),
isTrue,
);
});
test('overrides from environment are lowest priority', () {
expect(
isEnabled(
_configAndEnvFeature,
environment: <String, String>{'ENABLE_FLAG': 'true'},
globalConfig: <String, Object>{'enable-flag': false},
),
isFalse,
);
});
}