diff options
Diffstat (limited to 'catapult/telemetry/telemetry/internal/backends/chrome/desktop_browser_finder_unittest.py')
-rw-r--r-- | catapult/telemetry/telemetry/internal/backends/chrome/desktop_browser_finder_unittest.py | 298 |
1 files changed, 298 insertions, 0 deletions
diff --git a/catapult/telemetry/telemetry/internal/backends/chrome/desktop_browser_finder_unittest.py b/catapult/telemetry/telemetry/internal/backends/chrome/desktop_browser_finder_unittest.py new file mode 100644 index 00000000..c6c630e9 --- /dev/null +++ b/catapult/telemetry/telemetry/internal/backends/chrome/desktop_browser_finder_unittest.py @@ -0,0 +1,298 @@ +# Copyright 2013 The Chromium 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 os +import stat +import unittest + +from pyfakefs import fake_filesystem_unittest + +from telemetry.core import platform +from telemetry.core import util +from telemetry.internal.backends.chrome import desktop_browser_finder +from telemetry.internal.browser import browser_options +from telemetry.internal.platform import desktop_device +from telemetry.testing import system_stub + + +# This file verifies the logic for finding a browser instance on all platforms +# at once. It does so by providing stubs for the OS/sys/subprocess primitives +# that the underlying finding logic usually uses to locate a suitable browser. +# We prefer this approach to having to run the same test on every platform on +# which we want this code to work. + +class FindTestBase(unittest.TestCase): + def setUp(self): + self._finder_options = browser_options.BrowserFinderOptions() + self._finder_options.chrome_root = '../../../' + self._finder_stubs = system_stub.Override(desktop_browser_finder, + ['os', 'subprocess', 'sys']) + self._path_stubs = system_stub.Override( + desktop_browser_finder.path_module, ['os', 'sys']) + self._catapult_path_stubs = system_stub.Override( + desktop_browser_finder.path_module.catapult_util, ['os', 'sys']) + self._util_stubs = system_stub.Override(util, ['os', 'sys']) + + def tearDown(self): + self._finder_stubs.Restore() + self._path_stubs.Restore() + self._catapult_path_stubs.Restore() + self._util_stubs.Restore() + + @property + def _files(self): + return self._catapult_path_stubs.os.path.files + + def DoFindAll(self): + return desktop_browser_finder.FindAllAvailableBrowsers( + self._finder_options, desktop_device.DesktopDevice()) + + def DoFindAllTypes(self): + browsers = self.DoFindAll() + return [b.browser_type for b in browsers] + + def CanFindAvailableBrowsers(self): + return desktop_browser_finder.CanFindAvailableBrowsers() + + +def has_type(array, browser_type): + return len([x for x in array if x.browser_type == browser_type]) != 0 + + +class FindSystemTest(FindTestBase): + def setUp(self): + super(FindSystemTest, self).setUp() + self._finder_stubs.sys.platform = 'win32' + self._path_stubs.sys.platform = 'win32' + self._util_stubs.sys.platform = 'win32' + + def testFindProgramFiles(self): + if not self.CanFindAvailableBrowsers(): + return + + self._files.append( + 'C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe') + self._path_stubs.os.program_files = 'C:\\Program Files' + self.assertIn('system', self.DoFindAllTypes()) + + def testFindProgramFilesX86(self): + if not self.CanFindAvailableBrowsers(): + return + + self._files.append( + 'C:\\Program Files(x86)\\Google\\Chrome\\Application\\chrome.exe') + self._path_stubs.os.program_files_x86 = 'C:\\Program Files(x86)' + self.assertIn('system', self.DoFindAllTypes()) + + def testFindLocalAppData(self): + if not self.CanFindAvailableBrowsers(): + return + + self._files.append( + 'C:\\Local App Data\\Google\\Chrome\\Application\\chrome.exe') + self._path_stubs.os.local_app_data = 'C:\\Local App Data' + self.assertIn('system', self.DoFindAllTypes()) + + +class FindLocalBuildsTest(FindTestBase): + def setUp(self): + super(FindLocalBuildsTest, self).setUp() + self._finder_stubs.sys.platform = 'win32' + self._path_stubs.sys.platform = 'win32' + self._util_stubs.sys.platform = 'win32' + + def testFindBuild(self): + if not self.CanFindAvailableBrowsers(): + return + + self._files.append('..\\..\\..\\build\\Release\\chrome.exe') + self.assertIn('release', self.DoFindAllTypes()) + + def testFindOut(self): + if not self.CanFindAvailableBrowsers(): + return + + self._files.append('..\\..\\..\\out\\Release\\chrome.exe') + self.assertIn('release', self.DoFindAllTypes()) + + def testFindXcodebuild(self): + if not self.CanFindAvailableBrowsers(): + return + + self._files.append('..\\..\\..\\xcodebuild\\Release\\chrome.exe') + self.assertIn('release', self.DoFindAllTypes()) + + +class OSXFindTest(FindTestBase): + def setUp(self): + super(OSXFindTest, self).setUp() + self._finder_stubs.sys.platform = 'darwin' + self._path_stubs.sys.platform = 'darwin' + self._util_stubs.sys.platform = 'darwin' + self._files.append('/Applications/Google Chrome Canary.app/' + 'Contents/MacOS/Google Chrome Canary') + self._files.append('/Applications/Google Chrome.app/' + + 'Contents/MacOS/Google Chrome') + self._files.append( + '../../../out/Release/Chromium.app/Contents/MacOS/Chromium') + self._files.append( + '../../../out/Debug/Chromium.app/Contents/MacOS/Chromium') + self._files.append( + '../../../out/Release/Content Shell.app/Contents/MacOS/Content Shell') + self._files.append( + '../../../out/Debug/Content Shell.app/Contents/MacOS/Content Shell') + + def testFindAll(self): + if not self.CanFindAvailableBrowsers(): + return + + types = self.DoFindAllTypes() + self.assertEquals( + set(types), + set(['debug', 'release', + 'content-shell-debug', 'content-shell-release', + 'canary', 'system'])) + + def testFindExact(self): + if not self.CanFindAvailableBrowsers(): + return + + self._files.append( + '../../../foo1/Chromium.app/Contents/MacOS/Chromium') + self._finder_options.browser_executable = ( + '../../../foo1/Chromium.app/Contents/MacOS/Chromium') + types = self.DoFindAllTypes() + self.assertTrue('exact' in types) + + def testCannotFindExact(self): + if not self.CanFindAvailableBrowsers(): + return + + self._files.append( + '../../../foo1/Chromium.app/Contents/MacOS/Chromium') + self._finder_options.browser_executable = ( + '../../../foo2/Chromium.app/Contents/MacOS/Chromium') + self.assertRaises(Exception, self.DoFindAllTypes) + +class LinuxFindTest(fake_filesystem_unittest.TestCase): + + def setUp(self): + if not platform.GetHostPlatform().GetOSName() == 'linux': + self.skipTest('Not running on Linux') + self.setUpPyfakefs() + + self._finder_options = browser_options.BrowserFinderOptions() + self._finder_options.chrome_root = '/src/' + + def CreateBrowser(self, path): + self.fs.CreateFile(path) + os.chmod(path, stat.S_IXUSR) + + def DoFindAll(self): + return desktop_browser_finder.FindAllAvailableBrowsers( + self._finder_options, desktop_device.DesktopDevice()) + + def DoFindAllTypes(self): + return [b.browser_type for b in self.DoFindAll()] + + def testFindAllWithCheckout(self): + for target in ['Release', 'Debug']: + for browser in ['chrome', 'content_shell']: + self.CreateBrowser('/src/out/%s/%s' % (target, browser)) + + self.assertEquals( + set(self.DoFindAllTypes()), + {'debug', 'release', 'content-shell-debug', 'content-shell-release'}) + + def testFindAllFailsIfNotExecutable(self): + self.fs.CreateFile('/src/out/Release/chrome') + + self.assertFalse(self.DoFindAllTypes()) + + def testFindWithProvidedExecutable(self): + self.CreateBrowser('/foo/chrome') + self._finder_options.browser_executable = '/foo/chrome' + self.assertIn('exact', self.DoFindAllTypes()) + + def testFindWithProvidedApk(self): + self._finder_options.browser_executable = '/foo/chrome.apk' + self.assertNotIn('exact', self.DoFindAllTypes()) + + def testNoErrorWithNonChromeExecutableName(self): + self.fs.CreateFile('/foo/another_browser') + self._finder_options.browser_executable = '/foo/another_browser' + self.assertNotIn('exact', self.DoFindAllTypes()) + + def testFindAllWithInstalled(self): + official_names = ['chrome', 'chrome-beta', 'chrome-unstable'] + + for name in official_names: + self.CreateBrowser('/opt/google/%s/chrome' % name) + + self.assertEquals(set(self.DoFindAllTypes()), {'stable', 'beta', 'dev'}) + + def testFindAllSystem(self): + self.CreateBrowser('/opt/google/chrome/chrome') + os.symlink('/opt/google/chrome/chrome', '/usr/bin/google-chrome') + + self.assertEquals(set(self.DoFindAllTypes()), {'system', 'stable'}) + + def testFindAllSystemIsBeta(self): + self.CreateBrowser('/opt/google/chrome/chrome') + self.CreateBrowser('/opt/google/chrome-beta/chrome') + os.symlink('/opt/google/chrome-beta/chrome', '/usr/bin/google-chrome') + + google_chrome = [browser for browser in self.DoFindAll() + if browser.browser_type == 'system'][0] + self.assertEquals('/opt/google/chrome-beta', + google_chrome._browser_directory) + + +class WinFindTest(FindTestBase): + def setUp(self): + super(WinFindTest, self).setUp() + + self._finder_stubs.sys.platform = 'win32' + self._path_stubs.sys.platform = 'win32' + self._util_stubs.sys.platform = 'win32' + self._path_stubs.os.local_app_data = 'c:\\Users\\Someone\\AppData\\Local' + self._files.append('c:\\tmp\\chrome.exe') + self._files.append('..\\..\\..\\build\\Release\\chrome.exe') + self._files.append('..\\..\\..\\build\\Debug\\chrome.exe') + self._files.append('..\\..\\..\\build\\Release\\content_shell.exe') + self._files.append('..\\..\\..\\build\\Debug\\content_shell.exe') + self._files.append(self._path_stubs.os.local_app_data + '\\' + + 'Google\\Chrome\\Application\\chrome.exe') + self._files.append(self._path_stubs.os.local_app_data + '\\' + + 'Google\\Chrome SxS\\Application\\chrome.exe') + + def testFindAllGivenDefaults(self): + if not self.CanFindAvailableBrowsers(): + return + + types = self.DoFindAllTypes() + self.assertEquals(set(types), + set(['debug', 'release', + 'content-shell-debug', 'content-shell-release', + 'system', 'canary'])) + + def testFindAllWithExact(self): + if not self.CanFindAvailableBrowsers(): + return + + self._finder_options.browser_executable = 'c:\\tmp\\chrome.exe' + types = self.DoFindAllTypes() + self.assertEquals( + set(types), + set(['exact', + 'debug', 'release', + 'content-shell-debug', 'content-shell-release', + 'system', 'canary'])) + + def testNoErrorWithUnrecognizedExecutableName(self): + if not self.CanFindAvailableBrowsers(): + return + + self._files.append('c:\\foo\\another_browser.exe') + self._finder_options.browser_dir = 'c:\\foo\\another_browser.exe' + self.assertNotIn('exact', self.DoFindAllTypes()) |