page_runner_unittest.py revision 7d4cd473f85ac64c3747c96c277f9e506a0d2246
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. 4import logging 5import os 6import tempfile 7import unittest 8 9from telemetry.core import user_agent 10from telemetry.page import page as page_module 11from telemetry.page import page_set 12from telemetry.page import page_test 13from telemetry.page import page_runner 14from telemetry.unittest import options_for_unittests 15 16SIMPLE_CREDENTIALS_STRING = """ 17{ 18 "test": { 19 "username": "example", 20 "password": "asdf" 21 } 22} 23""" 24class StubCredentialsBackend(object): 25 def __init__(self, login_return_value): 26 self.did_get_login = False 27 self.did_get_login_no_longer_needed = False 28 self.login_return_value = login_return_value 29 30 @property 31 def credentials_type(self): # pylint: disable=R0201 32 return 'test' 33 34 def LoginNeeded(self, tab, config): # pylint: disable=W0613 35 self.did_get_login = True 36 return self.login_return_value 37 38 def LoginNoLongerNeeded(self, tab): # pylint: disable=W0613 39 self.did_get_login_no_longer_needed = True 40 41class PageRunnerTests(unittest.TestCase): 42 # TODO(nduca): Move the basic "test failed, test succeeded" tests from 43 # page_measurement_unittest to here. 44 45 def testHandlingOfCrashedTab(self): 46 ps = page_set.PageSet() 47 page1 = page_module.Page('chrome://crash', ps) 48 ps.pages.append(page1) 49 50 class Test(page_test.PageTest): 51 def RunTest(self, *args): 52 pass 53 54 options = options_for_unittests.GetCopy() 55 options.output_format = 'none' 56 results = page_runner.Run(Test('RunTest'), ps, options) 57 self.assertEquals(0, len(results.successes)) 58 self.assertEquals(1, len(results.errors)) 59 60 def testDiscardFirstResult(self): 61 ps = page_set.PageSet() 62 page = page_module.Page( 63 'file:///' + os.path.join('..', '..', 'unittest_data', 'blank.html'), 64 ps, 65 base_dir=os.path.dirname(__file__)) 66 ps.pages.append(page) 67 68 class Test(page_test.PageTest): 69 @property 70 def discard_first_result(self): 71 return True 72 def RunTest(self, *args): 73 pass 74 75 options = options_for_unittests.GetCopy() 76 options.output_format = 'none' 77 results = page_runner.Run(Test('RunTest'), ps, options) 78 self.assertEquals(0, len(results.successes)) 79 self.assertEquals(0, len(results.failures)) 80 81 def testCredentialsWhenLoginFails(self): 82 credentials_backend = StubCredentialsBackend(login_return_value=False) 83 did_run = self.runCredentialsTest(credentials_backend) 84 assert credentials_backend.did_get_login == True 85 assert credentials_backend.did_get_login_no_longer_needed == False 86 assert did_run == False 87 88 def testCredentialsWhenLoginSucceeds(self): 89 credentials_backend = StubCredentialsBackend(login_return_value=True) 90 did_run = self.runCredentialsTest(credentials_backend) 91 assert credentials_backend.did_get_login == True 92 assert credentials_backend.did_get_login_no_longer_needed == True 93 assert did_run 94 95 def runCredentialsTest(self, # pylint: disable=R0201 96 credentials_backend): 97 ps = page_set.PageSet() 98 page = page_module.Page( 99 'file:///' + os.path.join('..', '..', 'unittest_data', 'blank.html'), 100 ps, 101 base_dir=os.path.dirname(__file__)) 102 page.credentials = "test" 103 ps.pages.append(page) 104 105 did_run = [False] 106 107 try: 108 with tempfile.NamedTemporaryFile(delete=False) as f: 109 f.write(SIMPLE_CREDENTIALS_STRING) 110 ps.credentials_path = f.name 111 112 class TestThatInstallsCredentialsBackend(page_test.PageTest): 113 def __init__(self, credentials_backend): 114 super(TestThatInstallsCredentialsBackend, self).__init__('RunTest') 115 self._credentials_backend = credentials_backend 116 117 def SetUpBrowser(self, browser): 118 browser.credentials.AddBackend(self._credentials_backend) 119 120 def RunTest(self, page, tab, results): # pylint: disable=W0613,R0201 121 did_run[0] = True 122 123 test = TestThatInstallsCredentialsBackend(credentials_backend) 124 options = options_for_unittests.GetCopy() 125 options.output_format = 'none' 126 page_runner.Run(test, ps, options) 127 finally: 128 os.remove(f.name) 129 130 return did_run[0] 131 132 def testUserAgent(self): 133 ps = page_set.PageSet() 134 page = page_module.Page( 135 'file:///' + os.path.join('..', '..', 'unittest_data', 'blank.html'), 136 ps, 137 base_dir=os.path.dirname(__file__)) 138 ps.pages.append(page) 139 ps.user_agent_type = 'tablet' 140 141 class TestUserAgent(page_test.PageTest): 142 def RunTest(self, page, tab, results): # pylint: disable=W0613,R0201 143 actual_user_agent = tab.EvaluateJavaScript('window.navigator.userAgent') 144 expected_user_agent = user_agent.UA_TYPE_MAPPING['tablet'] 145 assert actual_user_agent.strip() == expected_user_agent 146 147 # This is so we can check later that the test actually made it into this 148 # function. Previously it was timing out before even getting here, which 149 # should fail, but since it skipped all the asserts, it slipped by. 150 self.hasRun = True # pylint: disable=W0201 151 152 test = TestUserAgent('RunTest') 153 options = options_for_unittests.GetCopy() 154 options.output_format = 'none' 155 page_runner.Run(test, ps, options) 156 157 self.assertTrue(hasattr(test, 'hasRun') and test.hasRun) 158 159 # Ensure that page_runner forces exactly 1 tab before running a page. 160 def testOneTab(self): 161 ps = page_set.PageSet() 162 page = page_module.Page( 163 'file:///' + os.path.join('..', '..', 'unittest_data', 'blank.html'), 164 ps, 165 base_dir=os.path.dirname(__file__)) 166 ps.pages.append(page) 167 168 class TestOneTab(page_test.PageTest): 169 def __init__(self, 170 test_method_name, 171 action_name_to_run='', 172 needs_browser_restart_after_each_run=False): 173 super(TestOneTab, self).__init__(test_method_name, action_name_to_run, 174 needs_browser_restart_after_each_run) 175 self._browser = None 176 177 def SetUpBrowser(self, browser): 178 self._browser = browser 179 if self._browser.supports_tab_control: 180 self._browser.tabs.New() 181 182 def RunTest(self, page, tab, results): # pylint: disable=W0613,R0201 183 if not self._browser.supports_tab_control: 184 logging.warning('Browser does not support tab control, skipping test') 185 return 186 assert len(self._browser.tabs) == 1 187 188 test = TestOneTab('RunTest') 189 options = options_for_unittests.GetCopy() 190 options.output_format = 'none' 191 page_runner.Run(test, ps, options) 192