@@ -17,21 +17,48 @@ package tools
1717
1818import (
1919 "context"
20+ "errors"
2021 "testing"
2122 "time"
2223
2324 fnpb "github.com/apache/beam/sdks/v2/go/pkg/beam/model/fnexecution_v1"
2425)
2526
27+ func getAllLogEntries (catcher * logCatcher ) []* fnpb.LogEntry {
28+ var entries []* fnpb.LogEntry
29+ for _ , list := range catcher .msgs {
30+ entries = append (entries , list .GetLogEntries ()... )
31+ }
32+ return entries
33+ }
34+
2635func TestBufferedLogger (t * testing.T ) {
2736 ctx := context .Background ()
2837
38+ t .Run ("printf" , func (t * testing.T ) {
39+ catcher := & logCatcher {}
40+ l := & Logger {client : catcher }
41+ bl := NewBufferedLogger (l )
42+
43+ bl .Printf (ctx , "test message" )
44+
45+ received := catcher .msgs [0 ].GetLogEntries ()[0 ]
46+
47+ if got , want := received .Message , "test message" ; got != want {
48+ t .Errorf ("got message %q, want %q" , got , want )
49+ }
50+
51+ if got , want := received .Severity , fnpb .LogEntry_Severity_DEBUG ; got != want {
52+ t .Errorf ("got severity %v, want %v" , got , want )
53+ }
54+ })
55+
2956 t .Run ("write" , func (t * testing.T ) {
3057 catcher := & logCatcher {}
3158 l := & Logger {client : catcher }
3259 bl := NewBufferedLogger (l )
3360
34- message := []byte ("test message" )
61+ message := []byte ("test message\n " )
3562 n , err := bl .Write (message )
3663 if err != nil {
3764 t .Errorf ("got error %v" , err )
@@ -77,7 +104,8 @@ func TestBufferedLogger(t *testing.T) {
77104 l := & Logger {client : catcher }
78105 bl := NewBufferedLogger (l )
79106
80- messages := []string {"foo" , "bar" , "baz" }
107+ messages := []string {"foo\n " , "bar\n " , "baz\n " }
108+ expected := []string {"foo" , "bar" , "baz" }
81109
82110 for _ , message := range messages {
83111 messBytes := []byte (message )
@@ -93,10 +121,14 @@ func TestBufferedLogger(t *testing.T) {
93121
94122 bl .FlushAtDebug (ctx )
95123
96- received := catcher .msgs [0 ].GetLogEntries ()
124+ received := getAllLogEntries (catcher )
125+
126+ if got , want := len (received ), len (expected ); got != want {
127+ t .Fatalf ("expected %d log entries received, got %d" , want , got )
128+ }
97129
98130 for i , message := range received {
99- if got , want := message .Message , messages [i ]; got != want {
131+ if got , want := message .Message , expected [i ]; got != want {
100132 t .Errorf ("got message %q, want %q" , got , want )
101133 }
102134
@@ -139,7 +171,8 @@ func TestBufferedLogger(t *testing.T) {
139171 l := & Logger {client : catcher }
140172 bl := NewBufferedLogger (l )
141173
142- messages := []string {"foo" , "bar" , "baz" }
174+ messages := []string {"foo\n " , "bar\n " , "baz\n " }
175+ expected := []string {"foo" , "bar" , "baz" }
143176
144177 for _ , message := range messages {
145178 messBytes := []byte (message )
@@ -155,10 +188,14 @@ func TestBufferedLogger(t *testing.T) {
155188
156189 bl .FlushAtError (ctx )
157190
158- received := catcher .msgs [0 ].GetLogEntries ()
191+ received := getAllLogEntries (catcher )
192+
193+ if got , want := len (received ), len (expected ); got != want {
194+ t .Fatalf ("expected %d log entries received, got %d" , want , got )
195+ }
159196
160197 for i , message := range received {
161- if got , want := message .Message , messages [i ]; got != want {
198+ if got , want := message .Message , expected [i ]; got != want {
162199 t .Errorf ("got message %q, want %q" , got , want )
163200 }
164201
@@ -168,6 +205,55 @@ func TestBufferedLogger(t *testing.T) {
168205 }
169206 })
170207
208+ t .Run ("flush with nil error" , func (t * testing.T ) {
209+ catcher := & logCatcher {}
210+ l := & Logger {client : catcher }
211+ bl := NewBufferedLogger (l )
212+
213+ message := []byte ("success message\n " )
214+ _ , err := bl .Write (message )
215+ if err != nil {
216+ t .Fatalf ("unexpected write error: %v" , err )
217+ }
218+
219+ if gotErr := bl .Flush (ctx , nil ); gotErr != nil {
220+ t .Errorf ("Flush(ctx, nil) returned error %v, want nil" , gotErr )
221+ }
222+
223+ received := catcher .msgs [0 ].GetLogEntries ()[0 ]
224+ if got , want := received .Message , "success message" ; got != want {
225+ t .Errorf ("got message %q, want %q" , got , want )
226+ }
227+ if got , want := received .Severity , fnpb .LogEntry_Severity_DEBUG ; got != want {
228+ t .Errorf ("got severity %v, want %v" , got , want )
229+ }
230+ })
231+
232+ t .Run ("flush with non-nil error" , func (t * testing.T ) {
233+ catcher := & logCatcher {}
234+ l := & Logger {client : catcher }
235+ bl := NewBufferedLogger (l )
236+
237+ message := []byte ("error message\n " )
238+ _ , err := bl .Write (message )
239+ if err != nil {
240+ t .Fatalf ("unexpected write error: %v" , err )
241+ }
242+
243+ originalErr := errors .New ("command failed" )
244+ if gotErr := bl .Flush (ctx , originalErr ); gotErr != originalErr {
245+ t .Errorf ("Flush(ctx, err) returned %v, want %v" , gotErr , originalErr )
246+ }
247+
248+ received := catcher .msgs [0 ].GetLogEntries ()[0 ]
249+ if got , want := received .Message , "error message" ; got != want {
250+ t .Errorf ("got message %q, want %q" , got , want )
251+ }
252+ if got , want := received .Severity , fnpb .LogEntry_Severity_ERROR ; got != want {
253+ t .Errorf ("got severity %v, want %v" , got , want )
254+ }
255+ })
256+
171257 t .Run ("direct print" , func (t * testing.T ) {
172258 catcher := & logCatcher {}
173259 l := & Logger {client : catcher }
@@ -195,7 +281,8 @@ func TestBufferedLogger(t *testing.T) {
195281 startTime := time .Now ()
196282 bl .now = func () time.Time { return startTime }
197283
198- messages := []string {"foo" , "bar" }
284+ messages := []string {"foo\n " , "bar\n " }
285+ expected := []string {"foo" , "bar" }
199286
200287 for i , message := range messages {
201288 if i > 1 {
@@ -212,7 +299,8 @@ func TestBufferedLogger(t *testing.T) {
212299 }
213300 }
214301
215- lastMessage := "baz"
302+ lastMessage := "baz\n "
303+ expected = append (expected , "baz" )
216304 bl .now = func () time.Time { return startTime .Add (6 * time .Second ) }
217305 messBytes := []byte (lastMessage )
218306 n , err := bl .Write (messBytes )
@@ -225,11 +313,14 @@ func TestBufferedLogger(t *testing.T) {
225313 }
226314
227315 // Type should have auto-flushed at debug after the third message
228- received := catcher .msgs [0 ].GetLogEntries ()
229- messages = append (messages , lastMessage )
316+ received := getAllLogEntries (catcher )
317+
318+ if got , want := len (received ), len (expected ); got != want {
319+ t .Fatalf ("expected %d log entries received, got %d" , want , got )
320+ }
230321
231322 for i , message := range received {
232- if got , want := message .Message , messages [i ]; got != want {
323+ if got , want := message .Message , expected [i ]; got != want {
233324 t .Errorf ("got message %q, want %q" , got , want )
234325 }
235326
@@ -238,4 +329,57 @@ func TestBufferedLogger(t *testing.T) {
238329 }
239330 }
240331 })
332+
333+ t .Run ("partial write splitting" , func (t * testing.T ) {
334+ catcher := & logCatcher {}
335+ l := & Logger {client : catcher }
336+ bl := NewBufferedLogger (l )
337+
338+ // Write a partial line
339+ n , err := bl .Write ([]byte ("hello " ))
340+ if err != nil {
341+ t .Errorf ("got error %v" , err )
342+ }
343+ if n != 6 {
344+ t .Errorf ("got %d, want 6" , n )
345+ }
346+ if len (bl .logs ) != 0 {
347+ t .Errorf ("expected no logs buffered yet, got %d" , len (bl .logs ))
348+ }
349+
350+ // Write remainder and a second line
351+ n , err = bl .Write ([]byte ("world\n line2\n partial" ))
352+ if err != nil {
353+ t .Errorf ("got error %v" , err )
354+ }
355+ if n != 19 {
356+ t .Errorf ("got %d, want 19" , n )
357+ }
358+
359+ if got , want := len (bl .logs ), 2 ; got != want {
360+ t .Errorf ("expected 2 logs buffered, got %d" , got )
361+ }
362+ if got , want := bl .logs [0 ], "hello world" ; got != want {
363+ t .Errorf ("got %q, want %q" , got , want )
364+ }
365+ if got , want := bl .logs [1 ], "line2" ; got != want {
366+ t .Errorf ("got %q, want %q" , got , want )
367+ }
368+
369+ // Flush should flush the final partial message
370+ bl .FlushAtDebug (ctx )
371+ received := getAllLogEntries (catcher )
372+ if got , want := len (received ), 3 ; got != want {
373+ t .Fatalf ("expected 3 log entries received, got %d" , got )
374+ }
375+ if got , want := received [0 ].Message , "hello world" ; got != want {
376+ t .Errorf ("got message %q, want %q" , got , want )
377+ }
378+ if got , want := received [1 ].Message , "line2" ; got != want {
379+ t .Errorf ("got message %q, want %q" , got , want )
380+ }
381+ if got , want := received [2 ].Message , "partial" ; got != want {
382+ t .Errorf ("got message %q, want %q" , got , want )
383+ }
384+ })
241385}
0 commit comments