page_runner_unittest.py revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
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)
95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)from telemetry.core import exceptions
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)from telemetry.core import user_agent
11a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)from telemetry.core import util
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)from telemetry.page import page as page_module
13ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochfrom telemetry.page import page_measurement
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)from telemetry.page import page_set
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)from telemetry.page import page_test
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)from telemetry.page import page_runner
17ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochfrom telemetry.page import test_expectations
185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)from telemetry.unittest import options_for_unittests
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SIMPLE_CREDENTIALS_STRING = """
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  "test": {
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    "username": "example",
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    "password": "asdf"
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)"""
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class StubCredentialsBackend(object):
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def __init__(self, login_return_value):
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self.did_get_login = False
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self.did_get_login_no_longer_needed = False
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self.login_return_value = login_return_value
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  @property
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def credentials_type(self): # pylint: disable=R0201
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return 'test'
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def LoginNeeded(self, tab, config): # pylint: disable=W0613
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self.did_get_login = True
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return self.login_return_value
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def LoginNoLongerNeeded(self, tab): # pylint: disable=W0613
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self.did_get_login_no_longer_needed = True
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class PageRunnerTests(unittest.TestCase):
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  # TODO(nduca): Move the basic "test failed, test succeeded" tests from
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  # page_measurement_unittest to here.
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def testHandlingOfCrashedTab(self):
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ps = page_set.PageSet()
51ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    expectations = test_expectations.TestExpectations()
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    page1 = page_module.Page('chrome://crash', ps)
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ps.pages.append(page1)
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    class Test(page_test.PageTest):
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      def RunTest(self, *args):
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        pass
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    options = options_for_unittests.GetCopy()
607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    options.output_format = 'none'
61ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    results = page_runner.Run(Test('RunTest'), ps, expectations, options)
6290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    self.assertEquals(0, len(results.successes))
633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    self.assertEquals(0, len(results.failures))
6490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    self.assertEquals(1, len(results.errors))
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
66a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  def testHandlingOfTestThatRaisesWithNonFatalUnknownExceptions(self):
67a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ps = page_set.PageSet()
68a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    expectations = test_expectations.TestExpectations()
69a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ps.pages.append(page_module.Page(
70a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        'file://blank.html', ps, base_dir=util.GetUnittestDataDir()))
71a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ps.pages.append(page_module.Page(
72a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        'file://blank.html', ps, base_dir=util.GetUnittestDataDir()))
73a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
74a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    class ExpectedException(Exception):
75a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      pass
76a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
77a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    class Test(page_test.PageTest):
78a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      def __init__(self, *args):
79a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        super(Test, self).__init__(*args)
80a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        self.run_count = 0
81a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      def RunTest(self, *_):
82a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        old_run_count = self.run_count
83a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        self.run_count += 1
84a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        if old_run_count == 0:
85a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)          raise ExpectedException()
86a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
87a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    options = options_for_unittests.GetCopy()
88a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    options.output_format = 'none'
89a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    test = Test('RunTest')
90a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    results = page_runner.Run(test, ps, expectations, options)
91a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    self.assertEquals(2, test.run_count)
92a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    self.assertEquals(1, len(results.successes))
93a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    self.assertEquals(1, len(results.failures))
94a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  def testHandlingOfCrashedTabWithExpectedFailure(self):
963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ps = page_set.PageSet()
973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    expectations = test_expectations.TestExpectations()
983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    expectations.Fail('chrome://crash')
993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    page1 = page_module.Page('chrome://crash', ps)
1003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ps.pages.append(page1)
1013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    class Test(page_test.PageTest):
103a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      def RunTest(self, *_):
1043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        pass
1053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    options = options_for_unittests.GetCopy()
1073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    options.output_format = 'none'
108a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    results = page_runner.Run(
109a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        Test('RunTest'), ps, expectations, options)
1103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    self.assertEquals(1, len(results.successes))
1113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    self.assertEquals(0, len(results.failures))
1123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    self.assertEquals(0, len(results.errors))
1133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  def testRetryOnBrowserCrash(self):
1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ps = page_set.PageSet()
1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    expectations = test_expectations.TestExpectations()
1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ps.pages.append(page_module.Page(
1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        'file://blank.html', ps, base_dir=util.GetUnittestDataDir()))
1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    class CrashyMeasurement(page_measurement.PageMeasurement):
1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      has_crashed = False
1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      def MeasurePage(self, *_):
1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        if not self.has_crashed:
1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          self.has_crashed = True
1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          raise exceptions.BrowserGoneException()
1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    options = options_for_unittests.GetCopy()
1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    options.output_format = 'csv'
1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    results = page_runner.Run(CrashyMeasurement(), ps, expectations, options)
1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    self.assertEquals(1, len(results.successes))
1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    self.assertEquals(0, len(results.failures))
1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    self.assertEquals(0, len(results.errors))
1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  def testDiscardFirstResult(self):
137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ps = page_set.PageSet()
138ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    expectations = test_expectations.TestExpectations()
139a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    ps.pages.append(page_module.Page(
1404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        'file://blank.html', ps, base_dir=util.GetUnittestDataDir()))
141a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    ps.pages.append(page_module.Page(
1424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        'file://blank.html', ps, base_dir=util.GetUnittestDataDir()))
143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
144ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    class Measurement(page_measurement.PageMeasurement):
145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      @property
146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      def discard_first_result(self):
147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        return True
148ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      def MeasurePage(self, *args):
149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        pass
150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    options = options_for_unittests.GetCopy()
1527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    options.output_format = 'none'
1538bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    options.reset_results = None
1548bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    options.upload_results = None
1558bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    options.results_label = None
156a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
157a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    options.repeat_options.page_repeat_iters = 1
158a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    options.repeat_options.pageset_repeat_iters = 1
159ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    results = page_runner.Run(Measurement(), ps, expectations, options)
16090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    self.assertEquals(0, len(results.successes))
16190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    self.assertEquals(0, len(results.failures))
162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
163a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    options.repeat_options.page_repeat_iters = 1
164a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    options.repeat_options.pageset_repeat_iters = 2
165ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    results = page_runner.Run(Measurement(), ps, expectations, options)
166a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    self.assertEquals(2, len(results.successes))
167a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    self.assertEquals(0, len(results.failures))
168a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
169a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    options.repeat_options.page_repeat_iters = 2
170a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    options.repeat_options.pageset_repeat_iters = 1
171ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    results = page_runner.Run(Measurement(), ps, expectations, options)
172a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    self.assertEquals(2, len(results.successes))
173a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    self.assertEquals(0, len(results.failures))
174a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
175ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    options.output_format = 'html'
176ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    options.repeat_options.page_repeat_iters = 1
177ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    options.repeat_options.pageset_repeat_iters = 1
178ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    results = page_runner.Run(Measurement(), ps, expectations, options)
179ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    self.assertEquals(0, len(results.successes))
180ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    self.assertEquals(0, len(results.failures))
181ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  def testPagesetRepeat(self):
1835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ps = page_set.PageSet()
1845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    expectations = test_expectations.TestExpectations()
1855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ps.pages.append(page_module.Page(
1865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        'file://blank.html', ps, base_dir=util.GetUnittestDataDir()))
1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ps.pages.append(page_module.Page(
1885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        'file://green_rect.html', ps, base_dir=util.GetUnittestDataDir()))
1895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    class Measurement(page_measurement.PageMeasurement):
1915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      i = 0
1925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      def MeasurePage(self, _, __, results):
1935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        self.i += 1
1945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        results.Add('metric', 'unit', self.i)
1955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    output_file = tempfile.NamedTemporaryFile(delete=False).name
1975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    try:
1985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      options = options_for_unittests.GetCopy()
1995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      options.output_format = 'buildbot'
2005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      options.output_file = output_file
2015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      options.reset_results = None
2025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      options.upload_results = None
2035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      options.results_label = None
2045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      options.repeat_options.page_repeat_iters = 1
2065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      options.repeat_options.pageset_repeat_iters = 2
2075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      results = page_runner.Run(Measurement(), ps, expectations, options)
2085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      results.PrintSummary()
2095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      self.assertEquals(4, len(results.successes))
2105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      self.assertEquals(0, len(results.failures))
2115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      stdout = open(output_file).read()
2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      self.assertIn('RESULT metric_by_url: blank.html= [1,3] unit', stdout)
2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      self.assertIn('RESULT metric_by_url: green_rect.html= [2,4] unit', stdout)
2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      self.assertIn('*RESULT metric: metric= [1,2,3,4] unit', stdout)
2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    finally:
2165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      results._output_stream.close()  # pylint: disable=W0212
2175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      os.remove(output_file)
2185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
21990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  def testCredentialsWhenLoginFails(self):
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    credentials_backend = StubCredentialsBackend(login_return_value=False)
2217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    did_run = self.runCredentialsTest(credentials_backend)
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    assert credentials_backend.did_get_login == True
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    assert credentials_backend.did_get_login_no_longer_needed == False
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    assert did_run == False
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
22690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  def testCredentialsWhenLoginSucceeds(self):
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    credentials_backend = StubCredentialsBackend(login_return_value=True)
2287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    did_run = self.runCredentialsTest(credentials_backend)
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    assert credentials_backend.did_get_login == True
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    assert credentials_backend.did_get_login_no_longer_needed == True
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    assert did_run
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def runCredentialsTest(self, # pylint: disable=R0201
2347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                         credentials_backend):
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ps = page_set.PageSet()
236ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    expectations = test_expectations.TestExpectations()
23790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    page = page_module.Page(
2384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        'file://blank.html', ps, base_dir=util.GetUnittestDataDir())
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    page.credentials = "test"
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ps.pages.append(page)
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    did_run = [False]
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
24490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    try:
24590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      with tempfile.NamedTemporaryFile(delete=False) as f:
24690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        f.write(SIMPLE_CREDENTIALS_STRING)
24790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        ps.credentials_path = f.name
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      class TestThatInstallsCredentialsBackend(page_test.PageTest):
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        def __init__(self, credentials_backend):
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          super(TestThatInstallsCredentialsBackend, self).__init__('RunTest')
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          self._credentials_backend = credentials_backend
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
254a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        def DidStartBrowser(self, browser):
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          browser.credentials.AddBackend(self._credentials_backend)
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        def RunTest(self, page, tab, results): # pylint: disable=W0613,R0201
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          did_run[0] = True
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      test = TestThatInstallsCredentialsBackend(credentials_backend)
2617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      options = options_for_unittests.GetCopy()
2627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      options.output_format = 'none'
263ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      page_runner.Run(test, ps, expectations, options)
26490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    finally:
26590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      os.remove(f.name)
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return did_run[0]
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def testUserAgent(self):
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ps = page_set.PageSet()
271ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    expectations = test_expectations.TestExpectations()
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    page = page_module.Page(
2734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        'file://blank.html', ps, base_dir=util.GetUnittestDataDir())
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ps.pages.append(page)
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ps.user_agent_type = 'tablet'
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    class TestUserAgent(page_test.PageTest):
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      def RunTest(self, page, tab, results): # pylint: disable=W0613,R0201
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        actual_user_agent = tab.EvaluateJavaScript('window.navigator.userAgent')
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        expected_user_agent = user_agent.UA_TYPE_MAPPING['tablet']
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        assert actual_user_agent.strip() == expected_user_agent
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        # This is so we can check later that the test actually made it into this
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        # function. Previously it was timing out before even getting here, which
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        # should fail, but since it skipped all the asserts, it slipped by.
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self.hasRun = True # pylint: disable=W0201
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    test = TestUserAgent('RunTest')
2897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    options = options_for_unittests.GetCopy()
2907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    options.output_format = 'none'
291ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    page_runner.Run(test, ps, expectations, options)
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self.assertTrue(hasattr(test, 'hasRun') and test.hasRun)
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  # Ensure that page_runner forces exactly 1 tab before running a page.
2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def testOneTab(self):
2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ps = page_set.PageSet()
298ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    expectations = test_expectations.TestExpectations()
2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    page = page_module.Page(
3004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        'file://blank.html', ps, base_dir=util.GetUnittestDataDir())
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ps.pages.append(page)
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    class TestOneTab(page_test.PageTest):
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      def __init__(self,
3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   test_method_name,
3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   action_name_to_run='',
3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   needs_browser_restart_after_each_run=False):
3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        super(TestOneTab, self).__init__(test_method_name, action_name_to_run,
3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                         needs_browser_restart_after_each_run)
3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self._browser = None
3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
312a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      def DidStartBrowser(self, browser):
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self._browser = browser
31490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        if self._browser.supports_tab_control:
31590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          self._browser.tabs.New()
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      def RunTest(self, page, tab, results): # pylint: disable=W0613,R0201
31890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        if not self._browser.supports_tab_control:
31990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          logging.warning('Browser does not support tab control, skipping test')
32090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          return
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        assert len(self._browser.tabs) == 1
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    test = TestOneTab('RunTest')
3247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    options = options_for_unittests.GetCopy()
3257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    options.output_format = 'none'
326ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    page_runner.Run(test, ps, expectations, options)
327a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
328a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  # Ensure that page_runner allows the test to customize the browser before it
329a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  # launches.
330a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  def testBrowserBeforeLaunch(self):
331a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    ps = page_set.PageSet()
332a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    expectations = test_expectations.TestExpectations()
333a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    page = page_module.Page(
3344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        'file://blank.html', ps, base_dir=util.GetUnittestDataDir())
335a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    ps.pages.append(page)
336a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
337a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    class TestBeforeLaunch(page_test.PageTest):
338a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      def __init__(self,
339a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                   test_method_name,
340a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                   action_name_to_run=''):
341a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        super(TestBeforeLaunch, self).__init__(
342a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)            test_method_name, action_name_to_run, False)
343a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        self._did_call_will_start = False
344a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        self._did_call_did_start = False
345a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
346a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      def WillStartBrowser(self, browser):
347a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        self._did_call_will_start = True
348a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        # TODO(simonjam): Test that the profile is available.
349a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
350a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      def DidStartBrowser(self, browser):
351a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        assert self._did_call_will_start
352a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        self._did_call_did_start = True
353a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
354a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      def RunTest(self, page, tab, results): # pylint: disable=W0613,R0201
355a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        assert self._did_call_did_start
356a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
357a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    test = TestBeforeLaunch('RunTest')
358a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    options = options_for_unittests.GetCopy()
359a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    options.output_format = 'none'
360a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    page_runner.Run(test, ps, expectations, options)
361