page_runner_unittest.py revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# Copyright (c) 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. 490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)import logging 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import os 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import tempfile 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import unittest 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)from telemetry.core import exceptions 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)from telemetry.core import user_agent 11a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)from telemetry.core import util 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)from telemetry.page import page as page_module 13ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochfrom telemetry.page import page_measurement 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)from telemetry.page import page_set 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)from telemetry.page import page_test 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)from telemetry.page import page_runner 17ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochfrom telemetry.page import test_expectations 185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)from telemetry.unittest import options_for_unittests 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SIMPLE_CREDENTIALS_STRING = """ 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){ 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "test": { 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "username": "example", 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "password": "asdf" 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)""" 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class StubCredentialsBackend(object): 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def __init__(self, login_return_value): 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.did_get_login = False 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.did_get_login_no_longer_needed = False 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.login_return_value = login_return_value 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) @property 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def credentials_type(self): # pylint: disable=R0201 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return 'test' 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def LoginNeeded(self, tab, config): # pylint: disable=W0613 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.did_get_login = True 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return self.login_return_value 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def LoginNoLongerNeeded(self, tab): # pylint: disable=W0613 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.did_get_login_no_longer_needed = True 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class PageRunnerTests(unittest.TestCase): 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # TODO(nduca): Move the basic "test failed, test succeeded" tests from 47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) # page_measurement_unittest to here. 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def testHandlingOfCrashedTab(self): 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ps = page_set.PageSet() 51ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch expectations = test_expectations.TestExpectations() 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) page1 = page_module.Page('chrome://crash', ps) 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ps.pages.append(page1) 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) class Test(page_test.PageTest): 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def RunTest(self, *args): 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pass 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) options = options_for_unittests.GetCopy() 607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) options.output_format = 'none' 61ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch results = page_runner.Run(Test('RunTest'), ps, expectations, options) 6290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) self.assertEquals(0, len(results.successes)) 633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) self.assertEquals(0, len(results.failures)) 6490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) self.assertEquals(1, len(results.errors)) 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 66a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) def testHandlingOfTestThatRaisesWithNonFatalUnknownExceptions(self): 67a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ps = page_set.PageSet() 68a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) expectations = test_expectations.TestExpectations() 69a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ps.pages.append(page_module.Page( 70a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 'file://blank.html', ps, base_dir=util.GetUnittestDataDir())) 71a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ps.pages.append(page_module.Page( 72a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 'file://blank.html', ps, base_dir=util.GetUnittestDataDir())) 73a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 74a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) class ExpectedException(Exception): 75a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) pass 76a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 77a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) class Test(page_test.PageTest): 78a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) def __init__(self, *args): 79a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) super(Test, self).__init__(*args) 80a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) self.run_count = 0 81a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) def RunTest(self, *_): 82a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) old_run_count = self.run_count 83a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) self.run_count += 1 84a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if old_run_count == 0: 85a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) raise ExpectedException() 86a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 87a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) options = options_for_unittests.GetCopy() 88a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) options.output_format = 'none' 89a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) test = Test('RunTest') 90a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) results = page_runner.Run(test, ps, expectations, options) 91a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) self.assertEquals(2, test.run_count) 92a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) self.assertEquals(1, len(results.successes)) 93a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) self.assertEquals(1, len(results.failures)) 94a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) def testHandlingOfCrashedTabWithExpectedFailure(self): 963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ps = page_set.PageSet() 973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) expectations = test_expectations.TestExpectations() 983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) expectations.Fail('chrome://crash') 993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) page1 = page_module.Page('chrome://crash', ps) 1003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ps.pages.append(page1) 1013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) class Test(page_test.PageTest): 103a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) def RunTest(self, *_): 1043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) pass 1053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) options = options_for_unittests.GetCopy() 1073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) options.output_format = 'none' 108a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) results = page_runner.Run( 109a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Test('RunTest'), ps, expectations, options) 1103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) self.assertEquals(1, len(results.successes)) 1113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) self.assertEquals(0, len(results.failures)) 1123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) self.assertEquals(0, len(results.errors)) 1133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) def testRetryOnBrowserCrash(self): 1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ps = page_set.PageSet() 1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expectations = test_expectations.TestExpectations() 1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ps.pages.append(page_module.Page( 1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 'file://blank.html', ps, base_dir=util.GetUnittestDataDir())) 1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) class CrashyMeasurement(page_measurement.PageMeasurement): 1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) has_crashed = False 1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) def MeasurePage(self, *_): 1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if not self.has_crashed: 1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) self.has_crashed = True 1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) raise exceptions.BrowserGoneException() 1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) options = options_for_unittests.GetCopy() 1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) options.output_format = 'csv' 1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) results = page_runner.Run(CrashyMeasurement(), ps, expectations, options) 1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) self.assertEquals(1, len(results.successes)) 1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) self.assertEquals(0, len(results.failures)) 1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) self.assertEquals(0, len(results.errors)) 1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) def testDiscardFirstResult(self): 137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ps = page_set.PageSet() 138ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch expectations = test_expectations.TestExpectations() 139a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch ps.pages.append(page_module.Page( 1404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 'file://blank.html', ps, base_dir=util.GetUnittestDataDir())) 141a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch ps.pages.append(page_module.Page( 1424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 'file://blank.html', ps, base_dir=util.GetUnittestDataDir())) 143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 144ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch class Measurement(page_measurement.PageMeasurement): 145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) @property 146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) def discard_first_result(self): 147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return True 148ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch def MeasurePage(self, *args): 149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) pass 150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) options = options_for_unittests.GetCopy() 1527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) options.output_format = 'none' 1538bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) options.reset_results = None 1548bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) options.upload_results = None 1558bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) options.results_label = None 156a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 157a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch options.repeat_options.page_repeat_iters = 1 158a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch options.repeat_options.pageset_repeat_iters = 1 159ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch results = page_runner.Run(Measurement(), ps, expectations, options) 16090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) self.assertEquals(0, len(results.successes)) 16190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) self.assertEquals(0, len(results.failures)) 162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 163a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch options.repeat_options.page_repeat_iters = 1 164a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch options.repeat_options.pageset_repeat_iters = 2 165ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch results = page_runner.Run(Measurement(), ps, expectations, options) 166a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch self.assertEquals(2, len(results.successes)) 167a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch self.assertEquals(0, len(results.failures)) 168a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 169a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch options.repeat_options.page_repeat_iters = 2 170a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch options.repeat_options.pageset_repeat_iters = 1 171ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch results = page_runner.Run(Measurement(), ps, expectations, options) 172a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch self.assertEquals(2, len(results.successes)) 173a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch self.assertEquals(0, len(results.failures)) 174a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 175ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch options.output_format = 'html' 176ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch options.repeat_options.page_repeat_iters = 1 177ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch options.repeat_options.pageset_repeat_iters = 1 178ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch results = page_runner.Run(Measurement(), ps, expectations, options) 179ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch self.assertEquals(0, len(results.successes)) 180ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch self.assertEquals(0, len(results.failures)) 181ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 1825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) def testPagesetRepeat(self): 1835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ps = page_set.PageSet() 1845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expectations = test_expectations.TestExpectations() 1855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ps.pages.append(page_module.Page( 1865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 'file://blank.html', ps, base_dir=util.GetUnittestDataDir())) 1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ps.pages.append(page_module.Page( 1885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 'file://green_rect.html', ps, base_dir=util.GetUnittestDataDir())) 1895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) class Measurement(page_measurement.PageMeasurement): 1915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) i = 0 1925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) def MeasurePage(self, _, __, results): 1935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) self.i += 1 1945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) results.Add('metric', 'unit', self.i) 1955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) output_file = tempfile.NamedTemporaryFile(delete=False).name 1975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) try: 1985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) options = options_for_unittests.GetCopy() 1995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) options.output_format = 'buildbot' 2005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) options.output_file = output_file 2015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) options.reset_results = None 2025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) options.upload_results = None 2035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) options.results_label = None 2045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) options.repeat_options.page_repeat_iters = 1 2065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) options.repeat_options.pageset_repeat_iters = 2 2075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) results = page_runner.Run(Measurement(), ps, expectations, options) 2085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) results.PrintSummary() 2095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) self.assertEquals(4, len(results.successes)) 2105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) self.assertEquals(0, len(results.failures)) 2115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) stdout = open(output_file).read() 2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) self.assertIn('RESULT metric_by_url: blank.html= [1,3] unit', stdout) 2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) self.assertIn('RESULT metric_by_url: green_rect.html= [2,4] unit', stdout) 2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) self.assertIn('*RESULT metric: metric= [1,2,3,4] unit', stdout) 2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) finally: 2165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) results._output_stream.close() # pylint: disable=W0212 2175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) os.remove(output_file) 2185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 21990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) def testCredentialsWhenLoginFails(self): 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) credentials_backend = StubCredentialsBackend(login_return_value=False) 2217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) did_run = self.runCredentialsTest(credentials_backend) 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assert credentials_backend.did_get_login == True 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assert credentials_backend.did_get_login_no_longer_needed == False 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assert did_run == False 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) def testCredentialsWhenLoginSucceeds(self): 2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) credentials_backend = StubCredentialsBackend(login_return_value=True) 2287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) did_run = self.runCredentialsTest(credentials_backend) 2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assert credentials_backend.did_get_login == True 2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assert credentials_backend.did_get_login_no_longer_needed == True 2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assert did_run 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def runCredentialsTest(self, # pylint: disable=R0201 2347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) credentials_backend): 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ps = page_set.PageSet() 236ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch expectations = test_expectations.TestExpectations() 23790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) page = page_module.Page( 2384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 'file://blank.html', ps, base_dir=util.GetUnittestDataDir()) 2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) page.credentials = "test" 2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ps.pages.append(page) 2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) did_run = [False] 2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 24490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) try: 24590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) with tempfile.NamedTemporaryFile(delete=False) as f: 24690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) f.write(SIMPLE_CREDENTIALS_STRING) 24790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ps.credentials_path = f.name 2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) class TestThatInstallsCredentialsBackend(page_test.PageTest): 2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def __init__(self, credentials_backend): 2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) super(TestThatInstallsCredentialsBackend, self).__init__('RunTest') 2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self._credentials_backend = credentials_backend 2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 254a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) def DidStartBrowser(self, browser): 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser.credentials.AddBackend(self._credentials_backend) 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def RunTest(self, page, tab, results): # pylint: disable=W0613,R0201 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) did_run[0] = True 2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test = TestThatInstallsCredentialsBackend(credentials_backend) 2617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) options = options_for_unittests.GetCopy() 2627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) options.output_format = 'none' 263ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch page_runner.Run(test, ps, expectations, options) 26490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) finally: 26590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) os.remove(f.name) 2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return did_run[0] 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def testUserAgent(self): 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ps = page_set.PageSet() 271ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch expectations = test_expectations.TestExpectations() 2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) page = page_module.Page( 2734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 'file://blank.html', ps, base_dir=util.GetUnittestDataDir()) 2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ps.pages.append(page) 2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ps.user_agent_type = 'tablet' 2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) class TestUserAgent(page_test.PageTest): 2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def RunTest(self, page, tab, results): # pylint: disable=W0613,R0201 2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) actual_user_agent = tab.EvaluateJavaScript('window.navigator.userAgent') 2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expected_user_agent = user_agent.UA_TYPE_MAPPING['tablet'] 2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assert actual_user_agent.strip() == expected_user_agent 2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # This is so we can check later that the test actually made it into this 2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # function. Previously it was timing out before even getting here, which 2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # should fail, but since it skipped all the asserts, it slipped by. 2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.hasRun = True # pylint: disable=W0201 2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test = TestUserAgent('RunTest') 2897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) options = options_for_unittests.GetCopy() 2907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) options.output_format = 'none' 291ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch page_runner.Run(test, ps, expectations, options) 2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.assertTrue(hasattr(test, 'hasRun') and test.hasRun) 2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # Ensure that page_runner forces exactly 1 tab before running a page. 2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def testOneTab(self): 2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ps = page_set.PageSet() 298ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch expectations = test_expectations.TestExpectations() 2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) page = page_module.Page( 3004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 'file://blank.html', ps, base_dir=util.GetUnittestDataDir()) 3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ps.pages.append(page) 3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) class TestOneTab(page_test.PageTest): 3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def __init__(self, 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_method_name, 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) action_name_to_run='', 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) needs_browser_restart_after_each_run=False): 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) super(TestOneTab, self).__init__(test_method_name, action_name_to_run, 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) needs_browser_restart_after_each_run) 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self._browser = None 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 312a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) def DidStartBrowser(self, browser): 3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self._browser = browser 31490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if self._browser.supports_tab_control: 31590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) self._browser.tabs.New() 3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def RunTest(self, page, tab, results): # pylint: disable=W0613,R0201 31890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if not self._browser.supports_tab_control: 31990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) logging.warning('Browser does not support tab control, skipping test') 32090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return 3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assert len(self._browser.tabs) == 1 3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test = TestOneTab('RunTest') 3247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) options = options_for_unittests.GetCopy() 3257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) options.output_format = 'none' 326ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch page_runner.Run(test, ps, expectations, options) 327a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 328a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) # Ensure that page_runner allows the test to customize the browser before it 329a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) # launches. 330a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) def testBrowserBeforeLaunch(self): 331a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ps = page_set.PageSet() 332a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) expectations = test_expectations.TestExpectations() 333a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) page = page_module.Page( 3344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 'file://blank.html', ps, base_dir=util.GetUnittestDataDir()) 335a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ps.pages.append(page) 336a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 337a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) class TestBeforeLaunch(page_test.PageTest): 338a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) def __init__(self, 339a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) test_method_name, 340a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) action_name_to_run=''): 341a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) super(TestBeforeLaunch, self).__init__( 342a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) test_method_name, action_name_to_run, False) 343a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) self._did_call_will_start = False 344a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) self._did_call_did_start = False 345a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 346a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) def WillStartBrowser(self, browser): 347a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) self._did_call_will_start = True 348a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) # TODO(simonjam): Test that the profile is available. 349a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 350a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) def DidStartBrowser(self, browser): 351a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) assert self._did_call_will_start 352a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) self._did_call_did_start = True 353a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 354a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) def RunTest(self, page, tab, results): # pylint: disable=W0613,R0201 355a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) assert self._did_call_did_start 356a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 357a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) test = TestBeforeLaunch('RunTest') 358a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) options = options_for_unittests.GetCopy() 359a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) options.output_format = 'none' 360a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) page_runner.Run(test, ps, expectations, options) 361