summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--chrome/test/data/media/html/media_constrained_network.html34
-rwxr-xr-xchrome/test/functional/media/media_constrained_network_perf.py24
-rwxr-xr-xmedia/tools/constrained_network_server/cns.py16
-rwxr-xr-xmedia/tools/constrained_network_server/cns_test.py18
4 files changed, 70 insertions, 22 deletions
diff --git a/chrome/test/data/media/html/media_constrained_network.html b/chrome/test/data/media/html/media_constrained_network.html
index ea37cc3..1f6711e 100644
--- a/chrome/test/data/media/html/media_constrained_network.html
+++ b/chrome/test/data/media/html/media_constrained_network.html
@@ -26,8 +26,11 @@
// Video play progress to calculate percentage of video played.
var vpp = -1;
- // String to indicate if error or abort events happen.
- var errorMsg = '';
+ // String to keep track of video events fired.
+ var eventsMsg = '';
+
+ // A flag to end the test is error or abort events get fired.
+ var endTest = false;
video.addEventListener('playing', function(event) {
startTime = new Date().getTime();
@@ -35,18 +38,35 @@
}, false);
video.addEventListener('ended', setEPP, false);
- video.addEventListener('error', logEvent, false);
- video.addEventListener('abort', logEvent, false);
+ video.addEventListener('error', end, false);
+ video.addEventListener('abort', end, false);
+
+ var events = ['loadstart', 'progress', 'suspend', 'waiting', 'emptied',
+ 'stalled', 'play', 'pause', 'loadedmetadata', 'loadeddata',
+ 'waiting', 'canplay', 'canplaythrough', 'seeking', 'seeked',
+ 'ratechange', 'durationchange', 'volumechange'];
+
+ var len = events.length;
+ for (var i = 0; i < len; i++) {
+ video.addEventListener(events[i], logEvent, false);
+ }
+
+ function end(evt){
+ endTest = true;
+ logEvent(evt);
+ }
function logEvent(evt) {
- errorMsg += evt.target + ' ' + evt.type + ' event fired.\n';
+ eventsMsg += new Date().toLocaleTimeString() + ' ' + evt.target + ' ' +
+ evt.type + ' event fired.\n';
}
- function setEPP() {
+ function setEPP(evt) {
playTime = new Date().getTime() - startTime;
durMs = video.duration * 1000;
epp = Math.max(0, (playTime - durMs) * 100 / durMs);
+ logEvent(evt);
}
function calculateProgress() {
@@ -60,7 +80,7 @@
// Called by the PyAuto controller to initiate testing.
function startTest(src) {
loadTime = new Date().getTime();
- video.src = src
+ video.src = src;
video.play();
if (window.domAutomationController)
diff --git a/chrome/test/functional/media/media_constrained_network_perf.py b/chrome/test/functional/media/media_constrained_network_perf.py
index 29ac2f1..80d86dd 100755
--- a/chrome/test/functional/media/media_constrained_network_perf.py
+++ b/chrome/test/functional/media/media_constrained_network_perf.py
@@ -121,10 +121,19 @@ class TestWorker(threading.Thread):
tab = self._FindTabLocked(unique_url)
self._metrics[var_name] = int(self._pyauto.GetDOMValue(var_name,
tab_index=tab))
- self._metrics['errorMsg'] = self._pyauto.GetDOMValue('errorMsg',
- tab_index=tab)
+ end_test = self._pyauto.GetDOMValue('endTest', tab_index=tab)
- return self._metrics[var_name] >= 0 or self._metrics['errorMsg'] != ''
+ 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.
+ """
+ with self._automation_lock:
+ tab = self._FindTabLocked(unique_url)
+ return self._pyauto.GetDOMValue('eventsMsg', tab_index=tab)
def _GetVideoProgress(self, unique_url):
"""Gets the video's current play progress percentage.
@@ -193,12 +202,11 @@ class TestWorker(threading.Thread):
'ms')
logging.debug('Test %s ended with %d%% of the video played.',
series_name, self._GetVideoProgress(unique_url))
- elif self._metrics['errorMsg'] == '':
- logging.error('Test %s timed-out.', series_name)
- if self._metrics['errorMsg'] != '':
- logging.debug('Test %s ended with error: %s', series_name,
- self._metrics['errorMsg'])
+ if self._metrics['ttp'] < 0 or self._metrics['epp'] < 0:
+ logging.error('Test %s failed to end gracefully due to time-out or '
+ 'an error.\nVideo events fired:\n%s', series_name,
+ self._GetEventsLog(unique_url))
# Close the tab.
with self._automation_lock:
diff --git a/media/tools/constrained_network_server/cns.py b/media/tools/constrained_network_server/cns.py
index 9f6c1a0..71ba9d7 100755
--- a/media/tools/constrained_network_server/cns.py
+++ b/media/tools/constrained_network_server/cns.py
@@ -92,7 +92,8 @@ class PortAllocator(object):
# Cleanup ports on new port requests. Do it after the cache check though
# so we don't erase and then setup the same port.
- self._CleanupLocked(all_ports=False)
+ if self._expiry_time_secs > 0:
+ self._CleanupLocked(all_ports=False)
# Performance isn't really an issue here, so just iterate over the port
# range to find an unused port. If no port is found, None is returned.
@@ -122,7 +123,7 @@ class PortAllocator(object):
traffic_control.CreateConstrainedPort(kwargs)
return True
except traffic_control.TrafficControlError as e:
- cherrypy.log('Error: %s\nOutput: %s', e.msg, e.error)
+ cherrypy.log('Error: %s\nOutput: %s' % (e.msg, e.error))
return False
def _CleanupLocked(self, all_ports):
@@ -151,7 +152,7 @@ class PortAllocator(object):
try:
traffic_control.DeleteConstrainedPort(self._ports[port]['config'])
except traffic_control.TrafficControlError as e:
- cherrypy.log('Error: %s\nOutput: %s', e.msg, e.error)
+ cherrypy.log('Error: %s\nOutput: %s' % (e.msg, e.error))
def Cleanup(self, interface, all_ports=False):
"""Cleans up expired ports, or if all_ports=True, all allocated ports.
@@ -275,7 +276,7 @@ def ParseArgs():
parser.add_option('--expiry-time', type='int',
default=_DEFAULT_PORT_EXPIRY_TIME_SECS,
help=('Number of seconds before constrained ports expire '
- 'and are cleaned up. Default: %default'))
+ 'and are cleaned up. 0=Disabled. Default: %default'))
parser.add_option('--port', type='int', default=_DEFAULT_SERVING_PORT,
help='Port to serve the API on. Default: %default')
parser.add_option('--port-range', default=_DEFAULT_CNS_PORT_RANGE,
@@ -291,8 +292,8 @@ def ParseArgs():
parser.add_option('--www-root', default=os.getcwd(),
help=('Directory root to serve files from. Defaults to the '
'current directory: %default'))
- parser.add_option('-v', '--verbose', action='store_true', dest='verbose',
- default=False, help='Turn on verbose output.')
+ parser.add_option('-v', '--verbose', action='store_true', default=False,
+ help='Turn on verbose output.')
options = parser.parse_args()[0]
@@ -303,6 +304,9 @@ def ParseArgs():
except ValueError:
parser.error('Invalid port range specified.')
+ if options.expiry_time < 0:
+ parser.error('Invalid expiry time specified.')
+
# Convert the path to an absolute to remove any . or ..
options.www_root = os.path.abspath(options.www_root)
diff --git a/media/tools/constrained_network_server/cns_test.py b/media/tools/constrained_network_server/cns_test.py
index 319f33a..0a6e995 100755
--- a/media/tools/constrained_network_server/cns_test.py
+++ b/media/tools/constrained_network_server/cns_test.py
@@ -1,5 +1,5 @@
#!/usr/bin/env python
-# Copyright (c) 2011 The Chromium Authors. All rights reserved.
+# 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.
@@ -99,6 +99,22 @@ class PortAllocatorTest(unittest.TestCase):
self.assertEquals(set(self._pa._ports.keys()), set([
cns._DEFAULT_CNS_PORT_RANGE[0], cns._DEFAULT_CNS_PORT_RANGE[0] + 1]))
+ def testPortAllocatorNoExpiration(self):
+ # Setup PortAllocator w/o port expiration.
+ self._pa = cns.PortAllocator(cns._DEFAULT_CNS_PORT_RANGE, 0)
+
+ # Ensure Get() succeeds and returns the correct port.
+ self.assertEquals(self._pa.Get('test'), cns._DEFAULT_CNS_PORT_RANGE[0])
+
+ # Update fake time to see if ports expire.
+ self._current_time += self._EXPIRY_TIME
+
+ # Send second Get() which would normally cause ports to expire. Ensure that
+ # the ports did not expire.
+ self.assertEquals(self._pa.Get('test2'), cns._DEFAULT_CNS_PORT_RANGE[0] + 1)
+ self.assertEquals(set(self._pa._ports.keys()), set([
+ cns._DEFAULT_CNS_PORT_RANGE[0], cns._DEFAULT_CNS_PORT_RANGE[0] + 1]))
+
class ConstrainedNetworkServerTest(unittest.TestCase):
"""End to end tests for ConstrainedNetworkServer system."""