blob: e14681e2d261409c8be9ffd2ea686bcc91047193 [file] [log] [blame]
# Copyright 2014 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import os
import sys
from telemetry import benchmark
from telemetry import story
from telemetry.core import util
from telemetry import decorators
from telemetry.page import page as page_module
from telemetry.page import page_test
from telemetry import record_wpr
from telemetry.testing import options_for_unittests
from telemetry.testing import tab_test_case
from telemetry.util import wpr_modes
class MockPage(page_module.Page):
def __init__(self, story_set, url):
super(MockPage, self).__init__(url=url,
page_set=story_set,
base_dir=util.GetUnittestDataDir())
self.func_calls = []
def RunNavigateSteps(self, action_runner):
self.func_calls.append('RunNavigateSteps')
super(MockPage, self).RunNavigateSteps(action_runner)
def RunPageInteractions(self, _):
self.func_calls.append('RunPageInteractions')
def RunSmoothness(self, _):
self.func_calls.append('RunSmoothness')
class MockStorySet(story.StorySet):
def __init__(self, url=''):
super(MockStorySet, self).__init__(
archive_data_file='data/archive_files/test.json')
self.AddStory(MockPage(self, url))
class MockPageTest(page_test.PageTest):
def __init__(self):
super(MockPageTest, self).__init__()
self._action_name_to_run = "RunPageInteractions"
self.func_calls = []
def CustomizeBrowserOptions(self, options):
self.func_calls.append('CustomizeBrowserOptions')
def WillNavigateToPage(self, page, tab):
self.func_calls.append('WillNavigateToPage')
def DidNavigateToPage(self, page, tab):
self.func_calls.append('DidNavigateToPage')
def ValidateAndMeasurePage(self, page, tab, results):
self.func_calls.append('ValidateAndMeasurePage')
def WillStartBrowser(self, platform):
self.func_calls.append('WillStartBrowser')
def DidStartBrowser(self, browser):
self.func_calls.append('DidStartBrowser')
class MockBenchmark(benchmark.Benchmark):
test = MockPageTest
mock_story_set = None
@classmethod
def AddBenchmarkCommandLineArgs(cls, group):
group.add_option('', '--mock-benchmark-url', action='store', type='string')
def CreateStorySet(self, options):
kwargs = {}
if options.mock_benchmark_url:
kwargs['url'] = options.mock_benchmark_url
self.mock_story_set = MockStorySet(**kwargs)
return self.mock_story_set
class RecordWprUnitTests(tab_test_case.TabTestCase):
_base_dir = util.GetUnittestDataDir()
_test_data_dir = os.path.join(util.GetUnittestDataDir(), 'page_tests')
@classmethod
def setUpClass(cls):
sys.path.extend([cls._base_dir, cls._test_data_dir])
super(RecordWprUnitTests, cls).setUpClass()
cls._url = cls.UrlOfUnittestFile('blank.html')
cls._test_options = options_for_unittests.GetCopy()
# When the RecorderPageTest is created from a PageSet, we do not have a
# PageTest to use. In this case, we will record every available action.
def testRunPage_AllActions(self):
record_page_test = record_wpr.RecorderPageTest()
page = MockPage(story_set=MockStorySet(url=self._url), url=self._url)
record_page_test.RunNavigateSteps(page, self._tab)
self.assertTrue('RunNavigateSteps' in page.func_calls)
# When the RecorderPageTest is created from a Benchmark, the benchmark will
# have a PageTest, specified by its test attribute.
def testRunPage_OnlyRunBenchmarkAction(self):
record_page_test = record_wpr.RecorderPageTest()
record_page_test.page_test = MockBenchmark().test()
page = MockPage(story_set=MockStorySet(url=self._url), url=self._url)
record_page_test.ValidateAndMeasurePage(page, self._tab, results=None)
def testRunPage_CallBenchmarksPageTestsFunctions(self):
record_page_test = record_wpr.RecorderPageTest()
record_page_test.page_test = MockBenchmark().test()
page = MockPage(story_set=MockStorySet(url=self._url), url=self._url)
record_page_test.ValidateAndMeasurePage(page, self._tab, results=None)
self.assertEqual(1, len(record_page_test.page_test.func_calls))
self.assertEqual('ValidateAndMeasurePage',
record_page_test.page_test.func_calls[0])
def GetBrowserDeviceFlags(self):
return ['--browser', self._browser.browser_type,
'--remote', self._test_options.cros_remote,
'--device', self._device]
@decorators.Disabled('chromeos') # crbug.com/404868.
def testWprRecorderWithPageSet(self):
flags = self.GetBrowserDeviceFlags()
mock_story_set = MockStorySet(url=self._url)
wpr_recorder = record_wpr.WprRecorder(self._test_data_dir,
mock_story_set, flags)
results = wpr_recorder.CreateResults()
wpr_recorder.Record(results)
self.assertEqual(set(mock_story_set.stories), results.pages_that_succeeded)
def testWprRecorderWithBenchmark(self):
flags = self.GetBrowserDeviceFlags()
flags.extend(['--mock-benchmark-url', self._url])
mock_benchmark = MockBenchmark()
wpr_recorder = record_wpr.WprRecorder(self._test_data_dir, mock_benchmark,
flags)
results = wpr_recorder.CreateResults()
wpr_recorder.Record(results)
self.assertEqual(set(mock_benchmark.mock_story_set.stories),
results.pages_that_succeeded)
def testPageSetBaseDirFlag(self):
flags = self.GetBrowserDeviceFlags()
flags.extend(['--page-set-base-dir', self._test_data_dir,
'--mock-benchmark-url', self._url])
mock_benchmark = MockBenchmark()
wpr_recorder = record_wpr.WprRecorder(
'non-existent-dummy-dir', mock_benchmark, flags)
results = wpr_recorder.CreateResults()
wpr_recorder.Record(results)
self.assertEqual(set(mock_benchmark.mock_story_set.stories),
results.pages_that_succeeded)
def testCommandLineFlags(self):
flags = [
'--page-repeat', '2',
'--mock-benchmark-url', self._url,
'--upload',
]
wpr_recorder = record_wpr.WprRecorder(self._test_data_dir, MockBenchmark(),
flags)
# page_runner command-line args
self.assertEquals(2, wpr_recorder.options.page_repeat)
# benchmark command-line args
self.assertEquals(self._url, wpr_recorder.options.mock_benchmark_url)
# record_wpr command-line arg to upload to cloud-storage.
self.assertTrue(wpr_recorder.options.upload)
# invalid command-line args
self.assertFalse(hasattr(wpr_recorder.options, 'not_a_real_option'))
def testRecordingEnabled(self):
flags = ['--mock-benchmark-url', self._url]
wpr_recorder = record_wpr.WprRecorder(self._test_data_dir, MockBenchmark(),
flags)
self.assertEqual(wpr_modes.WPR_RECORD,
wpr_recorder.options.browser_options.wpr_mode)
# When the RecorderPageTest CustomizeBrowserOptions/WillStartBrowser/
# DidStartBrowser function is called, it forwards the call to the PageTest
def testRecorderPageTest_BrowserMethods(self):
flags = ['--mock-benchmark-url', self._url]
record_page_test = record_wpr.RecorderPageTest()
record_page_test.page_test = MockBenchmark().test()
wpr_recorder = record_wpr.WprRecorder(self._test_data_dir, MockBenchmark(),
flags)
record_page_test.CustomizeBrowserOptions(wpr_recorder.options)
record_page_test.WillStartBrowser(self._tab.browser.platform)
record_page_test.DidStartBrowser(self._tab.browser)
self.assertTrue(
'CustomizeBrowserOptions' in record_page_test.page_test.func_calls)
self.assertTrue('WillStartBrowser' in record_page_test.page_test.func_calls)
self.assertTrue('DidStartBrowser' in record_page_test.page_test.func_calls)