mirror of
https://github.com/flutter/flutter
synced 2024-10-13 19:52:53 +00:00
60d7bb2588
This PR changes the Config class in flutter_tools to use the XDG Base directory specification instead of putting files directly in the user's home directory. If those files are already present in the home directory, they are used instead.
151 lines
4.6 KiB
Dart
151 lines
4.6 KiB
Dart
// 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:file/memory.dart';
|
|
import 'package:flutter_tools/src/base/config.dart';
|
|
import 'package:flutter_tools/src/base/error_handling_io.dart';
|
|
import 'package:flutter_tools/src/base/file_system.dart';
|
|
import 'package:flutter_tools/src/base/logger.dart';
|
|
import 'package:flutter_tools/src/base/platform.dart';
|
|
import 'package:flutter_tools/src/convert.dart';
|
|
import 'package:test/fake.dart';
|
|
|
|
import '../src/common.dart';
|
|
|
|
void main() {
|
|
Config config;
|
|
MemoryFileSystem memoryFileSystem;
|
|
FakePlatform fakePlatform;
|
|
|
|
setUp(() {
|
|
memoryFileSystem = MemoryFileSystem.test();
|
|
fakePlatform = FakePlatform(
|
|
operatingSystem: 'linux',
|
|
environment: <String, String>{
|
|
'HOME': '/',
|
|
},
|
|
);
|
|
config = Config(
|
|
'example',
|
|
fileSystem: memoryFileSystem,
|
|
logger: BufferLogger.test(),
|
|
platform: fakePlatform,
|
|
);
|
|
});
|
|
testWithoutContext('Config get set value', () async {
|
|
expect(config.getValue('foo'), null);
|
|
config.setValue('foo', 'bar');
|
|
expect(config.getValue('foo'), 'bar');
|
|
expect(config.keys, contains('foo'));
|
|
});
|
|
|
|
testWithoutContext('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'));
|
|
});
|
|
|
|
testWithoutContext('Config containsKey', () async {
|
|
expect(config.containsKey('foo'), false);
|
|
config.setValue('foo', 'bar');
|
|
expect(config.containsKey('foo'), true);
|
|
});
|
|
|
|
testWithoutContext('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')));
|
|
});
|
|
|
|
testWithoutContext('Config parse error', () {
|
|
final BufferLogger bufferLogger = BufferLogger.test();
|
|
final File file = memoryFileSystem.file('.flutter_example')
|
|
..writeAsStringSync('{"hello":"bar');
|
|
config = Config(
|
|
'example',
|
|
fileSystem: memoryFileSystem,
|
|
logger: bufferLogger,
|
|
platform: fakePlatform,
|
|
);
|
|
|
|
expect(file.existsSync(), false);
|
|
expect(bufferLogger.errorText, contains('Failed to decode preferences'));
|
|
});
|
|
|
|
testWithoutContext('Config does not error on missing file', () {
|
|
final BufferLogger bufferLogger = BufferLogger.test();
|
|
final File file = memoryFileSystem.file('example');
|
|
config = Config(
|
|
'example',
|
|
fileSystem: memoryFileSystem,
|
|
logger: bufferLogger,
|
|
platform: fakePlatform,
|
|
);
|
|
|
|
expect(file.existsSync(), false);
|
|
expect(bufferLogger.errorText, isEmpty);
|
|
});
|
|
|
|
testWithoutContext('Config does not error on a normally fatal file system exception', () {
|
|
final BufferLogger bufferLogger = BufferLogger.test();
|
|
final File file = ErrorHandlingFile(
|
|
platform: FakePlatform(operatingSystem: 'linux'),
|
|
fileSystem: MemoryFileSystem.test(),
|
|
delegate: FakeFile('testfile'),
|
|
);
|
|
|
|
config = Config.createForTesting(file, bufferLogger);
|
|
|
|
expect(bufferLogger.errorText, contains('Could not read preferences in testfile'));
|
|
// Also contains original error message:
|
|
expect(bufferLogger.errorText, contains('The flutter tool cannot access the file or directory'));
|
|
});
|
|
|
|
testWithoutContext('Config in home dir is used if it exists', () {
|
|
memoryFileSystem.file('.flutter_example').writeAsStringSync('{"hello":"bar"}');
|
|
config = Config(
|
|
'example',
|
|
fileSystem: memoryFileSystem,
|
|
logger: BufferLogger.test(),
|
|
platform: fakePlatform,
|
|
);
|
|
expect(config.getValue('hello'), 'bar');
|
|
expect(memoryFileSystem.file('.config/flutter/example').existsSync(), false);
|
|
});
|
|
|
|
testWithoutContext('Config is created in config dir if it does not already exist in home dir', () {
|
|
config = Config(
|
|
'example',
|
|
fileSystem: memoryFileSystem,
|
|
logger: BufferLogger.test(),
|
|
platform: fakePlatform,
|
|
);
|
|
|
|
config.setValue('foo', 'bar');
|
|
expect(memoryFileSystem.file('.config/flutter/example').existsSync(), true);
|
|
});
|
|
}
|
|
|
|
class FakeFile extends Fake implements File {
|
|
FakeFile(this.path);
|
|
|
|
@override
|
|
final String path;
|
|
|
|
@override
|
|
bool existsSync() {
|
|
return true;
|
|
}
|
|
|
|
@override
|
|
String readAsStringSync({Encoding encoding = utf8ForTesting}) {
|
|
throw const FileSystemException('', '', OSError('', 13)); // EACCES error on linux
|
|
}
|
|
}
|