15f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# Copyright 2014 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# found in the LICENSE file.
43551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
56e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)"""Provide a TestCase base class for PageTest subclasses' unittests."""
66e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import unittest
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)from telemetry import benchmark
10cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)from telemetry.core import exceptions
113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)from telemetry.core import util
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)from telemetry.page import page as page_module
136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)from telemetry.page import page_runner
145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liufrom telemetry.page import page_set as page_set_module
154ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdochfrom telemetry.page import page_test
16ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochfrom telemetry.page import test_expectations
176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)from telemetry.results import results_options
18868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)from telemetry.unittest import options_for_unittests
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
21010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)class BasicTestPage(page_module.Page):
225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  def __init__(self, url, page_set, base_dir):
235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    super(BasicTestPage, self).__init__(url, page_set, base_dir)
245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  def RunSmoothness(self, action_runner):
26116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    interaction = action_runner.BeginGestureInteraction(
27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        'ScrollAction', is_smooth=True)
28116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    action_runner.ScrollPage()
29116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    interaction.End()
305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class EmptyMetadataForTest(benchmark.BenchmarkMetadata):
335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  def __init__(self):
345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    super(EmptyMetadataForTest, self).__init__('')
355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)class PageTestTestCase(unittest.TestCase):
386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  """A base class to simplify writing unit tests for PageTest subclasses."""
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def CreatePageSetFromFileInUnittestDataDir(self, test_filename):
415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    ps = self.CreateEmptyPageSet()
425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    page = BasicTestPage('file://' + test_filename, ps, base_dir=ps.base_dir)
435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    ps.AddPage(page)
445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    return ps
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  def CreateEmptyPageSet(self):
473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    base_dir = util.GetUnittestDataDir()
485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    ps = page_set_module.PageSet(file_path=base_dir)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ps
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
51ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  def RunMeasurement(self, measurement, ps,
52ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      expectations=test_expectations.TestExpectations(),
53ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      options=None):
54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    """Runs a measurement against a pageset, returning the rows its outputs."""
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if options is None:
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      options = options_for_unittests.GetCopy()
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert options
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    temp_parser = options.CreateParser()
59a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    page_runner.AddCommandLineArgs(temp_parser)
60a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    measurement.AddCommandLineArgs(temp_parser)
61effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    measurement.SetArgumentDefaults(temp_parser)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    defaults = temp_parser.get_default_values()
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for k, v in defaults.__dict__.items():
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if hasattr(options, k):
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        continue
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      setattr(options, k, v)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    measurement.CustomizeBrowserOptions(options.browser_options)
697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    options.output_file = None
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    options.output_formats = ['none']
715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    options.suppress_gtest_report = True
727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    options.output_trace_tag = None
73a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    page_runner.ProcessCommandLineArgs(temp_parser, options)
74a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    measurement.ProcessCommandLineArgs(temp_parser, options)
755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    results = results_options.CreateResults(EmptyMetadataForTest(), options)
765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    page_runner.Run(measurement, ps, expectations, options, results)
775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return results
78effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
79effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  def TestTracingCleanedUp(self, measurement_class, options=None):
80effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    ps = self.CreatePageSetFromFileInUnittestDataDir('blank.html')
81effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    start_tracing_called = [False]
82effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    stop_tracing_called = [False]
83effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
84effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    class BuggyMeasurement(measurement_class):
85effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      def __init__(self, *args, **kwargs):
86effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        measurement_class.__init__(self, *args, **kwargs)
87effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
8803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      # Inject fake tracing methods to tracing_controller
89effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      def TabForPage(self, page, browser):
9003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        ActualStartTracing = browser.platform.tracing_controller.Start
91effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        def FakeStartTracing(*args, **kwargs):
92effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch          ActualStartTracing(*args, **kwargs)
93effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch          start_tracing_called[0] = True
94cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          raise exceptions.IntentionalException
95effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        browser.StartTracing = FakeStartTracing
96effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
9703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        ActualStopTracing = browser.platform.tracing_controller.Stop
98effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        def FakeStopTracing(*args, **kwargs):
9903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)          result = ActualStopTracing(*args, **kwargs)
100effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch          stop_tracing_called[0] = True
10103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)          return result
10203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        browser.platform.tracing_controller.Stop = FakeStopTracing
103effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
104effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        return measurement_class.TabForPage(self, page, browser)
105effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
106effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    measurement = BuggyMeasurement()
1074ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch    try:
1084ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      self.RunMeasurement(measurement, ps, options=options)
1094ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch    except page_test.TestNotSupportedOnPlatformFailure:
1104ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      pass
111effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    if start_tracing_called[0]:
112effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      self.assertTrue(stop_tracing_called[0])
113