Jan Tattermusch | 7897ae9 | 2017-06-07 22:57:36 +0200 | [diff] [blame] | 1 | # Copyright 2016 gRPC authors. |
ncteisen | 65a45ae | 2016-12-15 14:35:17 -0800 | [diff] [blame] | 2 | # |
Jan Tattermusch | 7897ae9 | 2017-06-07 22:57:36 +0200 | [diff] [blame] | 3 | # 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 |
ncteisen | 65a45ae | 2016-12-15 14:35:17 -0800 | [diff] [blame] | 6 | # |
Jan Tattermusch | 7897ae9 | 2017-06-07 22:57:36 +0200 | [diff] [blame] | 7 | # http://www.apache.org/licenses/LICENSE-2.0 |
ncteisen | 65a45ae | 2016-12-15 14:35:17 -0800 | [diff] [blame] | 8 | # |
Jan Tattermusch | 7897ae9 | 2017-06-07 22:57:36 +0200 | [diff] [blame] | 9 | # 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. |
ncteisen | 65a45ae | 2016-12-15 14:35:17 -0800 | [diff] [blame] | 14 | |
| 15 | """HTTP2 Test Server""" |
| 16 | |
Makarand Dharmapurikar | af37b80 | 2016-11-29 12:28:51 -0800 | [diff] [blame] | 17 | import argparse |
| 18 | import logging |
Eric Gribkoff | 5ae42a1 | 2017-03-10 12:04:49 -0800 | [diff] [blame] | 19 | import sys |
Makarand Dharmapurikar | 8c57917 | 2016-12-12 13:58:15 -0800 | [diff] [blame] | 20 | import twisted |
| 21 | import twisted.internet |
| 22 | import twisted.internet.endpoints |
| 23 | import twisted.internet.reactor |
Makarand Dharmapurikar | af37b80 | 2016-11-29 12:28:51 -0800 | [diff] [blame] | 24 | |
Makarand Dharmapurikar | af37b80 | 2016-11-29 12:28:51 -0800 | [diff] [blame] | 25 | import http2_base_server |
Makarand Dharmapurikar | 28d1980 | 2016-12-01 10:56:52 -0800 | [diff] [blame] | 26 | import test_goaway |
Makarand Dharmapurikar | 28d1980 | 2016-12-01 10:56:52 -0800 | [diff] [blame] | 27 | import test_max_streams |
Makarand Dharmapurikar | 8c57917 | 2016-12-12 13:58:15 -0800 | [diff] [blame] | 28 | import test_ping |
| 29 | import test_rst_after_data |
| 30 | import test_rst_after_header |
| 31 | import test_rst_during_data |
Alexander Polcyn | 50fdc8a | 2017-02-09 21:06:08 -0800 | [diff] [blame] | 32 | import test_data_frame_padding |
Makarand Dharmapurikar | af37b80 | 2016-11-29 12:28:51 -0800 | [diff] [blame] | 33 | |
Makarand Dharmapurikar | 8c57917 | 2016-12-12 13:58:15 -0800 | [diff] [blame] | 34 | _TEST_CASE_MAPPING = { |
Makarand Dharmapurikar | a16ea7f | 2016-12-02 10:17:03 -0800 | [diff] [blame] | 35 | 'rst_after_header': test_rst_after_header.TestcaseRstStreamAfterHeader, |
| 36 | 'rst_after_data': test_rst_after_data.TestcaseRstStreamAfterData, |
| 37 | 'rst_during_data': test_rst_during_data.TestcaseRstStreamDuringData, |
| 38 | 'goaway': test_goaway.TestcaseGoaway, |
| 39 | 'ping': test_ping.TestcasePing, |
| 40 | 'max_streams': test_max_streams.TestcaseSettingsMaxStreams, |
Alexander Polcyn | 50fdc8a | 2017-02-09 21:06:08 -0800 | [diff] [blame] | 41 | |
| 42 | # Positive tests below: |
| 43 | 'data_frame_padding': test_data_frame_padding.TestDataFramePadding, |
| 44 | 'no_df_padding_sanity_test': test_data_frame_padding.TestDataFramePadding, |
Makarand Dharmapurikar | a16ea7f | 2016-12-02 10:17:03 -0800 | [diff] [blame] | 45 | } |
| 46 | |
Eric Gribkoff | 69e2f82 | 2017-03-10 12:21:05 -0800 | [diff] [blame] | 47 | _exit_code = 0 |
| 48 | |
Makarand Dharmapurikar | 8c57917 | 2016-12-12 13:58:15 -0800 | [diff] [blame] | 49 | class H2Factory(twisted.internet.protocol.Factory): |
Makarand Dharmapurikar | af37b80 | 2016-11-29 12:28:51 -0800 | [diff] [blame] | 50 | def __init__(self, testcase): |
Eric Gribkoff | 5ae42a1 | 2017-03-10 12:04:49 -0800 | [diff] [blame] | 51 | logging.info('Creating H2Factory for new connection (%s)', testcase) |
Makarand Dharmapurikar | af37b80 | 2016-11-29 12:28:51 -0800 | [diff] [blame] | 52 | self._num_streams = 0 |
| 53 | self._testcase = testcase |
| 54 | |
| 55 | def buildProtocol(self, addr): |
| 56 | self._num_streams += 1 |
Makarand Dharmapurikar | 8c57917 | 2016-12-12 13:58:15 -0800 | [diff] [blame] | 57 | logging.info('New Connection: %d' % self._num_streams) |
| 58 | if not _TEST_CASE_MAPPING.has_key(self._testcase): |
| 59 | logging.error('Unknown test case: %s' % self._testcase) |
Makarand Dharmapurikar | af37b80 | 2016-11-29 12:28:51 -0800 | [diff] [blame] | 60 | assert(0) |
Makarand Dharmapurikar | a16ea7f | 2016-12-02 10:17:03 -0800 | [diff] [blame] | 61 | else: |
Makarand Dharmapurikar | 8c57917 | 2016-12-12 13:58:15 -0800 | [diff] [blame] | 62 | t = _TEST_CASE_MAPPING[self._testcase] |
Makarand Dharmapurikar | a16ea7f | 2016-12-02 10:17:03 -0800 | [diff] [blame] | 63 | |
| 64 | if self._testcase == 'goaway': |
| 65 | return t(self._num_streams).get_base_server() |
Alexander Polcyn | 50fdc8a | 2017-02-09 21:06:08 -0800 | [diff] [blame] | 66 | elif self._testcase == 'no_df_padding_sanity_test': |
| 67 | return t(use_padding=False).get_base_server() |
Makarand Dharmapurikar | a16ea7f | 2016-12-02 10:17:03 -0800 | [diff] [blame] | 68 | else: |
| 69 | return t().get_base_server() |
Makarand Dharmapurikar | af37b80 | 2016-11-29 12:28:51 -0800 | [diff] [blame] | 70 | |
Makarand Dharmapurikar | 7fc6f3b | 2017-01-09 10:55:51 -0800 | [diff] [blame] | 71 | def parse_arguments(): |
| 72 | parser = argparse.ArgumentParser() |
| 73 | parser.add_argument('--base_port', type=int, default=8080, |
| 74 | help='base port to run the servers (default: 8080). One test server is ' |
| 75 | 'started on each incrementing port, beginning with base_port, in the ' |
Alexander Polcyn | 50fdc8a | 2017-02-09 21:06:08 -0800 | [diff] [blame] | 76 | 'following order: data_frame_padding,goaway,max_streams,' |
| 77 | 'no_df_padding_sanity_test,ping,rst_after_data,rst_after_header,' |
Makarand Dharmapurikar | 7fc6f3b | 2017-01-09 10:55:51 -0800 | [diff] [blame] | 78 | 'rst_during_data' |
| 79 | ) |
| 80 | return parser.parse_args() |
| 81 | |
Eric Gribkoff | 5ae42a1 | 2017-03-10 12:04:49 -0800 | [diff] [blame] | 82 | def listen(endpoint, test_case): |
| 83 | deferred = endpoint.listen(H2Factory(test_case)) |
| 84 | def listen_error(reason): |
| 85 | # If listening fails, we stop the reactor and exit the program |
Eric Gribkoff | 95f48c1 | 2017-03-10 14:01:11 -0800 | [diff] [blame] | 86 | # with exit code 1. |
Eric Gribkoff | 69e2f82 | 2017-03-10 12:21:05 -0800 | [diff] [blame] | 87 | global _exit_code |
Eric Gribkoff | 95f48c1 | 2017-03-10 14:01:11 -0800 | [diff] [blame] | 88 | _exit_code = 1 |
Eric Gribkoff | 5ae42a1 | 2017-03-10 12:04:49 -0800 | [diff] [blame] | 89 | logging.error('Listening failed: %s' % reason.value) |
| 90 | twisted.internet.reactor.stop() |
| 91 | deferred.addErrback(listen_error) |
| 92 | |
Makarand Dharmapurikar | 7fc6f3b | 2017-01-09 10:55:51 -0800 | [diff] [blame] | 93 | def start_test_servers(base_port): |
| 94 | """ Start one server per test case on incrementing port numbers |
| 95 | beginning with base_port """ |
| 96 | index = 0 |
| 97 | for test_case in sorted(_TEST_CASE_MAPPING.keys()): |
| 98 | portnum = base_port + index |
| 99 | logging.warning('serving on port %d : %s'%(portnum, test_case)) |
| 100 | endpoint = twisted.internet.endpoints.TCP4ServerEndpoint( |
| 101 | twisted.internet.reactor, portnum, backlog=128) |
Eric Gribkoff | 5ae42a1 | 2017-03-10 12:04:49 -0800 | [diff] [blame] | 102 | # Wait until the reactor is running before calling endpoint.listen(). |
| 103 | twisted.internet.reactor.callWhenRunning(listen, endpoint, test_case) |
| 104 | |
Makarand Dharmapurikar | 7fc6f3b | 2017-01-09 10:55:51 -0800 | [diff] [blame] | 105 | index += 1 |
| 106 | |
Eric Gribkoff | b3bda54 | 2016-12-15 11:02:59 -0800 | [diff] [blame] | 107 | if __name__ == '__main__': |
| 108 | logging.basicConfig( |
| 109 | format='%(levelname) -10s %(asctime)s %(module)s:%(lineno)s | %(message)s', |
| 110 | level=logging.INFO) |
Makarand Dharmapurikar | 7fc6f3b | 2017-01-09 10:55:51 -0800 | [diff] [blame] | 111 | args = parse_arguments() |
| 112 | start_test_servers(args.base_port) |
Eric Gribkoff | b3bda54 | 2016-12-15 11:02:59 -0800 | [diff] [blame] | 113 | twisted.internet.reactor.run() |
Eric Gribkoff | 69e2f82 | 2017-03-10 12:21:05 -0800 | [diff] [blame] | 114 | sys.exit(_exit_code) |