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.
9 from pyfakefs
import fake_filesystem_unittest
11 from telemetry
.core
import android_platform
12 from telemetry
.internal
.backends
.chrome
import android_browser_finder
13 from telemetry
.internal
.platform
import android_platform_backend
14 from telemetry
.internal
.util
import binary_manager
15 from telemetry
.testing
import options_for_unittests
18 def FakeFetchPath(dependency
, arch
, os_name
, os_version
=None):
20 'dependency_dir', dependency
, '%s_%s_%s.apk' % (
21 os_name
, os_version
, arch
))
24 class AndroidBrowserFinderTest(fake_filesystem_unittest
.TestCase
):
26 self
.finder_options
= options_for_unittests
.GetCopy()
27 # Mock out what's needed for testing with exact APKs
29 self
._fetch
_path
_patcher
= mock
.patch(
30 'telemetry.internal.backends.chrome.android_browser_finder.binary_manager.FetchPath', # pylint: disable=line-too-long
32 self
._fetch
_path
_mock
= self
._fetch
_path
_patcher
.start()
33 self
._get
_package
_name
_patcher
= mock
.patch(
34 'devil.android.apk_helper.GetPackageName')
35 self
._get
_package
_name
_mock
= self
._get
_package
_name
_patcher
.start()
36 self
.fake_platform
= mock
.Mock(spec
=android_platform
.AndroidPlatform
)
37 self
.fake_platform
.CanLaunchApplication
.return_value
= True
38 self
.fake_platform
._platform
_backend
= mock
.create_autospec(
39 android_platform_backend
, spec_set
=True)
40 self
.fake_platform
.GetOSVersionName
.return_value
= 'L23ds5'
41 self
.fake_platform
.GetArchName
.return_value
= 'armeabi-v7a'
42 # The android_browser_finder converts the os version name to 'k' or 'l'
43 self
.expected_reference_build
= FakeFetchPath(
44 'chrome_stable', 'armeabi-v7a', 'android', 'l')
47 self
.tearDownPyfakefs()
48 self
._get
_package
_name
_patcher
.stop()
49 self
._fetch
_path
_patcher
.stop()
51 def testNoPlatformReturnsEmptyList(self
):
53 possible_browsers
= android_browser_finder
._FindAllPossibleBrowsers
(
54 self
.finder_options
, fake_platform
)
55 self
.assertEqual([], possible_browsers
)
57 def testCanLaunchAlwaysTrueReturnsAllExceptExactAndReference(self
):
58 if not self
.finder_options
.chrome_root
:
59 self
.skipTest('--chrome-root is not specified, skip the test')
61 android_browser_finder
.FindAllBrowserTypes(self
.finder_options
))
62 expected_types
= all_types
- set(('exact', 'reference'))
63 possible_browsers
= android_browser_finder
._FindAllPossibleBrowsers
(
64 self
.finder_options
, self
.fake_platform
)
67 set([b
.browser_type
for b
in possible_browsers
]))
69 def testCanLaunchAlwaysTrueReturnsAllExceptExact(self
):
70 if not self
.finder_options
.chrome_root
:
71 self
.skipTest('--chrome-root is not specified, skip the test')
72 self
.fs
.CreateFile(self
.expected_reference_build
)
74 android_browser_finder
.FindAllBrowserTypes(self
.finder_options
))
75 expected_types
= all_types
- set(('exact',))
76 possible_browsers
= android_browser_finder
._FindAllPossibleBrowsers
(
77 self
.finder_options
, self
.fake_platform
)
80 set([b
.browser_type
for b
in possible_browsers
]))
82 def testCanLaunchAlwaysTrueWithExactApkReturnsAll(self
):
83 if not self
.finder_options
.chrome_root
:
84 self
.skipTest('--chrome-root is not specified, skip the test')
86 '/foo/ContentShell.apk')
87 self
.fs
.CreateFile(self
.expected_reference_build
)
88 self
.finder_options
.browser_executable
= '/foo/ContentShell.apk'
89 self
._get
_package
_name
_mock
.return_value
= 'org.chromium.content_shell_apk'
92 android_browser_finder
.FindAllBrowserTypes(self
.finder_options
))
93 possible_browsers
= android_browser_finder
._FindAllPossibleBrowsers
(
94 self
.finder_options
, self
.fake_platform
)
97 set([b
.browser_type
for b
in possible_browsers
]))
99 def testErrorWithUnknownExactApk(self
):
101 '/foo/ContentShell.apk')
102 self
.finder_options
.browser_executable
= '/foo/ContentShell.apk'
103 self
._get
_package
_name
_mock
.return_value
= 'org.unknown.app'
105 self
.assertRaises(Exception,
106 android_browser_finder
._FindAllPossibleBrowsers
,
107 self
.finder_options
, self
.fake_platform
)
109 def testErrorWithNonExistantExactApk(self
):
110 self
.finder_options
.browser_executable
= '/foo/ContentShell.apk'
111 self
._get
_package
_name
_mock
.return_value
= 'org.chromium.content_shell_apk'
113 self
.assertRaises(Exception,
114 android_browser_finder
._FindAllPossibleBrowsers
,
115 self
.finder_options
, self
.fake_platform
)
117 def testNoErrorWithUnrecognizedApkName(self
):
118 if not self
.finder_options
.chrome_root
:
119 self
.skipTest('--chrome-root is not specified, skip the test')
122 self
.finder_options
.browser_executable
= '/foo/unknown.apk'
124 possible_browsers
= android_browser_finder
._FindAllPossibleBrowsers
(
125 self
.finder_options
, self
.fake_platform
)
126 self
.assertNotIn('exact', [b
.browser_type
for b
in possible_browsers
])
128 def testCanLaunchExactWithUnrecognizedApkNameButKnownPackageName(self
):
129 if not self
.finder_options
.chrome_root
:
130 self
.skipTest('--chrome-root is not specified, skip the test')
132 '/foo/MyFooBrowser.apk')
133 self
._get
_package
_name
_mock
.return_value
= 'org.chromium.chrome'
134 self
.finder_options
.browser_executable
= '/foo/MyFooBrowser.apk'
136 possible_browsers
= android_browser_finder
._FindAllPossibleBrowsers
(
137 self
.finder_options
, self
.fake_platform
)
138 self
.assertIn('exact', [b
.browser_type
for b
in possible_browsers
])
140 def testNoErrorWithMissingReferenceBuild(self
):
141 if not self
.finder_options
.chrome_root
:
142 self
.skipTest('--chrome-root is not specified, skip the test')
143 possible_browsers
= android_browser_finder
._FindAllPossibleBrowsers
(
144 self
.finder_options
, self
.fake_platform
)
145 self
.assertNotIn('reference', [b
.browser_type
for b
in possible_browsers
])
147 def testNoErrorWithReferenceBuildCloudStorageError(self
):
148 if not self
.finder_options
.chrome_root
:
149 self
.skipTest('--chrome-root is not specified, skip the test')
151 'telemetry.internal.backends.chrome.android_browser_finder.binary_manager.FetchPath', # pylint: disable=line-too-long
152 side_effect
=binary_manager
.CloudStorageError
):
153 possible_browsers
= android_browser_finder
._FindAllPossibleBrowsers
(
154 self
.finder_options
, self
.fake_platform
)
155 self
.assertNotIn('reference', [b
.browser_type
for b
in possible_browsers
])
157 def testNoErrorWithReferenceBuildNoPathFoundError(self
):
158 if not self
.finder_options
.chrome_root
:
159 self
.skipTest('--chrome-root is not specified, skip the test')
160 self
._fetch
_path
_mock
.side_effect
= binary_manager
.NoPathFoundError
161 possible_browsers
= android_browser_finder
._FindAllPossibleBrowsers
(
162 self
.finder_options
, self
.fake_platform
)
163 self
.assertNotIn('reference', [b
.browser_type
for b
in possible_browsers
])
166 class FakePossibleBrowser(object):
167 def __init__(self
, last_modification_time
):
168 self
._last
_modification
_time
= last_modification_time
170 def last_modification_time(self
):
171 return self
._last
_modification
_time
174 class SelectDefaultBrowserTest(unittest
.TestCase
):
175 def testEmptyListGivesNone(self
):
176 self
.assertIsNone(android_browser_finder
.SelectDefaultBrowser([]))
178 def testSinglePossibleReturnsSame(self
):
179 possible_browsers
= [FakePossibleBrowser(last_modification_time
=1)]
181 possible_browsers
[0],
182 android_browser_finder
.SelectDefaultBrowser(possible_browsers
))
184 def testListGivesNewest(self
):
185 possible_browsers
= [
186 FakePossibleBrowser(last_modification_time
=2),
187 FakePossibleBrowser(last_modification_time
=3), # newest
188 FakePossibleBrowser(last_modification_time
=1),
191 possible_browsers
[1],
192 android_browser_finder
.SelectDefaultBrowser(possible_browsers
))