aboutsummaryrefslogtreecommitdiffhomepage
path: root/test/http2_test/test_goaway.py
diff options
context:
space:
mode:
Diffstat (limited to 'test/http2_test/test_goaway.py')
-rw-r--r--test/http2_test/test_goaway.py51
1 files changed, 51 insertions, 0 deletions
diff --git a/test/http2_test/test_goaway.py b/test/http2_test/test_goaway.py
new file mode 100644
index 0000000000..419bd7b3f8
--- /dev/null
+++ b/test/http2_test/test_goaway.py
@@ -0,0 +1,51 @@
+import logging
+import http2_base_server
+
+class TestcaseGoaway(object):
+ """
+ This test does the following:
+ Process incoming request normally, i.e. send headers, data and trailers.
+ Then send a GOAWAY frame with the stream id of the processed request.
+ It assert that the next request is made on a different TCP connection.
+ """
+ def __init__(self, iteration):
+ self._base_server = http2_base_server.H2ProtocolBaseServer()
+ self._base_server._handlers['RequestReceived'] = self.on_request_received
+ self._base_server._handlers['DataReceived'] = self.on_data_received
+ self._base_server._handlers['WindowUpdated'] = self.on_window_update_default
+ self._base_server._handlers['SendDone'] = self.on_send_done
+ self._base_server._handlers['ConnectionLost'] = self.on_connection_lost
+ self._ready_to_send = False
+ self._iteration = iteration
+
+ def get_base_server(self):
+ return self._base_server
+
+ def on_connection_lost(self, reason):
+ logging.info('Disconnect received. Count %d'%self._iteration)
+ # _iteration == 2 => Two different connections have been used.
+ if self._iteration == 2:
+ self._base_server.on_connection_lost(reason)
+
+ def on_send_done(self):
+ self._base_server.on_send_done_default()
+ if self._base_server._stream_id == 1:
+ logging.info('Sending GOAWAY for stream 1')
+ self._base_server._conn.close_connection(error_code=0, additional_data=None, last_stream_id=1)
+
+ def on_request_received(self, event):
+ self._ready_to_send = False
+ self._base_server.on_request_received_default(event)
+
+ def on_data_received(self, event):
+ self._base_server.on_data_received_default(event)
+ sr = self._base_server.parse_received_data(self._base_server._recv_buffer)
+ if sr:
+ logging.info('Creating response size = %s'%sr.response_size)
+ response_data = self._base_server.default_response_data(sr.response_size)
+ self._ready_to_send = True
+ self._base_server.setup_send(response_data)
+
+ def on_window_update_default(self, event):
+ if self._ready_to_send:
+ self._base_server.default_send()