page_runner_unittest.py revision 6e8cce623b6e4fe0c9e4af605d675dd9d0338c38
15f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# Copyright 2014 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.
4a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)import logging
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import os
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import tempfile
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import unittest
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)from telemetry import benchmark
115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liufrom telemetry import decorators
12a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)from telemetry.core import browser_finder
135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)from telemetry.core import exceptions
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)from telemetry.core import user_agent
15a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)from telemetry.core import util
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)from telemetry.page import page as page_module
176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)from telemetry.page import page_runner
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)from telemetry.page import page_set
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)from telemetry.page import page_test
20ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochfrom telemetry.page import test_expectations
215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)from telemetry.results import results_options
225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)from telemetry.unittest import options_for_unittests
23116680a4aac90f2aa7413d9095a592090648e557Ben Murdochfrom telemetry.value import scalar
245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)from telemetry.value import string
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SIMPLE_CREDENTIALS_STRING = """
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  "test": {
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    "username": "example",
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    "password": "asdf"
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)"""
35a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
36a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
37a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)def SetUpPageRunnerArguments(options):
38a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  parser = options.CreateParser()
39a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  page_runner.AddCommandLineArgs(parser)
40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  options.MergeDefaultValues(parser.get_default_values())
41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  page_runner.ProcessCommandLineArgs(parser, options)
42a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class EmptyMetadataForTest(benchmark.BenchmarkMetadata):
445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  def __init__(self):
455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    super(EmptyMetadataForTest, self).__init__('')
46a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class StubCredentialsBackend(object):
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def __init__(self, login_return_value):
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self.did_get_login = False
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self.did_get_login_no_longer_needed = False
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self.login_return_value = login_return_value
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  @property
54010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  def credentials_type(self):
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return 'test'
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
57010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  def LoginNeeded(self, *_):
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self.did_get_login = True
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return self.login_return_value
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
61010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  def LoginNoLongerNeeded(self, _):
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self.did_get_login_no_longer_needed = True
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
64a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)def GetSuccessfulPageRuns(results):
665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return [run for run in results.all_page_runs if run.ok or run.skipped]
675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class PageRunnerTests(unittest.TestCase):
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  # TODO(nduca): Move the basic "test failed, test succeeded" tests from
716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  # page_test_unittest to here.
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def testHandlingOfCrashedTab(self):
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ps = page_set.PageSet()
75ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    expectations = test_expectations.TestExpectations()
76010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    page1 = page_module.Page('chrome://crash', ps)
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ps.pages.append(page1)
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    class Test(page_test.PageTest):
80010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      def ValidatePage(self, *args):
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        pass
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    options = options_for_unittests.GetCopy()
847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    options.output_format = 'none'
855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    options.suppress_gtest_report = True
86a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    SetUpPageRunnerArguments(options)
875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    results = results_options.CreateResults(EmptyMetadataForTest(), options)
885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    page_runner.Run(Test(), ps, expectations, options, results)
895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    self.assertEquals(0, len(GetSuccessfulPageRuns(results)))
90116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    self.assertEquals(1, len(results.failures))
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
92a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  def testHandlingOfTestThatRaisesWithNonFatalUnknownExceptions(self):
93a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ps = page_set.PageSet()
94a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    expectations = test_expectations.TestExpectations()
95a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ps.pages.append(page_module.Page(
96a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        'file://blank.html', ps, base_dir=util.GetUnittestDataDir()))
97a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ps.pages.append(page_module.Page(
98a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        'file://blank.html', ps, base_dir=util.GetUnittestDataDir()))
99a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
100a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    class ExpectedException(Exception):
101a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      pass
102a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
103a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    class Test(page_test.PageTest):
104a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      def __init__(self, *args):
105a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        super(Test, self).__init__(*args)
106a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        self.run_count = 0
107010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      def ValidatePage(self, *_):
108a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        old_run_count = self.run_count
109a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        self.run_count += 1
110a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        if old_run_count == 0:
111a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)          raise ExpectedException()
112a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
113a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    options = options_for_unittests.GetCopy()
114a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    options.output_format = 'none'
1155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    options.suppress_gtest_report = True
116010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    test = Test()
117a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    SetUpPageRunnerArguments(options)
1185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    results = results_options.CreateResults(EmptyMetadataForTest(), options)
1195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    page_runner.Run(test, ps, expectations, options, results)
120a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    self.assertEquals(2, test.run_count)
1215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    self.assertEquals(1, len(GetSuccessfulPageRuns(results)))
122a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    self.assertEquals(1, len(results.failures))
123a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
1243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  def testHandlingOfCrashedTabWithExpectedFailure(self):
1253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ps = page_set.PageSet()
1263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    expectations = test_expectations.TestExpectations()
1273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    expectations.Fail('chrome://crash')
1283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    page1 = page_module.Page('chrome://crash', ps)
1293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ps.pages.append(page1)
1303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    class Test(page_test.PageTest):
132010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      def ValidatePage(self, *_):
1333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        pass
1343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    options = options_for_unittests.GetCopy()
1363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    options.output_format = 'none'
1375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    options.suppress_gtest_report = True
138a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    SetUpPageRunnerArguments(options)
1395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    results = results_options.CreateResults(EmptyMetadataForTest(), options)
1405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    page_runner.Run(Test(), ps, expectations, options, results)
1415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    self.assertEquals(1, len(GetSuccessfulPageRuns(results)))
1423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    self.assertEquals(0, len(results.failures))
1433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  def testRetryOnBrowserCrash(self):
1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ps = page_set.PageSet()
1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    expectations = test_expectations.TestExpectations()
1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ps.pages.append(page_module.Page(
1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        'file://blank.html', ps, base_dir=util.GetUnittestDataDir()))
1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    class CrashyMeasurement(page_test.PageTest):
1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      has_crashed = False
1526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      def ValidateAndMeasurePage(self, page, tab, results):
1535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        # This value should be discarded on the first run when the
1545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        # browser crashed.
1555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        results.AddValue(
1565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            string.StringValue(page, 'test', 't', str(self.has_crashed)))
1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        if not self.has_crashed:
1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          self.has_crashed = True
159cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          raise exceptions.BrowserGoneException(tab.browser)
1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    options = options_for_unittests.GetCopy()
1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    options.output_format = 'csv'
1635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    options.suppress_gtest_report = True
1645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
165a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    SetUpPageRunnerArguments(options)
1665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    results = results_options.CreateResults(EmptyMetadataForTest(), options)
1675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    page_runner.Run(CrashyMeasurement(), ps, expectations, options, results)
1685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    self.assertEquals(1, len(GetSuccessfulPageRuns(results)))
1705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    self.assertEquals(0, len(results.failures))
1715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    self.assertEquals(1, len(results.all_page_specific_values))
1725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    self.assertEquals(
1735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        'True', results.all_page_specific_values[0].GetRepresentativeString())
1745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
175116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  @decorators.Disabled('xp')  # Flaky, http://crbug.com/390079.
176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  def testDiscardFirstResult(self):
177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ps = page_set.PageSet()
178ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    expectations = test_expectations.TestExpectations()
179a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    ps.pages.append(page_module.Page(
1804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        'file://blank.html', ps, base_dir=util.GetUnittestDataDir()))
181a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    ps.pages.append(page_module.Page(
1824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        'file://blank.html', ps, base_dir=util.GetUnittestDataDir()))
183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    class Measurement(page_test.PageTest):
185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      @property
186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      def discard_first_result(self):
187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        return True
1885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      def ValidateAndMeasurePage(self, page, _, results):
1905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        results.AddValue(string.StringValue(page, 'test', 't', page.url))
191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    options = options_for_unittests.GetCopy()
1937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    options.output_format = 'none'
1945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    options.suppress_gtest_report = True
1958bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    options.reset_results = None
1968bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    options.upload_results = None
1978bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    options.results_label = None
198a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
199a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    options.page_repeat = 1
200a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    options.pageset_repeat = 1
201a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    SetUpPageRunnerArguments(options)
2025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    results = results_options.CreateResults(EmptyMetadataForTest(), options)
2035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    page_runner.Run(Measurement(), ps, expectations, options, results)
2045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    self.assertEquals(0, len(GetSuccessfulPageRuns(results)))
20590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    self.assertEquals(0, len(results.failures))
2065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    self.assertEquals(0, len(results.all_page_specific_values))
207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
208a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    options.page_repeat = 1
209a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    options.pageset_repeat = 2
210a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    SetUpPageRunnerArguments(options)
2115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    results = results_options.CreateResults(EmptyMetadataForTest(), options)
2125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    page_runner.Run(Measurement(), ps, expectations, options, results)
2135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    self.assertEquals(2, len(GetSuccessfulPageRuns(results)))
214a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    self.assertEquals(0, len(results.failures))
2155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    self.assertEquals(2, len(results.all_page_specific_values))
216a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
217a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    options.page_repeat = 2
218a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    options.pageset_repeat = 1
219a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    SetUpPageRunnerArguments(options)
2205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    results = results_options.CreateResults(EmptyMetadataForTest(), options)
2215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    page_runner.Run(Measurement(), ps, expectations, options, results)
2225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    self.assertEquals(2, len(GetSuccessfulPageRuns(results)))
223a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    self.assertEquals(0, len(results.failures))
2245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    self.assertEquals(2, len(results.all_page_specific_values))
225a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
226ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    options.output_format = 'html'
2275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    options.suppress_gtest_report = True
228a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    options.page_repeat = 1
229a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    options.pageset_repeat = 1
230a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    SetUpPageRunnerArguments(options)
2315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    results = results_options.CreateResults(EmptyMetadataForTest(), options)
2325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    page_runner.Run(Measurement(), ps, expectations, options, results)
2335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    self.assertEquals(0, len(GetSuccessfulPageRuns(results)))
234ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    self.assertEquals(0, len(results.failures))
2355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    self.assertEquals(0, len(results.all_page_specific_values))
236ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
2375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  @decorators.Disabled('win')
2385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  def testPagesetRepeat(self):
2395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ps = page_set.PageSet()
2405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    expectations = test_expectations.TestExpectations()
2415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ps.pages.append(page_module.Page(
2425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        'file://blank.html', ps, base_dir=util.GetUnittestDataDir()))
2435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ps.pages.append(page_module.Page(
2445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        'file://green_rect.html', ps, base_dir=util.GetUnittestDataDir()))
2455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    class Measurement(page_test.PageTest):
2475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      i = 0
2486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      def ValidateAndMeasurePage(self, page, _, results):
2495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        self.i += 1
250116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        results.AddValue(scalar.ScalarValue(
251116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            page, 'metric', 'unit', self.i))
2525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    output_file = tempfile.NamedTemporaryFile(delete=False).name
2545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    try:
2555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      options = options_for_unittests.GetCopy()
2565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      options.output_format = 'buildbot'
2575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      options.output_file = output_file
2585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      options.suppress_gtest_report = True
2595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      options.reset_results = None
2605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      options.upload_results = None
2615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      options.results_label = None
2625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
263a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      options.page_repeat = 1
264a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      options.pageset_repeat = 2
265a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      SetUpPageRunnerArguments(options)
2665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      results = results_options.CreateResults(EmptyMetadataForTest(), options)
2675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      page_runner.Run(Measurement(), ps, expectations, options, results)
2685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      results.PrintSummary()
2695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      self.assertEquals(4, len(GetSuccessfulPageRuns(results)))
2705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      self.assertEquals(0, len(results.failures))
2715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      with open(output_file) as f:
2725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        stdout = f.read()
273cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      self.assertIn('RESULT metric: blank.html= [1,3] unit', stdout)
274cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      self.assertIn('RESULT metric: green_rect.html= [2,4] unit', stdout)
2755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      self.assertIn('*RESULT metric: metric= [1,2,3,4] unit', stdout)
2765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    finally:
2775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      # TODO(chrishenry): This is a HACK!!1 Really, the right way to
2785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      # do this is for page_runner (or output formatter) to close any
2795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      # files it has opened.
2805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      for formatter in results._output_formatters:  # pylint: disable=W0212
2815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        formatter.output_stream.close()
2825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      os.remove(output_file)
2835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
28490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  def testCredentialsWhenLoginFails(self):
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    credentials_backend = StubCredentialsBackend(login_return_value=False)
2867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    did_run = self.runCredentialsTest(credentials_backend)
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    assert credentials_backend.did_get_login == True
2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    assert credentials_backend.did_get_login_no_longer_needed == False
2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    assert did_run == False
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
29190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  def testCredentialsWhenLoginSucceeds(self):
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    credentials_backend = StubCredentialsBackend(login_return_value=True)
2937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    did_run = self.runCredentialsTest(credentials_backend)
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    assert credentials_backend.did_get_login == True
2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    assert credentials_backend.did_get_login_no_longer_needed == True
2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    assert did_run
2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
298010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  def runCredentialsTest(self, credentials_backend):
2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ps = page_set.PageSet()
300ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    expectations = test_expectations.TestExpectations()
30190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    page = page_module.Page(
3024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        'file://blank.html', ps, base_dir=util.GetUnittestDataDir())
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    page.credentials = "test"
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ps.pages.append(page)
3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    did_run = [False]
3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
30890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    try:
30990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      with tempfile.NamedTemporaryFile(delete=False) as f:
31090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        f.write(SIMPLE_CREDENTIALS_STRING)
31190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        ps.credentials_path = f.name
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      class TestThatInstallsCredentialsBackend(page_test.PageTest):
3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        def __init__(self, credentials_backend):
315010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          super(TestThatInstallsCredentialsBackend, self).__init__()
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          self._credentials_backend = credentials_backend
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
318a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        def DidStartBrowser(self, browser):
3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          browser.credentials.AddBackend(self._credentials_backend)
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
321010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        def ValidatePage(self, *_):
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          did_run[0] = True
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      test = TestThatInstallsCredentialsBackend(credentials_backend)
3257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      options = options_for_unittests.GetCopy()
3267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      options.output_format = 'none'
3275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      options.suppress_gtest_report = True
328a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      SetUpPageRunnerArguments(options)
3295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      results = results_options.CreateResults(EmptyMetadataForTest(), options)
3305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      page_runner.Run(test, ps, expectations, options, results)
33190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    finally:
33290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      os.remove(f.name)
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return did_run[0]
3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def testUserAgent(self):
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ps = page_set.PageSet()
338ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    expectations = test_expectations.TestExpectations()
3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    page = page_module.Page(
3404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        'file://blank.html', ps, base_dir=util.GetUnittestDataDir())
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ps.pages.append(page)
3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ps.user_agent_type = 'tablet'
3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    class TestUserAgent(page_test.PageTest):
345010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      def ValidatePage(self, _1, tab, _2):
3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        actual_user_agent = tab.EvaluateJavaScript('window.navigator.userAgent')
3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        expected_user_agent = user_agent.UA_TYPE_MAPPING['tablet']
3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        assert actual_user_agent.strip() == expected_user_agent
3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        # This is so we can check later that the test actually made it into this
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        # function. Previously it was timing out before even getting here, which
3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        # should fail, but since it skipped all the asserts, it slipped by.
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self.hasRun = True # pylint: disable=W0201
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
355010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    test = TestUserAgent()
3567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    options = options_for_unittests.GetCopy()
3577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    options.output_format = 'none'
3585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    options.suppress_gtest_report = True
359a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    SetUpPageRunnerArguments(options)
3605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    results = results_options.CreateResults(EmptyMetadataForTest(), options)
3615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    page_runner.Run(test, ps, expectations, options, results)
3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self.assertTrue(hasattr(test, 'hasRun') and test.hasRun)
3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  # Ensure that page_runner forces exactly 1 tab before running a page.
366116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  @decorators.Enabled('has tabs')
3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def testOneTab(self):
3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ps = page_set.PageSet()
369ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    expectations = test_expectations.TestExpectations()
3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    page = page_module.Page(
3714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        'file://blank.html', ps, base_dir=util.GetUnittestDataDir())
3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ps.pages.append(page)
3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    class TestOneTab(page_test.PageTest):
375010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      def __init__(self):
376010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        super(TestOneTab, self).__init__()
3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self._browser = None
3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
379a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      def DidStartBrowser(self, browser):
3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self._browser = browser
381116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        self._browser.tabs.New()
3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
383010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      def ValidatePage(self, *_):
3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        assert len(self._browser.tabs) == 1
3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
386010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    test = TestOneTab()
3877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    options = options_for_unittests.GetCopy()
3887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    options.output_format = 'none'
3895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    options.suppress_gtest_report = True
390a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    SetUpPageRunnerArguments(options)
3915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    results = results_options.CreateResults(EmptyMetadataForTest(), options)
3925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    page_runner.Run(test, ps, expectations, options, results)
393a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
394a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  # Ensure that page_runner allows the test to customize the browser before it
395a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  # launches.
396a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  def testBrowserBeforeLaunch(self):
397a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    ps = page_set.PageSet()
398a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    expectations = test_expectations.TestExpectations()
399a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    page = page_module.Page(
4004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        'file://blank.html', ps, base_dir=util.GetUnittestDataDir())
401a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    ps.pages.append(page)
402a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
403a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    class TestBeforeLaunch(page_test.PageTest):
404010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      def __init__(self):
405010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        super(TestBeforeLaunch, self).__init__()
406a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        self._did_call_will_start = False
407a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        self._did_call_did_start = False
408a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
409a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      def WillStartBrowser(self, browser):
410a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        self._did_call_will_start = True
411a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        # TODO(simonjam): Test that the profile is available.
412a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
413a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      def DidStartBrowser(self, browser):
414a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        assert self._did_call_will_start
415a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        self._did_call_did_start = True
416a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
417010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      def ValidatePage(self, *_):
418a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        assert self._did_call_did_start
419a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
420010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    test = TestBeforeLaunch()
421a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    options = options_for_unittests.GetCopy()
422a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    options.output_format = 'none'
4235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    options.suppress_gtest_report = True
424a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    SetUpPageRunnerArguments(options)
4255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    results = results_options.CreateResults(EmptyMetadataForTest(), options)
4265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    page_runner.Run(test, ps, expectations, options, results)
427a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
428a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  def testRunPageWithStartupUrl(self):
429a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ps = page_set.PageSet()
430a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    expectations = test_expectations.TestExpectations()
431a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    expectations = test_expectations.TestExpectations()
432a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    page = page_module.Page(
433a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        'file://blank.html', ps, base_dir=util.GetUnittestDataDir())
434a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    page.startup_url = 'about:blank'
435a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ps.pages.append(page)
436a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
4376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    class Measurement(page_test.PageTest):
438a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      def __init__(self):
439a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        super(Measurement, self).__init__()
440a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        self.browser_restarted = False
441a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
442effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      def CustomizeBrowserOptionsForSinglePage(self, ps, options):
443a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        self.browser_restarted = True
444effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        super(Measurement, self).CustomizeBrowserOptionsForSinglePage(ps,
445effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                                                      options)
4466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      def ValidateAndMeasurePage(self, page, tab, results):
447a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        pass
448a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
449a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    options = options_for_unittests.GetCopy()
450a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    options.page_repeat = 2
451a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    options.output_format = 'none'
4525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    options.suppress_gtest_report = True
453a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    if not browser_finder.FindBrowser(options):
454a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return
455a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    test = Measurement()
456effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    SetUpPageRunnerArguments(options)
4575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    results = results_options.CreateResults(EmptyMetadataForTest(), options)
4585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    page_runner.Run(test, ps, expectations, options, results)
459a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    self.assertEquals('about:blank', options.browser_options.startup_url)
460a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    self.assertTrue(test.browser_restarted)
461a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
462a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  # Ensure that page_runner calls cleanUp when a page run fails.
463a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  def testCleanUpPage(self):
464a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ps = page_set.PageSet()
465a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    expectations = test_expectations.TestExpectations()
466a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    page = page_module.Page(
467a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        'file://blank.html', ps, base_dir=util.GetUnittestDataDir())
468a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ps.pages.append(page)
469a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
470a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    class Test(page_test.PageTest):
471010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      def __init__(self):
472010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        super(Test, self).__init__()
473a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        self.did_call_clean_up = False
474a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
475010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      def ValidatePage(self, *_):
476cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        raise exceptions.IntentionalException
477a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
478a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      def CleanUpAfterPage(self, page, tab):
479a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        self.did_call_clean_up = True
480a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
481a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
482010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    test = Test()
483a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    options = options_for_unittests.GetCopy()
484a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    options.output_format = 'none'
4855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    options.suppress_gtest_report = True
486a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    SetUpPageRunnerArguments(options)
4875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    results = results_options.CreateResults(EmptyMetadataForTest(), options)
4885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    page_runner.Run(test, ps, expectations, options, results)
489a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    assert test.did_call_clean_up
490cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
491cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  # Ensure skipping the test if page cannot be run on the browser
492cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  def testPageCannotRunOnBrowser(self):
493cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    ps = page_set.PageSet()
494cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    expectations = test_expectations.TestExpectations()
495cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
496cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    class PageThatCannotRunOnBrowser(page_module.Page):
497cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
498cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      def __init__(self):
499cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        super(PageThatCannotRunOnBrowser, self).__init__(
500cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            url='file://blank.html', page_set=ps,
501cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            base_dir=util.GetUnittestDataDir())
502cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
503cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      def CanRunOnBrowser(self, _):
504cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        return False
505cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
506cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      def ValidatePage(self, _):
507cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        pass
508cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
509cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    class Test(page_test.PageTest):
510cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      def __init__(self, *args, **kwargs):
511cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        super(Test, self).__init__(*args, **kwargs)
512cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        self.will_navigate_to_page_called = False
513cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
514cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      def ValidatePage(self, *args):
515cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        pass
516cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
517cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      def WillNavigateToPage(self, _1, _2):
518cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        self.will_navigate_to_page_called = True
519cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
520cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    test = Test()
521cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    options = options_for_unittests.GetCopy()
522cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    options.output_format = 'none'
5235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    options.suppress_gtest_report = True
524cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    SetUpPageRunnerArguments(options)
5255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    results = results_options.CreateResults(EmptyMetadataForTest(), options)
5265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    page_runner.Run(test, ps, expectations, options, results)
527cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    self.assertFalse(test.will_navigate_to_page_called)
5285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    self.assertEquals(0, len(GetSuccessfulPageRuns(results)))
529cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    self.assertEquals(0, len(results.failures))
530f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
531f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  def TestUseLiveSitesFlag(self, options, expect_from_archive):
532f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    ps = page_set.PageSet(
533f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      file_path=util.GetUnittestDataDir(),
534f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      archive_data_file='data/archive_blank.json')
535f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    ps.pages.append(page_module.Page(
536f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      'file://blank.html', ps, base_dir=ps.base_dir))
537f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    expectations = test_expectations.TestExpectations()
538f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
5396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    class ArchiveTest(page_test.PageTest):
540f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      def __init__(self):
541f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        super(ArchiveTest, self).__init__()
542f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        self.is_page_from_archive = False
543f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        self.archive_path_exist = True
544f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
545f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      def WillNavigateToPage(self, page, tab):
546f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        self.archive_path_exist = (page.archive_path
547f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                   and os.path.isfile(page.archive_path))
548f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        self.is_page_from_archive = (
549f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          tab.browser._wpr_server is not None) # pylint: disable=W0212
550f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
5516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      def ValidateAndMeasurePage(self, _, __, results):
552f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        pass
553f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
554f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    test = ArchiveTest()
5555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    results = results_options.CreateResults(EmptyMetadataForTest(), options)
5565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    try:
5575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      page_runner.Run(test, ps, expectations, options, results)
5585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      if expect_from_archive and not test.archive_path_exist:
5595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        logging.warning('archive path did not exist, asserting that page '
5605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                        'is from archive is skipped.')
5615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        return
5625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      self.assertEquals(expect_from_archive, test.is_page_from_archive)
5635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    finally:
5645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      for p in ps:
5655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        if os.path.isfile(p.archive_path):
5665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          os.remove(p.archive_path)
5675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
568f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
569f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  def testUseLiveSitesFlagSet(self):
570f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    options = options_for_unittests.GetCopy()
571f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    options.output_format = 'none'
5725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    options.suppress_gtest_report = True
573f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    options.use_live_sites = True
574f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    SetUpPageRunnerArguments(options)
575f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    self.TestUseLiveSitesFlag(options, expect_from_archive=False)
576f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
577f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  def testUseLiveSitesFlagUnset(self):
578f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    options = options_for_unittests.GetCopy()
579f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    options.output_format = 'none'
5805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    options.suppress_gtest_report = True
581f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    SetUpPageRunnerArguments(options)
582f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    self.TestUseLiveSitesFlag(options, expect_from_archive=True)
583116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
584116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  def testMaxFailuresOptionIsRespected(self):
585116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    class TestPage(page_module.Page):
586116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      def __init__(self, *args, **kwargs):
587116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        super(TestPage, self).__init__(*args, **kwargs)
588116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        self.was_run = False
589116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
590116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      def RunNavigateSteps(self, action_runner):
591116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        self.was_run = True
592116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        raise Exception('Test exception')
593116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
594116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    class Test(page_test.PageTest):
595116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      def ValidatePage(self, *args):
596116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        pass
597116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
598116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    ps = page_set.PageSet()
599116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    expectations = test_expectations.TestExpectations()
600116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    page1 = TestPage(
601116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        'file://blank.html', ps, base_dir=util.GetUnittestDataDir())
602116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    ps.pages.append(page1)
603116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    page2 = TestPage(
604116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        'file://blank.html', ps, base_dir=util.GetUnittestDataDir())
605116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    ps.pages.append(page2)
606116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    page3 = TestPage(
607116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        'file://blank.html', ps, base_dir=util.GetUnittestDataDir())
608116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    ps.pages.append(page3)
609116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    page4 = TestPage(
610116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        'file://blank.html', ps, base_dir=util.GetUnittestDataDir())
611116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    ps.pages.append(page4)
612116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    page5 = TestPage(
613116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        'file://blank.html', ps, base_dir=util.GetUnittestDataDir())
614116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    ps.pages.append(page5)
615116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
616116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    options = options_for_unittests.GetCopy()
617116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    options.output_format = 'none'
6185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    options.suppress_gtest_report = True
619116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    SetUpPageRunnerArguments(options)
6205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    results = results_options.CreateResults(EmptyMetadataForTest(), options)
6215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    page_runner.Run(Test(max_failures=2), ps, expectations, options, results)
6225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    self.assertEquals(0, len(GetSuccessfulPageRuns(results)))
623116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    # Runs up to max_failures+1 failing tests before stopping, since
624116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    # every tests after max_failures failures have been encountered
625116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    # may all be passing.
626116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    self.assertEquals(3, len(results.failures))
627116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    self.assertTrue(page1.was_run)
628116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    self.assertTrue(page2.was_run)
629116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    self.assertTrue(page3.was_run)
630116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    self.assertFalse(page4.was_run)
631116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    self.assertFalse(page5.was_run)
632