1# Copyright 2014 The Chromium Authors. All rights reserved.
2# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4
5import os
6
7from telemetry.core import util
8from telemetry.unittest import tab_test_case
9
10
11class MemoryCacheHTTPServerTest(tab_test_case.TabTestCase):
12  def setUp(self):
13    super(MemoryCacheHTTPServerTest, self).setUp()
14    self._test_filename = 'bear.webm'
15    _test_file = os.path.join(util.GetUnittestDataDir(), 'bear.webm')
16    self._test_file_size = os.stat(_test_file).st_size
17
18  def testBasicHostingAndRangeRequests(self):
19    self.Navigate('blank.html')
20    x = self._tab.EvaluateJavaScript('document.body.innerHTML')
21    x = x.strip()
22
23    # Test basic html hosting.
24    self.assertEquals(x, 'Hello world')
25
26    file_size = self._test_file_size
27    last_byte = file_size - 1
28    # Test byte range request: no end byte.
29    self.CheckContentHeaders('0-', '0-%d' % last_byte, file_size)
30
31    # Test byte range request: greater than zero start byte.
32    self.CheckContentHeaders('100-', '100-%d' % last_byte,
33                             file_size - 100)
34
35    # Test byte range request: explicit byte range.
36    self.CheckContentHeaders('2-500', '2-500', '499')
37
38    # Test byte range request: no start byte.
39    self.CheckContentHeaders('-228',
40                             '%d-%d' % (file_size - 228, last_byte),
41                             '228')
42
43    # Test byte range request: end byte less than start byte.
44    self.CheckContentHeaders('100-5', '100-%d' % last_byte,
45                             file_size - 100)
46
47  def CheckContentHeaders(self, content_range_request, content_range_response,
48                          content_length_response):
49    self._tab.ExecuteJavaScript("""
50        var loaded = false;
51        var xmlhttp = new XMLHttpRequest();
52        xmlhttp.onload = function(e) {
53          loaded = true;
54        };
55        // Avoid cached content by appending unique URL param.
56        xmlhttp.open('GET', "%s?t=" + Date.now(), true);
57        xmlhttp.setRequestHeader('Range', 'bytes=%s');
58        xmlhttp.send();
59    """ % (self.UrlOfUnittestFile(self._test_filename),
60           content_range_request))
61    self._tab.WaitForJavaScriptExpression('loaded', 5)
62    content_range = self._tab.EvaluateJavaScript(
63        'xmlhttp.getResponseHeader("Content-Range");')
64    content_range_response = 'bytes %s/%d' % (
65        content_range_response, self._test_file_size)
66    self.assertEquals(content_range, content_range_response)
67    content_length = self._tab.EvaluateJavaScript(
68        'xmlhttp.getResponseHeader("Content-Length");')
69    self.assertEquals(content_length, str(content_length_response))
70