1# Copyright 2013 The Chromium Authors. All rights reserved.
2# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4
5import unittest
6
7from telemetry import benchmark
8from telemetry.core import browser_options
9from telemetry.core.platform import android_device
10from telemetry.core.platform import android_platform_backend
11from telemetry.core.backends.chrome import android_browser_finder
12from telemetry.unittest import system_stub
13
14
15class AndroidBrowserFinderTest(unittest.TestCase):
16  def setUp(self):
17    self._stubs = system_stub.Override(android_browser_finder,
18                                       ['adb_commands', 'os', 'subprocess',
19                                        'logging'])
20    self._android_device_stub = system_stub.Override(
21        android_device, ['adb_commands'])
22    self._apb_stub = system_stub.Override(
23        android_platform_backend, ['adb_commands'])
24
25  def tearDown(self):
26    self._stubs.Restore()
27    self._android_device_stub.Restore()
28    self._apb_stub.Restore()
29
30  def test_no_adb(self):
31    finder_options = browser_options.BrowserFinderOptions()
32
33    def NoAdb(*args, **kargs):  # pylint: disable=W0613
34      raise OSError('not found')
35    self._stubs.subprocess.Popen = NoAdb
36    browsers = android_browser_finder.FindAllAvailableBrowsers(finder_options)
37    self.assertEquals(0, len(browsers))
38
39  def test_adb_no_devices(self):
40    finder_options = browser_options.BrowserFinderOptions()
41
42    browsers = android_browser_finder.FindAllAvailableBrowsers(finder_options)
43    self.assertEquals(0, len(browsers))
44
45  def test_adb_permissions_error(self):
46    finder_options = browser_options.BrowserFinderOptions()
47
48    self._stubs.subprocess.Popen.communicate_result = (
49        """List of devices attached
50????????????\tno permissions""",
51        """* daemon not running. starting it now on port 5037 *
52* daemon started successfully *
53""")
54    browsers = android_browser_finder.FindAllAvailableBrowsers(finder_options)
55    self.assertEquals(3, len(self._stubs.logging.warnings))
56    self.assertEquals(0, len(browsers))
57
58  def test_adb_two_devices(self):
59    finder_options = browser_options.BrowserFinderOptions()
60
61    self._android_device_stub.adb_commands.attached_devices = [
62        '015d14fec128220c', '015d14fec128220d']
63
64    browsers = android_browser_finder.FindAllAvailableBrowsers(finder_options)
65    self.assertEquals(1, len(self._stubs.logging.warnings))
66    self.assertEquals(0, len(browsers))
67
68  @benchmark.Disabled('chromeos')
69  def test_adb_one_device(self):
70    finder_options = browser_options.BrowserFinderOptions()
71
72    self._android_device_stub.adb_commands.attached_devices = (
73        ['015d14fec128220c'])
74
75    def OnPM(args):
76      assert args[0] == 'pm'
77      assert args[1] == 'list'
78      assert args[2] == 'packages'
79      return ['package:org.chromium.content_shell_apk',
80              'package.com.google.android.setupwizard']
81
82    def OnLs(_):
83      return ['/sys/devices/system/cpu/cpu0']
84
85    self._apb_stub.adb_commands.adb_device.shell_command_handlers['pm'] = OnPM
86    self._apb_stub.adb_commands.adb_device.shell_command_handlers['ls'] = OnLs
87
88    browsers = android_browser_finder.FindAllAvailableBrowsers(finder_options)
89    self.assertEquals(1, len(browsers))
90