146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)# Copyright 2012 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# found in the LICENSE file.
45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)import logging
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7116680a4aac90f2aa7413d9095a592090648e557Ben Murdochfrom telemetry import benchmark
83551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)from telemetry.core import gpu_device
93551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)from telemetry.core import gpu_info
103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)from telemetry.core import system_info
1103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)from telemetry.core.platform import tracing_category_filter
1203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)from telemetry.core.platform import tracing_options
136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)from telemetry.unittest import browser_test_case
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)class BrowserTest(browser_test_case.BrowserTestCase):
1790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  def testBrowserCreation(self):
186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    self.assertEquals(1, len(self._browser.tabs))
1990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    # Different browsers boot up to different things.
216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    assert self._browser.tabs[0].url
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def testVersionDetection(self):
246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    # pylint: disable=W0212
256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    v = self._browser._browser_backend.chrome_branch_number
2690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    self.assertTrue(v > 0)
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
28116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  @benchmark.Enabled('has tabs')
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def testNewCloseTab(self):
306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    existing_tab = self._browser.tabs[0]
316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    self.assertEquals(1, len(self._browser.tabs))
3290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    existing_tab_url = existing_tab.url
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    new_tab = self._browser.tabs.New()
356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    self.assertEquals(2, len(self._browser.tabs))
3690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    self.assertEquals(existing_tab.url, existing_tab_url)
3790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    self.assertEquals(new_tab.url, 'about:blank')
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    new_tab.Close()
406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    self.assertEquals(1, len(self._browser.tabs))
4190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    self.assertEquals(existing_tab.url, existing_tab_url)
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def testMultipleTabCalls(self):
446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    self._browser.tabs[0].Navigate(self.UrlOfUnittestFile('blank.html'))
456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    self._browser.tabs[0].WaitForDocumentReadyStateToBeInteractiveOrBetter()
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def testTabCallByReference(self):
486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    tab = self._browser.tabs[0]
496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    tab.Navigate(self.UrlOfUnittestFile('blank.html'))
506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    self._browser.tabs[0].WaitForDocumentReadyStateToBeInteractiveOrBetter()
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  @benchmark.Enabled('has tabs')
53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  @benchmark.Disabled('win')  # crbug.com/321527
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def testCloseReferencedTab(self):
556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    self._browser.tabs.New()
566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    tab = self._browser.tabs[0]
576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    tab.Navigate(self.UrlOfUnittestFile('blank.html'))
5890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    tab.Close()
596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    self.assertEquals(1, len(self._browser.tabs))
6090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  @benchmark.Enabled('has tabs')
625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  def testForegroundTab(self):
635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    # Should be only one tab at this stage, so that must be the foreground tab
646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    original_tab = self._browser.tabs[0]
656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    self.assertEqual(self._browser.foreground_tab, original_tab)
666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    new_tab = self._browser.tabs.New()
675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    # New tab shouls be foreground tab
686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    self.assertEqual(self._browser.foreground_tab, new_tab)
695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    # Make sure that activating the background tab makes it the foreground tab
705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    original_tab.Activate()
716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    self.assertEqual(self._browser.foreground_tab, original_tab)
725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    # Closing the current foreground tab should switch the foreground tab to the
735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    # other tab
745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    original_tab.Close()
756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    self.assertEqual(self._browser.foreground_tab, new_tab)
763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  def testGetSystemInfo(self):
786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    if not self._browser.supports_system_info:
793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      logging.warning(
803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          'Browser does not support getting system info, skipping test.')
813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      return
823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    info = self._browser.GetSystemInfo()
843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    self.assertTrue(isinstance(info, system_info.SystemInfo))
863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    self.assertTrue(hasattr(info, 'model_name'))
873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    self.assertTrue(hasattr(info, 'gpu'))
883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    self.assertTrue(isinstance(info.gpu, gpu_info.GPUInfo))
893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    self.assertTrue(hasattr(info.gpu, 'devices'))
903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    self.assertTrue(len(info.gpu.devices) > 0)
913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    for g in info.gpu.devices:
923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      self.assertTrue(isinstance(g, gpu_device.GPUDevice))
933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  def testGetSystemInfoNotCachedObject(self):
956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    if not self._browser.supports_system_info:
965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      logging.warning(
975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          'Browser does not support getting system info, skipping test.')
985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      return
995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1006e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    info_a = self._browser.GetSystemInfo()
1016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    info_b = self._browser.GetSystemInfo()
1025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    self.assertFalse(info_a is info_b)
1035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  def testGetSystemTotalMemory(self):
1056e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    self.assertTrue(self._browser.memory_stats['SystemTotalPhysicalMemory'] > 0)
106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  @benchmark.Disabled('chromeos') # crbug.com/412713.
108a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  def testIsTracingRunning(self):
10903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    tracing_controller = self._browser.platform.tracing_controller
11003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    if not tracing_controller.IsChromeTracingSupported(self._browser):
111a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return
11203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    self.assertFalse(tracing_controller.is_tracing_running)
11303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    options = tracing_options.TracingOptions()
11403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    options.enable_chrome_trace = True
11503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    category_filter = tracing_category_filter.TracingCategoryFilter()
11603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    tracing_controller.Start(options, category_filter)
11703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    self.assertTrue(tracing_controller.is_tracing_running)
11803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    tracing_controller.Stop()
11903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    self.assertFalse(tracing_controller.is_tracing_running)
1206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)class CommandLineBrowserTest(browser_test_case.BrowserTestCase):
1236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  @classmethod
1246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  def CustomizeBrowserOptions(cls, options):
1256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    options.AppendExtraBrowserArgs('--user-agent=telemetry')
1266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  def testCommandLineOverriding(self):
1286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    # This test starts the browser with --user-agent=telemetry. This tests
1296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    # whether the user agent is then set.
1306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    t = self._browser.tabs[0]
1316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    t.Navigate(self.UrlOfUnittestFile('blank.html'))
1326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    t.WaitForDocumentReadyStateToBeInteractiveOrBetter()
1336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    self.assertEquals(t.EvaluateJavaScript('navigator.userAgent'),
1346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                      'telemetry')
1356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)class DirtyProfileBrowserTest(browser_test_case.BrowserTestCase):
1376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  @classmethod
1386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  def CustomizeBrowserOptions(cls, options):
1396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    options.profile_type = 'small_profile'
1406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  @benchmark.Disabled('chromeos')  # crbug.com/243912
1426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  def testDirtyProfileCreation(self):
1436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    self.assertEquals(1, len(self._browser.tabs))
144