page_runner_unittest.py revision ca12bfac764ba476d6cd062bf1dde12cc64c3f40
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    page = 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)
70
71    class Test(page_test.PageTest):
72      @property
73      def discard_first_result(self):
74        return True
75      def RunTest(self, *args):
76        pass
77
78    options = options_for_unittests.GetCopy()
79    options.output_format = 'none'
80    results = page_runner.Run(Test('RunTest'), ps, expectations, options)
81    self.assertEquals(0, len(results.successes))
82    self.assertEquals(0, len(results.failures))
83
84  def testCredentialsWhenLoginFails(self):
85    credentials_backend = StubCredentialsBackend(login_return_value=False)
86    did_run = self.runCredentialsTest(credentials_backend)
87    assert credentials_backend.did_get_login == True
88    assert credentials_backend.did_get_login_no_longer_needed == False
89    assert did_run == False
90
91  def testCredentialsWhenLoginSucceeds(self):
92    credentials_backend = StubCredentialsBackend(login_return_value=True)
93    did_run = self.runCredentialsTest(credentials_backend)
94    assert credentials_backend.did_get_login == True
95    assert credentials_backend.did_get_login_no_longer_needed == True
96    assert did_run
97
98  def runCredentialsTest(self, # pylint: disable=R0201
99                         credentials_backend):
100    ps = page_set.PageSet()
101    expectations = test_expectations.TestExpectations()
102    page = page_module.Page(
103        'file:///' + os.path.join('..', '..', 'unittest_data', 'blank.html'),
104        ps,
105        base_dir=os.path.dirname(__file__))
106    page.credentials = "test"
107    ps.pages.append(page)
108
109    did_run = [False]
110
111    try:
112      with tempfile.NamedTemporaryFile(delete=False) as f:
113        f.write(SIMPLE_CREDENTIALS_STRING)
114        ps.credentials_path = f.name
115
116      class TestThatInstallsCredentialsBackend(page_test.PageTest):
117        def __init__(self, credentials_backend):
118          super(TestThatInstallsCredentialsBackend, self).__init__('RunTest')
119          self._credentials_backend = credentials_backend
120
121        def SetUpBrowser(self, browser):
122          browser.credentials.AddBackend(self._credentials_backend)
123
124        def RunTest(self, page, tab, results): # pylint: disable=W0613,R0201
125          did_run[0] = True
126
127      test = TestThatInstallsCredentialsBackend(credentials_backend)
128      options = options_for_unittests.GetCopy()
129      options.output_format = 'none'
130      page_runner.Run(test, ps, expectations, options)
131    finally:
132      os.remove(f.name)
133
134    return did_run[0]
135
136  def testUserAgent(self):
137    ps = page_set.PageSet()
138    expectations = test_expectations.TestExpectations()
139    page = page_module.Page(
140        'file:///' + os.path.join('..', '..', 'unittest_data', 'blank.html'),
141        ps,
142        base_dir=os.path.dirname(__file__))
143    ps.pages.append(page)
144    ps.user_agent_type = 'tablet'
145
146    class TestUserAgent(page_test.PageTest):
147      def RunTest(self, page, tab, results): # pylint: disable=W0613,R0201
148        actual_user_agent = tab.EvaluateJavaScript('window.navigator.userAgent')
149        expected_user_agent = user_agent.UA_TYPE_MAPPING['tablet']
150        assert actual_user_agent.strip() == expected_user_agent
151
152        # This is so we can check later that the test actually made it into this
153        # function. Previously it was timing out before even getting here, which
154        # should fail, but since it skipped all the asserts, it slipped by.
155        self.hasRun = True # pylint: disable=W0201
156
157    test = TestUserAgent('RunTest')
158    options = options_for_unittests.GetCopy()
159    options.output_format = 'none'
160    page_runner.Run(test, ps, expectations, options)
161
162    self.assertTrue(hasattr(test, 'hasRun') and test.hasRun)
163
164  # Ensure that page_runner forces exactly 1 tab before running a page.
165  def testOneTab(self):
166    ps = page_set.PageSet()
167    expectations = test_expectations.TestExpectations()
168    page = page_module.Page(
169        'file:///' + os.path.join('..', '..', 'unittest_data', 'blank.html'),
170        ps,
171        base_dir=os.path.dirname(__file__))
172    ps.pages.append(page)
173
174    class TestOneTab(page_test.PageTest):
175      def __init__(self,
176                   test_method_name,
177                   action_name_to_run='',
178                   needs_browser_restart_after_each_run=False):
179        super(TestOneTab, self).__init__(test_method_name, action_name_to_run,
180                                         needs_browser_restart_after_each_run)
181        self._browser = None
182
183      def SetUpBrowser(self, browser):
184        self._browser = browser
185        if self._browser.supports_tab_control:
186          self._browser.tabs.New()
187
188      def RunTest(self, page, tab, results): # pylint: disable=W0613,R0201
189        if not self._browser.supports_tab_control:
190          logging.warning('Browser does not support tab control, skipping test')
191          return
192        assert len(self._browser.tabs) == 1
193
194    test = TestOneTab('RunTest')
195    options = options_for_unittests.GetCopy()
196    options.output_format = 'none'
197    page_runner.Run(test, ps, expectations, options)
198