| 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() | 
|  |