Skip to content

Commit 230eb3c

Browse files
cosmo0920edsiper
authored andcommitted
tests: integration: Add in_tcp and in_udp test cases
Signed-off-by: Hiroshi Hatake <hiroshi@chronosphere.io>
1 parent 9941fb4 commit 230eb3c

4 files changed

Lines changed: 239 additions & 0 deletions

File tree

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
service:
2+
flush: 1
3+
grace: 1
4+
log_level: info
5+
http_server: on
6+
http_port: ${FLUENT_BIT_HTTP_MONITORING_PORT}
7+
parsers_file: ${PARSERS_FILE_TEST}
8+
9+
pipeline:
10+
inputs:
11+
- name: tcp
12+
tag: target_input
13+
listen: 127.0.0.1
14+
port: ${FLUENT_BIT_TEST_LISTENER_PORT}
15+
format: none
16+
separator: "\\n"
17+
parser: json
18+
19+
outputs:
20+
- name: http
21+
match: target_input
22+
host: 127.0.0.1
23+
port: ${TEST_SUITE_HTTP_PORT}
24+
uri: /data
25+
format: json
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
import os
2+
import socket
3+
4+
import requests
5+
6+
from server.http_server import data_storage, http_server_run
7+
from utils.test_service import FluentBitTestService
8+
9+
10+
class Service:
11+
def __init__(self, config_file):
12+
self.config_file = os.path.abspath(os.path.join(os.path.dirname(__file__), "../config", config_file))
13+
test_path = os.path.dirname(os.path.abspath(__file__))
14+
self.parsers_file = os.environ.get("FLUENT_BIT_PARSERS_FILE") or os.path.abspath(
15+
os.path.join(test_path, "../../../../../conf/parsers.conf")
16+
)
17+
self.service = FluentBitTestService(
18+
self.config_file,
19+
data_storage=data_storage,
20+
data_keys=["payloads"],
21+
extra_env={
22+
"PARSERS_FILE_TEST": self.parsers_file,
23+
},
24+
pre_start=self._start_receiver,
25+
post_stop=self._stop_receiver,
26+
)
27+
28+
def _start_receiver(self, service):
29+
http_server_run(service.test_suite_http_port)
30+
self.service.wait_for_http_endpoint(
31+
f"http://127.0.0.1:{service.test_suite_http_port}/ping",
32+
timeout=10,
33+
interval=0.5,
34+
)
35+
36+
def _stop_receiver(self, service):
37+
try:
38+
requests.post(f"http://127.0.0.1:{service.test_suite_http_port}/shutdown", timeout=2)
39+
except requests.RequestException:
40+
pass
41+
42+
def start(self):
43+
self.service.start()
44+
self.flb_listener_port = self.service.flb_listener_port
45+
46+
def stop(self):
47+
self.service.stop()
48+
49+
def wait_for_single_record(self, timeout=10):
50+
payloads = self.service.wait_for_condition(
51+
lambda: data_storage["payloads"] if data_storage["payloads"] else None,
52+
timeout=timeout,
53+
interval=0.5,
54+
description="forwarded TCP payloads",
55+
)
56+
57+
assert len(payloads) == 1
58+
assert isinstance(payloads[0], list)
59+
assert len(payloads[0]) == 1
60+
61+
return payloads[0][0]
62+
63+
64+
def _send_line(port, line):
65+
with socket.create_connection(("127.0.0.1", port), timeout=5) as sock:
66+
sock.sendall(line.encode("utf-8"))
67+
sock.shutdown(socket.SHUT_WR)
68+
69+
70+
def test_in_tcp_parser_json_success():
71+
service = Service("in_tcp_parser_json.yaml")
72+
service.start()
73+
74+
try:
75+
_send_line(service.flb_listener_port, '{"message":"hello","value":42}\n')
76+
record = service.wait_for_single_record()
77+
finally:
78+
service.stop()
79+
80+
assert record["message"] == "hello"
81+
assert record["value"] == 42
82+
83+
84+
def test_in_tcp_parser_json_fallback_to_log():
85+
service = Service("in_tcp_parser_json.yaml")
86+
service.start()
87+
88+
try:
89+
_send_line(service.flb_listener_port, 'not-json\n')
90+
record = service.wait_for_single_record()
91+
finally:
92+
service.stop()
93+
94+
assert "log" in record
95+
assert record["log"].strip() == "not-json"
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
service:
2+
flush: 1
3+
grace: 1
4+
log_level: info
5+
http_server: on
6+
http_port: ${FLUENT_BIT_HTTP_MONITORING_PORT}
7+
parsers_file: ${PARSERS_FILE_TEST}
8+
9+
pipeline:
10+
inputs:
11+
- name: udp
12+
tag: target_input
13+
listen: 127.0.0.1
14+
port: ${FLUENT_BIT_TEST_LISTENER_PORT}
15+
format: none
16+
separator: "\\n"
17+
parser: json
18+
19+
outputs:
20+
- name: http
21+
match: target_input
22+
host: 127.0.0.1
23+
port: ${TEST_SUITE_HTTP_PORT}
24+
uri: /data
25+
format: json
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
import os
2+
import socket
3+
4+
import requests
5+
6+
from server.http_server import data_storage, http_server_run
7+
from utils.test_service import FluentBitTestService
8+
9+
10+
class Service:
11+
def __init__(self, config_file):
12+
self.config_file = os.path.abspath(os.path.join(os.path.dirname(__file__), "../config", config_file))
13+
test_path = os.path.dirname(os.path.abspath(__file__))
14+
self.parsers_file = os.environ.get("FLUENT_BIT_PARSERS_FILE") or os.path.abspath(
15+
os.path.join(test_path, "../../../../../conf/parsers.conf")
16+
)
17+
self.service = FluentBitTestService(
18+
self.config_file,
19+
data_storage=data_storage,
20+
data_keys=["payloads"],
21+
extra_env={
22+
"PARSERS_FILE_TEST": self.parsers_file,
23+
},
24+
pre_start=self._start_receiver,
25+
post_stop=self._stop_receiver,
26+
)
27+
28+
def _start_receiver(self, service):
29+
http_server_run(service.test_suite_http_port)
30+
self.service.wait_for_http_endpoint(
31+
f"http://127.0.0.1:{service.test_suite_http_port}/ping",
32+
timeout=10,
33+
interval=0.5,
34+
)
35+
36+
def _stop_receiver(self, service):
37+
try:
38+
requests.post(f"http://127.0.0.1:{service.test_suite_http_port}/shutdown", timeout=2)
39+
except requests.RequestException:
40+
pass
41+
42+
def start(self):
43+
self.service.start()
44+
self.flb_listener_port = self.service.flb_listener_port
45+
46+
def stop(self):
47+
self.service.stop()
48+
49+
def wait_for_single_record(self, timeout=10):
50+
payloads = self.service.wait_for_condition(
51+
lambda: data_storage["payloads"] if data_storage["payloads"] else None,
52+
timeout=timeout,
53+
interval=0.5,
54+
description="forwarded UDP payloads",
55+
)
56+
57+
assert len(payloads) == 1
58+
assert isinstance(payloads[0], list)
59+
assert len(payloads[0]) == 1
60+
61+
return payloads[0][0]
62+
63+
64+
def _send_datagram(port, payload):
65+
with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as sock:
66+
sock.sendto(payload.encode("utf-8"), ("127.0.0.1", port))
67+
68+
69+
def test_in_udp_parser_json_success():
70+
service = Service("in_udp_parser_json.yaml")
71+
service.start()
72+
73+
try:
74+
_send_datagram(service.flb_listener_port, '{"message":"hello","value":42}\n')
75+
record = service.wait_for_single_record()
76+
finally:
77+
service.stop()
78+
79+
assert record["message"] == "hello"
80+
assert record["value"] == 42
81+
82+
83+
def test_in_udp_parser_json_fallback_to_log():
84+
service = Service("in_udp_parser_json.yaml")
85+
service.start()
86+
87+
try:
88+
_send_datagram(service.flb_listener_port, 'not-json\n')
89+
record = service.wait_for_single_record()
90+
finally:
91+
service.stop()
92+
93+
assert "log" in record
94+
assert record["log"].strip() == "not-json"

0 commit comments

Comments
 (0)