// 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/android/android_device.dart'; import 'package:flutter_tools/src/android/android_sdk.dart'; import 'package:flutter_tools/src/application_package.dart'; import 'package:flutter_tools/src/base/file_system.dart'; import 'package:flutter_tools/src/globals.dart' as globals; import 'package:mockito/mockito.dart'; import '../../src/common.dart'; import '../../src/context.dart'; const FakeCommand kAdbVersionCommand = FakeCommand( command: ['adb', 'version'], stdout: 'Android Debug Bridge version 1.0.39', ); const FakeCommand kAdbStartServerCommand = FakeCommand( command: ['adb', 'start-server'] ); const FakeCommand kInstallCommand = FakeCommand( command: ['adb', '-s', '1234', 'install', '-t', '-r', 'app.apk'], ); const FakeCommand kStoreShaCommand = FakeCommand( command: ['adb', '-s', '1234', 'shell', 'echo', '-n', '', '>', '/data/local/tmp/sky.app.sha1'] ); void main() { testUsingContext('Cannot install app on API level below 16', () async { final File apk = globals.fs.file('app.apk')..createSync(); final AndroidApk androidApk = AndroidApk( file: apk, id: 'app', versionCode: 22, launchActivity: 'Main', ); final AndroidDevice androidDevice = AndroidDevice('1234'); when(globals.androidSdk.adbPath).thenReturn('adb'); final FakeProcessManager processManager = globals.processManager as FakeProcessManager; expect(await androidDevice.installApp(androidApk), false); expect(processManager.hasRemainingExpectations, false); }, overrides: { ProcessManager: () => FakeProcessManager.list([ kAdbVersionCommand, kAdbStartServerCommand, const FakeCommand( command: ['adb', '-s', '1234', 'shell', 'getprop'], stdout: '[ro.build.version.sdk]: [11]', ), ]), FileSystem: () => MemoryFileSystem.test(), AndroidSdk: () => MockAndroidSdk(), }); testUsingContext('Cannot install app if APK file is missing', () async { final File apk = globals.fs.file('app.apk'); final AndroidApk androidApk = AndroidApk( file: apk, id: 'app', versionCode: 22, launchActivity: 'Main', ); final AndroidDevice androidDevice = AndroidDevice('1234'); expect(await androidDevice.installApp(androidApk), false); }, overrides: { ProcessManager: () => FakeProcessManager.list([]), FileSystem: () => MemoryFileSystem.test(), AndroidSdk: () => MockAndroidSdk(), }); testUsingContext('Can install app on API level 16 or greater', () async { final File apk = globals.fs.file('app.apk')..createSync(); final AndroidApk androidApk = AndroidApk( file: apk, id: 'app', versionCode: 22, launchActivity: 'Main', ); final AndroidDevice androidDevice = AndroidDevice('1234'); when(globals.androidSdk.adbPath).thenReturn('adb'); final FakeProcessManager processManager = globals.processManager as FakeProcessManager; expect(await androidDevice.installApp(androidApk), true); expect(processManager.hasRemainingExpectations, false); }, overrides: { ProcessManager: () => FakeProcessManager.list([ kAdbVersionCommand, kAdbStartServerCommand, const FakeCommand( command: ['adb', '-s', '1234', 'shell', 'getprop'], stdout: '[ro.build.version.sdk]: [16]', ), kInstallCommand, kStoreShaCommand, ]), FileSystem: () => MemoryFileSystem.test(), AndroidSdk: () => MockAndroidSdk(), }); testUsingContext('Defaults to API level 16 if adb returns a null response', () async { final File apk = globals.fs.file('app.apk')..createSync(); final AndroidApk androidApk = AndroidApk( file: apk, id: 'app', versionCode: 22, launchActivity: 'Main', ); final AndroidDevice androidDevice = AndroidDevice('1234'); when(globals.androidSdk.adbPath).thenReturn('adb'); final FakeProcessManager processManager = globals.processManager as FakeProcessManager; expect(await androidDevice.installApp(androidApk), true); expect(processManager.hasRemainingExpectations, false); }, overrides: { ProcessManager: () => FakeProcessManager.list([ kAdbVersionCommand, kAdbStartServerCommand, const FakeCommand( command: ['adb', '-s', '1234', 'shell', 'getprop'], ), kInstallCommand, kStoreShaCommand, ]), FileSystem: () => MemoryFileSystem.test(), AndroidSdk: () => MockAndroidSdk(), }); } class MockAndroidSdk extends Mock implements AndroidSdk {}