diff options
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.""" |