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