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