Index: tools/telemetry/third_party/webpagereplay/httparchive_test.py |
diff --git a/tools/telemetry/third_party/webpagereplay/httparchive_test.py b/tools/telemetry/third_party/webpagereplay/httparchive_test.py |
deleted file mode 100755 |
index bc946533a284cd9b5ecf906183833add3d5092f3..0000000000000000000000000000000000000000 |
--- a/tools/telemetry/third_party/webpagereplay/httparchive_test.py |
+++ /dev/null |
@@ -1,442 +0,0 @@ |
-#!/usr/bin/env python |
-# Copyright 2011 Google Inc. All Rights Reserved. |
-# |
-# Licensed under the Apache License, Version 2.0 (the "License"); |
-# you may not use this file except in compliance with the License. |
-# You may obtain a copy of the License at |
-# |
-# http://www.apache.org/licenses/LICENSE-2.0 |
-# |
-# Unless required by applicable law or agreed to in writing, software |
-# distributed under the License is distributed on an "AS IS" BASIS, |
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
-# See the License for the specific language governing permissions and |
-# limitations under the License. |
- |
-import calendar |
-import email.utils |
-import httparchive |
-import unittest |
- |
- |
-def create_request(headers): |
- return httparchive.ArchivedHttpRequest( |
- 'GET', 'www.test.com', '/', None, headers) |
- |
-def create_response(headers): |
- return httparchive.ArchivedHttpResponse( |
- 11, 200, 'OK', headers, '') |
- |
- |
-class HttpArchiveTest(unittest.TestCase): |
- |
- REQUEST_HEADERS = {} |
- REQUEST = create_request(REQUEST_HEADERS) |
- |
- # Used for if-(un)modified-since checks |
- DATE_PAST = 'Wed, 13 Jul 2011 03:58:08 GMT' |
- DATE_PRESENT = 'Wed, 20 Jul 2011 04:58:08 GMT' |
- DATE_FUTURE = 'Wed, 27 Jul 2011 05:58:08 GMT' |
- DATE_INVALID = 'This is an invalid date!!' |
- |
- # etag values |
- ETAG_VALID = 'etag' |
- ETAG_INVALID = 'This is an invalid etag value!!' |
- |
- RESPONSE_HEADERS = [('last-modified', DATE_PRESENT), ('etag', ETAG_VALID)] |
- RESPONSE = create_response(RESPONSE_HEADERS) |
- |
- def setUp(self): |
- self.archive = httparchive.HttpArchive() |
- self.archive[self.REQUEST] = self.RESPONSE |
- |
- # Also add an identical POST request for testing |
- request = httparchive.ArchivedHttpRequest( |
- 'POST', 'www.test.com', '/', None, self.REQUEST_HEADERS) |
- self.archive[request] = self.RESPONSE |
- |
- def tearDown(self): |
- pass |
- |
- def test_init(self): |
- archive = httparchive.HttpArchive() |
- self.assertEqual(len(archive), 0) |
- |
- def test__TrimHeaders(self): |
- request = httparchive.ArchivedHttpRequest |
- header1 = {'accept-encoding': 'gzip,deflate'} |
- self.assertEqual(request._TrimHeaders(header1), |
- [(k, v) for k, v in header1.items()]) |
- |
- header2 = {'referer': 'www.google.com'} |
- self.assertEqual(request._TrimHeaders(header2), []) |
- |
- header3 = {'referer': 'www.google.com', 'cookie': 'cookie_monster!', |
- 'hello': 'world'} |
- self.assertEqual(request._TrimHeaders(header3), [('hello', 'world')]) |
- |
- # Tests that spaces and trailing comma get stripped. |
- header4 = {'accept-encoding': 'gzip, deflate,, '} |
- self.assertEqual(request._TrimHeaders(header4), |
- [('accept-encoding', 'gzip,deflate')]) |
- |
- # Tests that 'lzma' gets stripped. |
- header5 = {'accept-encoding': 'gzip, deflate, lzma'} |
- self.assertEqual(request._TrimHeaders(header5), |
- [('accept-encoding', 'gzip,deflate')]) |
- |
- # Tests that x-client-data gets stripped. |
- header6 = {'x-client-data': 'testdata'} |
- self.assertEqual(request._TrimHeaders(header6), []) |
- |
- def test_matches(self): |
- headers = {} |
- request1 = httparchive.ArchivedHttpRequest( |
- 'GET', 'www.test.com', '/index.html?hello=world', None, headers) |
- request2 = httparchive.ArchivedHttpRequest( |
- 'GET', 'www.test.com', '/index.html?foo=bar', None, headers) |
- |
- self.assert_(not request1.matches( |
- request2.command, request2.host, request2.full_path, use_query=True)) |
- self.assert_(request1.matches( |
- request2.command, request2.host, request2.full_path, use_query=False)) |
- |
- self.assert_(request1.matches( |
- request2.command, request2.host, None, use_query=True)) |
- self.assert_(request1.matches( |
- request2.command, None, request2.full_path, use_query=False)) |
- |
- empty_request = httparchive.ArchivedHttpRequest( |
- None, None, None, None, headers) |
- self.assert_(not empty_request.matches( |
- request2.command, request2.host, None, use_query=True)) |
- self.assert_(not empty_request.matches( |
- request2.command, None, request2.full_path, use_query=False)) |
- |
- def setup_find_closest_request(self): |
- headers = {} |
- request1 = httparchive.ArchivedHttpRequest( |
- 'GET', 'www.test.com', '/a?hello=world', None, headers) |
- request2 = httparchive.ArchivedHttpRequest( |
- 'GET', 'www.test.com', '/a?foo=bar', None, headers) |
- request3 = httparchive.ArchivedHttpRequest( |
- 'GET', 'www.test.com', '/b?hello=world', None, headers) |
- request4 = httparchive.ArchivedHttpRequest( |
- 'GET', 'www.test.com', '/c?hello=world', None, headers) |
- |
- archive = httparchive.HttpArchive() |
- # Add requests 2 and 3 and find closest match with request1 |
- archive[request2] = self.RESPONSE |
- archive[request3] = self.RESPONSE |
- |
- return archive, request1, request2, request3, request4 |
- |
- def test_find_closest_request(self): |
- archive, request1, request2, request3, request4 = ( |
- self.setup_find_closest_request()) |
- |
- # Always favor requests with same paths, even if use_path=False. |
- self.assertEqual( |
- request2, archive.find_closest_request(request1, use_path=False)) |
- # If we match strictly on path, request2 is the only match |
- self.assertEqual( |
- request2, archive.find_closest_request(request1, use_path=True)) |
- # request4 can be matched with request3, if use_path=False |
- self.assertEqual( |
- request3, archive.find_closest_request(request4, use_path=False)) |
- # ...but None, if use_path=True |
- self.assertEqual( |
- None, archive.find_closest_request(request4, use_path=True)) |
- |
- def test_find_closest_request_delete_simple(self): |
- archive, request1, request2, request3, request4 = ( |
- self.setup_find_closest_request()) |
- |
- del archive[request3] |
- self.assertEqual( |
- request2, archive.find_closest_request(request1, use_path=False)) |
- self.assertEqual( |
- request2, archive.find_closest_request(request1, use_path=True)) |
- |
- def test_find_closest_request_delete_complex(self): |
- archive, request1, request2, request3, request4 = ( |
- self.setup_find_closest_request()) |
- |
- del archive[request2] |
- self.assertEqual( |
- request3, archive.find_closest_request(request1, use_path=False)) |
- self.assertEqual( |
- None, archive.find_closest_request(request1, use_path=True)) |
- |
- def test_find_closest_request_timestamp(self): |
- headers = {} |
- request1 = httparchive.ArchivedHttpRequest( |
- 'GET', 'www.test.com', '/index.html?time=100000000&important=true', |
- None, headers) |
- request2 = httparchive.ArchivedHttpRequest( |
- 'GET', 'www.test.com', '/index.html?time=99999999&important=true', |
- None, headers) |
- request3 = httparchive.ArchivedHttpRequest( |
- 'GET', 'www.test.com', '/index.html?time=10000000&important=false', |
- None, headers) |
- archive = httparchive.HttpArchive() |
- # Add requests 2 and 3 and find closest match with request1 |
- archive[request2] = self.RESPONSE |
- archive[request3] = self.RESPONSE |
- |
- # Although request3 is lexicographically closer, request2 is semantically |
- # more similar. |
- self.assertEqual( |
- request2, archive.find_closest_request(request1, use_path=True)) |
- |
- def test_get_cmp_seq(self): |
- # The order of key-value pairs in query and header respectively should not |
- # matter. |
- headers = {'k2': 'v2', 'k1': 'v1'} |
- request = httparchive.ArchivedHttpRequest( |
- 'GET', 'www.test.com', '/a?c=d&a=b;e=f', None, headers) |
- self.assertEqual([('a', 'b'), ('c', 'd'), ('e', 'f'), |
- ('k1', 'v1'), ('k2', 'v2')], |
- request._GetCmpSeq('c=d&a=b;e=f')) |
- |
- def test_get_simple(self): |
- request = self.REQUEST |
- response = self.RESPONSE |
- archive = self.archive |
- |
- self.assertEqual(archive.get(request), response) |
- |
- false_request_headers = {'foo': 'bar'} |
- false_request = create_request(false_request_headers) |
- self.assertEqual(archive.get(false_request, default=None), None) |
- |
- def test_get_modified_headers(self): |
- request = self.REQUEST |
- response = self.RESPONSE |
- archive = self.archive |
- not_modified_response = httparchive.create_response(304) |
- |
- # Fail check and return response again |
- request_headers = {'if-modified-since': self.DATE_PAST} |
- request = create_request(request_headers) |
- self.assertEqual(archive.get(request), response) |
- |
- # Succeed check and return 304 Not Modified |
- request_headers = {'if-modified-since': self.DATE_FUTURE} |
- request = create_request(request_headers) |
- self.assertEqual(archive.get(request), not_modified_response) |
- |
- # Succeed check and return 304 Not Modified |
- request_headers = {'if-modified-since': self.DATE_PRESENT} |
- request = create_request(request_headers) |
- self.assertEqual(archive.get(request), not_modified_response) |
- |
- # Invalid date, fail check and return response again |
- request_headers = {'if-modified-since': self.DATE_INVALID} |
- request = create_request(request_headers) |
- self.assertEqual(archive.get(request), response) |
- |
- # fail check since the request is not a GET or HEAD request (as per RFC) |
- request_headers = {'if-modified-since': self.DATE_FUTURE} |
- request = httparchive.ArchivedHttpRequest( |
- 'POST', 'www.test.com', '/', None, request_headers) |
- self.assertEqual(archive.get(request), response) |
- |
- def test_get_unmodified_headers(self): |
- request = self.REQUEST |
- response = self.RESPONSE |
- archive = self.archive |
- not_modified_response = httparchive.create_response(304) |
- |
- # Succeed check |
- request_headers = {'if-unmodified-since': self.DATE_PAST} |
- request = create_request(request_headers) |
- self.assertEqual(archive.get(request), not_modified_response) |
- |
- # Fail check |
- request_headers = {'if-unmodified-since': self.DATE_FUTURE} |
- request = create_request(request_headers) |
- self.assertEqual(archive.get(request), response) |
- |
- # Succeed check |
- request_headers = {'if-unmodified-since': self.DATE_PRESENT} |
- request = create_request(request_headers) |
- self.assertEqual(archive.get(request), not_modified_response) |
- |
- # Fail check |
- request_headers = {'if-unmodified-since': self.DATE_INVALID} |
- request = create_request(request_headers) |
- self.assertEqual(archive.get(request), response) |
- |
- # Fail check since the request is not a GET or HEAD request (as per RFC) |
- request_headers = {'if-modified-since': self.DATE_PAST} |
- request = httparchive.ArchivedHttpRequest( |
- 'POST', 'www.test.com', '/', None, request_headers) |
- self.assertEqual(archive.get(request), response) |
- |
- def test_get_etags(self): |
- request = self.REQUEST |
- response = self.RESPONSE |
- archive = self.archive |
- not_modified_response = httparchive.create_response(304) |
- precondition_failed_response = httparchive.create_response(412) |
- |
- # if-match headers |
- request_headers = {'if-match': self.ETAG_VALID} |
- request = create_request(request_headers) |
- self.assertEqual(archive.get(request), response) |
- |
- request_headers = {'if-match': self.ETAG_INVALID} |
- request = create_request(request_headers) |
- self.assertEqual(archive.get(request), precondition_failed_response) |
- |
- # if-none-match headers |
- request_headers = {'if-none-match': self.ETAG_VALID} |
- request = create_request(request_headers) |
- self.assertEqual(archive.get(request), not_modified_response) |
- |
- request_headers = {'if-none-match': self.ETAG_INVALID} |
- request = create_request(request_headers) |
- self.assertEqual(archive.get(request), response) |
- |
- def test_get_multiple_match_headers(self): |
- request = self.REQUEST |
- response = self.RESPONSE |
- archive = self.archive |
- not_modified_response = httparchive.create_response(304) |
- precondition_failed_response = httparchive.create_response(412) |
- |
- # if-match headers |
- # If the request would, without the If-Match header field, |
- # result in anything other than a 2xx or 412 status, |
- # then the If-Match header MUST be ignored. |
- |
- request_headers = { |
- 'if-match': self.ETAG_VALID, |
- 'if-modified-since': self.DATE_PAST, |
- } |
- request = create_request(request_headers) |
- self.assertEqual(archive.get(request), response) |
- |
- # Invalid etag, precondition failed |
- request_headers = { |
- 'if-match': self.ETAG_INVALID, |
- 'if-modified-since': self.DATE_PAST, |
- } |
- request = create_request(request_headers) |
- self.assertEqual(archive.get(request), precondition_failed_response) |
- |
- # 304 response; ignore if-match header |
- request_headers = { |
- 'if-match': self.ETAG_VALID, |
- 'if-modified-since': self.DATE_FUTURE, |
- } |
- request = create_request(request_headers) |
- self.assertEqual(archive.get(request), not_modified_response) |
- |
- # 304 response; ignore if-match header |
- request_headers = { |
- 'if-match': self.ETAG_INVALID, |
- 'if-modified-since': self.DATE_PRESENT, |
- } |
- request = create_request(request_headers) |
- self.assertEqual(archive.get(request), not_modified_response) |
- |
- # Invalid etag, precondition failed |
- request_headers = { |
- 'if-match': self.ETAG_INVALID, |
- 'if-modified-since': self.DATE_INVALID, |
- } |
- request = create_request(request_headers) |
- self.assertEqual(archive.get(request), precondition_failed_response) |
- |
- def test_get_multiple_none_match_headers(self): |
- request = self.REQUEST |
- response = self.RESPONSE |
- archive = self.archive |
- not_modified_response = httparchive.create_response(304) |
- precondition_failed_response = httparchive.create_response(412) |
- |
- # if-none-match headers |
- # If the request would, without the If-None-Match header field, |
- # result in anything other than a 2xx or 304 status, |
- # then the If-None-Match header MUST be ignored. |
- |
- request_headers = { |
- 'if-none-match': self.ETAG_VALID, |
- 'if-modified-since': self.DATE_PAST, |
- } |
- request = create_request(request_headers) |
- self.assertEqual(archive.get(request), response) |
- |
- request_headers = { |
- 'if-none-match': self.ETAG_INVALID, |
- 'if-modified-since': self.DATE_PAST, |
- } |
- request = create_request(request_headers) |
- self.assertEqual(archive.get(request), response) |
- |
- # etag match, precondition failed |
- request_headers = { |
- 'if-none-match': self.ETAG_VALID, |
- 'if-modified-since': self.DATE_FUTURE, |
- } |
- request = create_request(request_headers) |
- self.assertEqual(archive.get(request), not_modified_response) |
- |
- request_headers = { |
- 'if-none-match': self.ETAG_INVALID, |
- 'if-modified-since': self.DATE_PRESENT, |
- } |
- request = create_request(request_headers) |
- self.assertEqual(archive.get(request), not_modified_response) |
- |
- request_headers = { |
- 'if-none-match': self.ETAG_INVALID, |
- 'if-modified-since': self.DATE_INVALID, |
- } |
- request = create_request(request_headers) |
- self.assertEqual(archive.get(request), response) |
- |
- |
-class ArchivedHttpResponse(unittest.TestCase): |
- PAST_DATE_A = 'Tue, 13 Jul 2010 03:47:07 GMT' |
- PAST_DATE_B = 'Tue, 13 Jul 2010 02:47:07 GMT' # PAST_DATE_A -1 hour |
- PAST_DATE_C = 'Tue, 13 Jul 2010 04:47:07 GMT' # PAST_DATE_A +1 hour |
- NOW_DATE_A = 'Wed, 20 Jul 2011 04:58:08 GMT' |
- NOW_DATE_B = 'Wed, 20 Jul 2011 03:58:08 GMT' # NOW_DATE_A -1 hour |
- NOW_DATE_C = 'Wed, 20 Jul 2011 05:58:08 GMT' # NOW_DATE_A +1 hour |
- NOW_SECONDS = calendar.timegm(email.utils.parsedate(NOW_DATE_A)) |
- |
- def setUp(self): |
- self.response = create_response([('date', self.PAST_DATE_A)]) |
- |
- def test_update_date_same_date(self): |
- self.assertEqual( |
- self.response.update_date(self.PAST_DATE_A, now=self.NOW_SECONDS), |
- self.NOW_DATE_A) |
- |
- def test_update_date_before_date(self): |
- self.assertEqual( |
- self.response.update_date(self.PAST_DATE_B, now=self.NOW_SECONDS), |
- self.NOW_DATE_B) |
- |
- def test_update_date_after_date(self): |
- self.assertEqual( |
- self.response.update_date(self.PAST_DATE_C, now=self.NOW_SECONDS), |
- self.NOW_DATE_C) |
- |
- def test_update_date_bad_date_param(self): |
- self.assertEqual( |
- self.response.update_date('garbage date', now=self.NOW_SECONDS), |
- 'garbage date') |
- |
- def test_update_date_bad_date_header(self): |
- self.response.set_header('date', 'garbage date') |
- self.assertEqual( |
- self.response.update_date(self.PAST_DATE_B, now=self.NOW_SECONDS), |
- self.PAST_DATE_B) |
- |
- |
-if __name__ == '__main__': |
- unittest.main() |