diff options
author | rdsmith@chromium.org <rdsmith@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-03-16 09:35:19 +0000 |
---|---|---|
committer | rdsmith@chromium.org <rdsmith@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-03-16 09:35:19 +0000 |
commit | fc179dd1b6742988ee4d130af96f7ed922c14f12 (patch) | |
tree | e0a1953ff9a97a6ff28822d38c30f76b79506229 /net/tools | |
parent | e8cb11fd2839d912f73a97621898c1397cd7ef40 (diff) | |
download | chromium_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-x | net/tools/testserver/testserver.py | 59 |
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: |