page_runner_unittest.py revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
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 os
5import tempfile
6import unittest
7
8from telemetry.core import browser_finder
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.test 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_benchmark_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    results = page_test.PageTestResults()
50
51    class Test(page_test.PageTest):
52      def RunTest(self, *args):
53        pass
54
55    with page_runner.PageRunner(ps) as runner:
56      options = options_for_unittests.GetCopy()
57      possible_browser = browser_finder.FindBrowser(options)
58      runner.Run(options, possible_browser, Test('RunTest'), results)
59    self.assertEquals(0, len(results.page_successes))
60    self.assertEquals(1, len(results.page_failures))
61
62  def disabled_testCredentialsWhenLoginFails(self):
63    # This test is disabled because it runs against live sites, and needs to be
64    # fixed. crbug.com/179038
65    results = page_test.PageTestResults()
66    credentials_backend = StubCredentialsBackend(login_return_value=False)
67    did_run = self.runCredentialsTest(credentials_backend, results)
68    assert credentials_backend.did_get_login == True
69    assert credentials_backend.did_get_login_no_longer_needed == False
70    assert did_run == False
71
72  def disabled_testCredentialsWhenLoginSucceeds(self):
73    # This test is disabled because it runs against live sites, and needs to be
74    # fixed. crbug.com/179038
75    results = page_test.PageTestResults()
76    credentials_backend = StubCredentialsBackend(login_return_value=True)
77    did_run = self.runCredentialsTest(credentials_backend, results)
78    assert credentials_backend.did_get_login == True
79    assert credentials_backend.did_get_login_no_longer_needed == True
80    assert did_run
81
82  def runCredentialsTest(self, # pylint: disable=R0201
83                         credentials_backend,
84                         results):
85    ps = page_set.PageSet()
86    page = page_module.Page('http://www.google.com', ps)
87    page.credentials = "test"
88    ps.pages.append(page)
89
90    did_run = [False]
91
92    with tempfile.NamedTemporaryFile() as f:
93      f.write(SIMPLE_CREDENTIALS_STRING)
94      f.flush()
95      ps.credentials_path = f.name
96
97      class TestThatInstallsCredentialsBackend(page_test.PageTest):
98        def __init__(self, credentials_backend):
99          super(TestThatInstallsCredentialsBackend, self).__init__('RunTest')
100          self._credentials_backend = credentials_backend
101
102        def SetUpBrowser(self, browser):
103          browser.credentials.AddBackend(self._credentials_backend)
104
105        def RunTest(self, page, tab, results): # pylint: disable=W0613,R0201
106          did_run[0] = True
107
108      test = TestThatInstallsCredentialsBackend(credentials_backend)
109      with page_runner.PageRunner(ps) as runner:
110        options = options_for_unittests.GetCopy()
111        possible_browser = browser_finder.FindBrowser(options)
112        runner.Run(options, possible_browser, test, results)
113
114    return did_run[0]
115
116  def testUserAgent(self):
117    ps = page_set.PageSet()
118    page = page_module.Page(
119        'file:///' + os.path.join('..', '..', 'unittest_data', 'blank.html'),
120        ps,
121        base_dir=os.path.dirname(__file__))
122    ps.pages.append(page)
123    ps.user_agent_type = 'tablet'
124
125    class TestUserAgent(page_test.PageTest):
126      def RunTest(self, page, tab, results): # pylint: disable=W0613,R0201
127        actual_user_agent = tab.EvaluateJavaScript('window.navigator.userAgent')
128        expected_user_agent = user_agent.UA_TYPE_MAPPING['tablet']
129        assert actual_user_agent.strip() == expected_user_agent
130
131        # This is so we can check later that the test actually made it into this
132        # function. Previously it was timing out before even getting here, which
133        # should fail, but since it skipped all the asserts, it slipped by.
134        self.hasRun = True # pylint: disable=W0201
135
136    test = TestUserAgent('RunTest')
137    with page_runner.PageRunner(ps) as runner:
138      options = options_for_unittests.GetCopy()
139      possible_browser = browser_finder.FindBrowser(options)
140      results = page_test.PageTestResults()
141      runner.Run(options, possible_browser, test, results)
142
143    self.assertTrue(hasattr(test, 'hasRun') and test.hasRun)
144
145  # Ensure that page_runner forces exactly 1 tab before running a page.
146  def testOneTab(self):
147    ps = page_set.PageSet()
148    page = page_module.Page(
149        'file:///' + os.path.join('..', '..', 'unittest_data', 'blank.html'),
150        ps,
151        base_dir=os.path.dirname(__file__))
152    ps.pages.append(page)
153
154    class TestOneTab(page_test.PageTest):
155      def __init__(self,
156                   test_method_name,
157                   action_name_to_run='',
158                   needs_browser_restart_after_each_run=False):
159        super(TestOneTab, self).__init__(test_method_name, action_name_to_run,
160                                         needs_browser_restart_after_each_run)
161        self._browser = None
162
163      def SetUpBrowser(self, browser):
164        self._browser = browser
165        self._browser.tabs.New()
166
167      def RunTest(self, page, tab, results): # pylint: disable=W0613,R0201
168        assert len(self._browser.tabs) == 1
169
170    test = TestOneTab('RunTest')
171    with page_runner.PageRunner(ps) as runner:
172      options = options_for_unittests.GetCopy()
173      possible_browser = browser_finder.FindBrowser(options)
174      results = page_test.PageTestResults()
175      runner.Run(options, possible_browser, test, results)
176