page_runner_unittest.py revision 90dce4d38c5ff5333bea97d859d4e484e27edf0c
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 browser_finder
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)from telemetry.core import user_agent
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
1490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)from telemetry.page import page_test_results
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)from telemetry.page import page_runner
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)from telemetry.test import options_for_unittests
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()
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    page1 = page_module.Page('chrome://crash', ps)
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ps.pages.append(page1)
5190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    results = page_test_results.PageTestResults()
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)
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    with page_runner.PageRunner(ps) as runner:
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      options = options_for_unittests.GetCopy()
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      possible_browser = browser_finder.FindBrowser(options)
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      runner.Run(options, possible_browser, Test('RunTest'), results)
6190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    self.assertEquals(0, len(results.successes))
6290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    self.assertEquals(1, len(results.errors))
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  def testDiscardFirstResult(self):
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ps = page_set.PageSet()
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    page = page_module.Page(
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        'file:///' + os.path.join('..', '..', 'unittest_data', 'blank.html'),
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        ps,
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        base_dir=os.path.dirname(__file__))
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ps.pages.append(page)
7190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    results = page_test_results.PageTestResults()
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    class Test(page_test.PageTest):
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      @property
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      def discard_first_result(self):
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        return True
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      def RunTest(self, *args):
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        pass
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    with page_runner.PageRunner(ps) as runner:
81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      options = options_for_unittests.GetCopy()
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      possible_browser = browser_finder.FindBrowser(options)
83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      runner.Run(options, possible_browser, Test('RunTest'), results)
8490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    self.assertEquals(0, len(results.successes))
8590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    self.assertEquals(0, len(results.failures))
86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
8790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  def testCredentialsWhenLoginFails(self):
8890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    results = page_test_results.PageTestResults()
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    credentials_backend = StubCredentialsBackend(login_return_value=False)
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    did_run = self.runCredentialsTest(credentials_backend, results)
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    assert credentials_backend.did_get_login == True
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    assert credentials_backend.did_get_login_no_longer_needed == False
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    assert did_run == False
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  def testCredentialsWhenLoginSucceeds(self):
9690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    results = page_test_results.PageTestResults()
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    credentials_backend = StubCredentialsBackend(login_return_value=True)
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    did_run = self.runCredentialsTest(credentials_backend, results)
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    assert credentials_backend.did_get_login == True
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    assert credentials_backend.did_get_login_no_longer_needed == True
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    assert did_run
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def runCredentialsTest(self, # pylint: disable=R0201
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         credentials_backend,
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         results):
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ps = page_set.PageSet()
10790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    page = page_module.Page(
10890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        'file:///' + os.path.join('..', '..', 'unittest_data', 'blank.html'),
10990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        ps,
11090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        base_dir=os.path.dirname(__file__))
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    page.credentials = "test"
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ps.pages.append(page)
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    did_run = [False]
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    try:
11790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      with tempfile.NamedTemporaryFile(delete=False) as f:
11890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        f.write(SIMPLE_CREDENTIALS_STRING)
11990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        ps.credentials_path = f.name
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      class TestThatInstallsCredentialsBackend(page_test.PageTest):
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        def __init__(self, credentials_backend):
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          super(TestThatInstallsCredentialsBackend, self).__init__('RunTest')
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          self._credentials_backend = credentials_backend
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        def SetUpBrowser(self, browser):
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          browser.credentials.AddBackend(self._credentials_backend)
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        def RunTest(self, page, tab, results): # pylint: disable=W0613,R0201
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          did_run[0] = True
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      test = TestThatInstallsCredentialsBackend(credentials_backend)
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      with page_runner.PageRunner(ps) as runner:
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        options = options_for_unittests.GetCopy()
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        possible_browser = browser_finder.FindBrowser(options)
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        runner.Run(options, possible_browser, test, results)
13790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    finally:
13890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      os.remove(f.name)
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return did_run[0]
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def testUserAgent(self):
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ps = page_set.PageSet()
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    page = page_module.Page(
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        'file:///' + os.path.join('..', '..', 'unittest_data', 'blank.html'),
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ps,
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        base_dir=os.path.dirname(__file__))
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ps.pages.append(page)
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ps.user_agent_type = 'tablet'
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    class TestUserAgent(page_test.PageTest):
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      def RunTest(self, page, tab, results): # pylint: disable=W0613,R0201
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        actual_user_agent = tab.EvaluateJavaScript('window.navigator.userAgent')
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        expected_user_agent = user_agent.UA_TYPE_MAPPING['tablet']
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        assert actual_user_agent.strip() == expected_user_agent
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        # This is so we can check later that the test actually made it into this
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        # function. Previously it was timing out before even getting here, which
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        # should fail, but since it skipped all the asserts, it slipped by.
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self.hasRun = True # pylint: disable=W0201
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    test = TestUserAgent('RunTest')
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    with page_runner.PageRunner(ps) as runner:
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      options = options_for_unittests.GetCopy()
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      possible_browser = browser_finder.FindBrowser(options)
16690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      results = page_test_results.PageTestResults()
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      runner.Run(options, possible_browser, test, results)
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self.assertTrue(hasattr(test, 'hasRun') and test.hasRun)
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  # Ensure that page_runner forces exactly 1 tab before running a page.
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def testOneTab(self):
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ps = page_set.PageSet()
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    page = page_module.Page(
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        'file:///' + os.path.join('..', '..', 'unittest_data', 'blank.html'),
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ps,
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        base_dir=os.path.dirname(__file__))
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ps.pages.append(page)
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    class TestOneTab(page_test.PageTest):
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      def __init__(self,
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   test_method_name,
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   action_name_to_run='',
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   needs_browser_restart_after_each_run=False):
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        super(TestOneTab, self).__init__(test_method_name, action_name_to_run,
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                         needs_browser_restart_after_each_run)
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self._browser = None
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      def SetUpBrowser(self, browser):
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self._browser = browser
19190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        if self._browser.supports_tab_control:
19290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          self._browser.tabs.New()
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      def RunTest(self, page, tab, results): # pylint: disable=W0613,R0201
19590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        if not self._browser.supports_tab_control:
19690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          logging.warning('Browser does not support tab control, skipping test')
19790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          return
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        assert len(self._browser.tabs) == 1
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    test = TestOneTab('RunTest')
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    with page_runner.PageRunner(ps) as runner:
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      options = options_for_unittests.GetCopy()
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      possible_browser = browser_finder.FindBrowser(options)
20490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      results = page_test_results.PageTestResults()
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      runner.Run(options, possible_browser, test, results)
206