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