Skip to content

Commit a0cd7e4

Browse files
committed
tests: integration: cover idle timeout recovery
Signed-off-by: Eduardo Silva <eduardo@chronosphere.io>
1 parent f82c5e0 commit a0cd7e4

2 files changed

Lines changed: 101 additions & 1 deletion

File tree

tests/integration/scenarios/in_http_max_connections/config/in_http_max_connections.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ pipeline:
1010
- name: http
1111
listen: 127.0.0.1
1212
port: ${FLUENT_BIT_TEST_LISTENER_PORT}
13+
http_server.idle_timeout: 2s
1314
http_server.max_connections: 1
1415

1516
outputs:

tests/integration/scenarios/in_http_max_connections/tests/test_in_http_max_connections_001.py

Lines changed: 100 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
import os
22
import socket
3+
import time
34

45
import pytest
56
import requests
67

78
from server.http_server import data_storage, http_server_run
89
from utils.fluent_bit_manager import FluentBitStartupError
9-
from utils.http_matrix import run_curl_request
10+
from utils.http_matrix import curl_supports_http2, run_curl_request
1011
from utils.test_service import FluentBitTestService
1112

1213

@@ -93,3 +94,101 @@ def test_in_http_max_connections_blocks_and_recovers():
9394

9495
assert accepted["status_code"] == 201
9596
assert forwarded_payloads[0][0]["message"] == "max-connections"
97+
98+
99+
def test_in_http_idle_timeout_evicts_partial_request_connection():
100+
service = Service()
101+
service.start()
102+
103+
held_connection = None
104+
try:
105+
held_connection = socket.create_connection(("127.0.0.1", service.flb_listener_port), timeout=2)
106+
held_connection.settimeout(5)
107+
held_connection.sendall(b"POST / HTTP/1.1\r\n")
108+
109+
overflow_rejected = False
110+
try:
111+
response = run_curl_request(
112+
f"http://127.0.0.1:{service.flb_listener_port}/",
113+
payload='{"message":"idle-timeout-blocked"}',
114+
headers=["Content-Type: application/json"],
115+
http_mode="http1.1",
116+
)
117+
overflow_rejected = response["status_code"] != 201
118+
except Exception:
119+
overflow_rejected = True
120+
121+
assert overflow_rejected
122+
123+
time.sleep(3)
124+
125+
response = run_curl_request(
126+
f"http://127.0.0.1:{service.flb_listener_port}/",
127+
payload='{"message":"idle-timeout-recovered"}',
128+
headers=["Content-Type: application/json"],
129+
http_mode="http1.1",
130+
)
131+
forwarded_payloads = service.service.wait_for_condition(
132+
lambda: data_storage["payloads"] if data_storage["payloads"] else None,
133+
timeout=10,
134+
interval=0.5,
135+
description="forwarded idle-timeout payload",
136+
)
137+
finally:
138+
if held_connection:
139+
held_connection.close()
140+
service.stop()
141+
142+
assert response["status_code"] == 201
143+
assert forwarded_payloads[0][0]["message"] == "idle-timeout-recovered"
144+
145+
146+
def test_in_http_idle_timeout_evicts_partial_http2_preface_connection():
147+
if not curl_supports_http2():
148+
pytest.skip("curl was built without HTTP/2 support")
149+
150+
service = Service()
151+
service.start()
152+
153+
held_connection = None
154+
try:
155+
held_connection = socket.create_connection(("127.0.0.1", service.flb_listener_port), timeout=2)
156+
held_connection.settimeout(5)
157+
held_connection.sendall(b"PRI * HTTP/2.0\r\n\r\nSM\r\n")
158+
159+
overflow_rejected = False
160+
try:
161+
response = run_curl_request(
162+
f"http://127.0.0.1:{service.flb_listener_port}/",
163+
payload='{"message":"idle-timeout-http2-blocked"}',
164+
headers=["Content-Type: application/json"],
165+
http_mode="http2-prior-knowledge",
166+
)
167+
overflow_rejected = response["status_code"] != 201
168+
except Exception:
169+
overflow_rejected = True
170+
171+
assert overflow_rejected
172+
173+
time.sleep(3)
174+
175+
response = run_curl_request(
176+
f"http://127.0.0.1:{service.flb_listener_port}/",
177+
payload='{"message":"idle-timeout-http2-recovered"}',
178+
headers=["Content-Type: application/json"],
179+
http_mode="http2-prior-knowledge",
180+
)
181+
forwarded_payloads = service.service.wait_for_condition(
182+
lambda: data_storage["payloads"] if data_storage["payloads"] else None,
183+
timeout=10,
184+
interval=0.5,
185+
description="forwarded idle-timeout http2 payload",
186+
)
187+
finally:
188+
if held_connection:
189+
held_connection.close()
190+
service.stop()
191+
192+
assert response["status_code"] == 201
193+
assert response["http_version"] == "2"
194+
assert forwarded_payloads[0][0]["message"] == "idle-timeout-http2-recovered"

0 commit comments

Comments
 (0)