Index: chrome/test/functional/media/media_constrained_network_perf.py |
=================================================================== |
--- chrome/test/functional/media/media_constrained_network_perf.py (revision 261231) |
+++ chrome/test/functional/media/media_constrained_network_perf.py (working copy) |
@@ -1,210 +0,0 @@ |
-#!/usr/bin/env python |
-# Copyright (c) 2012 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. |
- |
-"""Records metrics on playing media under constrained network conditions. |
- |
-Spins up a Constrained Network Server (CNS) and runs through a test matrix of |
-bandwidth, latency, and packet loss settings. Tests running media files defined |
-in _TEST_MEDIA_EPP record the extra-play-percentage (EPP) metric and the |
-time-to-playback (TTP) metric in a format consumable by the Chromium perf bots. |
-Other tests running media files defined in _TEST_MEDIA_NO_EPP record only the |
-TTP metric. |
- |
-Since even a small number of different settings yields a large test matrix, the |
-design is threaded... however PyAuto is not, so a global lock is used when calls |
-into PyAuto are necessary. The number of threads can be set by _TEST_THREADS. |
- |
-The CNS code is located under: <root>/src/media/tools/constrained_network_server |
-""" |
- |
-import logging |
-import os |
-import posixpath |
-import Queue |
- |
-import pyauto_media |
-import pyauto_utils |
- |
-import cns_test_base |
-import worker_thread |
- |
-# The network constraints used for measuring ttp and epp. |
-# Previous tests with 2% and 5% packet loss resulted in inconsistent data. Thus |
-# packet loss is not used often in perf tests. Tests with very low bandwidth, |
-# such as 56K Dial-up resulted in very slow tests (about 8 mins to run each |
-# test iteration). In addition, metrics for Dial-up would be out of range of the |
-# other tests metrics, making the graphs hard to read. |
-_TESTS_TO_RUN = [cns_test_base.Cable, |
- cns_test_base.Wifi, |
- cns_test_base.DSL, |
- cns_test_base.Slow, |
- cns_test_base.NoConstraints] |
- |
-# HTML test path; relative to src/chrome/test/data. Loads a test video and |
-# records metrics in JavaScript. |
-_TEST_HTML_PATH = os.path.join( |
- 'media', 'html', 'media_constrained_network.html') |
- |
-# Number of threads to use during testing. |
-_TEST_THREADS = 3 |
- |
-# Number of times we run the same test to eliminate outliers. |
-_TEST_ITERATIONS = 3 |
- |
-# Media file names used for measuring epp and tpp. |
-_TEST_MEDIA_EPP = ['roller.webm'] |
-_TEST_MEDIA_EPP.extend(posixpath.join('crowd', name) for name in |
- ['crowd360.ogv', 'crowd.wav', 'crowd.ogg']) |
- |
-# Media file names used for measuring tpp without epp. |
-_TEST_MEDIA_NO_EPP = [posixpath.join('dartmoor', name) for name in |
- ['dartmoor2.ogg', 'dartmoor2.m4a', 'dartmoor2.mp3', |
- 'dartmoor2.wav']] |
-_TEST_MEDIA_NO_EPP.extend(posixpath.join('crowd', name) for name in |
- ['crowd1080.webm', 'crowd1080.ogv', 'crowd1080.mp4', |
- 'crowd360.webm', 'crowd360.mp4']) |
- |
-# Timeout values for epp and ttp tests in seconds. |
-_TEST_EPP_TIMEOUT = 180 |
-_TEST_TTP_TIMEOUT = 20 |
- |
- |
-class CNSWorkerThread(worker_thread.WorkerThread): |
- """Worker thread. Runs a test for each task in the queue.""" |
- |
- def __init__(self, *args, **kwargs): |
- """Sets up CNSWorkerThread class variables.""" |
- # Allocate local vars before WorkerThread.__init__ runs the thread. |
- self._metrics = {} |
- self._test_iterations = _TEST_ITERATIONS |
- worker_thread.WorkerThread.__init__(self, *args, **kwargs) |
- |
- def _HaveMetricOrError(self, var_name, unique_url): |
- """Checks if the page has variable value ready or if an error has occured. |
- |
- The varaible value must be set to < 0 pre-run. |
- |
- Args: |
- var_name: The variable name to check the metric for. |
- unique_url: The url of the page to check for the variable's metric. |
- |
- Returns: |
- True is the var_name value is >=0 or if an error_msg exists. |
- """ |
- self._metrics[var_name] = int(self.GetDOMValue(var_name, url=unique_url)) |
- end_test = self.GetDOMValue('endTest', url=unique_url) |
- |
- return self._metrics[var_name] >= 0 or end_test |
- |
- def _GetEventsLog(self, unique_url): |
- """Returns the log of video events fired while running the test. |
- |
- Args: |
- unique_url: The url of the page identifying the test. |
- """ |
- return self.GetDOMValue('eventsMsg', url=unique_url) |
- |
- def _GetVideoProgress(self, unique_url): |
- """Gets the video's current play progress percentage. |
- |
- Args: |
- unique_url: The url of the page to check for video play progress. |
- """ |
- return int(self.CallJavascriptFunc('calculateProgress', url=unique_url)) |
- |
- def RunTask(self, unique_url, task): |
- """Runs the specific task on the url given. |
- |
- It is assumed that a tab with the unique_url is already loaded. |
- Args: |
- unique_url: A unique identifier of the test page. |
- task: A (series_name, settings, file_name, run_epp) tuple. |
- Returns: |
- True if at least one iteration of the tests run as expected. |
- """ |
- ttp_results = [] |
- epp_results = [] |
- # Build video source URL. Values <= 0 mean the setting is disabled. |
- series_name, settings, (file_name, run_epp) = task |
- video_url = cns_test_base.GetFileURL( |
- file_name, bandwidth=settings[0], latency=settings[1], |
- loss=settings[2], new_port=True) |
- |
- graph_name = series_name + '_' + os.path.basename(file_name) |
- for iter_num in xrange(self._test_iterations): |
- # Start the test! |
- self.CallJavascriptFunc('startTest', [video_url], url=unique_url) |
- |
- # Wait until the necessary metrics have been collected. |
- self._metrics['epp'] = self._metrics['ttp'] = -1 |
- self.WaitUntil(self._HaveMetricOrError, args=['ttp', unique_url], |
- retry_sleep=1, timeout=_TEST_EPP_TIMEOUT, debug=False) |
- # Do not wait for epp if ttp is not available. |
- if self._metrics['ttp'] >= 0: |
- ttp_results.append(self._metrics['ttp']) |
- if run_epp: |
- self.WaitUntil( |
- self._HaveMetricOrError, args=['epp', unique_url], retry_sleep=2, |
- timeout=_TEST_EPP_TIMEOUT, debug=False) |
- |
- if self._metrics['epp'] >= 0: |
- epp_results.append(self._metrics['epp']) |
- |
- logging.debug('Iteration:%d - Test %s ended with %d%% of the video ' |
- 'played.', iter_num, graph_name, |
- self._GetVideoProgress(unique_url),) |
- |
- if self._metrics['ttp'] < 0 or (run_epp and self._metrics['epp'] < 0): |
- logging.error('Iteration:%d - Test %s failed to end gracefully due ' |
- 'to time-out or error.\nVideo events fired:\n%s', |
- iter_num, graph_name, self._GetEventsLog(unique_url)) |
- |
- # End of iterations, print results, |
- pyauto_utils.PrintPerfResult('ttp', graph_name, ttp_results, 'ms') |
- |
- # Return true if we got at least one result to report. |
- if run_epp: |
- pyauto_utils.PrintPerfResult('epp', graph_name, epp_results, '%') |
- return len(epp_results) != 0 |
- return len(ttp_results) != 0 |
- |
- |
-class MediaConstrainedNetworkPerfTest(cns_test_base.CNSTestBase): |
- """PyAuto test container. See file doc string for more information.""" |
- |
- def _RunDummyTest(self, test_path): |
- """Runs a dummy test with high bandwidth and no latency or packet loss. |
- |
- Fails the unit test if the dummy test does not end. |
- |
- Args: |
- test_path: Path to HTML/JavaScript test code. |
- """ |
- tasks = Queue.Queue() |
- tasks.put(('Dummy Test', [5000, 0, 0], (_TEST_MEDIA_EPP[0], True))) |
- # Dummy test should successfully finish by passing all the tests. |
- if worker_thread.RunWorkerThreads(self, CNSWorkerThread, tasks, 1, |
- test_path): |
- self.fail('Failed to run dummy test.') |
- |
- def testConstrainedNetworkPerf(self): |
- |
- """Starts CNS, spins up worker threads to run through _TEST_CONSTRAINTS.""" |
- # Run a dummy test to avoid Chrome/CNS startup overhead. |
- logging.debug('Starting a dummy test to avoid Chrome/CNS startup overhead.') |
- self._RunDummyTest(_TEST_HTML_PATH) |
- logging.debug('Dummy test has finished. Starting real perf tests.') |
- |
- # Tests that wait for EPP metrics. |
- media_files = [(name, True) for name in _TEST_MEDIA_EPP] |
- media_files.extend((name, False) for name in _TEST_MEDIA_NO_EPP) |
- tasks = cns_test_base.CreateCNSPerfTasks(_TESTS_TO_RUN, media_files) |
- if worker_thread.RunWorkerThreads(self, CNSWorkerThread, tasks, |
- _TEST_THREADS, _TEST_HTML_PATH): |
- self.fail('Some tests failed to run as expected.') |
- |
- |
-if __name__ == '__main__': |
- pyauto_media.Main() |