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 5 import os 6 7 from telemetry.core import util 8 from telemetry.testing import tab_test_case 9 10 11 class MemoryCacheHTTPServerTest(tab_test_case.TabTestCase): 12 13 def setUp(self): 14 super(MemoryCacheHTTPServerTest, self).setUp() 15 self._test_filename = 'bear.webm' 16 _test_file = os.path.join(util.GetUnittestDataDir(), 'bear.webm') 17 self._test_file_size = os.stat(_test_file).st_size 18 19 def testBasicHostingAndRangeRequests(self): 20 self.Navigate('blank.html') 21 x = self._tab.EvaluateJavaScript('document.body.innerHTML') 22 x = x.strip() 23 24 # Test basic html hosting. 25 self.assertEquals(x, 'Hello world') 26 27 file_size = self._test_file_size 28 last_byte = file_size - 1 29 # Test byte range request: no end byte. 30 self.CheckContentHeaders('0-', '0-%d' % last_byte, file_size) 31 32 # Test byte range request: greater than zero start byte. 33 self.CheckContentHeaders('100-', '100-%d' % last_byte, 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', '%d-%d' % (file_size - 228, last_byte), 40 '228') 41 42 # Test byte range request: end byte less than start byte. 43 self.CheckContentHeaders('100-5', '100-%d' % last_byte, file_size - 100) 44 45 def CheckContentHeaders(self, content_range_request, content_range_response, 46 content_length_response): 47 self._tab.ExecuteJavaScript(""" 48 var loaded = false; 49 var xmlhttp = new XMLHttpRequest(); 50 xmlhttp.onload = function(e) { 51 loaded = true; 52 }; 53 // Avoid cached content by appending unique URL param. 54 xmlhttp.open('GET', {{ url }} + "?t=" + Date.now(), true); 55 xmlhttp.setRequestHeader('Range', {{ range }}); 56 xmlhttp.send(); 57 """, 58 url=self.UrlOfUnittestFile(self._test_filename), 59 range='bytes=%s' % content_range_request) 60 self._tab.WaitForJavaScriptCondition('loaded', timeout=5) 61 content_range = self._tab.EvaluateJavaScript( 62 'xmlhttp.getResponseHeader("Content-Range");') 63 content_range_response = 'bytes %s/%d' % (content_range_response, 64 self._test_file_size) 65 self.assertEquals(content_range, content_range_response) 66 content_length = self._tab.EvaluateJavaScript( 67 'xmlhttp.getResponseHeader("Content-Length");') 68 self.assertEquals(content_length, str(content_length_response)) 69 70 def testAbsoluteAndRelativePathsYieldSameURL(self): 71 test_file_rel_path = 'green_rect.html' 72 test_file_abs_path = os.path.abspath(os.path.join(util.GetUnittestDataDir(), 73 test_file_rel_path)) 74 # It's necessary to bypass self.UrlOfUnittestFile since that 75 # concatenates the unittest directory on to the incoming path, 76 # causing the same code path to be taken in both cases. 77 self._platform.SetHTTPServerDirectories(util.GetUnittestDataDir()) 78 self.assertEquals( 79 self._platform.http_server.UrlOf(test_file_rel_path), 80 self._platform.http_server.UrlOf(test_file_abs_path)) 81