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