summaryrefslogtreecommitdiffstats
path: root/net/tools
diff options
context:
space:
mode:
authorrdsmith@chromium.org <rdsmith@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-03-16 09:35:19 +0000
committerrdsmith@chromium.org <rdsmith@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-03-16 09:35:19 +0000
commitfc179dd1b6742988ee4d130af96f7ed922c14f12 (patch)
treee0a1953ff9a97a6ff28822d38c30f76b79506229 /net/tools
parente8cb11fd2839d912f73a97621898c1397cd7ef40 (diff)
downloadchromium_src-fc179dd1b6742988ee4d130af96f7ed922c14f12.zip
chromium_src-fc179dd1b6742988ee4d130af96f7ed922c14f12.tar.gz
chromium_src-fc179dd1b6742988ee4d130af96f7ed922c14f12.tar.bz2
Partially integrate filename determination with resumption.
Also substantially increased test coverage. BUG=7648 R=asanka@chromium.org Review URL: https://chromiumcodereview.appspot.com/12308011 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@188562 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net/tools')
-rwxr-xr-xnet/tools/testserver/testserver.py59
1 files changed, 50 insertions, 9 deletions
diff --git a/net/tools/testserver/testserver.py b/net/tools/testserver/testserver.py
index 931fdd7..44312a0 100755
--- a/net/tools/testserver/testserver.py
+++ b/net/tools/testserver/testserver.py
@@ -55,7 +55,6 @@ SERVER_WEBSOCKET = 5
# Default request queue size for WebSocketServer.
_DEFAULT_REQUEST_QUEUE_SIZE = 128
-
class WebSocketOptions:
"""Holds options for WebSocketServer."""
@@ -224,6 +223,10 @@ class UDPEchoServer(testserver_base.ClientRestrictingServerMixIn,
class TestPageHandler(testserver_base.BasePageHandler):
+ # Class variables to allow for persistence state between page handler
+ # invocations
+ rst_limits = {}
+ fail_precondition = {}
def __init__(self, request, client_address, socket_server):
connect_handlers = [
@@ -1455,6 +1458,13 @@ class TestPageHandler(testserver_base.BasePageHandler):
Support range requests. If the data requested doesn't straddle a reset
boundary, it will all be sent. Used for testing resuming downloads."""
+ def DataForRange(start, end):
+ """Data to be provided for a particular range of bytes."""
+ # Offset and scale to avoid too obvious (and hence potentially
+ # collidable) data.
+ return ''.join([chr(y % 256)
+ for y in range(start * 2 + 15, end * 2 + 15, 2)])
+
if not self._ShouldHandleRequest('/rangereset'):
return False
@@ -1466,6 +1476,10 @@ class TestPageHandler(testserver_base.BasePageHandler):
rst_boundary = 4000
respond_to_range = True
hold_for_signal = False
+ rst_limit = -1
+ token = 'DEFAULT'
+ fail_precondition = 0
+ send_verifiers = True
# Parse the query
qdict = urlparse.parse_qs(query, True)
@@ -1473,10 +1487,31 @@ class TestPageHandler(testserver_base.BasePageHandler):
size = int(qdict['size'][0])
if 'rst_boundary' in qdict:
rst_boundary = int(qdict['rst_boundary'][0])
+ if 'token' in qdict:
+ # Identifying token for stateful tests.
+ token = qdict['token'][0]
+ if 'rst_limit' in qdict:
+ # Max number of rsts for a given token.
+ rst_limit = int(qdict['rst_limit'][0])
if 'bounce_range' in qdict:
respond_to_range = False
if 'hold' in qdict:
+ # Note that hold_for_signal will not work with null range requests;
+ # see TODO below.
hold_for_signal = True
+ if 'no_verifiers' in qdict:
+ send_verifiers = False
+ if 'fail_precondition' in qdict:
+ fail_precondition = int(qdict['fail_precondition'][0])
+
+ # Record already set information, or set it.
+ rst_limit = TestPageHandler.rst_limits.setdefault(token, rst_limit)
+ if rst_limit != 0:
+ TestPageHandler.rst_limits[token] -= 1
+ fail_precondition = TestPageHandler.fail_precondition.setdefault(
+ token, fail_precondition)
+ if fail_precondition != 0:
+ TestPageHandler.fail_precondition[token] -= 1
first_byte = 0
last_byte = size - 1
@@ -1497,10 +1532,12 @@ class TestPageHandler(testserver_base.BasePageHandler):
if last_byte < first_byte:
return False
- # Set socket send buf high enough that we don't need to worry
- # about asynchronous closes when sending RSTs.
- self.connection.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF,
- 16284)
+ if (fail_precondition and
+ (self.headers.getheader('If-Modified-Since') or
+ self.headers.getheader('If-Match'))):
+ self.send_response(412)
+ self.end_headers()
+ return True
if range_response:
self.send_response(206)
@@ -1510,13 +1547,16 @@ class TestPageHandler(testserver_base.BasePageHandler):
self.send_response(200)
self.send_header('Content-Type', 'application/octet-stream')
self.send_header('Content-Length', last_byte - first_byte + 1)
+ if send_verifiers:
+ self.send_header('Etag', '"XYZZY"')
+ self.send_header('Last-Modified', 'Tue, 19 Feb 2013 14:32 EST')
self.end_headers()
if hold_for_signal:
# TODO(rdsmith/phajdan.jr): http://crbug.com/169519: Without writing
# a single byte, the self.server.handle_request() below hangs
# without processing new incoming requests.
- self.wfile.write('X')
+ self.wfile.write(DataForRange(first_byte, first_byte + 1))
first_byte = first_byte + 1
# handle requests until one of them clears this flag.
self.server.wait_for_download = True
@@ -1524,11 +1564,11 @@ class TestPageHandler(testserver_base.BasePageHandler):
self.server.handle_request()
possible_rst = ((first_byte / rst_boundary) + 1) * rst_boundary
- if possible_rst >= last_byte:
+ if possible_rst >= last_byte or rst_limit == 0:
# No RST has been requested in this range, so we don't need to
# do anything fancy; just write the data and let the python
# infrastructure close the connection.
- self.wfile.write('X' * (last_byte - first_byte + 1))
+ self.wfile.write(DataForRange(first_byte, last_byte + 1))
self.wfile.flush()
return True
@@ -1538,7 +1578,8 @@ class TestPageHandler(testserver_base.BasePageHandler):
# sent when using the linger semantics to hard close a socket,
# we send the data and then wait for our peer to release us
# before sending the reset.
- self.wfile.write('X' * (possible_rst - first_byte))
+ data = DataForRange(first_byte, possible_rst)
+ self.wfile.write(data)
self.wfile.flush()
self.server.wait_for_download = True
while self.server.wait_for_download: