diff options
-rw-r--r-- | tools/telemetry/telemetry/core/memory_cache_http_server.py | 20 | ||||
-rw-r--r-- | tools/telemetry/telemetry/core/temporary_http_server_unittest.py | 57 |
2 files changed, 66 insertions, 11 deletions
diff --git a/tools/telemetry/telemetry/core/memory_cache_http_server.py b/tools/telemetry/telemetry/core/memory_cache_http_server.py index 7602328..fa66635 100644 --- a/tools/telemetry/telemetry/core/memory_cache_http_server.py +++ b/tools/telemetry/telemetry/core/memory_cache_http_server.py @@ -77,7 +77,8 @@ class MemoryCacheHTTPRequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler): A ByteRange namedtuple object with the requested byte-range values. If no Range is explicitly requested or there is a failure parsing, return None. - Special case: If range specified is in the format "N-", return N-N. + If range specified is in the format "N-", return N-END. Refer to + http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html for details. If upper range limit is greater than total # of bytes, return upper index. """ @@ -96,9 +97,12 @@ class MemoryCacheHTTPRequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler): to_byte = 0 if len(byte_range_values) == 2: - from_byte = int(byte_range_values[0]) - if byte_range_values[1]: - to_byte = int(byte_range_values[1]) + # If to_range is not defined return all bytes starting from from_byte. + to_byte = (int(byte_range_values[1]) if byte_range_values[1] + else total_num_of_bytes - 1) + # If from_range is not defined return last 'to_byte' bytes. + from_byte = (int(byte_range_values[0]) if byte_range_values[0] + else total_num_of_bytes - to_byte) else: return None @@ -106,12 +110,8 @@ class MemoryCacheHTTPRequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler): if from_byte < 0: return None - if to_byte < from_byte: - to_byte = from_byte - - if to_byte >= total_num_of_bytes: - # End of range requested is greater than length of requested resource. - # Only return # of available bytes. + # Make to_byte the end byte by default in edge cases. + if to_byte < from_byte or to_byte >= total_num_of_bytes: to_byte = total_num_of_bytes - 1 return ByteRange(from_byte, to_byte) diff --git a/tools/telemetry/telemetry/core/temporary_http_server_unittest.py b/tools/telemetry/telemetry/core/temporary_http_server_unittest.py index 64ad67e..1fa76fe 100644 --- a/tools/telemetry/telemetry/core/temporary_http_server_unittest.py +++ b/tools/telemetry/telemetry/core/temporary_http_server_unittest.py @@ -2,14 +2,22 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. +import os import unittest from telemetry.core import browser_finder from telemetry.core import util from telemetry.unittest import options_for_unittests + class TemporaryHTTPServerTest(unittest.TestCase): - def testBasicHosting(self): + + def setUp(self): + self.test_file = 'bear.webm' + test_file_path = os.path.join(util.GetUnittestDataDir(), self.test_file) + self.test_file_size = os.stat(test_file_path).st_size + + def testBasicHostingAndRangeRequests(self): options = options_for_unittests.GetCopy() browser_to_create = browser_finder.FindBrowser(options) with browser_to_create.Create() as b: @@ -21,4 +29,51 @@ class TemporaryHTTPServerTest(unittest.TestCase): x = t.EvaluateJavaScript('document.body.innerHTML') x = x.strip() + # Test basic html hosting. self.assertEquals(x, 'Hello world') + + file_size = self.test_file_size + last_byte = file_size - 1 + # Test byte range request: no end byte. + self.CheckContentHeaders(b, t, '0-', '0-%d' % last_byte, file_size) + + # Test byte range request: greater than zero start byte. + self.CheckContentHeaders(b, t, '100-', '100-%d' % last_byte, + file_size - 100) + + # Test byte range request: explicit byte range. + self.CheckContentHeaders(b, t, '2-500', '2-500', '499') + + # Test byte range request: no start byte. + self.CheckContentHeaders(b, t, '-228', + '%d-%d' % (file_size - 228, last_byte), + '228') + + # Test byte range request: end byte less than start byte. + self.CheckContentHeaders(b, t, '100-5', '100-%d' % last_byte, + file_size - 100) + + def CheckContentHeaders(self, browser, tab, content_range_request, + content_range_response, content_lenght_response): + tab.ExecuteJavaScript(""" + var loaded = false; + var xmlhttp = new XMLHttpRequest(); + xmlhttp.onload = function(e) { + loaded = true; + }; + // Avoid cached content by appending unique URL param. + xmlhttp.open('GET', "%s?t=" + Date.now(), true); + xmlhttp.setRequestHeader('Range', 'bytes=%s'); + xmlhttp.send(); + """ % (browser.http_server.UrlOf('/%s' % self.test_file), + content_range_request)) + util.WaitFor(lambda: tab.EvaluateJavaScript('loaded == true'), + timeout=5, poll_interval=1) + content_range = tab.EvaluateJavaScript( + 'xmlhttp.getResponseHeader("Content-Range");') + content_range_response = 'bytes %s/%d' % ( + content_range_response, self.test_file_size) + self.assertEquals(content_range, content_range_response) + content_length = tab.EvaluateJavaScript( + 'xmlhttp.getResponseHeader("Content-Length");') + self.assertEquals(content_length, str(content_lenght_response)) |