Skip to content

Commit c168504

Browse files
committed
add test for consume with error and fix
1 parent 45a3fdb commit c168504

2 files changed

Lines changed: 37 additions & 2 deletions

File tree

simple_syslog/parser.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,9 @@ def consume_stream_with_errors(
215215
self.consume(line, consumer)
216216
except (DeviationError, ParseError) as e:
217217
error_consumer(line, e)
218+
except Exception as generic:
219+
pe = ParseError(generic)
220+
error_consumer(line, pe)
218221

219222

220223
class Rfc5424SyslogParser(AbstractSyslogParser[T]):

tests/test_3164_parser.py

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,17 +13,19 @@
1313
# limitations under the License.
1414

1515
from io import TextIOBase
16-
from typing import Generator, List
16+
from typing import Generator, List, Optional, Union
1717

1818
from simple_syslog.builder import DefaultBuilder
1919
from simple_syslog.data import SyslogDataSet
20+
from simple_syslog.exceptions import DeviationError, ParseError
2021
from simple_syslog.keys import (
2122
DefaultKeyProvider,
2223
SyslogFieldKey,
2324
SyslogFieldKeyDefaults,
2425
)
2526
from simple_syslog.parser import (
2627
AbstractSyslogParser,
28+
ErrorConsumer,
2729
Rfc3164SyslogParser,
2830
SyslogConsumer,
2931
)
@@ -163,12 +165,42 @@ def fun(data_set: SyslogDataSet):
163165
consume_from_file(f, parser, fun)
164166

165167

168+
def test_parse_line_consumer_and_error(file_of_3164_many_with_errors_txt) -> None:
169+
"""Test parsing with consumer callback."""
170+
builder = DefaultBuilder(
171+
specification=SyslogSpecification.RFC_3164,
172+
key_provider=DefaultKeyProvider(),
173+
nil_policy=None,
174+
allowed_deviations=None,
175+
)
176+
parser = Rfc3164SyslogParser(builder)
177+
set_count = 0
178+
err_count = 0
179+
180+
def fun(_: SyslogDataSet):
181+
nonlocal set_count
182+
set_count = set_count + 1
183+
184+
def er(line: str, err: Union[ParseError, DeviationError]) -> None:
185+
nonlocal err_count
186+
err_count = err_count + 1
187+
assert isinstance(err, ParseError)
188+
189+
with file_of_3164_many_with_errors_txt.open("r") as f:
190+
consume_from_file(f, parser, fun, er)
191+
assert set_count == 3
192+
assert err_count == 1
193+
194+
166195
def consume_from_file(
167196
f: TextIOBase,
168197
parser: AbstractSyslogParser[SyslogDataSet],
169198
consumer: SyslogConsumer[SyslogDataSet],
199+
error_consumer: Optional[ErrorConsumer] = None,
170200
) -> None:
171-
"""Open parse with callback."""
201+
"""Open parse with callback and optional error consumer."""
202+
if error_consumer is not None:
203+
return parser.consume_stream_with_errors(f, consumer, error_consumer)
172204
return parser.consume_stream(f, consumer)
173205

174206

0 commit comments

Comments
 (0)