diff options
author | gabadie <gabadie@chromium.org> | 2016-03-21 07:43:20 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-03-21 14:45:03 +0000 |
commit | 0869819900ada55ac050c31400665679b01fc8e5 (patch) | |
tree | 4e9a91642fcbea5bc8518714145a02c0ade24a78 /tools/android | |
parent | b64e3cb6324560bf9525d804acf6894ee214a73c (diff) | |
download | chromium_src-0869819900ada55ac050c31400665679b01fc8e5.zip chromium_src-0869819900ada55ac050c31400665679b01fc8e5.tar.gz chromium_src-0869819900ada55ac050c31400665679b01fc8e5.tar.bz2 |
tools/android/loading: Lets test_server.py handling custom response headers.
This CL let the test_server.py looking for a RESPONSE_HEADERS.json
in the source directory to add response headers on resources. This
will be used for non-regression tests of sandwich's WPR patching.
BUG=582080
Review URL: https://codereview.chromium.org/1759093002
Cr-Commit-Position: refs/heads/master@{#382284}
Diffstat (limited to 'tools/android')
-rwxr-xr-x | tools/android/loading/trace_test/test_server.py | 40 | ||||
-rw-r--r-- | tools/android/loading/trace_test/webserver_unittest.py | 121 |
2 files changed, 124 insertions, 37 deletions
diff --git a/tools/android/loading/trace_test/test_server.py b/tools/android/loading/trace_test/test_server.py index 5898c66..5463667e 100755 --- a/tools/android/loading/trace_test/test_server.py +++ b/tools/android/loading/trace_test/test_server.py @@ -13,6 +13,7 @@ via a named pipe at --fifo. Sources are served from the tree named at import argparse import cgi +import json import os.path import logging import re @@ -20,6 +21,27 @@ import time import wsgiref.simple_server +_CONTENT_TYPE_FOR_SUFFIX = { + 'css': 'text/css', + 'html': 'text/html', + 'jpg': 'image/jpeg', + 'js': 'text/javascript', + 'json': 'application/json', + 'png': 'image/png', + 'ttf': 'font/ttf',} + +# Name of the JSON file containing per file custom response headers located in +# the --source_dir. +# This file should structured like: +# { +# 'mydocument.html': [ +# ['Cache-Control', 'max-age=3600'], +# ['Content-Encoding', 'gzip'], +# ] +# } +RESPONSE_HEADERS_PATH = 'RESPONSE_HEADERS.json' + + class ServerApp(object): """WSGI App. @@ -27,6 +49,11 @@ class ServerApp(object): """ def __init__(self, source_dir): self._source_dir = source_dir + self._response_headers = {} + response_header_path = os.path.join(source_dir, RESPONSE_HEADERS_PATH) + if os.path.exists(response_header_path): + with open(response_header_path) as response_headers_file: + self._response_headers = json.load(response_headers_file) def __call__(self, environ, start_response): """WSGI dispatch. @@ -54,14 +81,11 @@ class ServerApp(object): logging.info('responding with %s', filename) suffix = path[path.rfind('.') + 1:] - start_response('200 OK', [('Content-Type', - {'css': 'text/css', - 'html': 'text/html', - 'jpg': 'image/jpeg', - 'js': 'text/javascript', - 'png': 'image/png', - 'ttf': 'font/ttf', - }[suffix])]) + headers = [('Content-Type', _CONTENT_TYPE_FOR_SUFFIX[suffix])] + if path in self._response_headers: + for header in self._response_headers[path]: + headers.append((str(header[0]), str(header[1]))) + start_response('200 OK', headers) return file(filename).read() diff --git a/tools/android/loading/trace_test/webserver_unittest.py b/tools/android/loading/trace_test/webserver_unittest.py index 2daa2710..d687b13 100644 --- a/tools/android/loading/trace_test/webserver_unittest.py +++ b/tools/android/loading/trace_test/webserver_unittest.py @@ -2,9 +2,12 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. +import httplib +import json import os -import socket +import shutil import sys +import tempfile import unittest _SRC_DIR = os.path.abspath(os.path.join( @@ -12,41 +15,101 @@ _SRC_DIR = os.path.abspath(os.path.join( sys.path.append(os.path.join(_SRC_DIR, 'tools', 'android', 'loading')) import options +from trace_test import test_server from trace_test import webserver_test OPTIONS = options.OPTIONS -class TracingTrackTestCase(unittest.TestCase): +class WebServerTestCase(unittest.TestCase): def setUp(self): - OPTIONS.ParseArgs('', extra=[('--noisy', False)]) - - def testWebserver(self): - with webserver_test.TemporaryDirectory() as temp_dir: - test_html = file(os.path.join(temp_dir, 'test.html'), 'w') - test_html.write('<!DOCTYPE html><html><head><title>Test</title></head>' - '<body><h1>Test Page</h1></body></html>') - test_html.close() - - server = webserver_test.WebServer(temp_dir, temp_dir) - server.Start() - sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - host, port = server.Address().split(':') - sock.connect((host, int(port))) - sock.sendall('GET null HTTP/1.1\n\n') - data = sock.recv(4096) - self.assertTrue(data.startswith('HTTP/1.0 404 Not Found')) - sock.close() - - sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - sock.connect((host, int(port))) - sock.sendall('GET test.html HTTP/1.1\n\n') - data = sock.recv(4096) - self.assertTrue('HTTP/1.0 200 OK' in data) - - sock.close() - self.assertTrue(server.Stop()) + if not OPTIONS._parsed_args: + OPTIONS.ParseArgs('', extra=[('--noisy', False)]) + self._temp_dir = tempfile.mkdtemp() + self._server = webserver_test.WebServer(self._temp_dir, self._temp_dir) + + def tearDown(self): + self.assertTrue(self._server.Stop()) + shutil.rmtree(self._temp_dir) + + def StartServer(self): + self._server.Start() + + def WriteFile(self, path, file_content): + with open(os.path.join(self._temp_dir, path), 'w') as file_output: + file_output.write(file_content) + + def Request(self, path): + host, port = self._server.Address().split(':') + connection = httplib.HTTPConnection(host, int(port)) + connection.request('GET', path) + response = connection.getresponse() + connection.close() + return response + + def testWebserverBasic(self): + self.WriteFile('test.html', + '<!DOCTYPE html><html><head><title>Test</title></head>' + '<body><h1>Test Page</h1></body></html>') + self.StartServer() + + response = self.Request('test.html') + self.assertEqual(200, response.status) + + response = self.Request('/test.html') + self.assertEqual(200, response.status) + + response = self.Request('///test.html') + self.assertEqual(200, response.status) + + def testWebserver404(self): + self.StartServer() + + response = self.Request('null') + self.assertEqual(404, response.status) + self.assertEqual('text/html', response.getheader('content-type')) + + def testContentType(self): + self.WriteFile('test.html', + '<!DOCTYPE html><html><head><title>Test</title></head>' + '<body><h1>Test Page</h1></body></html>') + self.WriteFile('blobfile', + 'whatever') + self.StartServer() + + response = self.Request('test.html') + self.assertEqual(200, response.status) + self.assertEqual('text/html', response.getheader('content-type')) + + response = self.Request('blobfile') + self.assertEqual(500, response.status) + + def testCustomResponseHeader(self): + self.WriteFile('test.html', + '<!DOCTYPE html><html><head><title>Test</title></head>' + '<body><h1>Test Page</h1></body></html>') + self.WriteFile('test2.html', + '<!DOCTYPE html><html><head><title>Test 2</title></head>' + '<body><h1>Test Page 2</h1></body></html>') + self.WriteFile(test_server.RESPONSE_HEADERS_PATH, + json.dumps({'test2.html': [['Cache-Control', 'no-store']]})) + self.StartServer() + + response = self.Request('test.html') + self.assertEqual(200, response.status) + self.assertEqual('text/html', response.getheader('content-type')) + self.assertEqual(None, response.getheader('cache-control')) + + response = self.Request('test2.html') + self.assertEqual(200, response.status) + self.assertEqual('text/html', response.getheader('content-type')) + self.assertEqual('no-store', response.getheader('cache-control')) + + response = self.Request(test_server.RESPONSE_HEADERS_PATH) + self.assertEqual(200, response.status) + self.assertEqual('application/json', response.getheader('content-type')) + self.assertEqual(None, response.getheader('cache-control')) if __name__ == '__main__': |