From 2bbb8779f52329cfdc707f9399ffd1996059d002 Mon Sep 17 00:00:00 2001 From: Alyssa Wilk Date: Mon, 25 Oct 2021 12:07:15 -0400 Subject: [PATCH 1/2] dfp: adding queueing test Signed-off-by: Alyssa Wilk --- .../proxy_filter_integration_test.cc | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/test/extensions/filters/http/dynamic_forward_proxy/proxy_filter_integration_test.cc b/test/extensions/filters/http/dynamic_forward_proxy/proxy_filter_integration_test.cc index 906de4085a3c3..e46e6b43dc223 100644 --- a/test/extensions/filters/http/dynamic_forward_proxy/proxy_filter_integration_test.cc +++ b/test/extensions/filters/http/dynamic_forward_proxy/proxy_filter_integration_test.cc @@ -446,5 +446,63 @@ TEST_P(ProxyFilterIntegrationTest, UseCacheFileAndTestHappyEyeballs) { EXPECT_EQ(1, test_server_->counter("dns_cache.foo.host_added")->value()); } +TEST_P(ProxyFilterIntegrationTest, MultipleRequestsLowStreamLimit) { + setDownstreamProtocol(Http::CodecType::HTTP2); + setUpstreamProtocol(Http::CodecType::HTTP2); + + // Ensure we only have one connection upstream, one request active at a time. + config_helper_.addConfigModifier([](envoy::config::bootstrap::v3::Bootstrap& bootstrap) { + auto* static_resources = bootstrap.mutable_static_resources(); + auto* cluster = static_resources->mutable_clusters(0); + auto* circuit_breakers = cluster->mutable_circuit_breakers(); + circuit_breakers->add_thresholds()->mutable_max_connections()->set_value(1); + ConfigHelper::HttpProtocolOptions protocol_options; + protocol_options.mutable_explicit_http_config() + ->mutable_http2_protocol_options() + ->mutable_max_concurrent_streams() + ->set_value(1); + ConfigHelper::setProtocolOptions(*bootstrap.mutable_static_resources()->mutable_clusters(0), + protocol_options); + }); + + // Start sending the request, but ensure no end stream will be sent, so the + // stream will stay in use. + initialize(); + codec_client_ = makeHttpConnection(lookupPort("http")); + + // Start sending the request, but ensure no end stream will be sent, so the + // stream will stay in use. + auto encoder_decoder = codec_client_->startRequest(default_request_headers_); + request_encoder_ = &encoder_decoder.first; + auto response = std::move(encoder_decoder.second); + + // make sure the headers are received. + ASSERT_TRUE(fake_upstreams_[0]->waitForHttpConnection(*dispatcher_, fake_upstream_connection_)); + ASSERT_TRUE(fake_upstream_connection_->waitForNewStream(*dispatcher_, upstream_request_)); + ASSERT_TRUE(upstream_request_->waitForHeadersComplete()); + + // Start another request. + auto response2 = codec_client_->makeHeaderOnlyRequest(default_request_headers_); + test_server_->waitForCounterEq("http.config_test.downstream_rq_total", 2); + // Make sure the stream is not received. + ASSERT_FALSE(fake_upstream_connection_->waitForNewStream(*dispatcher_, upstream_request_, + std::chrono::milliseconds(100))); + + // Finish the first stream. + codec_client_->sendData(*request_encoder_, 0, true); + upstream_request_->encodeHeaders(default_response_headers_, true); + ASSERT_TRUE(response->waitForEndStream()); + EXPECT_TRUE(response->complete()); + EXPECT_EQ("200", response->headers().getStatusValue()); + + // This should allow the second stream to complete + ASSERT_TRUE(fake_upstream_connection_->waitForNewStream(*dispatcher_, upstream_request_)); + ASSERT_TRUE(upstream_request_->waitForHeadersComplete()); + upstream_request_->encodeHeaders(default_response_headers_, true); + ASSERT_TRUE(response2->waitForEndStream()); + EXPECT_TRUE(response2->complete()); + EXPECT_EQ("200", response2->headers().getStatusValue()); +} + } // namespace } // namespace Envoy From a4959853d201fd05e7293a8dd5973abc926844d0 Mon Sep 17 00:00:00 2001 From: Alyssa Wilk Date: Mon, 25 Oct 2021 12:55:21 -0400 Subject: [PATCH 2/2] comments Signed-off-by: Alyssa Wilk --- .../proxy_filter_integration_test.cc | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/test/extensions/filters/http/dynamic_forward_proxy/proxy_filter_integration_test.cc b/test/extensions/filters/http/dynamic_forward_proxy/proxy_filter_integration_test.cc index e46e6b43dc223..c138d28fbb59b 100644 --- a/test/extensions/filters/http/dynamic_forward_proxy/proxy_filter_integration_test.cc +++ b/test/extensions/filters/http/dynamic_forward_proxy/proxy_filter_integration_test.cc @@ -452,9 +452,11 @@ TEST_P(ProxyFilterIntegrationTest, MultipleRequestsLowStreamLimit) { // Ensure we only have one connection upstream, one request active at a time. config_helper_.addConfigModifier([](envoy::config::bootstrap::v3::Bootstrap& bootstrap) { - auto* static_resources = bootstrap.mutable_static_resources(); - auto* cluster = static_resources->mutable_clusters(0); - auto* circuit_breakers = cluster->mutable_circuit_breakers(); + envoy::config::bootstrap::v3::Bootstrap::StaticResources* static_resources = + bootstrap.mutable_static_resources(); + envoy::config::cluster::v3::Cluster* cluster = static_resources->mutable_clusters(0); + envoy::config::cluster::v3::CircuitBreakers* circuit_breakers = + cluster->mutable_circuit_breakers(); circuit_breakers->add_thresholds()->mutable_max_connections()->set_value(1); ConfigHelper::HttpProtocolOptions protocol_options; protocol_options.mutable_explicit_http_config() @@ -472,17 +474,19 @@ TEST_P(ProxyFilterIntegrationTest, MultipleRequestsLowStreamLimit) { // Start sending the request, but ensure no end stream will be sent, so the // stream will stay in use. - auto encoder_decoder = codec_client_->startRequest(default_request_headers_); + std::pair encoder_decoder = + codec_client_->startRequest(default_request_headers_); request_encoder_ = &encoder_decoder.first; - auto response = std::move(encoder_decoder.second); + IntegrationStreamDecoderPtr response = std::move(encoder_decoder.second); - // make sure the headers are received. + // Make sure the headers are received. ASSERT_TRUE(fake_upstreams_[0]->waitForHttpConnection(*dispatcher_, fake_upstream_connection_)); ASSERT_TRUE(fake_upstream_connection_->waitForNewStream(*dispatcher_, upstream_request_)); ASSERT_TRUE(upstream_request_->waitForHeadersComplete()); // Start another request. - auto response2 = codec_client_->makeHeaderOnlyRequest(default_request_headers_); + IntegrationStreamDecoderPtr response2 = + codec_client_->makeHeaderOnlyRequest(default_request_headers_); test_server_->waitForCounterEq("http.config_test.downstream_rq_total", 2); // Make sure the stream is not received. ASSERT_FALSE(fake_upstream_connection_->waitForNewStream(*dispatcher_, upstream_request_,