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