Home | History | Annotate | Download | only in page
      1 # Copyright (c) 2012 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.
      4 import json
      5 import os
      6 
      7 from telemetry.core import wpr_modes
      8 from telemetry.page import page_measurement
      9 from telemetry.page import page_measurement_unittest_base
     10 from telemetry.page import page as page_module
     11 from telemetry.page import page_set
     12 from telemetry.page import page_set_archive_info
     13 from telemetry.page.actions import all_page_actions
     14 from telemetry.page.actions import page_action
     15 from telemetry.unittest import options_for_unittests
     16 
     17 class MeasurementThatFails(page_measurement.PageMeasurement):
     18   def MeasurePage(self, page, tab, results):
     19     raise page_measurement.MeasurementFailure('Intentional failure.')
     20 
     21 class MeasurementThatHasDefaults(page_measurement.PageMeasurement):
     22   def AddCommandLineOptions(self, parser):
     23     parser.add_option('-x', dest='x', default=3)
     24 
     25   def MeasurePage(self, page, tab, results):
     26     if not hasattr(self.options, 'x'):
     27       raise page_measurement.MeasurementFailure('Default option was not set.')
     28     if self.options.x != 3:
     29       raise page_measurement.MeasurementFailure(
     30           'Expected x == 3, got x == ' + self.options.x)
     31     results.Add('x', 'ms', 7)
     32 
     33 class MeasurementForBlank(page_measurement.PageMeasurement):
     34   def MeasurePage(self, page, tab, results):
     35     contents = tab.EvaluateJavaScript('document.body.textContent')
     36     if contents.strip() != 'Hello world':
     37       raise page_measurement.MeasurementFailure(
     38           'Page contents were: ' + contents)
     39 
     40 class MeasurementForReplay(page_measurement.PageMeasurement):
     41   def MeasurePage(self, page, tab, results):
     42     # Web Page Replay returns '404 Not found' if a page is not in the archive.
     43     contents = tab.EvaluateJavaScript('document.body.textContent')
     44     if '404 Not Found' in contents.strip():
     45       raise page_measurement.MeasurementFailure('Page not in archive.')
     46 
     47 class MeasurementQueryParams(page_measurement.PageMeasurement):
     48   def MeasurePage(self, page, tab, results):
     49     query = tab.EvaluateJavaScript('window.location.search')
     50     expected = '?foo=1'
     51     if query.strip() != expected:
     52       raise page_measurement.MeasurementFailure(
     53           'query was %s, not %s.' % (query, expected))
     54 
     55 class MeasurementWithAction(page_measurement.PageMeasurement):
     56   def __init__(self):
     57     super(MeasurementWithAction, self).__init__('test_action')
     58 
     59   def MeasurePage(self, page, tab, results):
     60     pass
     61 
     62 class PageMeasurementUnitTest(
     63   page_measurement_unittest_base.PageMeasurementUnitTestBase):
     64 
     65   def setUp(self):
     66     self._options = options_for_unittests.GetCopy()
     67     self._options.browser_options.wpr_mode = wpr_modes.WPR_OFF
     68 
     69   def testGotToBlank(self):
     70     ps = self.CreatePageSetFromFileInUnittestDataDir('blank.html')
     71     measurement = MeasurementForBlank()
     72     all_results = self.RunMeasurement(measurement, ps, options=self._options)
     73     self.assertEquals(0, len(all_results.failures))
     74 
     75   def testGotQueryParams(self):
     76     ps = self.CreatePageSet('file://blank.html?foo=1')
     77     measurement = MeasurementQueryParams()
     78     all_results = self.RunMeasurement(measurement, ps, options=self._options)
     79     self.assertEquals(0, len(all_results.failures))
     80 
     81   def testFailure(self):
     82     ps = self.CreatePageSetFromFileInUnittestDataDir('blank.html')
     83     measurement = MeasurementThatFails()
     84     all_results = self.RunMeasurement(measurement, ps, options=self._options)
     85     self.assertEquals(1, len(all_results.failures))
     86 
     87   def testDefaults(self):
     88     ps = self.CreatePageSetFromFileInUnittestDataDir('blank.html')
     89     measurement = MeasurementThatHasDefaults()
     90     all_results = self.RunMeasurement(measurement, ps, options=self._options)
     91     self.assertEquals(len(all_results.all_page_specific_values), 1)
     92     self.assertEquals(
     93       all_results.all_page_specific_values[0].value, 7)
     94 
     95   def disabled_testRecordAndReplay(self):
     96     # This test is disabled because it runs against live sites, and needs to be
     97     # fixed. crbug.com/179038
     98     test_archive = '/tmp/google.wpr'
     99     google_url = 'http://www.google.com/'
    100     foo_url = 'http://www.foo.com/'
    101     archive_info_template = ("""
    102 {
    103 "archives": {
    104   "%s": ["%s"]
    105 }
    106 }
    107 """)
    108     try:
    109       ps = page_set.PageSet()
    110       measurement = MeasurementForReplay()
    111 
    112       # First record an archive with only www.google.com.
    113       self._options.browser_options.wpr_mode = wpr_modes.WPR_RECORD
    114 
    115       ps.wpr_archive_info = page_set_archive_info.PageSetArchiveInfo(
    116           '', '', json.loads(archive_info_template %
    117                              (test_archive, google_url)))
    118       ps.pages = [page_module.Page(google_url, ps)]
    119       all_results = self.RunMeasurement(measurement, ps, options=self._options)
    120       self.assertEquals(0, len(all_results.failures))
    121 
    122       # Now replay it and verify that google.com is found but foo.com is not.
    123       self._options.browser_options.wpr_mode = wpr_modes.WPR_REPLAY
    124 
    125       ps.wpr_archive_info = page_set_archive_info.PageSetArchiveInfo(
    126           '', '', json.loads(archive_info_template % (test_archive, foo_url)))
    127       ps.pages = [page_module.Page(foo_url, ps)]
    128       all_results = self.RunMeasurement(measurement, ps, options=self._options)
    129       self.assertEquals(1, len(all_results.failures))
    130 
    131       ps.wpr_archive_info = page_set_archive_info.PageSetArchiveInfo(
    132           '', '', json.loads(archive_info_template %
    133                              (test_archive, google_url)))
    134       ps.pages = [page_module.Page(google_url, ps)]
    135       all_results = self.RunMeasurement(measurement, ps, options=self._options)
    136       self.assertEquals(0, len(all_results.failures))
    137 
    138       self.assertTrue(os.path.isfile(test_archive))
    139 
    140     finally:
    141       if os.path.isfile(test_archive):
    142         os.remove(test_archive)
    143 
    144   def testActions(self):
    145     action_called = [False]
    146     class MockAction(page_action.PageAction):
    147       def RunAction(self, page, tab, previous_action):
    148         action_called[0] = True
    149     all_page_actions.RegisterClassForTest('mock', MockAction)
    150 
    151     ps = self.CreatePageSetFromFileInUnittestDataDir('blank.html')
    152     setattr(ps.pages[0], 'test_action', {'action': 'mock'})
    153     measurement = MeasurementWithAction()
    154     self.RunMeasurement(measurement, ps, options=self._options)
    155     self.assertTrue(action_called[0])
    156