| // Copyright 2015 The Chromium 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 'dart:async'; |
| |
| import 'package:flutter_tools/src/android/android_device.dart'; |
| import 'package:flutter_tools/src/application_package.dart'; |
| import 'package:flutter_tools/src/build_info.dart'; |
| import 'package:flutter_tools/src/devfs.dart'; |
| import 'package:flutter_tools/src/device.dart'; |
| import 'package:flutter_tools/src/ios/devices.dart'; |
| import 'package:flutter_tools/src/ios/simulators.dart'; |
| import 'package:flutter_tools/src/runner/flutter_command.dart'; |
| import 'package:mockito/mockito.dart'; |
| import 'package:test/test.dart'; |
| |
| class MockApplicationPackageStore extends ApplicationPackageStore { |
| MockApplicationPackageStore() : super( |
| android: new AndroidApk( |
| id: 'io.flutter.android.mock', |
| apkPath: '/mock/path/to/android/SkyShell.apk', |
| launchActivity: 'io.flutter.android.mock.MockActivity' |
| ), |
| iOS: new BuildableIOSApp( |
| appDirectory: '/mock/path/to/iOS/SkyShell.app', |
| projectBundleId: 'io.flutter.ios.mock' |
| ) |
| ); |
| } |
| |
| class MockAndroidDevice extends Mock implements AndroidDevice { |
| @override |
| TargetPlatform get targetPlatform => TargetPlatform.android_arm; |
| |
| @override |
| bool isSupported() => true; |
| } |
| |
| class MockIOSDevice extends Mock implements IOSDevice { |
| @override |
| TargetPlatform get targetPlatform => TargetPlatform.ios; |
| |
| @override |
| bool isSupported() => true; |
| } |
| |
| class MockIOSSimulator extends Mock implements IOSSimulator { |
| @override |
| TargetPlatform get targetPlatform => TargetPlatform.ios; |
| |
| @override |
| bool isSupported() => true; |
| } |
| |
| class MockDeviceLogReader extends DeviceLogReader { |
| @override |
| String get name => 'MockLogReader'; |
| |
| final StreamController<String> _linesController = new StreamController<String>.broadcast(); |
| |
| @override |
| Stream<String> get logLines => _linesController.stream; |
| |
| void addLine(String line) => _linesController.add(line); |
| |
| void dispose() { |
| _linesController.close(); |
| } |
| } |
| |
| void applyMocksToCommand(FlutterCommand command) { |
| command |
| ..applicationPackages = new MockApplicationPackageStore() |
| ..commandValidator = () => true; |
| } |
| |
| /// Common functionality for tracking mock interaction |
| class BasicMock { |
| final List<String> messages = <String>[]; |
| |
| void expectMessages(List<String> expectedMessages) { |
| final List<String> actualMessages = new List<String>.from(messages); |
| messages.clear(); |
| expect(actualMessages, unorderedEquals(expectedMessages)); |
| } |
| |
| bool contains(String match) { |
| print('Checking for `$match` in:'); |
| print(messages); |
| final bool result = messages.contains(match); |
| messages.clear(); |
| return result; |
| } |
| } |
| |
| class MockDevFSOperations extends BasicMock implements DevFSOperations { |
| Map<Uri, DevFSContent> devicePathToContent = <Uri, DevFSContent>{}; |
| |
| @override |
| Future<Uri> create(String fsName) async { |
| messages.add('create $fsName'); |
| return Uri.parse('file:///$fsName'); |
| } |
| |
| @override |
| Future<dynamic> destroy(String fsName) async { |
| messages.add('destroy $fsName'); |
| } |
| |
| @override |
| Future<dynamic> writeFile(String fsName, Uri deviceUri, DevFSContent content) async { |
| messages.add('writeFile $fsName $deviceUri'); |
| devicePathToContent[deviceUri] = content; |
| } |
| |
| @override |
| Future<dynamic> deleteFile(String fsName, Uri deviceUri) async { |
| messages.add('deleteFile $fsName $deviceUri'); |
| devicePathToContent.remove(deviceUri); |
| } |
| } |