Index: chrome/test/functional/media/cns_test_base.py |
=================================================================== |
--- chrome/test/functional/media/cns_test_base.py (revision 261231) |
+++ chrome/test/functional/media/cns_test_base.py (working copy) |
@@ -1,201 +0,0 @@ |
-# 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. |
- |
-"""Constrained network server (CNS) test base.""" |
- |
-import logging |
-import os |
-import Queue |
-import subprocess |
-import sys |
-import threading |
-import urllib2 |
- |
-import pyauto |
-import pyauto_paths |
- |
- |
-# List of commonly used network constraints settings. |
-# Each setting is a tuppe of the form: |
-# ('TEST_NAME', [BANDWIDTH_Kbps, LATENCY_ms, PACKET_LOSS_%]) |
-# |
-# Note: The test name should satisfy the regex [\w\.-]+ (check |
-# tools/perf_expectations/tests/perf_expectations_unittest.py for details). It |
-# is used to name the result graphs on the dashboards. |
-# |
-# The WiFi, DSL, and Cable settings were taken from webpagetest.org as |
-# approximations of their respective real world networks. The settings were |
-# based on 2011 FCC Broadband Data report (http://www.fcc.gov/document/ |
-# measuring-broadband-america-report-consumer-broadband-performance-us). |
-DialUp = ('DialUp', [56, 120, 5]) |
-Slow = ('Slow', [256, 105, 1]) |
-Wifi = ('Wifi', [1024, 60, 0]) |
-DSL = ('DSL', [1541, 50, 0]) |
-Cable = ('Cable', [5120, 28, 0]) |
-NoConstraints = ('NoConstraints', [0, 0, 0]) |
- |
-# Path to CNS executable relative to source root. |
-_CNS_PATH = os.path.join( |
- 'media', 'tools', 'constrained_network_server', 'cns.py') |
- |
-# Port to start the CNS on. |
-_CNS_PORT = 9000 |
- |
-# A flag to determine whether to launch a local CNS instance or to connect |
-# to the external CNS server. Default to False since all current bots use an |
-# external instance. |
-# If not on Windows, set USE_LOCAL_CNS=1 env variable to switch the flag. |
-USE_LOCAL_CNS = ('win' not in sys.platform and 'USE_LOCAL_CNS' in os.environ and |
- os.environ['USE_LOCAL_CNS'] == '1') |
- |
-# Base CNS URL, only requires & separated parameter names appended. |
-if USE_LOCAL_CNS: |
- CNS_BASE_URL = 'http://127.0.0.1:%d/ServeConstrained?' % _CNS_PORT |
-else: |
- CNS_BASE_URL = 'http://chromeperf34:%d/ServeConstrained?' % _CNS_PORT |
- CNS_CLEANUP_URL = 'http://chromeperf34:%d/Cleanup' % _CNS_PORT |
- |
-# Used for server sanity check. |
-_TEST_VIDEO = 'roller.webm' |
- |
-# Directory root to serve files from. |
-_ROOT_PATH = os.path.join(pyauto.PyUITest.DataDir(), 'pyauto_private', 'media') |
- |
- |
-class CNSTestBase(pyauto.PyUITest): |
- """CNS test base hadles startup and teardown of CNS server.""" |
- |
- def __init__(self, *args, **kwargs): |
- """Initialize CNSTestBase by setting the arguments for CNS server. |
- |
- Args: |
- Check cns.py command line argument list for details. |
- """ |
- self._port = kwargs.get('port', _CNS_PORT) |
- self._interface = kwargs.get('interface', 'lo') |
- self._www_root = kwargs.get('www_root', _ROOT_PATH) |
- self._verbose = kwargs.get('verbose', True) |
- self._expiry_time = kwargs.get('expiry_time', 0) |
- self._socket_timeout = kwargs.get('socket_timeout') |
- pyauto.PyUITest.__init__(self, *args, **kwargs) |
- |
- def setUp(self): |
- """Ensures the Constrained Network Server (CNS) server is up and running.""" |
- if USE_LOCAL_CNS: |
- self._SetUpLocal() |
- else: |
- self._SetUpExternal() |
- |
- def _SetUpExternal(self): |
- """Ensures the test can connect to the external CNS server.""" |
- if self.WaitUntil(self._CanAccessServer, retry_sleep=3, timeout=30, |
- debug=False): |
- pyauto.PyUITest.setUp(self) |
- else: |
- self.fail('Failed to connect to CNS.') |
- |
- def _SetUpLocal(self): |
- """Starts the CNS server locally.""" |
- cmd = [sys.executable, os.path.join(pyauto_paths.GetSourceDir(), _CNS_PATH), |
- '--port', str(self._port), |
- '--interface', self._interface, |
- '--www-root', self._www_root, |
- '--expiry-time', str(self._expiry_time)] |
- |
- if self._socket_timeout: |
- cmd.extend(['--socket-timeout', str(self._socket_timeout)]) |
- if self._verbose: |
- cmd.append('-v') |
- logging.debug('Starting CNS server: %s ', ' '.join(cmd)) |
- |
- self._cns_process = subprocess.Popen(cmd, stderr=subprocess.PIPE) |
- ProcessLogger(self._cns_process) |
- |
- if self.WaitUntil(self._CanAccessServer, retry_sleep=3, timeout=30, |
- debug=False): |
- pyauto.PyUITest.setUp(self) |
- else: |
- self.tearDown() |
- self.fail('Failed to start CNS.') |
- |
- def _CanAccessServer(self): |
- """Checks if the CNS server can serve a file with no network constraints.""" |
- test_url = ''.join([CNS_BASE_URL, 'f=', _TEST_VIDEO]) |
- try: |
- return urllib2.urlopen(test_url) is not None |
- except Exception: |
- return False |
- |
- def tearDown(self): |
- """Stops the Constrained Network Server (CNS).""" |
- if USE_LOCAL_CNS: |
- logging.debug('Stopping CNS server.') |
- # Do not use process.kill(), it will not clean up cns. |
- self.Kill(self._cns_process.pid) |
- # Need to wait since the process logger has a lock on the process stderr. |
- self._cns_process.wait() |
- self.assertFalse(self._cns_process.returncode is None) |
- logging.debug('CNS server stopped.') |
- else: |
- # Call CNS Cleanup to remove all ports created by this client. |
- self.NavigateToURL(CNS_CLEANUP_URL) |
- pyauto.PyUITest.tearDown(self) |
- |
- |
-class ProcessLogger(threading.Thread): |
- """A thread to log a process's stderr output.""" |
- |
- def __init__(self, process): |
- """Starts the process logger thread. |
- |
- Args: |
- process: The process to log. |
- """ |
- threading.Thread.__init__(self) |
- self._process = process |
- self.start() |
- |
- def run(self): |
- """Adds debug statements for the process's stderr output.""" |
- line = True |
- while line: |
- line = self._process.stderr.readline() |
- logging.debug(line.strip()) |
- |
- |
-def GetFileURL(file_name, bandwidth=0, latency=0, loss=0, new_port=False): |
- """Returns CNS URL for the file with specified constraints. |
- |
- Args: |
- Check cns.ServeConstrained() args for more details. |
- """ |
- video_url = [CNS_BASE_URL, 'f=' + file_name] |
- if bandwidth > 0: |
- video_url.append('bandwidth=%d' % bandwidth) |
- if latency > 0: |
- video_url.append('latency=%d' % latency) |
- if loss > 0: |
- video_url.append('loss=%d' % loss) |
- if new_port: |
- video_url.append('new_port=%s' % new_port) |
- return '&'.join(video_url) |
- |
- |
-def CreateCNSPerfTasks(network_constraints_settings, test_media_files): |
- """Returns a queue of tasks combinining network constrains with media files. |
- |
- Args: |
- network_constraints_settings: List of (setting_name, setting_values) |
- tupples. |
- test_media_files: List of media files to run the tests on. |
- """ |
- # Convert relative test path into an absolute path. |
- tasks = Queue.Queue() |
- for file_name in test_media_files: |
- for series_name, settings in network_constraints_settings: |
- logging.debug('Add test: %s\tSettings: %s\tMedia: %s', series_name, |
- settings, file_name) |
- tasks.put((series_name, settings, file_name)) |
- |
- return tasks |