146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)# Copyright 2013 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.
43551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
56e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)import json
66e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)import os
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
86e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)from telemetry import benchmark
96e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)from telemetry.core import exceptions
106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)from telemetry.core import wpr_modes
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)from telemetry.page import page as page_module
126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)from telemetry.page import page_set
136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)from telemetry.page import page_set_archive_info
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)from telemetry.page import page_test
156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)from telemetry.unittest import options_for_unittests
166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)from telemetry.unittest import page_test_test_case
176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)from telemetry.value import scalar
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)class PageTestThatFails(page_test.PageTest):
216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  def ValidateAndMeasurePage(self, page, tab, results):
226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    raise exceptions.IntentionalException
236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)class PageTestThatHasDefaults(page_test.PageTest):
266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  def AddCommandLineArgs(self, parser):
276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    parser.add_option('-x', dest='x', default=3)
286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  def ValidateAndMeasurePage(self, page, tab, results):
306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    if not hasattr(self.options, 'x'):
316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      raise page_test.MeasurementFailure('Default option was not set.')
326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    if self.options.x != 3:
336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      raise page_test.MeasurementFailure(
346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)          'Expected x == 3, got x == ' + self.options.x)
356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    results.AddValue(scalar.ScalarValue(page, 'x', 'ms', 7))
366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)class PageTestForBlank(page_test.PageTest):
396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  def ValidateAndMeasurePage(self, page, tab, results):
406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    contents = tab.EvaluateJavaScript('document.body.textContent')
416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    if contents.strip() != 'Hello world':
426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      raise page_test.MeasurementFailure(
436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)          'Page contents were: ' + contents)
446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)class PageTestForReplay(page_test.PageTest):
476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  def ValidateAndMeasurePage(self, page, tab, results):
486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    # Web Page Replay returns '404 Not found' if a page is not in the archive.
496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    contents = tab.EvaluateJavaScript('document.body.textContent')
506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    if '404 Not Found' in contents.strip():
516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      raise page_test.MeasurementFailure('Page not in archive.')
526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)class PageTestQueryParams(page_test.PageTest):
556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  def ValidateAndMeasurePage(self, page, tab, results):
566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    query = tab.EvaluateJavaScript('window.location.search')
576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    expected = '?foo=1'
586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    if query.strip() != expected:
596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      raise page_test.MeasurementFailure(
606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)          'query was %s, not %s.' % (query, expected))
616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)class PageTestWithAction(page_test.PageTest):
646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  def __init__(self):
656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    super(PageTestWithAction, self).__init__('RunTestAction')
666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  def ValidateAndMeasurePage(self, page, tab, results):
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    pass
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)class PageWithAction(page_module.Page):
726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  def __init__(self, url, ps):
736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    super(PageWithAction, self).__init__(url, ps, ps.base_dir)
746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    self.run_test_action_called = False
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  def RunTestAction(self, _):
776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    self.run_test_action_called = True
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)class PageTestUnitTest(page_test_test_case.PageTestTestCase):
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  def setUp(self):
836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    self._options = options_for_unittests.GetCopy()
846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    self._options.browser_options.wpr_mode = wpr_modes.WPR_OFF
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  def testGotToBlank(self):
876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    ps = self.CreatePageSetFromFileInUnittestDataDir('blank.html')
886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    measurement = PageTestForBlank()
896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    all_results = self.RunMeasurement(measurement, ps, options=self._options)
906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    self.assertEquals(0, len(all_results.failures))
916e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  def testGotQueryParams(self):
936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    ps = self.CreatePageSetFromFileInUnittestDataDir('blank.html?foo=1')
946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    measurement = PageTestQueryParams()
956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    all_results = self.RunMeasurement(measurement, ps, options=self._options)
966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    self.assertEquals(0, len(all_results.failures))
976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
986e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  def testFailure(self):
996e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    ps = self.CreatePageSetFromFileInUnittestDataDir('blank.html')
1006e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    measurement = PageTestThatFails()
1016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    all_results = self.RunMeasurement(measurement, ps, options=self._options)
1026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    self.assertEquals(1, len(all_results.failures))
1036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1046e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  def testDefaults(self):
1056e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    ps = self.CreatePageSetFromFileInUnittestDataDir('blank.html')
1066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    measurement = PageTestThatHasDefaults()
1076e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    all_results = self.RunMeasurement(measurement, ps, options=self._options)
1086e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    self.assertEquals(len(all_results.all_page_specific_values), 1)
1096e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    self.assertEquals(
1106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      all_results.all_page_specific_values[0].value, 7)
1116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  # This test is disabled because it runs against live sites, and needs to be
1136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  # fixed. crbug.com/179038
1146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  @benchmark.Disabled
1156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  def testRecordAndReplay(self):
1166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    test_archive = '/tmp/google.wpr'
1176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    google_url = 'http://www.google.com/'
1186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    foo_url = 'http://www.foo.com/'
1196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    archive_info_template = ("""
1206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles){
1216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)"archives": {
1226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  "%s": ["%s"]
1236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
1246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
1256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)""")
1266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    try:
1276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      ps = page_set.PageSet()
1286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      measurement = PageTestForReplay()
1296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      # First record an archive with only www.google.com.
1316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      self._options.browser_options.wpr_mode = wpr_modes.WPR_RECORD
1326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      ps.wpr_archive_info = page_set_archive_info.PageSetArchiveInfo(
1346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)          '', '', json.loads(archive_info_template %
1356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                             (test_archive, google_url)))
1366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      ps.pages = [page_module.Page(google_url, ps)]
1376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      all_results = self.RunMeasurement(measurement, ps, options=self._options)
1386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      self.assertEquals(0, len(all_results.failures))
1396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      # Now replay it and verify that google.com is found but foo.com is not.
1416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      self._options.browser_options.wpr_mode = wpr_modes.WPR_REPLAY
1426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      ps.wpr_archive_info = page_set_archive_info.PageSetArchiveInfo(
1446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)          '', '', json.loads(archive_info_template % (test_archive, foo_url)))
1456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      ps.pages = [page_module.Page(foo_url, ps)]
1466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      all_results = self.RunMeasurement(measurement, ps, options=self._options)
1476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      self.assertEquals(1, len(all_results.failures))
1486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      ps.wpr_archive_info = page_set_archive_info.PageSetArchiveInfo(
1506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)          '', '', json.loads(archive_info_template %
1516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                             (test_archive, google_url)))
1526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      ps.pages = [page_module.Page(google_url, ps)]
1536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      all_results = self.RunMeasurement(measurement, ps, options=self._options)
1546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      self.assertEquals(0, len(all_results.failures))
1556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      self.assertTrue(os.path.isfile(test_archive))
1576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    finally:
1596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      if os.path.isfile(test_archive):
1606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        os.remove(test_archive)
1616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  def testRunActions(self):
1636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    ps = self.CreateEmptyPageSet()
1646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    page = PageWithAction('file://blank.html', ps)
1656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    ps.AddPage(page)
1666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    measurement = PageTestWithAction()
1676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    self.RunMeasurement(measurement, ps, options=self._options)
1686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    self.assertTrue(page.run_test_action_called)
169