23 #include <gmock/gmock.h>
24 #include <gtest/gtest.h>
26 #include "absl/strings/str_format.h"
72 ~HttpRequestTest()
override {
92 while (!predicate()) {
97 &
worker, NSecondsTime(1))));
109 g_argc, g_argv,
false );
127 struct RequestState {
128 explicit RequestState(HttpRequestTest*
test) :
test(
test) {}
135 HttpRequestTest*
test;
142 RequestState* request_state =
static_cast<RequestState*
>(
arg);
143 if (request_state->pollset_set_to_destroy_eagerly !=
nullptr) {
150 "<html><head><title>Hello world!</title></head>"
151 "<body><p>This is a test</p></body></html>";
159 request_state->test->RunAndKick(
160 [request_state]() { request_state->done =
true; });
164 RequestState* request_state =
static_cast<RequestState*
>(
arg);
165 if (request_state->pollset_set_to_destroy_eagerly !=
nullptr) {
175 request_state->test->RunAndKick(
176 [request_state]() { request_state->done =
true; });
180 RequestState request_state(
this);
194 grpc_schedule_on_exec_ctx),
195 &request_state.response,
198 http_request->Start();
199 PollUntil([&request_state]() {
return request_state.done; },
200 AbslDeadlineSeconds(60));
203 TEST_F(HttpRequestTest, Post) {
204 RequestState request_state(
this);
210 req.body =
const_cast<char*
>(
"hello");
220 grpc_schedule_on_exec_ctx),
221 &request_state.response,
224 http_request->Start();
225 PollUntil([&request_state]() {
return request_state.done; },
226 AbslDeadlineSeconds(60));
229 int g_fake_non_responsive_dns_server_port;
233 "Injecting broken nameserver list. Bad server address:|[::1]:%d|.",
234 g_fake_non_responsive_dns_server_port);
239 (
reinterpret_cast<char*
>(&dns_server_addrs[0].addr.addr6))[15] = 0x1;
240 dns_server_addrs[0].tcp_port = g_fake_non_responsive_dns_server_port;
241 dns_server_addrs[0].udp_port = g_fake_non_responsive_dns_server_port;
242 dns_server_addrs[0].next =
nullptr;
246 TEST_F(HttpRequestTest, CancelGetDuringDNSResolution) {
250 kWaitForClientToSendFirstBytes,
252 g_fake_non_responsive_dns_server_port = fake_dns_server.port();
259 std::vector<std::thread>
threads;
263 RequestState request_state(
this);
268 "http",
"dont-care-since-wont-be-resolved.test.com:443",
"/get",
276 grpc_schedule_on_exec_ctx),
277 &request_state.response,
280 http_request->Start();
284 http_request.reset();
288 PollUntil([&request_state]() {
return request_state.done; },
289 AbslDeadlineSeconds(60));
290 cancel_thread.join();
299 TEST_F(HttpRequestTest, CancelGetWhileReadingResponse) {
308 kWaitForClientToSendFirstBytes,
313 std::vector<std::thread>
threads;
319 RequestState request_state(
this);
332 grpc_schedule_on_exec_ctx),
333 &request_state.response,
336 http_request->Start();
341 http_request.reset();
345 PollUntil([&request_state]() {
return request_state.done; },
346 AbslDeadlineSeconds(60));
347 cancel_thread.join();
360 TEST_F(HttpRequestTest, CancelGetRacesWithConnectionFailure) {
376 std::vector<std::thread>
threads;
380 RequestState request_state(
this);
393 grpc_schedule_on_exec_ctx),
394 &request_state.response,
399 http_request->Start();
409 http_request.reset();
413 PollUntil([&request_state]() {
return request_state.done; },
414 AbslDeadlineSeconds(60));
415 cancel_thread.join();
428 TEST_F(HttpRequestTest, CallerPollentsAreNotReferencedAfterCallbackIsRan) {
439 RequestState request_state(
this);
443 req.path =
const_cast<char*
>(
"/get");
446 pops(), request_state.pollset_set_to_destroy_eagerly);
449 request_state.pollset_set_to_destroy_eagerly);
456 &wrapped_pollset_set_to_destroy_eagerly, &
req, NSecondsTime(15),
458 grpc_schedule_on_exec_ctx),
459 &request_state.response,
463 http_request->Start();
465 http_request.reset();
476 "test only HttpRequest::OnHandshakeDone intercept orphaning request: %p",
488 CancelDuringSecurityHandshakeButHandshakeStillSucceeds) {
489 RequestState request_state(
this);
503 grpc_schedule_on_exec_ctx),
504 &request_state.response,
508 http_request->Start();
509 (void)http_request.release();
511 PollUntil([&request_state]() {
return request_state.done; },
512 AbslDeadlineSeconds(60));
518 int main(
int argc,
char** argv) {