(tctx)
| 93 | |
| 94 | |
| 95 | def test_simple(tctx): |
| 96 | playbook, cff = start_h2_client(tctx) |
| 97 | flow = Placeholder(HTTPFlow) |
| 98 | server = Placeholder(Server) |
| 99 | initial = Placeholder(bytes) |
| 100 | assert ( |
| 101 | playbook |
| 102 | >> DataReceived( |
| 103 | tctx.client, |
| 104 | cff.build_headers_frame( |
| 105 | example_request_headers, flags=["END_STREAM"] |
| 106 | ).serialize(), |
| 107 | ) |
| 108 | << http.HttpRequestHeadersHook(flow) |
| 109 | >> reply() |
| 110 | << http.HttpRequestHook(flow) |
| 111 | >> reply() |
| 112 | << OpenConnection(server) |
| 113 | >> reply(None, side_effect=make_h2) |
| 114 | << SendData(server, initial) |
| 115 | ) |
| 116 | frames = decode_frames(initial()) |
| 117 | assert [type(x) for x in frames] == [ |
| 118 | hyperframe.frame.SettingsFrame, |
| 119 | hyperframe.frame.WindowUpdateFrame, |
| 120 | hyperframe.frame.HeadersFrame, |
| 121 | ] |
| 122 | sff = FrameFactory() |
| 123 | assert ( |
| 124 | playbook |
| 125 | # a conforming h2 server would send settings first, we disregard this for now. |
| 126 | >> DataReceived( |
| 127 | server, sff.build_headers_frame(example_response_headers).serialize() |
| 128 | ) |
| 129 | << http.HttpResponseHeadersHook(flow) |
| 130 | >> reply() |
| 131 | >> DataReceived( |
| 132 | server, |
| 133 | sff.build_data_frame(b"Hello, World!", flags=["END_STREAM"]).serialize(), |
| 134 | ) |
| 135 | << http.HttpResponseHook(flow) |
| 136 | >> reply() |
| 137 | << SendData( |
| 138 | tctx.client, |
| 139 | cff.build_headers_frame(example_response_headers).serialize() |
| 140 | + cff.build_data_frame(b"Hello, World!").serialize() |
| 141 | + cff.build_data_frame(b"", flags=["END_STREAM"]).serialize(), |
| 142 | ) |
| 143 | ) |
| 144 | assert flow().request.url == "http://example.com/" |
| 145 | assert flow().response.text == "Hello, World!" |
| 146 | |
| 147 | |
| 148 | @pytest.mark.parametrize("stream", ["stream", ""]) |
nothing calls this directly
no test coverage detected
searching dependent graphs…