page_runner_unittest.py revision 3551c9c881056c480085172ff9840cab31610854
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)
653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  def testHandlingOfCrashedTabWithExpectedFailure(self):
663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ps = page_set.PageSet()
673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    expectations = test_expectations.TestExpectations()
683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    expectations.Fail('chrome://crash')
693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    page1 = page_module.Page('chrome://crash', ps)
703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ps.pages.append(page1)
713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    class Test(page_test.PageTest):
733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      def RunTest(self, *args):
743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        pass
753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    options = options_for_unittests.GetCopy()
773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    options.output_format = 'none'
783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    results = page_runner.Run(Test('RunTest'), ps, expectations, options)
793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    self.assertEquals(1, len(results.successes))
803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    self.assertEquals(0, len(results.failures))
813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    self.assertEquals(0, len(results.errors))
823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  def testDiscardFirstResult(self):
84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ps = page_set.PageSet()
85ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    expectations = test_expectations.TestExpectations()
86a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    ps.pages.append(page_module.Page(
873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'file:///blank.html', ps, base_dir=util.GetUnittestDataDir()))
88a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    ps.pages.append(page_module.Page(
893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'file:///blank.html', ps, base_dir=util.GetUnittestDataDir()))
90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
91ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    class Measurement(page_measurement.PageMeasurement):
92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      @property
93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      def discard_first_result(self):
94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        return True
95ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      def MeasurePage(self, *args):
96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        pass
97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    options = options_for_unittests.GetCopy()
997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    options.output_format = 'none'
100ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    options.reset_html_results = None
101a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
102a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    options.repeat_options.page_repeat_iters = 1
103a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    options.repeat_options.pageset_repeat_iters = 1
104ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    results = page_runner.Run(Measurement(), ps, expectations, options)
10590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    self.assertEquals(0, len(results.successes))
10690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    self.assertEquals(0, len(results.failures))
107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
108a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    options.repeat_options.page_repeat_iters = 1
109a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    options.repeat_options.pageset_repeat_iters = 2
110ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    results = page_runner.Run(Measurement(), ps, expectations, options)
111a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    self.assertEquals(2, len(results.successes))
112a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    self.assertEquals(0, len(results.failures))
113a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
114a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    options.repeat_options.page_repeat_iters = 2
115a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    options.repeat_options.pageset_repeat_iters = 1
116ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    results = page_runner.Run(Measurement(), ps, expectations, options)
117a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    self.assertEquals(2, len(results.successes))
118a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    self.assertEquals(0, len(results.failures))
119a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
120ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    options.output_format = 'html'
121ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    options.repeat_options.page_repeat_iters = 1
122ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    options.repeat_options.pageset_repeat_iters = 1
123ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    results = page_runner.Run(Measurement(), ps, expectations, options)
124ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    self.assertEquals(0, len(results.successes))
125ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    self.assertEquals(0, len(results.failures))
126ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
12790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  def testCredentialsWhenLoginFails(self):
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    credentials_backend = StubCredentialsBackend(login_return_value=False)
1297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    did_run = self.runCredentialsTest(credentials_backend)
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    assert credentials_backend.did_get_login == True
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    assert credentials_backend.did_get_login_no_longer_needed == False
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    assert did_run == False
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  def testCredentialsWhenLoginSucceeds(self):
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    credentials_backend = StubCredentialsBackend(login_return_value=True)
1367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    did_run = self.runCredentialsTest(credentials_backend)
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    assert credentials_backend.did_get_login == True
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    assert credentials_backend.did_get_login_no_longer_needed == True
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    assert did_run
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def runCredentialsTest(self, # pylint: disable=R0201
1427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                         credentials_backend):
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ps = page_set.PageSet()
144ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    expectations = test_expectations.TestExpectations()
14590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    page = page_module.Page(
1463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'file:///blank.html', ps, base_dir=util.GetUnittestDataDir())
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    page.credentials = "test"
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ps.pages.append(page)
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    did_run = [False]
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    try:
15390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      with tempfile.NamedTemporaryFile(delete=False) as f:
15490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        f.write(SIMPLE_CREDENTIALS_STRING)
15590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        ps.credentials_path = f.name
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      class TestThatInstallsCredentialsBackend(page_test.PageTest):
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        def __init__(self, credentials_backend):
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          super(TestThatInstallsCredentialsBackend, self).__init__('RunTest')
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          self._credentials_backend = credentials_backend
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
162a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        def DidStartBrowser(self, browser):
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          browser.credentials.AddBackend(self._credentials_backend)
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        def RunTest(self, page, tab, results): # pylint: disable=W0613,R0201
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          did_run[0] = True
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      test = TestThatInstallsCredentialsBackend(credentials_backend)
1697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      options = options_for_unittests.GetCopy()
1707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      options.output_format = 'none'
171ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      page_runner.Run(test, ps, expectations, options)
17290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    finally:
17390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      os.remove(f.name)
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return did_run[0]
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def testUserAgent(self):
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ps = page_set.PageSet()
179ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    expectations = test_expectations.TestExpectations()
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    page = page_module.Page(
1813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'file:///blank.html', ps, base_dir=util.GetUnittestDataDir())
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ps.pages.append(page)
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ps.user_agent_type = 'tablet'
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    class TestUserAgent(page_test.PageTest):
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      def RunTest(self, page, tab, results): # pylint: disable=W0613,R0201
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        actual_user_agent = tab.EvaluateJavaScript('window.navigator.userAgent')
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        expected_user_agent = user_agent.UA_TYPE_MAPPING['tablet']
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        assert actual_user_agent.strip() == expected_user_agent
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        # This is so we can check later that the test actually made it into this
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        # function. Previously it was timing out before even getting here, which
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        # should fail, but since it skipped all the asserts, it slipped by.
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self.hasRun = True # pylint: disable=W0201
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    test = TestUserAgent('RunTest')
1977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    options = options_for_unittests.GetCopy()
1987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    options.output_format = 'none'
199ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    page_runner.Run(test, ps, expectations, options)
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self.assertTrue(hasattr(test, 'hasRun') and test.hasRun)
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  # Ensure that page_runner forces exactly 1 tab before running a page.
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def testOneTab(self):
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ps = page_set.PageSet()
206ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    expectations = test_expectations.TestExpectations()
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    page = page_module.Page(
2083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'file:///blank.html', ps, base_dir=util.GetUnittestDataDir())
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ps.pages.append(page)
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    class TestOneTab(page_test.PageTest):
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      def __init__(self,
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   test_method_name,
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   action_name_to_run='',
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   needs_browser_restart_after_each_run=False):
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        super(TestOneTab, self).__init__(test_method_name, action_name_to_run,
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                         needs_browser_restart_after_each_run)
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self._browser = None
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
220a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      def DidStartBrowser(self, browser):
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self._browser = browser
22290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        if self._browser.supports_tab_control:
22390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          self._browser.tabs.New()
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      def RunTest(self, page, tab, results): # pylint: disable=W0613,R0201
22690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        if not self._browser.supports_tab_control:
22790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          logging.warning('Browser does not support tab control, skipping test')
22890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          return
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        assert len(self._browser.tabs) == 1
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    test = TestOneTab('RunTest')
2327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    options = options_for_unittests.GetCopy()
2337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    options.output_format = 'none'
234ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    page_runner.Run(test, ps, expectations, options)
235a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
236a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  # Ensure that page_runner allows the test to customize the browser before it
237a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  # launches.
238a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  def testBrowserBeforeLaunch(self):
239a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    ps = page_set.PageSet()
240a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    expectations = test_expectations.TestExpectations()
241a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    page = page_module.Page(
2423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'file:///blank.html', ps, base_dir=util.GetUnittestDataDir())
243a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    ps.pages.append(page)
244a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
245a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    class TestBeforeLaunch(page_test.PageTest):
246a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      def __init__(self,
247a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                   test_method_name,
248a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                   action_name_to_run=''):
249a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        super(TestBeforeLaunch, self).__init__(
250a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)            test_method_name, action_name_to_run, False)
251a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        self._did_call_will_start = False
252a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        self._did_call_did_start = False
253a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
254a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      def WillStartBrowser(self, browser):
255a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        self._did_call_will_start = True
256a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        # TODO(simonjam): Test that the profile is available.
257a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
258a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      def DidStartBrowser(self, browser):
259a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        assert self._did_call_will_start
260a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        self._did_call_did_start = True
261a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
262a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      def RunTest(self, page, tab, results): # pylint: disable=W0613,R0201
263a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        assert self._did_call_did_start
264a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
265a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    test = TestBeforeLaunch('RunTest')
266a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    options = options_for_unittests.GetCopy()
267a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    options.output_format = 'none'
268a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    page_runner.Run(test, ps, expectations, options)
269