1+ /*
2+ * Copyright OpenSearch Contributors
3+ * SPDX-License-Identifier: Apache-2.0
4+ *
5+ * The OpenSearch Contributors require contributions made to
6+ * this file be licensed under the Apache-2.0 license or a
7+ * compatible open source license.
8+ *
9+ */
10+
11+ package org .opensearch .dataprepper .plugins .codec .newline ;
12+
13+ import org .junit .jupiter .api .BeforeEach ;
14+ import org .junit .jupiter .api .Test ;
15+ import org .opensearch .dataprepper .event .TestEventFactory ;
16+ import org .opensearch .dataprepper .model .codec .OutputCodec ;
17+ import org .opensearch .dataprepper .model .event .Event ;
18+ import org .opensearch .dataprepper .model .event .EventBuilder ;
19+ import org .opensearch .dataprepper .model .event .EventFactory ;
20+ import org .opensearch .dataprepper .model .sink .OutputCodecContext ;
21+
22+ import java .io .ByteArrayOutputStream ;
23+ import java .io .IOException ;
24+ import java .nio .charset .StandardCharsets ;
25+ import java .util .HashMap ;
26+ import java .util .Map ;
27+ import java .util .UUID ;
28+
29+ import static org .hamcrest .CoreMatchers .equalTo ;
30+ import static org .hamcrest .MatcherAssert .assertThat ;
31+ import static org .junit .jupiter .api .Assertions .assertThrows ;
32+
33+ class NewlineDelimitedOutputCodecTest {
34+
35+ private NewlineDelimitedOutputCodec codec ;
36+ private NewlineDelimitedOutputConfig config ;
37+ private EventFactory eventFactory ;
38+
39+ @ BeforeEach
40+ void setUp () {
41+ config = new NewlineDelimitedOutputConfig ();
42+ codec = new NewlineDelimitedOutputCodec (config );
43+ eventFactory = TestEventFactory .getTestEventFactory ();
44+ }
45+
46+ @ Test
47+ void constructor_throws_if_config_is_null () {
48+ assertThrows (NullPointerException .class , () -> new NewlineDelimitedOutputCodec (null ));
49+ }
50+
51+ @ Test
52+ void writeEvent_writes_message_field_as_plain_text () throws IOException {
53+ final String message = UUID .randomUUID ().toString ();
54+ final ByteArrayOutputStream outputStream = new ByteArrayOutputStream ();
55+ final OutputCodecContext codecContext = new OutputCodecContext ();
56+
57+ final Map <String , Object > eventData = new HashMap <>();
58+ eventData .put ("message" , message );
59+ final Event event = eventFactory .eventBuilder (EventBuilder .class ).withData (eventData ).build ();
60+
61+ codec .start (outputStream , event , codecContext );
62+ codec .writeEvent (event , outputStream );
63+ codec .complete (outputStream );
64+
65+ final String output = outputStream .toString (StandardCharsets .UTF_8 );
66+ assertThat (output , equalTo (message + System .lineSeparator ()));
67+ }
68+
69+ @ Test
70+ void writeEvent_writes_nothing_when_message_is_missing_and_include_empty_objects_false () throws IOException {
71+ final ByteArrayOutputStream outputStream = new ByteArrayOutputStream ();
72+ final OutputCodecContext codecContext = new OutputCodecContext ();
73+
74+ final Map <String , Object > eventData = new HashMap <>();
75+ eventData .put ("other_field" , "some value" );
76+ final Event event = eventFactory .eventBuilder (EventBuilder .class ).withData (eventData ).build ();
77+
78+ codec .start (outputStream , event , codecContext );
79+ codec .writeEvent (event , outputStream );
80+ codec .complete (outputStream );
81+
82+ final String output = outputStream .toString (StandardCharsets .UTF_8 );
83+ assertThat (output , equalTo ("" ));
84+ }
85+
86+ @ Test
87+ void writeEvent_writes_nothing_when_message_is_null_and_include_empty_objects_false () throws IOException {
88+ final ByteArrayOutputStream outputStream = new ByteArrayOutputStream ();
89+ final OutputCodecContext codecContext = new OutputCodecContext ();
90+
91+ final Map <String , Object > eventData = new HashMap <>();
92+ eventData .put ("message" , null );
93+ final Event event = eventFactory .eventBuilder (EventBuilder .class ).withData (eventData ).build ();
94+
95+ codec .start (outputStream , event , codecContext );
96+ codec .writeEvent (event , outputStream );
97+ codec .complete (outputStream );
98+
99+ final String output = outputStream .toString (StandardCharsets .UTF_8 );
100+ assertThat (output , equalTo ("" ));
101+ }
102+
103+ @ Test
104+ void writeEvent_writes_empty_line_when_message_is_missing_and_include_empty_objects_true () throws IOException {
105+ config .setIncludeEmptyObjects (true );
106+ codec = new NewlineDelimitedOutputCodec (config );
107+
108+ final ByteArrayOutputStream outputStream = new ByteArrayOutputStream ();
109+ final OutputCodecContext codecContext = new OutputCodecContext ();
110+
111+ final Map <String , Object > eventData = new HashMap <>();
112+ eventData .put ("other_field" , "some value" );
113+ final Event event = eventFactory .eventBuilder (EventBuilder .class ).withData (eventData ).build ();
114+
115+ codec .start (outputStream , event , codecContext );
116+ codec .writeEvent (event , outputStream );
117+ codec .complete (outputStream );
118+
119+ final String output = outputStream .toString (StandardCharsets .UTF_8 );
120+ assertThat (output , equalTo ("" + System .lineSeparator ()));
121+ }
122+
123+ @ Test
124+ void writeEvent_writes_empty_line_when_message_is_null_and_include_empty_objects_true () throws IOException {
125+ config .setIncludeEmptyObjects (true );
126+ codec = new NewlineDelimitedOutputCodec (config );
127+
128+ final ByteArrayOutputStream outputStream = new ByteArrayOutputStream ();
129+ final OutputCodecContext codecContext = new OutputCodecContext ();
130+
131+ final Map <String , Object > eventData = new HashMap <>();
132+ eventData .put ("message" , null );
133+ final Event event = eventFactory .eventBuilder (EventBuilder .class ).withData (eventData ).build ();
134+
135+ codec .start (outputStream , event , codecContext );
136+ codec .writeEvent (event , outputStream );
137+ codec .complete (outputStream );
138+
139+ final String output = outputStream .toString (StandardCharsets .UTF_8 );
140+ assertThat (output , equalTo ("" + System .lineSeparator ()));
141+ }
142+
143+ @ Test
144+ void writeEvent_writes_multiple_events_on_separate_lines () throws IOException {
145+ final ByteArrayOutputStream outputStream = new ByteArrayOutputStream ();
146+ final OutputCodecContext codecContext = new OutputCodecContext ();
147+
148+ final Map <String , Object > eventData1 = new HashMap <>();
149+ eventData1 .put ("message" , "First message" );
150+ final Event event1 = eventFactory .eventBuilder (EventBuilder .class ).withData (eventData1 ).build ();
151+
152+ final Map <String , Object > eventData2 = new HashMap <>();
153+ eventData2 .put ("message" , "Second message" );
154+ final Event event2 = eventFactory .eventBuilder (EventBuilder .class ).withData (eventData2 ).build ();
155+
156+ codec .start (outputStream , event1 , codecContext );
157+ codec .writeEvent (event1 , outputStream );
158+ codec .writeEvent (event2 , outputStream );
159+ codec .complete (outputStream );
160+
161+ final String output = outputStream .toString (StandardCharsets .UTF_8 );
162+ assertThat (output , equalTo ("First message" + System .lineSeparator () + "Second message" + System .lineSeparator ()));
163+ }
164+
165+ @ Test
166+ void getExtension_returns_txt () {
167+ assertThat (codec .getExtension (), equalTo ("txt" ));
168+ }
169+
170+ @ Test
171+ void createWriter_writes_message_field_as_plain_text () throws IOException {
172+ final ByteArrayOutputStream outputStream = new ByteArrayOutputStream ();
173+ final OutputCodecContext codecContext = new OutputCodecContext ();
174+
175+ final Map <String , Object > eventData = new HashMap <>();
176+ eventData .put ("message" , "Test message content" );
177+ final Event event = eventFactory .eventBuilder (EventBuilder .class ).withData (eventData ).build ();
178+
179+ final OutputCodec .Writer writer = codec .createWriter (outputStream , event , codecContext );
180+ writer .writeEvent (event );
181+ writer .complete ();
182+
183+ final String output = outputStream .toString (StandardCharsets .UTF_8 );
184+ assertThat (output , equalTo ("Test message content" + System .lineSeparator ()));
185+ }
186+ }
0 commit comments