Skip to content

Commit 45a3fdb

Browse files
committed
fix stream consumption and add 3164 test for consuming
1 parent 6eb8ca3 commit 45a3fdb

File tree

3 files changed

+152
-5
lines changed

3 files changed

+152
-5
lines changed

simple_syslog/parser.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -194,8 +194,7 @@ def consume_stream(self, stream: TextIOBase, consumer: SyslogConsumer[T]) -> Non
194194
ValueError: if stream or consumer are None
195195
196196
"""
197-
line = stream.readline()
198-
while line:
197+
for line in stream:
199198
self.consume(line, consumer)
200199

201200
def consume_stream_with_errors(
@@ -211,8 +210,7 @@ def consume_stream_with_errors(
211210
consumer: Called with T
212211
error_consumer: Called with any ParseError or DeviationError
213212
"""
214-
line = stream.readline()
215-
while line:
213+
for line in stream:
216214
try:
217215
self.consume(line, consumer)
218216
except (DeviationError, ParseError) as e:

tests/test_3164_parser.py

Lines changed: 55 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,11 @@
2222
SyslogFieldKey,
2323
SyslogFieldKeyDefaults,
2424
)
25-
from simple_syslog.parser import AbstractSyslogParser, Rfc3164SyslogParser
25+
from simple_syslog.parser import (
26+
AbstractSyslogParser,
27+
Rfc3164SyslogParser,
28+
SyslogConsumer,
29+
)
2630
from simple_syslog.specification import SyslogSpecification
2731

2832
expectedMessageOne = (
@@ -118,6 +122,56 @@ def test_parse_line(file_of_3164_single_ise_txt) -> None:
118122
)
119123

120124

125+
def test_parse_line_consumer(file_of_3164_single_ise_txt) -> None:
126+
"""Test parsing with consumer callback."""
127+
builder = DefaultBuilder(
128+
specification=SyslogSpecification.RFC_3164,
129+
key_provider=DefaultKeyProvider(),
130+
nil_policy=None,
131+
allowed_deviations=None,
132+
)
133+
parser = Rfc3164SyslogParser(builder)
134+
135+
def fun(data_set: SyslogDataSet):
136+
assert data_set
137+
assert (
138+
expectedMessageOne
139+
== data_set.data[SyslogFieldKeyDefaults[SyslogFieldKey.MESSAGE]]
140+
)
141+
assert (
142+
expectedHostNameOne
143+
== data_set.data[SyslogFieldKeyDefaults[SyslogFieldKey.HEADER_HOSTNAME]]
144+
)
145+
assert (
146+
expectedPriOne
147+
== data_set.data[SyslogFieldKeyDefaults[SyslogFieldKey.HEADER_PRI]]
148+
)
149+
assert (
150+
expectedSeverityOne
151+
== data_set.data[SyslogFieldKeyDefaults[SyslogFieldKey.HEADER_PRI_SEVERITY]]
152+
)
153+
assert (
154+
expectedFacilityOne
155+
== data_set.data[SyslogFieldKeyDefaults[SyslogFieldKey.HEADER_PRI_FACILITY]]
156+
)
157+
assert (
158+
expectedTimestampOne
159+
== data_set.data[SyslogFieldKeyDefaults[SyslogFieldKey.HEADER_TIMESTAMP]]
160+
)
161+
162+
with file_of_3164_single_ise_txt.open("r") as f:
163+
consume_from_file(f, parser, fun)
164+
165+
166+
def consume_from_file(
167+
f: TextIOBase,
168+
parser: AbstractSyslogParser[SyslogDataSet],
169+
consumer: SyslogConsumer[SyslogDataSet],
170+
) -> None:
171+
"""Open parse with callback."""
172+
return parser.consume_stream(f, consumer)
173+
174+
121175
def generate_from_file(
122176
f: TextIOBase, parser: AbstractSyslogParser[SyslogDataSet]
123177
) -> Generator[SyslogDataSet, None, None]:

tests/tmp.txt

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
2+
# @Test
3+
# public void testParseLineConsumer() throws Exception {
4+
# Default3164MessageHandler builder = new Default3164MessageHandler();
5+
# SyslogParser<Map<String, String>> parser = new SyslogParserBuilder<Map<String, String>>().forSpecification(SyslogSpecification.RFC_3164)
6+
# .withSyslogBuilder(builder).build();
7+
# handleLine(readFileToString("src/test/resources/logs/3164/single_ise.txt"), parser, (map) -> {
8+
# Assert.assertEquals(expectedMessageOne, map.get(SyslogFieldKeys.MESSAGE.getField()));
9+
# Assert.assertEquals(expectedHostNameOne, map.get(SyslogFieldKeys.HEADER_HOSTNAME.getField()));
10+
# Assert.assertEquals(expectedPriOne, map.get(SyslogFieldKeys.HEADER_PRI.getField()));
11+
# Assert.assertEquals(expectedSeverityOne, map.get(SyslogFieldKeys.HEADER_PRI_SEVERITY.getField()));
12+
# Assert.assertEquals(expectedFacilityOne, map.get(SyslogFieldKeys.HEADER_PRI_FACILITY.getField()));
13+
# Assert.assertEquals(expectedTimestampOne, map.get(SyslogFieldKeys.HEADER_TIMESTAMP.getField()));
14+
# });
15+
# }
16+
#
17+
# @Test
18+
# public void testParseLinesConsumerAndErrorConsumer() throws Exception {
19+
# final AtomicInteger mapCount = new AtomicInteger();
20+
# final AtomicInteger errorCount = new AtomicInteger();
21+
# SyslogParser<Map<String, String>> parser = new SyslogParserBuilder<Map<String,String>>().forSpecification(SyslogSpecification.RFC_3164).withSyslogBuilder(new Default3164MessageHandler()).build();
22+
# handleFile("src/test/resources/logs/3164/many_with_errors.txt", parser, (map) -> mapCount.incrementAndGet(),
23+
# (line, throwable) -> errorCount.incrementAndGet());
24+
# Assert.assertEquals(3, mapCount.get());
25+
# Assert.assertEquals(1, errorCount.get());
26+
# }
27+
#
28+
# @Test
29+
# public void testParseLines() throws Exception {
30+
# Default3164MessageHandler builder = new Default3164MessageHandler();
31+
# SyslogParser<Map<String, String>> parser = new SyslogParserBuilder<Map<String, String>>().forSpecification(SyslogSpecification.RFC_3164).withSyslogBuilder(builder).build();
32+
# List<Map<String, String>> mapList = handleFile("src/test/resources/logs/3164/many_ise.txt", parser);
33+
# Assert.assertEquals(308, mapList.size());
34+
# }
35+
#
36+
# @Test
37+
# public void testParseLinesMixDates() throws Exception {
38+
# Default3164MessageHandler builder = new Default3164MessageHandler();
39+
# SyslogParser<Map<String,String>> parser = new SyslogParserBuilder<Map<String, String>>().forSpecification(SyslogSpecification.RFC_3164).withSyslogBuilder(builder).build();
40+
# List<Map<String, String>> mapList = handleFile("src/test/resources/logs/3164/two_ise_mix_date.txt", parser);
41+
# Assert.assertEquals(2, mapList.size());
42+
# }
43+
#
44+
# @Test
45+
# public void testParseLinesDeviations() throws Exception {
46+
# Default3164MessageHandler
47+
# builder = new Default3164MessageHandler(new DefaultKeyProvider(), EnumSet.of(AllowableDeviations.PRIORITY));
48+
# SyslogParser<Map<String, String>> parser = new SyslogParserBuilder<Map<String, String>>().forSpecification(SyslogSpecification.RFC_3164)
49+
# .withSyslogBuilder(builder).build();
50+
# List<Map<String, String>> mapList = handleFile("src/test/resources/logs/3164/many_ise_deviations.txt", parser);
51+
# Assert.assertEquals(308, mapList.size());
52+
# }
53+
#
54+
# @Test
55+
# public void testParseLinesConsumer() throws Exception {
56+
# Default3164MessageHandler builder = new Default3164MessageHandler();
57+
# SyslogParser<Map<String, String>> parser = new SyslogParserBuilder<Map<String, String>>().forSpecification(SyslogSpecification.RFC_3164).withSyslogBuilder(builder).build();
58+
# final AtomicInteger count = new AtomicInteger();
59+
# handleFile("src/test/resources/logs/3164/many_ise.txt", parser, (map) -> {
60+
# count.incrementAndGet();
61+
# });
62+
#
63+
# Assert.assertEquals(count.get(), 308);
64+
# }
65+
#
66+
# @Test
67+
# public void testParseLinesConsumerMixDates() throws Exception {
68+
# Default3164MessageHandler builder = new Default3164MessageHandler();
69+
# SyslogParser<Map<String, String>> parser = new SyslogParserBuilder<Map<String, String>>().forSpecification(SyslogSpecification.RFC_3164).withSyslogBuilder(builder).build();
70+
# final AtomicInteger count = new AtomicInteger();
71+
# handleFile("src/test/resources/logs/3164/two_ise_mix_date.txt", parser, (map) -> {
72+
# count.incrementAndGet();
73+
# });
74+
#
75+
# Assert.assertEquals(count.get(), 2);
76+
# }
77+
#
78+
# @Test(expected = ParseException.class)
79+
# @SuppressWarnings("unchecked")
80+
# public void testInvalidLine() throws Exception {
81+
# Default3164MessageHandler builder = new Default3164MessageHandler();
82+
# SyslogParser<Map<String, String>> parser = new SyslogParserBuilder<Map<String, String>>().forSpecification(SyslogSpecification.RFC_3164).withSyslogBuilder(builder).build();
83+
# Map<String, String> map = handleLine("localhost some body of the message", parser);
84+
# }
85+
#
86+
# @Test(expected = ParseException.class)
87+
# @SuppressWarnings("unchecked")
88+
# public void testInvalidLineConsumer() throws Exception {
89+
# Default3164MessageHandler builder = new Default3164MessageHandler();
90+
# SyslogParser<Map<String, String>> parser = new SyslogParserBuilder<Map<String, String>>().forSpecification(SyslogSpecification.RFC_3164).withSyslogBuilder(builder).build();
91+
# handleLine("localhost some body of the message", parser, (map) -> {
92+
# Assert.fail();
93+
# });
94+
# }
95+
# }

0 commit comments

Comments
 (0)