diff --git a/packages/flutter_tools/lib/src/base/config.dart b/packages/flutter_tools/lib/src/base/config.dart index 7c1a5220781..7d5e3d0883c 100644 --- a/packages/flutter_tools/lib/src/base/config.dart +++ b/packages/flutter_tools/lib/src/base/config.dart @@ -3,15 +3,28 @@ // found in the LICENSE file. import '../convert.dart'; +import '../globals.dart'; import 'context.dart'; import 'file_system.dart'; +import 'logger.dart'; import 'utils.dart'; class Config { - Config([File configFile]) { + Config([File configFile, Logger localLogger]) { + final Logger loggerInstance = localLogger ?? logger; _configFile = configFile ?? fs.file(fs.path.join(userHomePath(), '.flutter_settings')); if (_configFile.existsSync()) { - _values = castStringKeyedMap(json.decode(_configFile.readAsStringSync())); + try { + _values = castStringKeyedMap(json.decode(_configFile.readAsStringSync())); + } on FormatException { + loggerInstance + ..printError('Failed to decode preferences in ${_configFile.path}.') + ..printError( + 'You may need to reapply any previously saved configuration ' + 'with the "flutter config" command.', + ); + _configFile.deleteSync(); + } } } diff --git a/packages/flutter_tools/test/general.shard/config_test.dart b/packages/flutter_tools/test/general.shard/config_test.dart index 4e64db38af4..2c5f7d6e795 100644 --- a/packages/flutter_tools/test/general.shard/config_test.dart +++ b/packages/flutter_tools/test/general.shard/config_test.dart @@ -2,54 +2,59 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import 'package:file/memory.dart'; import 'package:flutter_tools/src/base/config.dart'; import 'package:flutter_tools/src/base/file_system.dart'; +import 'package:flutter_tools/src/base/logger.dart'; import '../src/common.dart'; void main() { Config config; - Directory tempDir; + MemoryFileSystem memoryFileSystem; setUp(() { - tempDir = fs.systemTempDirectory.createTempSync('flutter_config_test.'); - final File file = fs.file(fs.path.join(tempDir.path, '.settings')); + memoryFileSystem = MemoryFileSystem(); + final File file = memoryFileSystem.file('example'); config = Config(file); }); - - tearDown(() { - tryToDelete(tempDir); + test('Config get set value', () async { + expect(config.getValue('foo'), null); + config.setValue('foo', 'bar'); + expect(config.getValue('foo'), 'bar'); + expect(config.keys, contains('foo')); }); - group('config', () { - test('get set value', () async { - expect(config.getValue('foo'), null); - config.setValue('foo', 'bar'); - expect(config.getValue('foo'), 'bar'); - expect(config.keys, contains('foo')); - }); + test('Config get set bool value', () async { + expect(config.getValue('foo'), null); + config.setValue('foo', true); + expect(config.getValue('foo'), true); + expect(config.keys, contains('foo')); + }); - test('get set bool value', () async { - expect(config.getValue('foo'), null); - config.setValue('foo', true); - expect(config.getValue('foo'), true); - expect(config.keys, contains('foo')); - }); + test('Config containsKey', () async { + expect(config.containsKey('foo'), false); + config.setValue('foo', 'bar'); + expect(config.containsKey('foo'), true); + }); - test('containsKey', () async { - expect(config.containsKey('foo'), false); - config.setValue('foo', 'bar'); - expect(config.containsKey('foo'), true); - }); + test('Config removeValue', () async { + expect(config.getValue('foo'), null); + config.setValue('foo', 'bar'); + expect(config.getValue('foo'), 'bar'); + expect(config.keys, contains('foo')); + config.removeValue('foo'); + expect(config.getValue('foo'), null); + expect(config.keys, isNot(contains('foo'))); + }); - test('removeValue', () async { - expect(config.getValue('foo'), null); - config.setValue('foo', 'bar'); - expect(config.getValue('foo'), 'bar'); - expect(config.keys, contains('foo')); - config.removeValue('foo'); - expect(config.getValue('foo'), null); - expect(config.keys, isNot(contains('foo'))); - }); + test('Config parse error', () { + final BufferLogger bufferLogger =BufferLogger(); + final File file = memoryFileSystem.file('example') + ..writeAsStringSync('{"hello":"bar'); + config = Config(file, bufferLogger); + + expect(file.existsSync(), false); + expect(bufferLogger.errorText, contains('Failed to decode preferences')); }); }