133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck# Copyright 2012 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 logging 633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reckimport os 733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reckimport shutil 833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reckimport tempfile 933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reckimport unittest 1033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck 1133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reckfrom telemetry.core import exceptions 1233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reckfrom telemetry import decorators 1333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reckfrom telemetry.internal.browser import browser as browser_module 1433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reckfrom telemetry.internal.browser import browser_finder 1533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reckfrom telemetry.internal.platform import gpu_device 1633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reckfrom telemetry.internal.platform import gpu_info 1733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reckfrom telemetry.internal.platform import system_info 1833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reckfrom telemetry.internal.util import path 1933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reckfrom telemetry.testing import browser_test_case 2033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reckfrom telemetry.testing import options_for_unittests 2133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reckfrom telemetry.timeline import tracing_config 2233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck 2333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reckimport mock 2433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reckimport py_utils 2533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck 2633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reckclass IntentionalException(Exception): 2733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck pass 2833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck 2933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck 3033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reckclass BrowserTest(browser_test_case.BrowserTestCase): 3133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck def testBrowserCreation(self): 3233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck self.assertEquals(1, len(self._browser.tabs)) 3333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck 3433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck # Different browsers boot up to different things. 3533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck assert self._browser.tabs[0].url 3633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck 3733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck @decorators.Enabled('has tabs') 3833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck def testNewCloseTab(self): 3933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck existing_tab = self._browser.tabs[0] 4033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck self.assertEquals(1, len(self._browser.tabs)) 4133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck existing_tab_url = existing_tab.url 4233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck 4333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck new_tab = self._browser.tabs.New() 4433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck self.assertEquals(2, len(self._browser.tabs)) 4533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck self.assertEquals(existing_tab.url, existing_tab_url) 4633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck self.assertEquals(new_tab.url, 'about:blank') 4733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck 4833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck new_tab.Close() 4933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck self.assertEquals(1, len(self._browser.tabs)) 5033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck self.assertEquals(existing_tab.url, existing_tab_url) 5133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck 5233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck def testMultipleTabCalls(self): 5333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck self._browser.tabs[0].Navigate(self.UrlOfUnittestFile('blank.html')) 5433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck self._browser.tabs[0].WaitForDocumentReadyStateToBeInteractiveOrBetter() 5533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck 5633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck def testTabCallByReference(self): 5733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck tab = self._browser.tabs[0] 5833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck tab.Navigate(self.UrlOfUnittestFile('blank.html')) 5933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck self._browser.tabs[0].WaitForDocumentReadyStateToBeInteractiveOrBetter() 6033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck 6133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck @decorators.Enabled('has tabs') 6233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck def testCloseReferencedTab(self): 6333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck self._browser.tabs.New() 6433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck tab = self._browser.tabs[0] 6533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck tab.Navigate(self.UrlOfUnittestFile('blank.html')) 6633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck tab.Close() 6733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck self.assertEquals(1, len(self._browser.tabs)) 6833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck 6933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck @decorators.Enabled('has tabs') 7033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck def testForegroundTab(self): 7133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck # Should be only one tab at this stage, so that must be the foreground tab 7233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck original_tab = self._browser.tabs[0] 7333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck self.assertEqual(self._browser.foreground_tab, original_tab) 7433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck new_tab = self._browser.tabs.New() 7533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck # New tab shouls be foreground tab 7633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck self.assertEqual(self._browser.foreground_tab, new_tab) 7733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck # Make sure that activating the background tab makes it the foreground tab 7833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck original_tab.Activate() 7933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck self.assertEqual(self._browser.foreground_tab, original_tab) 8033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck # Closing the current foreground tab should switch the foreground tab to the 8133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck # other tab 8233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck original_tab.Close() 8333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck self.assertEqual(self._browser.foreground_tab, new_tab) 8433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck 8533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck # This test uses the reference browser and doesn't have access to 8633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck # helper binaries like crashpad_database_util. 8733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck @decorators.Enabled('linux') 8833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck def testGetMinidumpPathOnCrash(self): 8933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck tab = self._browser.tabs[0] 9033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck with self.assertRaises(exceptions.AppCrashException): 9133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck tab.Navigate('chrome://crash', timeout=5) 9233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck crash_minidump_path = self._browser.GetMostRecentMinidumpPath() 9333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck self.assertIsNotNone(crash_minidump_path) 9433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck 9533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck def testGetSystemInfo(self): 9633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck if not self._browser.supports_system_info: 9733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck logging.warning( 9833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck 'Browser does not support getting system info, skipping test.') 9933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck return 10033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck 10133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck info = self._browser.GetSystemInfo() 10233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck 10333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck self.assertTrue(isinstance(info, system_info.SystemInfo)) 10433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck self.assertTrue(hasattr(info, 'model_name')) 10533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck self.assertTrue(hasattr(info, 'gpu')) 10633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck self.assertTrue(isinstance(info.gpu, gpu_info.GPUInfo)) 10733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck self.assertTrue(hasattr(info.gpu, 'devices')) 10833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck self.assertTrue(len(info.gpu.devices) > 0) 10933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck for g in info.gpu.devices: 11033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck self.assertTrue(isinstance(g, gpu_device.GPUDevice)) 11133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck 11233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck def testGetSystemInfoNotCachedObject(self): 11333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck if not self._browser.supports_system_info: 11433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck logging.warning( 11533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck 'Browser does not support getting system info, skipping test.') 11633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck return 11733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck 11833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck info_a = self._browser.GetSystemInfo() 11933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck info_b = self._browser.GetSystemInfo() 12033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck self.assertFalse(info_a is info_b) 12133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck 12233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck def testGetSystemTotalMemory(self): 12333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck self.assertTrue(self._browser.memory_stats['SystemTotalPhysicalMemory'] > 0) 12433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck 12533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck 12633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck # crbug.com/628836 (CrOS, where system-guest indicates ChromeOS guest) 12733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck # github.com/catapult-project/catapult/issues/3130 (Windows) 12833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck @decorators.Disabled('cros-chrome-guest', 'system-guest', 'chromeos', 'win') 12933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck def testIsTracingRunning(self): 13033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck tracing_controller = self._browser.platform.tracing_controller 13133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck if not tracing_controller.IsChromeTracingSupported(): 13233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck return 13333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck self.assertFalse(tracing_controller.is_tracing_running) 13433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck config = tracing_config.TracingConfig() 13533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck config.enable_chrome_trace = True 13633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck tracing_controller.StartTracing(config) 13733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck self.assertTrue(tracing_controller.is_tracing_running) 13833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck tracing_controller.StopTracing() 13933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck self.assertFalse(tracing_controller.is_tracing_running) 14033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck 14133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck 14233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reckclass CommandLineBrowserTest(browser_test_case.BrowserTestCase): 14333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck @classmethod 14433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck def CustomizeBrowserOptions(cls, options): 14533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck options.AppendExtraBrowserArgs('--user-agent=telemetry') 14633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck 14733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck def testCommandLineOverriding(self): 14833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck # This test starts the browser with --user-agent=telemetry. This tests 14933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck # whether the user agent is then set. 15033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck t = self._browser.tabs[0] 15133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck t.Navigate(self.UrlOfUnittestFile('blank.html')) 15233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck t.WaitForDocumentReadyStateToBeInteractiveOrBetter() 15333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck self.assertEquals(t.EvaluateJavaScript('navigator.userAgent'), 15433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck 'telemetry') 15533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck 15633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reckclass DirtyProfileBrowserTest(browser_test_case.BrowserTestCase): 15733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck @classmethod 15833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck def CustomizeBrowserOptions(cls, options): 15933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck options.profile_type = 'small_profile' 16033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck 16133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck @decorators.Disabled('chromeos') # crbug.com/243912 16233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck def testDirtyProfileCreation(self): 16333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck self.assertEquals(1, len(self._browser.tabs)) 16433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck 16533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck 16633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reckclass BrowserLoggingTest(browser_test_case.BrowserTestCase): 16733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck @classmethod 16833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck def CustomizeBrowserOptions(cls, options): 16933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck options.logging_verbosity = options.VERBOSE_LOGGING 17033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck 17133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck @decorators.Disabled('chromeos', 'android') 17233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck def testLogFileExist(self): 17333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck self.assertTrue( 17433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck os.path.isfile(self._browser._browser_backend.log_file_path)) 17533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck 17633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck 17733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reckdef _GenerateBrowserProfile(number_of_tabs): 17833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck """ Generate a browser profile which browser had |number_of_tabs| number of 17933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck tabs opened before it was closed. 18033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck Returns: 18133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck profile_dir: the directory of profile. 18233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck """ 18333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck profile_dir = tempfile.mkdtemp() 18433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck options = options_for_unittests.GetCopy() 18533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck options.browser_options.output_profile_path = profile_dir 18633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck browser_to_create = browser_finder.FindBrowser(options) 18733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck browser_to_create.platform.network_controller.InitializeIfNeeded() 18833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck try: 18933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck with browser_to_create.Create(options) as browser: 19033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck browser.platform.SetHTTPServerDirectories(path.GetUnittestDataDir()) 19133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck blank_file_path = os.path.join(path.GetUnittestDataDir(), 'blank.html') 19233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck blank_url = browser.platform.http_server.UrlOf(blank_file_path) 19333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck browser.foreground_tab.Navigate(blank_url) 19433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck browser.foreground_tab.WaitForDocumentReadyStateToBeComplete() 19533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck for _ in xrange(number_of_tabs - 1): 19633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck tab = browser.tabs.New() 19733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck tab.Navigate(blank_url) 19833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck tab.WaitForDocumentReadyStateToBeComplete() 19933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck return profile_dir 20033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck finally: 20133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck browser_to_create.platform.network_controller.Close() 20233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck 20333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck 20433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reckclass BrowserCreationTest(unittest.TestCase): 20533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck def setUp(self): 20633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck self.mock_browser_backend = mock.MagicMock() 20733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck self.mock_platform_backend = mock.MagicMock() 20833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck 20933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck def testCleanedUpCalledWhenExceptionRaisedInBrowserCreation(self): 21033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck self.mock_platform_backend.platform.FlushDnsCache.side_effect = ( 21133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck IntentionalException('Boom!')) 21233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck with self.assertRaises(IntentionalException): 21333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck browser_module.Browser( 21433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck self.mock_browser_backend, self.mock_platform_backend, 21533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck credentials_path=None) 21633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck self.assertTrue(self.mock_platform_backend.WillCloseBrowser.called) 21733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck 21833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck def testOriginalExceptionNotSwallow(self): 21933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck self.mock_platform_backend.platform.FlushDnsCache.side_effect = ( 22033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck IntentionalException('Boom!')) 22133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck self.mock_platform_backend.WillCloseBrowser.side_effect = ( 22233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck IntentionalException('Cannot close browser!')) 22333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck with self.assertRaises(IntentionalException) as context: 22433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck browser_module.Browser( 22533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck self.mock_browser_backend, self.mock_platform_backend, 22633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck credentials_path=None) 22733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck self.assertIn('Boom!', context.exception.message) 22833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck 22933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck 23033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reckclass BrowserRestoreSessionTest(unittest.TestCase): 23133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck 23233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck @classmethod 23333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck def setUpClass(cls): 23433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck cls._number_of_tabs = 4 23533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck cls._profile_dir = _GenerateBrowserProfile(cls._number_of_tabs) 23633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck cls._options = options_for_unittests.GetCopy() 23733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck cls._options.browser_options.AppendExtraBrowserArgs( 23833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck ['--restore-last-session']) 23933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck cls._options.browser_options.profile_dir = cls._profile_dir 24033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck cls._browser_to_create = browser_finder.FindBrowser(cls._options) 24133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck cls._browser_to_create.platform.network_controller.InitializeIfNeeded() 24233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck 24333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck @decorators.Enabled('has tabs') 24433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck @decorators.Disabled('chromeos', 'win', 'mac') 24533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck # TODO(nednguyen): Enable this test on windowsn platform 24633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck def testRestoreBrowserWithMultipleTabs(self): 24733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck with self._browser_to_create.Create(self._options) as browser: 24833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck # The number of tabs will be self._number_of_tabs + 1 as it includes the 24933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck # old tabs and a new blank tab. 25033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck expected_number_of_tabs = self._number_of_tabs + 1 25133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck try: 25233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck py_utils.WaitFor( 25333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck lambda: len(browser.tabs) == expected_number_of_tabs, 10) 25433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck except: 25533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck logging.error('Number of tabs is %s' % len(browser.tabs)) 25633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck raise 25733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck self.assertEquals(expected_number_of_tabs, len(browser.tabs)) 25833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck 25933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck @classmethod 26033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck def tearDownClass(cls): 26133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck cls._browser_to_create.platform.network_controller.Close() 26233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck shutil.rmtree(cls._profile_dir) 26333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck 26433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck 26533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reckclass TestBrowserOperationDoNotLeakTempFiles(unittest.TestCase): 26633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck 26733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck @decorators.Enabled('win', 'mac', 'linux') 26833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck @decorators.Isolated 26933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck def testBrowserNotLeakingTempFiles(self): 27033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck options = options_for_unittests.GetCopy() 27133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck browser_to_create = browser_finder.FindBrowser(options) 27233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck self.assertIsNotNone(browser_to_create) 27333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck before_browser_run_temp_dir_content = os.listdir(tempfile.tempdir) 27433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck browser_to_create.platform.network_controller.InitializeIfNeeded() 27533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck try: 27633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck with browser_to_create.Create(options) as browser: 27733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck tab = browser.tabs.New() 27833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck tab.Navigate('about:blank') 27933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck self.assertEquals(2, tab.EvaluateJavaScript('1 + 1')) 28033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck after_browser_run_temp_dir_content = os.listdir(tempfile.tempdir) 28133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck self.assertEqual(before_browser_run_temp_dir_content, 28233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck after_browser_run_temp_dir_content) 28333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck finally: 28433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck browser_to_create.platform.network_controller.Close() 285