// 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 Feature _noConfigFeature = Feature(name: 'example'); const Feature _configOnlyFeature = Feature(name: 'example', configSetting: 'enable-flag'); const Feature _envOnlyFeature = Feature(name: 'example', environmentOverride: 'ENABLE_FLAG'); const Feature _configAndEnvFeature = Feature( name: 'example', configSetting: 'enable-flag', environmentOverride: 'ENABLE_FLAG', ); void main() { bool? isEnabled( Feature feature, { Map environment = const {}, Map globalConfig = const {}, String? projectManifest, }) { final Config globalConfigReader = Config.test(); for (final MapEntry(:String key, :Object value) in globalConfig.entries) { globalConfigReader.setValue(key, value); } final BufferLogger logger = BufferLogger.test(); final FlutterManifest? flutterManifest = projectManifest != null ? FlutterManifest.createFromString(projectManifest, logger: logger) : FlutterManifest.empty(logger: logger); if (flutterManifest == null) { fail(logger.errorText); } final FlutterFeaturesConfig featuresConfig = FlutterFeaturesConfig( globalConfig: globalConfigReader, platform: FakePlatform(environment: {...environment}), projectManifest: flutterManifest, ); return featuresConfig.isEnabled(feature); } test('returns null if cannot be overriden', () { expect( isEnabled( _noConfigFeature, environment: {'ENABLE_FLAG': 'true'}, globalConfig: {'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: {'enable-flag': true}), isTrue, ); }); test('global configuration value must be a boolean', () { expect( () => isEnabled( _configOnlyFeature, globalConfig: {'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: {'enable-flag': false}, ), isTrue, ); }); test('overrides from environment', () { expect( isEnabled(_envOnlyFeature, environment: {'ENABLE_FLAG': 'true'}), isTrue, ); }); test('overrides from environment are case insensitive', () { expect( isEnabled(_envOnlyFeature, environment: {'ENABLE_FLAG': 'tRuE'}), isTrue, ); }); test('overrides from environment are lowest priority', () { expect( isEnabled( _configAndEnvFeature, environment: {'ENABLE_FLAG': 'true'}, globalConfig: {'enable-flag': false}, ), isFalse, ); }); }