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