blob: 701a1b30a6e09421557e8c8f2d9941c3c7d44e2c [file] [log] [blame]
# Copyright 2016 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 utils
from telemetry import page
from telemetry import story
from benchmarks.pagesets import media_router_page
from telemetry.core import exceptions
from telemetry.page import shared_page_state
from telemetry.util import js_template
SESSION_TIME = 300 # 5 minutes
class SharedState(shared_page_state.SharedPageState):
"""Shared state that restarts the browser for every single story."""
def __init__(self, test, finder_options, story_set):
super(SharedState, self).__init__(
test, finder_options, story_set)
def DidRunStory(self, results):
super(SharedState, self).DidRunStory(results)
self._StopBrowser()
class CastDialogPage(media_router_page.CastPage):
"""Cast page to open a cast-enabled page and open media router dialog."""
def __init__(self, page_set, url='file://basic_test.html',
shared_page_state_class=shared_page_state.SharedPageState):
super(CastDialogPage, self).__init__(
url=url, page_set=page_set,
shared_page_state_class=shared_page_state_class)
def RunPageInteractions(self, action_runner):
# Wait for 5s after Chrome is opened in order to get consistent results.
action_runner.Wait(5)
with action_runner.CreateInteraction('LaunchDialog'):
# Open dialog
action_runner.TapElement(selector='#start_session_button')
action_runner.Wait(5)
# Close media router dialog
for tab in action_runner.tab.browser.tabs:
if tab.url == 'chrome://media-router/':
self.CloseDialog(tab)
class CastIdlePage(CastDialogPage):
"""Cast page to open a cast-enabled page and do nothing."""
def __init__(self, page_set):
super(CastIdlePage, self).__init__(
page_set=page_set,
url='file://basic_test.html',
shared_page_state_class=SharedState)
def RunPageInteractions(self, action_runner):
# Wait for 5s after Chrome is opened in order to get consistent results.
action_runner.Wait(5)
with action_runner.CreateInteraction('Idle'):
action_runner.ExecuteJavaScript('collectPerfData();')
action_runner.Wait(SESSION_TIME)
class CastFlingingPage(media_router_page.CastPage):
"""Cast page to fling a video to Chromecast device."""
def __init__(self, page_set):
super(CastFlingingPage, self).__init__(
page_set=page_set,
url='file://basic_test.html#flinging',
shared_page_state_class=SharedState)
def RunPageInteractions(self, action_runner):
sink_name = self._GetDeviceName()
# Wait for 5s after Chrome is opened in order to get consistent results.
action_runner.Wait(5)
with action_runner.CreateInteraction('flinging'):
self._WaitForResult(
action_runner,
lambda: action_runner.EvaluateJavaScript('initialized'),
'Failed to initialize',
timeout=30)
self.CloseExistingRoute(action_runner, sink_name)
# Start session
action_runner.TapElement(selector='#start_session_button')
self._WaitForResult(
action_runner,
lambda: len(action_runner.tab.browser.tabs) >= 2,
'MR dialog never showed up.')
for tab in action_runner.tab.browser.tabs:
# Choose sink
if tab.url == 'chrome://media-router/':
self.WaitUntilDialogLoaded(action_runner, tab)
self.ChooseSink(tab, sink_name)
self._WaitForResult(
action_runner,
lambda: action_runner.EvaluateJavaScript('currentSession'),
'Failed to start session',
timeout=10)
# Load Media
self.ExecuteAsyncJavaScript(
action_runner,
js_template.Render(
'loadMedia({{ url }});', url=utils.GetInternalVideoURL()),
lambda: action_runner.EvaluateJavaScript('currentMedia'),
'Failed to load media',
timeout=120)
action_runner.Wait(5)
action_runner.ExecuteJavaScript('collectPerfData();')
action_runner.Wait(SESSION_TIME)
# Stop session
self.ExecuteAsyncJavaScript(
action_runner,
'stopSession();',
lambda: not action_runner.EvaluateJavaScript('currentSession'),
'Failed to stop session',
timeout=30)
class CastMirroringPage(media_router_page.CastPage):
"""Cast page to mirror a tab to Chromecast device."""
def __init__(self, page_set):
super(CastMirroringPage, self).__init__(
page_set=page_set,
url='file://mirroring.html',
shared_page_state_class=SharedState)
def RunPageInteractions(self, action_runner):
sink_name = self._GetDeviceName()
# Wait for 5s after Chrome is opened in order to get consistent results.
action_runner.Wait(5)
with action_runner.CreateInteraction('mirroring'):
self.CloseExistingRoute(action_runner, sink_name)
# Start session
action_runner.TapElement(selector='#start_session_button')
self._WaitForResult(
action_runner,
lambda: len(action_runner.tab.browser.tabs) >= 2,
'MR dialog never showed up.')
for tab in action_runner.tab.browser.tabs:
# Choose sink
if tab.url == 'chrome://media-router/':
self.WaitUntilDialogLoaded(action_runner, tab)
self.ChooseSink(tab, sink_name)
# Wait for 5s to make sure the route is created.
action_runner.Wait(5)
action_runner.TapElement(selector='#start_session_button')
self._WaitForResult(
action_runner,
lambda: len(action_runner.tab.browser.tabs) >= 2,
'MR dialog never showed up.')
for tab in action_runner.tab.browser.tabs:
if tab.url == 'chrome://media-router/':
self.WaitUntilDialogLoaded(action_runner, tab)
if not self.CheckIfExistingRoute(tab, sink_name):
raise page.page_test.Failure('Failed to start mirroring session.')
action_runner.ExecuteJavaScript('collectPerfData();')
action_runner.Wait(SESSION_TIME)
self.CloseExistingRoute(action_runner, sink_name)
class MediaRouterDialogPageSet(story.StorySet):
"""Pageset for media router dialog latency tests."""
def __init__(self):
super(MediaRouterDialogPageSet, self).__init__(
cloud_storage_bucket=story.PARTNER_BUCKET)
self.AddStory(CastDialogPage(self))
class MediaRouterCPUMemoryPageSet(story.StorySet):
"""Pageset for media router CPU/memory usage tests."""
def __init__(self):
super(MediaRouterCPUMemoryPageSet, self).__init__(
cloud_storage_bucket=story.PARTNER_BUCKET)
self.AddStory(CastIdlePage(self))
self.AddStory(CastFlingingPage(self))
self.AddStory(CastMirroringPage(self))
class CPUMemoryPageSet(story.StorySet):
"""Pageset to get baseline CPU and memory usage."""
def __init__(self):
super(CPUMemoryPageSet, self).__init__(
cloud_storage_bucket=story.PARTNER_BUCKET)
self.AddStory(CastIdlePage(self))