133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck# Copyright 2014 The Chromium Authors. All rights reserved.
233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck# Use of this source code is governed by a BSD-style license that can be
333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck# found in the LICENSE file.
433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reckimport unittest
633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reckfrom telemetry import decorators
833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reckfrom telemetry.internal.browser import browser_options
933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reckfrom telemetry.internal.platform import android_device
1033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reckfrom telemetry.internal.platform import remote_platform_options
1133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reckfrom telemetry.testing import system_stub
1233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reckimport mock
1333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
1433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reckfrom devil.android import device_utils
1533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reckfrom devil.android import device_blacklist
1633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
1733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
1833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reckclass _BaseAndroidDeviceTest(unittest.TestCase):
1933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck  def setUp(self):
2033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def check_blacklist_arg(blacklist):
2133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck      self.assertTrue(blacklist is None
2233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck                      or isinstance(blacklist, device_blacklist.Blacklist))
2333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck      return mock.DEFAULT
2433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
2533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    self._healthy_device_patcher = mock.patch(
2633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        'devil.android.device_utils.DeviceUtils.HealthyDevices')
2733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    self._healthy_device_mock = self._healthy_device_patcher.start()
2833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    self._healthy_device_mock.side_effect = check_blacklist_arg
2933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    self._android_device_stub = system_stub.Override(
3033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        android_device, ['subprocess', 'logging'])
3133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
3233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck  def _GetMockDeviceUtils(self, device_serial):
3333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    device = device_utils.DeviceUtils(device_serial)
3433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    return device
3533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
3633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck  def tearDown(self):
3733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    self._healthy_device_patcher.stop()
3833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    self._android_device_stub.Restore()
3933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
4033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
4133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reckclass AndroidDeviceTest(_BaseAndroidDeviceTest):
4233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck  @decorators.Enabled('android')
4333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck  def testGetAllAttachedAndroidDevices(self):
4433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    self._healthy_device_mock.return_value = [
4533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self._GetMockDeviceUtils('01'),
4633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self._GetMockDeviceUtils('02')]
4733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    self.assertEquals(
4833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        set(['01', '02']),
4933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        set(device.device_id for device in
5033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            android_device.AndroidDevice.GetAllConnectedDevices(None)))
5133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
5233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck  @decorators.Enabled('android')
5333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck  def testNoAdbReturnsNone(self):
5433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    finder_options = browser_options.BrowserFinderOptions()
5533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    with (
5633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock.patch('os.path.isabs', return_value=True)), (
5733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock.patch('os.path.exists', return_value=False)):
5833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck      self.assertEquals([], self._android_device_stub.logging.warnings)
5933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck      self.assertIsNone(android_device.GetDevice(finder_options))
6033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
6133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck  # https://github.com/catapult-project/catapult/issues/3099 (Android)
6233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck  @decorators.Disabled('all')
6333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck  def testAdbNoDevicesReturnsNone(self):
6433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    finder_options = browser_options.BrowserFinderOptions()
6533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    with mock.patch('os.path.isabs', return_value=False):
6633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck      self._healthy_device_mock.return_value = []
6733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck      self.assertEquals([], self._android_device_stub.logging.warnings)
6833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck      self.assertIsNone(android_device.GetDevice(finder_options))
6933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
7033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck  # https://github.com/catapult-project/catapult/issues/3099 (Android)
7133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck  @decorators.Disabled('all')
7233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck  def testAdbTwoDevicesReturnsNone(self):
7333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    finder_options = browser_options.BrowserFinderOptions()
7433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    with mock.patch('os.path.isabs', return_value=False):
7533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck      self._healthy_device_mock.return_value = [
7633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck          self._GetMockDeviceUtils('015d14fec128220c'),
7733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck          self._GetMockDeviceUtils('015d14fec128220d')]
7833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck      device = android_device.GetDevice(finder_options)
7933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck      self.assertEquals([
8033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck          'Multiple devices attached. Please specify one of the following:\n'
8133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck          '  --device=015d14fec128220c\n'
8233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck          '  --device=015d14fec128220d'],
8333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck          self._android_device_stub.logging.warnings)
8433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck      self.assertIsNone(device)
8533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
8633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck  @decorators.Enabled('android')
8733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck  def testAdbPickOneDeviceReturnsDeviceInstance(self):
8833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    finder_options = browser_options.BrowserFinderOptions()
8933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    platform_options = remote_platform_options.AndroidPlatformOptions(
9033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        device='555d14fecddddddd')  # pick one
9133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    finder_options.remote_platform_options = platform_options
9233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    with mock.patch('os.path.isabs', return_value=False):
9333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck      self._healthy_device_mock.return_value = [
9433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck          self._GetMockDeviceUtils('015d14fec128220c'),
9533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck          self._GetMockDeviceUtils('555d14fecddddddd')]
9633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck      device = android_device.GetDevice(finder_options)
9733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck      self.assertEquals([], self._android_device_stub.logging.warnings)
9833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck      self.assertEquals('555d14fecddddddd', device.device_id)
9933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
10033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck  # https://github.com/catapult-project/catapult/issues/3099 (Android)
10133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck  @decorators.Disabled('all')
10233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck  def testAdbOneDeviceReturnsDeviceInstance(self):
10333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    finder_options = browser_options.BrowserFinderOptions()
10433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    with mock.patch('os.path.isabs', return_value=False):
10533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck      self._healthy_device_mock.return_value = [
10633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck          self._GetMockDeviceUtils('015d14fec128220c')]
10733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck      device = android_device.GetDevice(finder_options)
10833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck      self.assertEquals([], self._android_device_stub.logging.warnings)
10933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck      self.assertEquals('015d14fec128220c', device.device_id)
11033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
11133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
11233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reckclass FindAllAvailableDevicesTest(_BaseAndroidDeviceTest):
11333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck  # https://github.com/catapult-project/catapult/issues/3099 (Android)
11433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck  @decorators.Disabled('all')
11533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck  def testAdbNoDeviceReturnsEmptyList(self):
11633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    finder_options = browser_options.BrowserFinderOptions()
11733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    with mock.patch('os.path.isabs', return_value=False):
11833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck      self._healthy_device_mock.return_value = []
11933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck      devices = android_device.FindAllAvailableDevices(finder_options)
12033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck      self.assertEquals([], self._android_device_stub.logging.warnings)
12133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck      self.assertIsNotNone(devices)
12233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck      self.assertEquals(len(devices), 0)
12333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
12433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck  # https://github.com/catapult-project/catapult/issues/3099 (Android)
12533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck  @decorators.Disabled('all')
12633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck  def testAdbOneDeviceReturnsListWithOneDeviceInstance(self):
12733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    finder_options = browser_options.BrowserFinderOptions()
12833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    with mock.patch('os.path.isabs', return_value=False):
12933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck      self._healthy_device_mock.return_value = [
13033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck          self._GetMockDeviceUtils('015d14fec128220c')]
13133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck      devices = android_device.FindAllAvailableDevices(finder_options)
13233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck      self.assertEquals([], self._android_device_stub.logging.warnings)
13333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck      self.assertIsNotNone(devices)
13433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck      self.assertEquals(len(devices), 1)
13533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck      self.assertEquals('015d14fec128220c', devices[0].device_id)
13633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
13733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck  # https://github.com/catapult-project/catapult/issues/3099 (Android)
13833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck  @decorators.Disabled('all')
13933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck  def testAdbMultipleDevicesReturnsListWithAllDeviceInstances(self):
14033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    finder_options = browser_options.BrowserFinderOptions()
14133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    with mock.patch('os.path.isabs', return_value=False):
14233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck      self._healthy_device_mock.return_value = [
14333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck          self._GetMockDeviceUtils('015d14fec128220c'),
14433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck          self._GetMockDeviceUtils('015d14fec128220d'),
14533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck          self._GetMockDeviceUtils('015d14fec128220e')]
14633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck      devices = android_device.FindAllAvailableDevices(finder_options)
14733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck      self.assertEquals([], self._android_device_stub.logging.warnings)
14833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck      self.assertIsNotNone(devices)
14933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck      self.assertEquals(len(devices), 3)
15033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck      self.assertEquals(devices[0].guid, '015d14fec128220c')
15133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck      self.assertEquals(devices[1].guid, '015d14fec128220d')
15233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck      self.assertEquals(devices[2].guid, '015d14fec128220e')
153