page_runner_unittest.py revision a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# Copyright (c) 2012 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# found in the LICENSE file.
490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)import logging
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import os
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import tempfile
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import unittest
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)from telemetry.core import user_agent
10a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)from telemetry.core import util
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)from telemetry.page import page as page_module
12ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochfrom telemetry.page import page_measurement
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)from telemetry.page import page_set
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)from telemetry.page import page_test
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)from telemetry.page import page_runner
16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)from telemetry.unittest import options_for_unittests
17ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochfrom telemetry.page import test_expectations
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SIMPLE_CREDENTIALS_STRING = """
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  "test": {
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    "username": "example",
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    "password": "asdf"
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)"""
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class StubCredentialsBackend(object):
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def __init__(self, login_return_value):
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self.did_get_login = False
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self.did_get_login_no_longer_needed = False
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self.login_return_value = login_return_value
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  @property
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def credentials_type(self): # pylint: disable=R0201
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return 'test'
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def LoginNeeded(self, tab, config): # pylint: disable=W0613
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self.did_get_login = True
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return self.login_return_value
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def LoginNoLongerNeeded(self, tab): # pylint: disable=W0613
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self.did_get_login_no_longer_needed = True
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class PageRunnerTests(unittest.TestCase):
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  # TODO(nduca): Move the basic "test failed, test succeeded" tests from
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  # page_measurement_unittest to here.
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def testHandlingOfCrashedTab(self):
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ps = page_set.PageSet()
50ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    expectations = test_expectations.TestExpectations()
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    page1 = page_module.Page('chrome://crash', ps)
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ps.pages.append(page1)
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    class Test(page_test.PageTest):
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      def RunTest(self, *args):
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        pass
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    options = options_for_unittests.GetCopy()
597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    options.output_format = 'none'
60ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    results = page_runner.Run(Test('RunTest'), ps, expectations, options)
6190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    self.assertEquals(0, len(results.successes))
623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    self.assertEquals(0, len(results.failures))
6390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    self.assertEquals(1, len(results.errors))
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
65a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  def testHandlingOfTestThatRaisesWithNonFatalUnknownExceptions(self):
66a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ps = page_set.PageSet()
67a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    expectations = test_expectations.TestExpectations()
68a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ps.pages.append(page_module.Page(
69a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        'file://blank.html', ps, base_dir=util.GetUnittestDataDir()))
70a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ps.pages.append(page_module.Page(
71a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        'file://blank.html', ps, base_dir=util.GetUnittestDataDir()))
72a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
73a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    class ExpectedException(Exception):
74a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      pass
75a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
76a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    class Test(page_test.PageTest):
77a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      def __init__(self, *args):
78a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        super(Test, self).__init__(*args)
79a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        self.run_count = 0
80a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      def RunTest(self, *_):
81a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        old_run_count = self.run_count
82a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        self.run_count += 1
83a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        if old_run_count == 0:
84a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)          raise ExpectedException()
85a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
86a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    options = options_for_unittests.GetCopy()
87a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    options.output_format = 'none'
88a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    test = Test('RunTest')
89a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    results = page_runner.Run(test, ps, expectations, options)
90a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    self.assertEquals(2, test.run_count)
91a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    self.assertEquals(1, len(results.successes))
92a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    self.assertEquals(1, len(results.failures))
93a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  def testHandlingOfCrashedTabWithExpectedFailure(self):
953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ps = page_set.PageSet()
963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    expectations = test_expectations.TestExpectations()
973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    expectations.Fail('chrome://crash')
983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    page1 = page_module.Page('chrome://crash', ps)
993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ps.pages.append(page1)
1003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    class Test(page_test.PageTest):
102a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      def RunTest(self, *_):
1033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        pass
1043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    options = options_for_unittests.GetCopy()
1063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    options.output_format = 'none'
107a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    results = page_runner.Run(
108a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        Test('RunTest'), ps, expectations, options)
1093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    self.assertEquals(1, len(results.successes))
1103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    self.assertEquals(0, len(results.failures))
1113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    self.assertEquals(0, len(results.errors))
1123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  def testDiscardFirstResult(self):
114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ps = page_set.PageSet()
115ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    expectations = test_expectations.TestExpectations()
116a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    ps.pages.append(page_module.Page(
1174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        'file://blank.html', ps, base_dir=util.GetUnittestDataDir()))
118a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    ps.pages.append(page_module.Page(
1194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        'file://blank.html', ps, base_dir=util.GetUnittestDataDir()))
120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
121ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    class Measurement(page_measurement.PageMeasurement):
122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      @property
123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      def discard_first_result(self):
124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        return True
125ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      def MeasurePage(self, *args):
126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        pass
127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    options = options_for_unittests.GetCopy()
1297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    options.output_format = 'none'
1308bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    options.reset_results = None
1318bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    options.upload_results = None
1328bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    options.results_label = None
133a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
134a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    options.repeat_options.page_repeat_iters = 1
135a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    options.repeat_options.pageset_repeat_iters = 1
136ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    results = page_runner.Run(Measurement(), ps, expectations, options)
13790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    self.assertEquals(0, len(results.successes))
13890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    self.assertEquals(0, len(results.failures))
139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
140a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    options.repeat_options.page_repeat_iters = 1
141a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    options.repeat_options.pageset_repeat_iters = 2
142ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    results = page_runner.Run(Measurement(), ps, expectations, options)
143a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    self.assertEquals(2, len(results.successes))
144a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    self.assertEquals(0, len(results.failures))
145a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
146a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    options.repeat_options.page_repeat_iters = 2
147a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    options.repeat_options.pageset_repeat_iters = 1
148ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    results = page_runner.Run(Measurement(), ps, expectations, options)
149a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    self.assertEquals(2, len(results.successes))
150a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    self.assertEquals(0, len(results.failures))
151a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
152ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    options.output_format = 'html'
153ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    options.repeat_options.page_repeat_iters = 1
154ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    options.repeat_options.pageset_repeat_iters = 1
155ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    results = page_runner.Run(Measurement(), ps, expectations, options)
156ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    self.assertEquals(0, len(results.successes))
157ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    self.assertEquals(0, len(results.failures))
158ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
15990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  def testCredentialsWhenLoginFails(self):
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    credentials_backend = StubCredentialsBackend(login_return_value=False)
1617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    did_run = self.runCredentialsTest(credentials_backend)
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    assert credentials_backend.did_get_login == True
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    assert credentials_backend.did_get_login_no_longer_needed == False
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    assert did_run == False
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  def testCredentialsWhenLoginSucceeds(self):
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    credentials_backend = StubCredentialsBackend(login_return_value=True)
1687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    did_run = self.runCredentialsTest(credentials_backend)
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    assert credentials_backend.did_get_login == True
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    assert credentials_backend.did_get_login_no_longer_needed == True
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    assert did_run
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def runCredentialsTest(self, # pylint: disable=R0201
1747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                         credentials_backend):
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ps = page_set.PageSet()
176ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    expectations = test_expectations.TestExpectations()
17790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    page = page_module.Page(
1784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        'file://blank.html', ps, base_dir=util.GetUnittestDataDir())
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    page.credentials = "test"
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ps.pages.append(page)
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    did_run = [False]
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    try:
18590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      with tempfile.NamedTemporaryFile(delete=False) as f:
18690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        f.write(SIMPLE_CREDENTIALS_STRING)
18790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        ps.credentials_path = f.name
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      class TestThatInstallsCredentialsBackend(page_test.PageTest):
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        def __init__(self, credentials_backend):
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          super(TestThatInstallsCredentialsBackend, self).__init__('RunTest')
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          self._credentials_backend = credentials_backend
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
194a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        def DidStartBrowser(self, browser):
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          browser.credentials.AddBackend(self._credentials_backend)
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        def RunTest(self, page, tab, results): # pylint: disable=W0613,R0201
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          did_run[0] = True
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      test = TestThatInstallsCredentialsBackend(credentials_backend)
2017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      options = options_for_unittests.GetCopy()
2027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      options.output_format = 'none'
203ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      page_runner.Run(test, ps, expectations, options)
20490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    finally:
20590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      os.remove(f.name)
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return did_run[0]
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def testUserAgent(self):
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ps = page_set.PageSet()
211ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    expectations = test_expectations.TestExpectations()
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    page = page_module.Page(
2134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        'file://blank.html', ps, base_dir=util.GetUnittestDataDir())
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ps.pages.append(page)
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ps.user_agent_type = 'tablet'
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    class TestUserAgent(page_test.PageTest):
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      def RunTest(self, page, tab, results): # pylint: disable=W0613,R0201
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        actual_user_agent = tab.EvaluateJavaScript('window.navigator.userAgent')
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        expected_user_agent = user_agent.UA_TYPE_MAPPING['tablet']
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        assert actual_user_agent.strip() == expected_user_agent
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        # This is so we can check later that the test actually made it into this
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        # function. Previously it was timing out before even getting here, which
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        # should fail, but since it skipped all the asserts, it slipped by.
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self.hasRun = True # pylint: disable=W0201
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    test = TestUserAgent('RunTest')
2297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    options = options_for_unittests.GetCopy()
2307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    options.output_format = 'none'
231ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    page_runner.Run(test, ps, expectations, options)
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self.assertTrue(hasattr(test, 'hasRun') and test.hasRun)
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  # Ensure that page_runner forces exactly 1 tab before running a page.
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def testOneTab(self):
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ps = page_set.PageSet()
238ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    expectations = test_expectations.TestExpectations()
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    page = page_module.Page(
2404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        'file://blank.html', ps, base_dir=util.GetUnittestDataDir())
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ps.pages.append(page)
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    class TestOneTab(page_test.PageTest):
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      def __init__(self,
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   test_method_name,
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   action_name_to_run='',
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   needs_browser_restart_after_each_run=False):
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        super(TestOneTab, self).__init__(test_method_name, action_name_to_run,
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                         needs_browser_restart_after_each_run)
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self._browser = None
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
252a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      def DidStartBrowser(self, browser):
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self._browser = browser
25490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        if self._browser.supports_tab_control:
25590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          self._browser.tabs.New()
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      def RunTest(self, page, tab, results): # pylint: disable=W0613,R0201
25890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        if not self._browser.supports_tab_control:
25990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          logging.warning('Browser does not support tab control, skipping test')
26090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          return
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        assert len(self._browser.tabs) == 1
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    test = TestOneTab('RunTest')
2647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    options = options_for_unittests.GetCopy()
2657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    options.output_format = 'none'
266ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    page_runner.Run(test, ps, expectations, options)
267a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
268a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  # Ensure that page_runner allows the test to customize the browser before it
269a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  # launches.
270a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  def testBrowserBeforeLaunch(self):
271a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    ps = page_set.PageSet()
272a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    expectations = test_expectations.TestExpectations()
273a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    page = page_module.Page(
2744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        'file://blank.html', ps, base_dir=util.GetUnittestDataDir())
275a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    ps.pages.append(page)
276a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
277a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    class TestBeforeLaunch(page_test.PageTest):
278a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      def __init__(self,
279a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                   test_method_name,
280a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                   action_name_to_run=''):
281a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        super(TestBeforeLaunch, self).__init__(
282a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)            test_method_name, action_name_to_run, False)
283a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        self._did_call_will_start = False
284a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        self._did_call_did_start = False
285a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
286a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      def WillStartBrowser(self, browser):
287a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        self._did_call_will_start = True
288a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        # TODO(simonjam): Test that the profile is available.
289a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
290a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      def DidStartBrowser(self, browser):
291a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        assert self._did_call_will_start
292a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        self._did_call_did_start = True
293a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
294a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      def RunTest(self, page, tab, results): # pylint: disable=W0613,R0201
295a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        assert self._did_call_did_start
296a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
297a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    test = TestBeforeLaunch('RunTest')
298a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    options = options_for_unittests.GetCopy()
299a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    options.output_format = 'none'
300a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    page_runner.Run(test, ps, expectations, options)
301