| Index: build/android/devil/android/device_utils_test.py | 
| diff --git a/build/android/devil/android/device_utils_test.py b/build/android/devil/android/device_utils_test.py | 
| index ec641e9748606e354d9ec2867afbe962a16d3b10..ae389aa97ab3e7bd6885f0b3322e7829574beaf9 100755 | 
| --- a/build/android/devil/android/device_utils_test.py | 
| +++ b/build/android/devil/android/device_utils_test.py | 
| @@ -553,13 +553,51 @@ class DeviceUtilsRebootTest(DeviceUtilsTest): | 
| class DeviceUtilsInstallTest(DeviceUtilsTest): | 
|  | 
| def testInstall_noPriorInstall(self): | 
| +    with self.patch_call(self.call.device.build_version_sdk, return_value=23): | 
| +      with self.assertCalls( | 
| +          (mock.call.devil.android.apk_helper.GetPackageName( | 
| +              '/fake/test/app.apk'), | 
| +           'test.package'), | 
| +          (self.call.device._GetApplicationPathsInternal('test.package'), []), | 
| +          self.call.adb.Install('/fake/test/app.apk', reinstall=False), | 
| +          (mock.call.devil.android.apk_helper.ApkHelper.GetPermissions(), | 
| +              ['p1']), | 
| +          (self.call.device.GrantPermissions('test.package', ['p1']), [])): | 
| +        self.device.Install('/fake/test/app.apk', retries=0) | 
| + | 
| +  def testIntsall_permissionsPreM(self): | 
| +    with self.patch_call(self.call.device.build_version_sdk, return_value=20): | 
| +      with self.assertCalls( | 
| +          (mock.call.devil.android.apk_helper.GetPackageName( | 
| +              '/fake/test/app.apk'), | 
| +           'test.package'), | 
| +          (self.call.device._GetApplicationPathsInternal('test.package'), []), | 
| +          (self.call.adb.Install('/fake/test/app.apk', reinstall=False))): | 
| +        self.device.Install('/fake/test/app.apk', retries=0) | 
| + | 
| +  def testInstall_findPermissions(self): | 
| +    with self.patch_call(self.call.device.build_version_sdk, return_value=23): | 
| +      with self.assertCalls( | 
| +          (mock.call.devil.android.apk_helper.GetPackageName( | 
| +              '/fake/test/app.apk'), | 
| +           'test.package'), | 
| +          (self.call.device._GetApplicationPathsInternal('test.package'), []), | 
| +          (self.call.adb.Install('/fake/test/app.apk', reinstall=False)), | 
| +          (mock.call.devil.android.apk_helper.ApkHelper.GetPermissions(), | 
| +              ['p1']), | 
| +          (self.call.device.GrantPermissions('test.package', ['p1']), [])): | 
| +        self.device.Install('/fake/test/app.apk', retries=0) | 
| + | 
| +  def testInstall_passPermissions(self): | 
| with self.assertCalls( | 
| (mock.call.devil.android.apk_helper.GetPackageName( | 
| '/fake/test/app.apk'), | 
| 'test.package'), | 
| (self.call.device._GetApplicationPathsInternal('test.package'), []), | 
| -        self.call.adb.Install('/fake/test/app.apk', reinstall=False)): | 
| -      self.device.Install('/fake/test/app.apk', retries=0) | 
| +        (self.call.adb.Install('/fake/test/app.apk', reinstall=False)), | 
| +        (self.call.device.GrantPermissions('test.package', ['p1', 'p2']), [])): | 
| +      self.device.Install( | 
| +          '/fake/test/app.apk', retries=0, permissions=['p1', 'p2']) | 
|  | 
| def testInstall_differentPriorInstall(self): | 
| with self.assertCalls( | 
| @@ -573,7 +611,7 @@ class DeviceUtilsInstallTest(DeviceUtilsTest): | 
| (['/fake/test/app.apk'], None)), | 
| self.call.adb.Uninstall('test.package', False), | 
| self.call.adb.Install('/fake/test/app.apk', reinstall=False)): | 
| -      self.device.Install('/fake/test/app.apk', retries=0) | 
| +      self.device.Install('/fake/test/app.apk', retries=0, permissions=[]) | 
|  | 
| def testInstall_differentPriorInstall_reinstall(self): | 
| with self.assertCalls( | 
| @@ -586,7 +624,8 @@ class DeviceUtilsInstallTest(DeviceUtilsTest): | 
| ['/fake/test/app.apk']), | 
| (['/fake/test/app.apk'], None)), | 
| self.call.adb.Install('/fake/test/app.apk', reinstall=True)): | 
| -      self.device.Install('/fake/test/app.apk', reinstall=True, retries=0) | 
| +      self.device.Install( | 
| +          '/fake/test/app.apk', reinstall=True, retries=0, permissions=[]) | 
|  | 
| def testInstall_identicalPriorInstall(self): | 
| with self.assertCalls( | 
| @@ -598,7 +637,7 @@ class DeviceUtilsInstallTest(DeviceUtilsTest): | 
| (self.call.device._ComputeStaleApks('test.package', | 
| ['/fake/test/app.apk']), | 
| ([], None))): | 
| -      self.device.Install('/fake/test/app.apk', retries=0) | 
| +      self.device.Install('/fake/test/app.apk', retries=0, permissions=[]) | 
|  | 
| def testInstall_fails(self): | 
| with self.assertCalls( | 
| @@ -2006,6 +2045,33 @@ class DeviceUtilsRestartAdbdTest(DeviceUtilsTest): | 
| self.device.RestartAdbd() | 
|  | 
|  | 
| +class DeviceUtilsGrantPermissionsTest(DeviceUtilsTest): | 
| + | 
| +  def testGrantPermissions_none(self): | 
| +    self.device.GrantPermissions('package', []) | 
| + | 
| +  def testGrantPermissions_underM(self): | 
| +    with self.patch_call(self.call.device.build_version_sdk, | 
| +                         return_value=20): | 
| +      self.device.GrantPermissions('package', ['p1']) | 
| + | 
| +  def testGrantPermissions_one(self): | 
| +    permissions_cmd = 'pm grant package p1;' | 
| +    with self.patch_call(self.call.device.build_version_sdk, | 
| +                         return_value=23): | 
| +      with self.assertCalls( | 
| +          (self.call.device.RunShellCommand(permissions_cmd), [])): | 
| +        self.device.GrantPermissions('package', ['p1']) | 
| + | 
| +  def testGrantPermissions_multiple(self): | 
| +    permissions_cmd = 'pm grant package p1;pm grant package p2;' | 
| +    with self.patch_call(self.call.device.build_version_sdk, | 
| +                         return_value=23): | 
| +      with self.assertCalls( | 
| +          (self.call.device.RunShellCommand(permissions_cmd), [])): | 
| +        self.device.GrantPermissions('package', ['p1', 'p2']) | 
| + | 
| + | 
| if __name__ == '__main__': | 
| logging.getLogger().setLevel(logging.DEBUG) | 
| unittest.main(verbosity=2) | 
|  |