Unverified Commit 86c21c5d authored by Jenn Magder's avatar Jenn Magder Committed by GitHub

Replace MockPlistParser with FakePlistParser (#75276)

parent fd5668bb
...@@ -23,7 +23,6 @@ import 'package:flutter_tools/src/device.dart'; ...@@ -23,7 +23,6 @@ import 'package:flutter_tools/src/device.dart';
import 'package:flutter_tools/src/doctor.dart'; import 'package:flutter_tools/src/doctor.dart';
import 'package:flutter_tools/src/features.dart'; import 'package:flutter_tools/src/features.dart';
import 'package:flutter_tools/src/globals.dart' as globals; import 'package:flutter_tools/src/globals.dart' as globals;
import 'package:flutter_tools/src/ios/plist_parser.dart';
import 'package:flutter_tools/src/reporting/reporting.dart'; import 'package:flutter_tools/src/reporting/reporting.dart';
import 'package:flutter_tools/src/version.dart'; import 'package:flutter_tools/src/version.dart';
import 'package:flutter_tools/src/vscode/vscode.dart'; import 'package:flutter_tools/src/vscode/vscode.dart';
...@@ -1045,7 +1044,6 @@ class VsCodeValidatorTestTargets extends VsCodeValidator { ...@@ -1045,7 +1044,6 @@ class VsCodeValidatorTestTargets extends VsCodeValidator {
static final String missingExtensions = globals.fs.path.join('test', 'data', 'vscode', 'notExtensions'); static final String missingExtensions = globals.fs.path.join('test', 'data', 'vscode', 'notExtensions');
} }
class MockPlistParser extends Mock implements PlistParser {}
class MockDeviceManager extends Mock implements DeviceManager {} class MockDeviceManager extends Mock implements DeviceManager {}
class MockDevice extends Mock implements Device { class MockDevice extends Mock implements Device {
MockDevice() { MockDevice() {
......
...@@ -4,8 +4,6 @@ ...@@ -4,8 +4,6 @@
// @dart = 2.8 // @dart = 2.8
import 'dart:convert';
import 'package:file/file.dart'; import 'package:file/file.dart';
import 'package:file/memory.dart'; import 'package:file/memory.dart';
import 'package:flutter_tools/src/android/android_sdk.dart'; import 'package:flutter_tools/src/android/android_sdk.dart';
...@@ -27,6 +25,7 @@ import 'package:process/process.dart'; ...@@ -27,6 +25,7 @@ import 'package:process/process.dart';
import '../src/common.dart'; import '../src/common.dart';
import '../src/context.dart'; import '../src/context.dart';
import '../src/fakes.dart';
final Generator _kNoColorTerminalPlatform = () => FakePlatform(stdoutSupportsAnsi: false); final Generator _kNoColorTerminalPlatform = () => FakePlatform(stdoutSupportsAnsi: false);
final Map<Type, Generator> noColorTerminalOverride = <Type, Generator>{ final Map<Type, Generator> noColorTerminalOverride = <Type, Generator>{
...@@ -249,16 +248,19 @@ void main() { ...@@ -249,16 +248,19 @@ void main() {
group('PrebuiltIOSApp', () { group('PrebuiltIOSApp', () {
MockOperatingSystemUtils os; MockOperatingSystemUtils os;
FakePlistParser testPlistParser;
final Map<Type, Generator> overrides = <Type, Generator>{ final Map<Type, Generator> overrides = <Type, Generator>{
FileSystem: () => MemoryFileSystem.test(), FileSystem: () => MemoryFileSystem.test(),
ProcessManager: () => FakeProcessManager.any(), ProcessManager: () => FakeProcessManager.any(),
PlistParser: () => MockPlistUtils(), PlistParser: () => testPlistParser,
Platform: _kNoColorTerminalPlatform, Platform: _kNoColorTerminalPlatform,
OperatingSystemUtils: () => os, OperatingSystemUtils: () => os,
}; };
setUp(() { setUp(() {
os = MockOperatingSystemUtils(); os = MockOperatingSystemUtils();
testPlistParser = FakePlistParser();
}); });
testUsingContext('Error on non-existing file', () { testUsingContext('Error on non-existing file', () {
...@@ -292,7 +294,7 @@ void main() { ...@@ -292,7 +294,7 @@ void main() {
testUsingContext('Error on bad info.plist', () { testUsingContext('Error on bad info.plist', () {
globals.fs.directory('bundle.app').createSync(); globals.fs.directory('bundle.app').createSync();
globals.fs.file('bundle.app/Info.plist').writeAsStringSync(badPlistData); globals.fs.file('bundle.app/Info.plist').createSync();
final PrebuiltIOSApp iosApp = IOSApp.fromPrebuiltApp(globals.fs.file('bundle.app')) as PrebuiltIOSApp; final PrebuiltIOSApp iosApp = IOSApp.fromPrebuiltApp(globals.fs.file('bundle.app')) as PrebuiltIOSApp;
expect(iosApp, isNull); expect(iosApp, isNull);
expect( expect(
...@@ -304,7 +306,8 @@ void main() { ...@@ -304,7 +306,8 @@ void main() {
testUsingContext('Success with app bundle', () { testUsingContext('Success with app bundle', () {
globals.fs.directory('bundle.app').createSync(); globals.fs.directory('bundle.app').createSync();
globals.fs.file('bundle.app/Info.plist').writeAsStringSync(plistData); globals.fs.file('bundle.app/Info.plist').createSync();
testPlistParser.setProperty('CFBundleIdentifier', 'fooBundleId');
final PrebuiltIOSApp iosApp = IOSApp.fromPrebuiltApp(globals.fs.file('bundle.app')) as PrebuiltIOSApp; final PrebuiltIOSApp iosApp = IOSApp.fromPrebuiltApp(globals.fs.file('bundle.app')) as PrebuiltIOSApp;
expect(testLogger.errorText, isEmpty); expect(testLogger.errorText, isEmpty);
expect(iosApp.bundleDir.path, 'bundle.app'); expect(iosApp.bundleDir.path, 'bundle.app');
...@@ -355,9 +358,10 @@ void main() { ...@@ -355,9 +358,10 @@ void main() {
final Directory bundleAppDir = globals.fs.directory( final Directory bundleAppDir = globals.fs.directory(
globals.fs.path.join(targetDirectory.path, 'Payload', 'bundle.app')); globals.fs.path.join(targetDirectory.path, 'Payload', 'bundle.app'));
bundleAppDir.createSync(recursive: true); bundleAppDir.createSync(recursive: true);
testPlistParser.setProperty('CFBundleIdentifier', 'fooBundleId');
globals.fs globals.fs
.file(globals.fs.path.join(bundleAppDir.path, 'Info.plist')) .file(globals.fs.path.join(bundleAppDir.path, 'Info.plist'))
.writeAsStringSync(plistData); .createSync();
}); });
final PrebuiltIOSApp iosApp = IOSApp.fromPrebuiltApp(globals.fs.file('app.ipa')) as PrebuiltIOSApp; final PrebuiltIOSApp iosApp = IOSApp.fromPrebuiltApp(globals.fs.file('app.ipa')) as PrebuiltIOSApp;
expect(testLogger.errorText, isEmpty); expect(testLogger.errorText, isEmpty);
...@@ -703,25 +707,4 @@ N: android=http://schemas.android.com/apk/res/android ...@@ -703,25 +707,4 @@ N: android=http://schemas.android.com/apk/res/android
A: android:name(0x01010003)="android.permission.INTERNET" (Raw: "android.permission.INTERNET") A: android:name(0x01010003)="android.permission.INTERNET" (Raw: "android.permission.INTERNET")
'''; ''';
class MockPlistUtils extends Mock implements PlistParser {
@override
String getValueFromFile(String path, String key) {
final File file = globals.fs.file(path);
if (!file.existsSync()) {
return null;
}
return json.decode(file.readAsStringSync())[key] as String;
}
}
// Contains no bundle identifier.
const String badPlistData = '''
{}
''';
const String plistData = '''
{"CFBundleIdentifier": "fooBundleId"}
''';
class MockOperatingSystemUtils extends Mock implements OperatingSystemUtils { } class MockOperatingSystemUtils extends Mock implements OperatingSystemUtils { }
...@@ -25,10 +25,9 @@ import 'package:process/process.dart'; ...@@ -25,10 +25,9 @@ import 'package:process/process.dart';
import '../../src/common.dart'; import '../../src/common.dart';
import '../../src/context.dart'; import '../../src/context.dart';
import '../../src/fakes.dart';
import '../../src/mocks.dart'; import '../../src/mocks.dart';
class MockPlistUtils extends Mock implements PlistParser {}
final Platform macosPlatform = FakePlatform( final Platform macosPlatform = FakePlatform(
operatingSystem: 'macos', operatingSystem: 'macos',
environment: <String, String>{ environment: <String, String>{
...@@ -861,12 +860,14 @@ Dec 20 17:04:32 md32-11-vm1 Another App[88374]: Ignore this text''' ...@@ -861,12 +860,14 @@ Dec 20 17:04:32 md32-11-vm1 Another App[88374]: Ignore this text'''
}); });
group('startApp', () { group('startApp', () {
FakePlistParser testPlistParser;
SimControl simControl; SimControl simControl;
Xcode xcode; Xcode xcode;
setUp(() { setUp(() {
simControl = MockSimControl(); simControl = MockSimControl();
xcode = Xcode.test(processManager: FakeProcessManager.any()); xcode = Xcode.test(processManager: FakeProcessManager.any());
testPlistParser = FakePlistParser();
}); });
testUsingContext("startApp uses compiled app's Info.plist to find CFBundleIdentifier", () async { testUsingContext("startApp uses compiled app's Info.plist to find CFBundleIdentifier", () async {
...@@ -876,7 +877,7 @@ Dec 20 17:04:32 md32-11-vm1 Another App[88374]: Ignore this text''' ...@@ -876,7 +877,7 @@ Dec 20 17:04:32 md32-11-vm1 Another App[88374]: Ignore this text'''
simulatorCategory: 'iOS 11.2', simulatorCategory: 'iOS 11.2',
simControl: simControl, simControl: simControl,
); );
when(globals.plistParser.getValueFromFile(any, any)).thenReturn('correct'); testPlistParser.setProperty('CFBundleIdentifier', 'correct');
final Directory mockDir = globals.fs.currentDirectory; final Directory mockDir = globals.fs.currentDirectory;
final IOSApp package = PrebuiltIOSApp(projectBundleId: 'incorrect', bundleName: 'name', bundleDir: mockDir); final IOSApp package = PrebuiltIOSApp(projectBundleId: 'incorrect', bundleName: 'name', bundleDir: mockDir);
...@@ -887,7 +888,7 @@ Dec 20 17:04:32 md32-11-vm1 Another App[88374]: Ignore this text''' ...@@ -887,7 +888,7 @@ Dec 20 17:04:32 md32-11-vm1 Another App[88374]: Ignore this text'''
verify(simControl.launch(any, 'correct', any)); verify(simControl.launch(any, 'correct', any));
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
PlistParser: () => MockPlistUtils(), PlistParser: () => testPlistParser,
FileSystem: () => fileSystem, FileSystem: () => fileSystem,
ProcessManager: () => FakeProcessManager.any(), ProcessManager: () => FakeProcessManager.any(),
Xcode: () => xcode, Xcode: () => xcode,
...@@ -910,7 +911,7 @@ Dec 20 17:04:32 md32-11-vm1 Another App[88374]: Ignore this text''' ...@@ -910,7 +911,7 @@ Dec 20 17:04:32 md32-11-vm1 Another App[88374]: Ignore this text'''
verify(simControl.launch(any, any, captureAny)).captured.contains('--enable-software-rendering'); verify(simControl.launch(any, any, captureAny)).captured.contains('--enable-software-rendering');
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
PlistParser: () => MockPlistUtils(), PlistParser: () => testPlistParser,
FileSystem: () => fileSystem, FileSystem: () => fileSystem,
ProcessManager: () => FakeProcessManager.any(), ProcessManager: () => FakeProcessManager.any(),
Xcode: () => xcode, Xcode: () => xcode,
......
...@@ -23,6 +23,7 @@ import 'package:mockito/mockito.dart'; ...@@ -23,6 +23,7 @@ import 'package:mockito/mockito.dart';
import '../src/common.dart'; import '../src/common.dart';
import '../src/context.dart'; import '../src/context.dart';
import '../src/fakes.dart';
import '../src/testbed.dart'; import '../src/testbed.dart';
void main() { void main() {
...@@ -346,12 +347,12 @@ apply plugin: 'kotlin-android' ...@@ -346,12 +347,12 @@ apply plugin: 'kotlin-android'
group('product bundle identifier', () { group('product bundle identifier', () {
MemoryFileSystem fs; MemoryFileSystem fs;
MockPlistUtils mockPlistUtils; FakePlistParser testPlistUtils;
MockXcodeProjectInterpreter mockXcodeProjectInterpreter; MockXcodeProjectInterpreter mockXcodeProjectInterpreter;
FlutterProjectFactory flutterProjectFactory; FlutterProjectFactory flutterProjectFactory;
setUp(() { setUp(() {
fs = MemoryFileSystem.test(); fs = MemoryFileSystem.test();
mockPlistUtils = MockPlistUtils(); testPlistUtils = FakePlistParser();
mockXcodeProjectInterpreter = MockXcodeProjectInterpreter(); mockXcodeProjectInterpreter = MockXcodeProjectInterpreter();
flutterProjectFactory = FlutterProjectFactory( flutterProjectFactory = FlutterProjectFactory(
fileSystem: fs, fileSystem: fs,
...@@ -363,7 +364,7 @@ apply plugin: 'kotlin-android' ...@@ -363,7 +364,7 @@ apply plugin: 'kotlin-android'
testUsingContext(description, testMethod, overrides: <Type, Generator>{ testUsingContext(description, testMethod, overrides: <Type, Generator>{
FileSystem: () => fs, FileSystem: () => fs,
ProcessManager: () => FakeProcessManager.any(), ProcessManager: () => FakeProcessManager.any(),
PlistParser: () => mockPlistUtils, PlistParser: () => testPlistUtils,
XcodeProjectInterpreter: () => mockXcodeProjectInterpreter, XcodeProjectInterpreter: () => mockXcodeProjectInterpreter,
FlutterProjectFactory: () => flutterProjectFactory, FlutterProjectFactory: () => flutterProjectFactory,
}); });
...@@ -401,7 +402,7 @@ apply plugin: 'kotlin-android' ...@@ -401,7 +402,7 @@ apply plugin: 'kotlin-android'
testWithMocks('from plist, if no variables', () async { testWithMocks('from plist, if no variables', () async {
final FlutterProject project = await someProject(); final FlutterProject project = await someProject();
project.ios.defaultHostInfoPlist.createSync(recursive: true); project.ios.defaultHostInfoPlist.createSync(recursive: true);
when(mockPlistUtils.getValueFromFile(any, any)).thenReturn('io.flutter.someProject'); testPlistUtils.setProperty('CFBundleIdentifier', 'io.flutter.someProject');
expect(await project.ios.productBundleIdentifier(null), 'io.flutter.someProject'); expect(await project.ios.productBundleIdentifier(null), 'io.flutter.someProject');
}); });
...@@ -419,7 +420,7 @@ apply plugin: 'kotlin-android' ...@@ -419,7 +420,7 @@ apply plugin: 'kotlin-android'
return Future<XcodeProjectInfo>.value(XcodeProjectInfo(<String>[], <String>[], <String>['Runner'], logger)); return Future<XcodeProjectInfo>.value(XcodeProjectInfo(<String>[], <String>[], <String>['Runner'], logger));
}); });
when(mockPlistUtils.getValueFromFile(any, any)).thenReturn(r'$(PRODUCT_BUNDLE_IDENTIFIER)'); testPlistUtils.setProperty('CFBundleIdentifier', r'$(PRODUCT_BUNDLE_IDENTIFIER)');
expect(await project.ios.productBundleIdentifier(null), 'io.flutter.someProject'); expect(await project.ios.productBundleIdentifier(null), 'io.flutter.someProject');
}); });
...@@ -439,7 +440,7 @@ apply plugin: 'kotlin-android' ...@@ -439,7 +440,7 @@ apply plugin: 'kotlin-android'
return Future<XcodeProjectInfo>.value(XcodeProjectInfo(<String>[], <String>[], <String>['Runner'], logger)); return Future<XcodeProjectInfo>.value(XcodeProjectInfo(<String>[], <String>[], <String>['Runner'], logger));
}); });
when(mockPlistUtils.getValueFromFile(any, any)).thenReturn(r'$(PRODUCT_BUNDLE_IDENTIFIER).$(SUFFIX)'); testPlistUtils.setProperty('CFBundleIdentifier', r'$(PRODUCT_BUNDLE_IDENTIFIER).$(SUFFIX)');
expect(await project.ios.productBundleIdentifier(null), 'io.flutter.someProject.suffix'); expect(await project.ios.productBundleIdentifier(null), 'io.flutter.someProject.suffix');
}); });
...@@ -621,12 +622,12 @@ apply plugin: 'kotlin-android' ...@@ -621,12 +622,12 @@ apply plugin: 'kotlin-android'
}); });
group('watch companion', () { group('watch companion', () {
MemoryFileSystem fs; MemoryFileSystem fs;
MockPlistUtils mockPlistUtils; FakePlistParser testPlistParser;
MockXcodeProjectInterpreter mockXcodeProjectInterpreter; MockXcodeProjectInterpreter mockXcodeProjectInterpreter;
FlutterProjectFactory flutterProjectFactory; FlutterProjectFactory flutterProjectFactory;
setUp(() { setUp(() {
fs = MemoryFileSystem.test(); fs = MemoryFileSystem.test();
mockPlistUtils = MockPlistUtils(); testPlistParser = FakePlistParser();
mockXcodeProjectInterpreter = MockXcodeProjectInterpreter(); mockXcodeProjectInterpreter = MockXcodeProjectInterpreter();
flutterProjectFactory = FlutterProjectFactory( flutterProjectFactory = FlutterProjectFactory(
fileSystem: fs, fileSystem: fs,
...@@ -640,7 +641,7 @@ apply plugin: 'kotlin-android' ...@@ -640,7 +641,7 @@ apply plugin: 'kotlin-android'
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
FileSystem: () => fs, FileSystem: () => fs,
ProcessManager: () => FakeProcessManager.any(), ProcessManager: () => FakeProcessManager.any(),
PlistParser: () => mockPlistUtils, PlistParser: () => testPlistParser,
XcodeProjectInterpreter: () => mockXcodeProjectInterpreter, XcodeProjectInterpreter: () => mockXcodeProjectInterpreter,
FlutterProjectFactory: () => flutterProjectFactory, FlutterProjectFactory: () => flutterProjectFactory,
}); });
...@@ -665,7 +666,7 @@ apply plugin: 'kotlin-android' ...@@ -665,7 +666,7 @@ apply plugin: 'kotlin-android'
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
FileSystem: () => fs, FileSystem: () => fs,
ProcessManager: () => FakeProcessManager.any(), ProcessManager: () => FakeProcessManager.any(),
PlistParser: () => mockPlistUtils, PlistParser: () => testPlistParser,
XcodeProjectInterpreter: () => mockXcodeProjectInterpreter, XcodeProjectInterpreter: () => mockXcodeProjectInterpreter,
FlutterProjectFactory: () => flutterProjectFactory, FlutterProjectFactory: () => flutterProjectFactory,
}); });
...@@ -678,7 +679,7 @@ apply plugin: 'kotlin-android' ...@@ -678,7 +679,7 @@ apply plugin: 'kotlin-android'
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
FileSystem: () => fs, FileSystem: () => fs,
ProcessManager: () => FakeProcessManager.any(), ProcessManager: () => FakeProcessManager.any(),
PlistParser: () => mockPlistUtils, PlistParser: () => testPlistParser,
XcodeProjectInterpreter: () => mockXcodeProjectInterpreter, XcodeProjectInterpreter: () => mockXcodeProjectInterpreter,
FlutterProjectFactory: () => flutterProjectFactory, FlutterProjectFactory: () => flutterProjectFactory,
}); });
...@@ -687,12 +688,12 @@ apply plugin: 'kotlin-android' ...@@ -687,12 +688,12 @@ apply plugin: 'kotlin-android'
final FlutterProject project = await someProject(); final FlutterProject project = await someProject();
project.ios.hostAppRoot.childDirectory('WatchTarget').childFile('Info.plist').createSync(recursive: true); project.ios.hostAppRoot.childDirectory('WatchTarget').childFile('Info.plist').createSync(recursive: true);
when(mockPlistUtils.getValueFromFile(any, 'WKCompanionAppBundleIdentifier')).thenReturn('io.flutter.someOTHERproject'); testPlistParser.setProperty('WKCompanionAppBundleIdentifier', 'io.flutter.someOTHERproject');
expect(await project.ios.containsWatchCompanion(<String>['WatchTarget'], null), isFalse); expect(await project.ios.containsWatchCompanion(<String>['WatchTarget'], null), isFalse);
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
FileSystem: () => fs, FileSystem: () => fs,
ProcessManager: () => FakeProcessManager.any(), ProcessManager: () => FakeProcessManager.any(),
PlistParser: () => mockPlistUtils, PlistParser: () => testPlistParser,
XcodeProjectInterpreter: () => mockXcodeProjectInterpreter, XcodeProjectInterpreter: () => mockXcodeProjectInterpreter,
FlutterProjectFactory: () => flutterProjectFactory, FlutterProjectFactory: () => flutterProjectFactory,
}); });
...@@ -701,13 +702,13 @@ apply plugin: 'kotlin-android' ...@@ -701,13 +702,13 @@ apply plugin: 'kotlin-android'
final FlutterProject project = await someProject(); final FlutterProject project = await someProject();
project.ios.xcodeProject.createSync(); project.ios.xcodeProject.createSync();
project.ios.hostAppRoot.childDirectory('WatchTarget').childFile('Info.plist').createSync(recursive: true); project.ios.hostAppRoot.childDirectory('WatchTarget').childFile('Info.plist').createSync(recursive: true);
when(mockPlistUtils.getValueFromFile(any, 'WKCompanionAppBundleIdentifier')).thenReturn('io.flutter.someProject'); testPlistParser.setProperty('WKCompanionAppBundleIdentifier', 'io.flutter.someProject');
expect(await project.ios.containsWatchCompanion(<String>['WatchTarget'], null), isTrue); expect(await project.ios.containsWatchCompanion(<String>['WatchTarget'], null), isTrue);
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
FileSystem: () => fs, FileSystem: () => fs,
ProcessManager: () => FakeProcessManager.any(), ProcessManager: () => FakeProcessManager.any(),
PlistParser: () => mockPlistUtils, PlistParser: () => testPlistParser,
XcodeProjectInterpreter: () => mockXcodeProjectInterpreter, XcodeProjectInterpreter: () => mockXcodeProjectInterpreter,
FlutterProjectFactory: () => flutterProjectFactory, FlutterProjectFactory: () => flutterProjectFactory,
}); });
...@@ -969,8 +970,6 @@ File androidPluginRegistrant(Directory parent) { ...@@ -969,8 +970,6 @@ File androidPluginRegistrant(Directory parent) {
.childFile('GeneratedPluginRegistrant.java'); .childFile('GeneratedPluginRegistrant.java');
} }
class MockPlistUtils extends Mock implements PlistParser {}
class MockXcodeProjectInterpreter extends Mock implements XcodeProjectInterpreter { class MockXcodeProjectInterpreter extends Mock implements XcodeProjectInterpreter {
@override @override
bool get isInstalled => true; bool get isInstalled => true;
......
...@@ -38,6 +38,7 @@ import 'package:mockito/mockito.dart'; ...@@ -38,6 +38,7 @@ import 'package:mockito/mockito.dart';
import 'common.dart'; import 'common.dart';
import 'fake_process_manager.dart'; import 'fake_process_manager.dart';
import 'fakes.dart';
import 'mocks.dart'; import 'mocks.dart';
import 'throwing_pub.dart'; import 'throwing_pub.dart';
...@@ -382,14 +383,6 @@ class MockHttpClient extends Mock implements HttpClient {} ...@@ -382,14 +383,6 @@ class MockHttpClient extends Mock implements HttpClient {}
class MockCrashReporter extends Mock implements CrashReporter {} class MockCrashReporter extends Mock implements CrashReporter {}
class FakePlistParser implements PlistParser {
@override
Map<String, dynamic> parseFile(String plistFilePath) => const <String, dynamic>{};
@override
String getValueFromFile(String plistFilePath, String key) => null;
}
class LocalFileSystemBlockingSetCurrentDirectory extends LocalFileSystem { class LocalFileSystemBlockingSetCurrentDirectory extends LocalFileSystem {
LocalFileSystemBlockingSetCurrentDirectory() : super.test( LocalFileSystemBlockingSetCurrentDirectory() : super.test(
signals: LocalSignals.instance, signals: LocalSignals.instance,
......
...@@ -7,7 +7,6 @@ ...@@ -7,7 +7,6 @@
import 'dart:async'; import 'dart:async';
import 'dart:io' as io show IOSink, ProcessSignal, Stdout, StdoutException; import 'dart:io' as io show IOSink, ProcessSignal, Stdout, StdoutException;
import 'package:flutter_tools/src/base/file_system.dart'; import 'package:flutter_tools/src/base/file_system.dart';
import 'package:flutter_tools/src/base/io.dart'; import 'package:flutter_tools/src/base/io.dart';
import 'package:flutter_tools/src/base/logger.dart'; import 'package:flutter_tools/src/base/logger.dart';
...@@ -15,6 +14,7 @@ import 'package:flutter_tools/src/base/os.dart'; ...@@ -15,6 +14,7 @@ import 'package:flutter_tools/src/base/os.dart';
import 'package:flutter_tools/src/cache.dart'; import 'package:flutter_tools/src/cache.dart';
import 'package:flutter_tools/src/convert.dart'; import 'package:flutter_tools/src/convert.dart';
import 'package:flutter_tools/src/device.dart'; import 'package:flutter_tools/src/device.dart';
import 'package:flutter_tools/src/ios/plist_parser.dart';
/// A fake implementation of the [DeviceLogReader]. /// A fake implementation of the [DeviceLogReader].
class FakeDeviceLogReader extends DeviceLogReader { class FakeDeviceLogReader extends DeviceLogReader {
...@@ -398,3 +398,21 @@ class ThrowingPollingDeviceDiscovery extends PollingDeviceDiscovery { ...@@ -398,3 +398,21 @@ class ThrowingPollingDeviceDiscovery extends PollingDeviceDiscovery {
@override @override
bool get canListAnything => true; bool get canListAnything => true;
} }
class FakePlistParser implements PlistParser {
final Map<String, dynamic> _underlyingValues = <String, String>{};
void setProperty(String key, dynamic value) {
_underlyingValues[key] = value;
}
@override
Map<String, dynamic> parseFile(String plistFilePath) {
return _underlyingValues;
}
@override
String getValueFromFile(String plistFilePath, String key) {
return _underlyingValues[key] as String;
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment