page_runner_unittest.py revision a36e5920737c6adbddd3e43b760e5de8431db6e0
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
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)from telemetry.page import page_set
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)from telemetry.page import page_test
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)from telemetry.page import page_runner
15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)from telemetry.unittest import options_for_unittests
16ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochfrom telemetry.page import test_expectations
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SIMPLE_CREDENTIALS_STRING = """
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  "test": {
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    "username": "example",
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    "password": "asdf"
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)"""
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class StubCredentialsBackend(object):
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def __init__(self, login_return_value):
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self.did_get_login = False
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self.did_get_login_no_longer_needed = False
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self.login_return_value = login_return_value
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  @property
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def credentials_type(self): # pylint: disable=R0201
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return 'test'
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def LoginNeeded(self, tab, config): # pylint: disable=W0613
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self.did_get_login = True
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return self.login_return_value
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def LoginNoLongerNeeded(self, tab): # pylint: disable=W0613
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self.did_get_login_no_longer_needed = True
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class PageRunnerTests(unittest.TestCase):
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  # TODO(nduca): Move the basic "test failed, test succeeded" tests from
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  # page_measurement_unittest to here.
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def testHandlingOfCrashedTab(self):
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ps = page_set.PageSet()
49ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    expectations = test_expectations.TestExpectations()
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    page1 = page_module.Page('chrome://crash', ps)
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ps.pages.append(page1)
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    class Test(page_test.PageTest):
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      def RunTest(self, *args):
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        pass
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    options = options_for_unittests.GetCopy()
587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    options.output_format = 'none'
59ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    results = page_runner.Run(Test('RunTest'), ps, expectations, options)
6090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    self.assertEquals(0, len(results.successes))
6190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    self.assertEquals(1, len(results.errors))
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  def testDiscardFirstResult(self):
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ps = page_set.PageSet()
65ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    expectations = test_expectations.TestExpectations()
66a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    ps.pages.append(page_module.Page(
67a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        'file:///' + os.path.join(util.GetUnittestDataDir(), 'blank.html'),
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        ps,
69a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch        base_dir=os.path.dirname(__file__)))
70a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    ps.pages.append(page_module.Page(
71a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        'file:///' + os.path.join(util.GetUnittestDataDir(), 'blank.html'),
72a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch        ps,
73a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch        base_dir=os.path.dirname(__file__)))
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    class Test(page_test.PageTest):
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      @property
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      def discard_first_result(self):
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        return True
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      def RunTest(self, *args):
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        pass
81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    options = options_for_unittests.GetCopy()
837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    options.output_format = 'none'
84a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
85a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    options.repeat_options.page_repeat_iters = 1
86a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    options.repeat_options.pageset_repeat_iters = 1
87ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    results = page_runner.Run(Test('RunTest'), ps, expectations, options)
8890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    self.assertEquals(0, len(results.successes))
8990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    self.assertEquals(0, len(results.failures))
90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
91a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    options.repeat_options.page_repeat_iters = 1
92a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    options.repeat_options.pageset_repeat_iters = 2
93a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    results = page_runner.Run(Test('RunTest'), ps, expectations, options)
94a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    self.assertEquals(2, len(results.successes))
95a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    self.assertEquals(0, len(results.failures))
96a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
97a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    options.repeat_options.page_repeat_iters = 2
98a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    options.repeat_options.pageset_repeat_iters = 1
99a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    results = page_runner.Run(Test('RunTest'), ps, expectations, options)
100a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    self.assertEquals(2, len(results.successes))
101a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    self.assertEquals(0, len(results.failures))
102a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
10390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  def testCredentialsWhenLoginFails(self):
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    credentials_backend = StubCredentialsBackend(login_return_value=False)
1057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    did_run = self.runCredentialsTest(credentials_backend)
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    assert credentials_backend.did_get_login == True
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    assert credentials_backend.did_get_login_no_longer_needed == False
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    assert did_run == False
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  def testCredentialsWhenLoginSucceeds(self):
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    credentials_backend = StubCredentialsBackend(login_return_value=True)
1127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    did_run = self.runCredentialsTest(credentials_backend)
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    assert credentials_backend.did_get_login == True
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    assert credentials_backend.did_get_login_no_longer_needed == True
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    assert did_run
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def runCredentialsTest(self, # pylint: disable=R0201
1187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                         credentials_backend):
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ps = page_set.PageSet()
120ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    expectations = test_expectations.TestExpectations()
12190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    page = page_module.Page(
122a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        'file:///' + os.path.join(util.GetUnittestDataDir(), 'blank.html'),
12390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        ps,
12490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        base_dir=os.path.dirname(__file__))
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    page.credentials = "test"
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ps.pages.append(page)
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    did_run = [False]
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    try:
13190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      with tempfile.NamedTemporaryFile(delete=False) as f:
13290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        f.write(SIMPLE_CREDENTIALS_STRING)
13390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        ps.credentials_path = f.name
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      class TestThatInstallsCredentialsBackend(page_test.PageTest):
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        def __init__(self, credentials_backend):
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          super(TestThatInstallsCredentialsBackend, self).__init__('RunTest')
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          self._credentials_backend = credentials_backend
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
140a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        def DidStartBrowser(self, browser):
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          browser.credentials.AddBackend(self._credentials_backend)
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        def RunTest(self, page, tab, results): # pylint: disable=W0613,R0201
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          did_run[0] = True
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      test = TestThatInstallsCredentialsBackend(credentials_backend)
1477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      options = options_for_unittests.GetCopy()
1487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      options.output_format = 'none'
149ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      page_runner.Run(test, ps, expectations, options)
15090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    finally:
15190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      os.remove(f.name)
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return did_run[0]
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def testUserAgent(self):
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ps = page_set.PageSet()
157ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    expectations = test_expectations.TestExpectations()
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    page = page_module.Page(
159a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        'file:///' + os.path.join(util.GetUnittestDataDir(), 'blank.html'),
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ps,
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        base_dir=os.path.dirname(__file__))
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ps.pages.append(page)
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ps.user_agent_type = 'tablet'
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    class TestUserAgent(page_test.PageTest):
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      def RunTest(self, page, tab, results): # pylint: disable=W0613,R0201
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        actual_user_agent = tab.EvaluateJavaScript('window.navigator.userAgent')
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        expected_user_agent = user_agent.UA_TYPE_MAPPING['tablet']
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        assert actual_user_agent.strip() == expected_user_agent
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        # This is so we can check later that the test actually made it into this
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        # function. Previously it was timing out before even getting here, which
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        # should fail, but since it skipped all the asserts, it slipped by.
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self.hasRun = True # pylint: disable=W0201
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    test = TestUserAgent('RunTest')
1777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    options = options_for_unittests.GetCopy()
1787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    options.output_format = 'none'
179ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    page_runner.Run(test, ps, expectations, options)
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self.assertTrue(hasattr(test, 'hasRun') and test.hasRun)
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  # Ensure that page_runner forces exactly 1 tab before running a page.
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def testOneTab(self):
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ps = page_set.PageSet()
186ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    expectations = test_expectations.TestExpectations()
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    page = page_module.Page(
188a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        'file:///' + os.path.join(util.GetUnittestDataDir(), 'blank.html'),
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ps,
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        base_dir=os.path.dirname(__file__))
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ps.pages.append(page)
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    class TestOneTab(page_test.PageTest):
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      def __init__(self,
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   test_method_name,
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   action_name_to_run='',
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   needs_browser_restart_after_each_run=False):
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        super(TestOneTab, self).__init__(test_method_name, action_name_to_run,
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                         needs_browser_restart_after_each_run)
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self._browser = None
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
202a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      def DidStartBrowser(self, browser):
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self._browser = browser
20490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        if self._browser.supports_tab_control:
20590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          self._browser.tabs.New()
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      def RunTest(self, page, tab, results): # pylint: disable=W0613,R0201
20890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        if not self._browser.supports_tab_control:
20990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          logging.warning('Browser does not support tab control, skipping test')
21090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          return
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        assert len(self._browser.tabs) == 1
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    test = TestOneTab('RunTest')
2147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    options = options_for_unittests.GetCopy()
2157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    options.output_format = 'none'
216ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    page_runner.Run(test, ps, expectations, options)
217a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
218a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  # Ensure that page_runner allows the test to customize the browser before it
219a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  # launches.
220a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  def testBrowserBeforeLaunch(self):
221a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    ps = page_set.PageSet()
222a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    expectations = test_expectations.TestExpectations()
223a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    page = page_module.Page(
224a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        'file:///' + os.path.join(util.GetUnittestDataDir(), 'blank.html'),
225a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        ps,
226a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        base_dir=os.path.dirname(__file__))
227a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    ps.pages.append(page)
228a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
229a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    class TestBeforeLaunch(page_test.PageTest):
230a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      def __init__(self,
231a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                   test_method_name,
232a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                   action_name_to_run=''):
233a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        super(TestBeforeLaunch, self).__init__(
234a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)            test_method_name, action_name_to_run, False)
235a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        self._did_call_will_start = False
236a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        self._did_call_did_start = False
237a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
238a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      def WillStartBrowser(self, browser):
239a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        self._did_call_will_start = True
240a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        # TODO(simonjam): Test that the profile is available.
241a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
242a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      def DidStartBrowser(self, browser):
243a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        assert self._did_call_will_start
244a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        self._did_call_did_start = True
245a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
246a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      def RunTest(self, page, tab, results): # pylint: disable=W0613,R0201
247a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        assert self._did_call_did_start
248a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
249a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    test = TestBeforeLaunch('RunTest')
250a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    options = options_for_unittests.GetCopy()
251a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    options.output_format = 'none'
252a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    page_runner.Run(test, ps, expectations, options)
253