summaryrefslogtreecommitdiffstats
path: root/tools/android
diff options
context:
space:
mode:
authorgabadie <gabadie@chromium.org>2016-03-21 07:43:20 -0700
committerCommit bot <commit-bot@chromium.org>2016-03-21 14:45:03 +0000
commit0869819900ada55ac050c31400665679b01fc8e5 (patch)
tree4e9a91642fcbea5bc8518714145a02c0ade24a78 /tools/android
parentb64e3cb6324560bf9525d804acf6894ee214a73c (diff)
downloadchromium_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-xtools/android/loading/trace_test/test_server.py40
-rw-r--r--tools/android/loading/trace_test/webserver_unittest.py121
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__':