@@ -172,3 +172,133 @@ func TestSyslogParserDoesNotSplitBatches(t *testing.T) {
172172 }))
173173 output .AssertNumberOfCalls (t , "ProcessBatch" , 1 )
174174}
175+
176+ func TestSyslogQuietModeProcessBatch (t * testing.T ) {
177+ testCases := []struct {
178+ name string
179+ onError string
180+ expectError bool
181+ }{
182+ {
183+ name : "DropOnErrorQuiet_ReturnsNoError" ,
184+ onError : "drop_quiet" ,
185+ expectError : false ,
186+ },
187+ {
188+ name : "SendOnErrorQuiet_ReturnsNoError" ,
189+ onError : "send_quiet" ,
190+ expectError : false ,
191+ },
192+ {
193+ name : "DropOnError_ReturnsError" ,
194+ onError : "drop" ,
195+ expectError : true ,
196+ },
197+ {
198+ name : "SendOnError_ReturnsError" ,
199+ onError : "send" ,
200+ expectError : true ,
201+ },
202+ }
203+
204+ for _ , tc := range testCases {
205+ t .Run (tc .name , func (t * testing.T ) {
206+ cfg := basicConfig ()
207+ cfg .Protocol = syslog .RFC5424
208+ cfg .OnError = tc .onError
209+
210+ set := componenttest .NewNopTelemetrySettings ()
211+ op , err := cfg .Build (set )
212+ require .NoError (t , err )
213+
214+ output := & testutil.Operator {}
215+ output .On ("ID" ).Return ("fake" )
216+ output .On ("CanProcess" ).Return (true )
217+ output .On ("ProcessBatch" , mock .Anything , mock .Anything ).Return (nil )
218+ require .NoError (t , op .SetOutputs ([]operator.Operator {output }))
219+
220+ ctx := t .Context ()
221+
222+ // Create entries with invalid syslog messages that will cause parse errors
223+ entry1 := entry .New ()
224+ entry1 .Body = "invalid syslog message 1"
225+
226+ entry2 := entry .New ()
227+ entry2 .Body = "invalid syslog message 2"
228+
229+ entry3 := entry .New ()
230+ entry3 .Body = "invalid syslog message 3"
231+
232+ testEntries := []* entry.Entry {entry1 , entry2 , entry3 }
233+
234+ err = op .ProcessBatch (ctx , testEntries )
235+ if tc .expectError {
236+ require .Error (t , err , "expected error in non-quiet mode" )
237+ } else {
238+ require .NoError (t , err , "expected no error in quiet mode" )
239+ }
240+ })
241+ }
242+ }
243+
244+ // TestSyslogQuietModeProcess tests quiet mode handling for toBytes error
245+ // in the Process method when allowSkipPriHeader is enabled
246+ func TestSyslogQuietModeProcess (t * testing.T ) {
247+ testCases := []struct {
248+ name string
249+ onError string
250+ expectError bool
251+ }{
252+ {
253+ name : "DropOnErrorQuiet_ReturnsNoError" ,
254+ onError : "drop_quiet" ,
255+ expectError : false ,
256+ },
257+ {
258+ name : "SendOnErrorQuiet_ReturnsNoError" ,
259+ onError : "send_quiet" ,
260+ expectError : false ,
261+ },
262+ {
263+ name : "DropOnError_ReturnsError" ,
264+ onError : "drop" ,
265+ expectError : true ,
266+ },
267+ {
268+ name : "SendOnError_ReturnsError" ,
269+ onError : "send" ,
270+ expectError : true ,
271+ },
272+ }
273+
274+ for _ , tc := range testCases {
275+ t .Run (tc .name , func (t * testing.T ) {
276+ cfg := basicConfig ()
277+ cfg .Protocol = syslog .RFC3164
278+ cfg .AllowSkipPriHeader = true // Enable this to trigger the toBytes path
279+ cfg .OnError = tc .onError
280+
281+ set := componenttest .NewNopTelemetrySettings ()
282+ op , err := cfg .Build (set )
283+ require .NoError (t , err )
284+
285+ output := & testutil.Operator {}
286+ output .On ("ID" ).Return ("fake" )
287+ output .On ("CanProcess" ).Return (true )
288+ output .On ("Process" , mock .Anything , mock .Anything ).Return (nil )
289+ require .NoError (t , op .SetOutputs ([]operator.Operator {output }))
290+
291+ // Create entry with non-string body that will cause toBytes error
292+ e := entry .New ()
293+ e .Body = 12345 // Non-string body causes toBytes to fail
294+ e .ObservedTimestamp = time .Now ()
295+
296+ err = op .Process (t .Context (), e )
297+ if tc .expectError {
298+ require .Error (t , err , "expected error in non-quiet mode" )
299+ } else {
300+ require .NoError (t , err , "expected no error in quiet mode" )
301+ }
302+ })
303+ }
304+ }
0 commit comments