summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tools/telemetry/telemetry/core/memory_cache_http_server.py20
-rw-r--r--tools/telemetry/telemetry/core/temporary_http_server_unittest.py57
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))