blob: 472fcbbee7ef0ce5bd5d0cee7a8c384430c87f4f [file] [log] [blame]
Jan Tattermusch7897ae92017-06-07 22:57:36 +02001# Copyright 2016 gRPC authors.
ncteisen65a45ae2016-12-15 14:35:17 -08002#
Jan Tattermusch7897ae92017-06-07 22:57:36 +02003# Licensed under the Apache License, Version 2.0 (the "License");
4# you may not use this file except in compliance with the License.
5# You may obtain a copy of the License at
ncteisen65a45ae2016-12-15 14:35:17 -08006#
Jan Tattermusch7897ae92017-06-07 22:57:36 +02007# http://www.apache.org/licenses/LICENSE-2.0
ncteisen65a45ae2016-12-15 14:35:17 -08008#
Jan Tattermusch7897ae92017-06-07 22:57:36 +02009# Unless required by applicable law or agreed to in writing, software
10# distributed under the License is distributed on an "AS IS" BASIS,
11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12# See the License for the specific language governing permissions and
13# limitations under the License.
ncteisen65a45ae2016-12-15 14:35:17 -080014
Makarand Dharmapurikar323bfa72016-12-01 10:51:10 -080015import logging
Makarand Dharmapurikarecc32882016-12-01 15:22:50 -080016import time
Makarand Dharmapurikar8c579172016-12-12 13:58:15 -080017
Makarand Dharmapurikar323bfa72016-12-01 10:51:10 -080018import http2_base_server
19
20class TestcaseGoaway(object):
21 """
22 This test does the following:
23 Process incoming request normally, i.e. send headers, data and trailers.
24 Then send a GOAWAY frame with the stream id of the processed request.
Makarand Dharmapurikar8c579172016-12-12 13:58:15 -080025 It checks that the next request is made on a different TCP connection.
Makarand Dharmapurikar323bfa72016-12-01 10:51:10 -080026 """
27 def __init__(self, iteration):
28 self._base_server = http2_base_server.H2ProtocolBaseServer()
29 self._base_server._handlers['RequestReceived'] = self.on_request_received
30 self._base_server._handlers['DataReceived'] = self.on_data_received
Makarand Dharmapurikar323bfa72016-12-01 10:51:10 -080031 self._base_server._handlers['SendDone'] = self.on_send_done
32 self._base_server._handlers['ConnectionLost'] = self.on_connection_lost
33 self._ready_to_send = False
34 self._iteration = iteration
35
36 def get_base_server(self):
37 return self._base_server
38
39 def on_connection_lost(self, reason):
Makarand Dharmapurikar8c579172016-12-12 13:58:15 -080040 logging.info('Disconnect received. Count %d' % self._iteration)
Makarand Dharmapurikar323bfa72016-12-01 10:51:10 -080041 # _iteration == 2 => Two different connections have been used.
Makarand Dharmapurikara16ea7f2016-12-02 10:17:03 -080042 if self._iteration == 2:
Makarand Dharmapurikar323bfa72016-12-01 10:51:10 -080043 self._base_server.on_connection_lost(reason)
44
Makarand Dharmapurikar4350e742016-12-01 14:24:22 -080045 def on_send_done(self, stream_id):
46 self._base_server.on_send_done_default(stream_id)
Makarand Dharmapurikar8c579172016-12-12 13:58:15 -080047 logging.info('Sending GOAWAY for stream %d:' % stream_id)
Makarand Dharmapurikar4350e742016-12-01 14:24:22 -080048 self._base_server._conn.close_connection(error_code=0, additional_data=None, last_stream_id=stream_id)
49 self._base_server._stream_status[stream_id] = False
Makarand Dharmapurikar323bfa72016-12-01 10:51:10 -080050
51 def on_request_received(self, event):
52 self._ready_to_send = False
53 self._base_server.on_request_received_default(event)
54
55 def on_data_received(self, event):
56 self._base_server.on_data_received_default(event)
Makarand Dharmapurikar4350e742016-12-01 14:24:22 -080057 sr = self._base_server.parse_received_data(event.stream_id)
Makarand Dharmapurikar323bfa72016-12-01 10:51:10 -080058 if sr:
Makarand Dharmapurikar8c579172016-12-12 13:58:15 -080059 logging.info('Creating response size = %s' % sr.response_size)
Makarand Dharmapurikar323bfa72016-12-01 10:51:10 -080060 response_data = self._base_server.default_response_data(sr.response_size)
61 self._ready_to_send = True
Makarand Dharmapurikar4350e742016-12-01 14:24:22 -080062 self._base_server.setup_send(response_data, event.stream_id)