blob: 61f4beb74aa5f02036289106d0fd3b2f3cb0e994 [file] [log] [blame]
ncteisen65a45ae2016-12-15 14:35:17 -08001# Copyright 2016, Google Inc.
2# All rights reserved.
3#
4# Redistribution and use in source and binary forms, with or without
5# modification, are permitted provided that the following conditions are
6# met:
7#
8# * Redistributions of source code must retain the above copyright
9# notice, this list of conditions and the following disclaimer.
10# * Redistributions in binary form must reproduce the above
11# copyright notice, this list of conditions and the following disclaimer
12# in the documentation and/or other materials provided with the
13# distribution.
14# * Neither the name of Google Inc. nor the names of its
15# contributors may be used to endorse or promote products derived from
16# this software without specific prior written permission.
17#
18# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
Makarand Dharmapurikar323bfa72016-12-01 10:51:10 -080030import logging
Makarand Dharmapurikarecc32882016-12-01 15:22:50 -080031import time
Makarand Dharmapurikar8c579172016-12-12 13:58:15 -080032
Makarand Dharmapurikar323bfa72016-12-01 10:51:10 -080033import http2_base_server
34
35class TestcaseGoaway(object):
36 """
37 This test does the following:
38 Process incoming request normally, i.e. send headers, data and trailers.
39 Then send a GOAWAY frame with the stream id of the processed request.
Makarand Dharmapurikar8c579172016-12-12 13:58:15 -080040 It checks that the next request is made on a different TCP connection.
Makarand Dharmapurikar323bfa72016-12-01 10:51:10 -080041 """
42 def __init__(self, iteration):
43 self._base_server = http2_base_server.H2ProtocolBaseServer()
44 self._base_server._handlers['RequestReceived'] = self.on_request_received
45 self._base_server._handlers['DataReceived'] = self.on_data_received
Makarand Dharmapurikar323bfa72016-12-01 10:51:10 -080046 self._base_server._handlers['SendDone'] = self.on_send_done
47 self._base_server._handlers['ConnectionLost'] = self.on_connection_lost
48 self._ready_to_send = False
49 self._iteration = iteration
50
51 def get_base_server(self):
52 return self._base_server
53
54 def on_connection_lost(self, reason):
Makarand Dharmapurikar8c579172016-12-12 13:58:15 -080055 logging.info('Disconnect received. Count %d' % self._iteration)
Makarand Dharmapurikar323bfa72016-12-01 10:51:10 -080056 # _iteration == 2 => Two different connections have been used.
Makarand Dharmapurikara16ea7f2016-12-02 10:17:03 -080057 if self._iteration == 2:
Makarand Dharmapurikar323bfa72016-12-01 10:51:10 -080058 self._base_server.on_connection_lost(reason)
59
Makarand Dharmapurikar4350e742016-12-01 14:24:22 -080060 def on_send_done(self, stream_id):
61 self._base_server.on_send_done_default(stream_id)
Makarand Dharmapurikar8c579172016-12-12 13:58:15 -080062 logging.info('Sending GOAWAY for stream %d:' % stream_id)
Makarand Dharmapurikar4350e742016-12-01 14:24:22 -080063 self._base_server._conn.close_connection(error_code=0, additional_data=None, last_stream_id=stream_id)
64 self._base_server._stream_status[stream_id] = False
Makarand Dharmapurikar323bfa72016-12-01 10:51:10 -080065
66 def on_request_received(self, event):
67 self._ready_to_send = False
68 self._base_server.on_request_received_default(event)
69
70 def on_data_received(self, event):
71 self._base_server.on_data_received_default(event)
Makarand Dharmapurikar4350e742016-12-01 14:24:22 -080072 sr = self._base_server.parse_received_data(event.stream_id)
Makarand Dharmapurikar323bfa72016-12-01 10:51:10 -080073 if sr:
Makarand Dharmapurikar8c579172016-12-12 13:58:15 -080074 logging.info('Creating response size = %s' % sr.response_size)
Makarand Dharmapurikar323bfa72016-12-01 10:51:10 -080075 response_data = self._base_server.default_response_data(sr.response_size)
76 self._ready_to_send = True
Makarand Dharmapurikar4350e742016-12-01 14:24:22 -080077 self._base_server.setup_send(response_data, event.stream_id)