Skip to content

Commit c91e09b

Browse files
author
Kazuyoshi Kato
committed
daemon/logger: replace flaky TestFollowLogsHandleDecodeErr
Signed-off-by: Kazuyoshi Kato <katokazu@amazon.com>
1 parent 7a10f5a commit c91e09b

File tree

2 files changed

+41
-75
lines changed

2 files changed

+41
-75
lines changed
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package loggerutils // import "github.com/docker/docker/daemon/logger/loggerutils"
2+
3+
import (
4+
"io"
5+
"os"
6+
"testing"
7+
8+
"gotest.tools/v3/assert"
9+
)
10+
11+
func TestHandleDecoderErr(t *testing.T) {
12+
f, err := os.CreateTemp("", t.Name())
13+
assert.NilError(t, err)
14+
defer os.Remove(f.Name())
15+
16+
_, err = f.Write([]byte("hello"))
17+
assert.NilError(t, err)
18+
19+
pos, err := f.Seek(0, io.SeekCurrent)
20+
assert.NilError(t, err)
21+
assert.Assert(t, pos != 0)
22+
23+
dec := &testDecoder{}
24+
25+
// Simulate "turncate" case, where the file was bigger before.
26+
fl := &follow{file: f, dec: dec, oldSize: 100}
27+
err = fl.handleDecodeErr(io.EOF)
28+
assert.NilError(t, err)
29+
30+
// handleDecodeErr seeks to zero.
31+
pos, err = f.Seek(0, io.SeekCurrent)
32+
assert.NilError(t, err)
33+
assert.Equal(t, int64(0), pos)
34+
35+
// Reset is called.
36+
assert.Equal(t, 1, dec.resetCount)
37+
}

daemon/logger/loggerutils/logfile_test.go

Lines changed: 4 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,11 @@ import (
44
"bufio"
55
"bytes"
66
"context"
7-
"errors"
87
"fmt"
98
"io"
109
"os"
1110
"path/filepath"
1211
"strings"
13-
"sync"
1412
"sync/atomic"
1513
"testing"
1614
"text/tabwriter"
@@ -24,8 +22,9 @@ import (
2422
)
2523

2624
type testDecoder struct {
27-
rdr io.Reader
28-
scanner *bufio.Scanner
25+
rdr io.Reader
26+
scanner *bufio.Scanner
27+
resetCount int
2928
}
3029

3130
func (d *testDecoder) Decode() (*logger.Message, error) {
@@ -42,6 +41,7 @@ func (d *testDecoder) Decode() (*logger.Message, error) {
4241
func (d *testDecoder) Reset(rdr io.Reader) {
4342
d.rdr = rdr
4443
d.scanner = bufio.NewScanner(rdr)
44+
d.resetCount++
4545
}
4646

4747
func (d *testDecoder) Close() {
@@ -246,77 +246,6 @@ func TestFollowLogsProducerGone(t *testing.T) {
246246
}
247247
}
248248

249-
type lineDecoder struct {
250-
r *bufio.Reader
251-
resetCount int
252-
}
253-
254-
func (d *lineDecoder) Decode() (*logger.Message, error) {
255-
line, err := d.r.ReadString('\n')
256-
if err != nil {
257-
return nil, err
258-
}
259-
m := logger.NewMessage()
260-
m.Line = []byte(line)
261-
return m, nil
262-
}
263-
264-
func (d *lineDecoder) Reset(r io.Reader) {
265-
d.r = bufio.NewReader(r)
266-
d.resetCount++
267-
}
268-
269-
func (d *lineDecoder) Close() {
270-
}
271-
272-
func TestFollowLogsHandleDecodeErr(t *testing.T) {
273-
lw := logger.NewLogWatcher()
274-
defer lw.ConsumerGone()
275-
276-
fw, err := os.CreateTemp("", t.Name())
277-
assert.NilError(t, err)
278-
defer os.Remove(fw.Name())
279-
280-
fr, err := os.Open(fw.Name())
281-
assert.NilError(t, err)
282-
283-
dec := &lineDecoder{}
284-
dec.Reset(fr)
285-
286-
var since, until time.Time
287-
rotate := make(chan interface{})
288-
evict := make(chan interface{})
289-
290-
var wg sync.WaitGroup
291-
wg.Add(1)
292-
go func() {
293-
defer wg.Done()
294-
followLogs(fr, lw, rotate, evict, dec, since, until)
295-
}()
296-
297-
sendReceive := func(f io.Writer, message string) {
298-
_, err = f.Write([]byte(message))
299-
assert.NilError(t, err)
300-
m := <-lw.Msg
301-
assert.Equal(t, message, string(m.Line))
302-
}
303-
304-
sendReceive(fw, "log1\n")
305-
sendReceive(fw, "log2\n")
306-
307-
ft, err := os.OpenFile(fw.Name(), os.O_WRONLY|os.O_TRUNC, 0600)
308-
assert.NilError(t, err)
309-
310-
sendReceive(ft, "log3\n")
311-
312-
evict <- errors.New("stop followLogs")
313-
wg.Wait()
314-
315-
// followLogs calls Reset() in the beginning,
316-
// each 3 writes result Reset(), then handleDecodeErr() calles Reset().
317-
assert.Equal(t, 5, dec.resetCount)
318-
}
319-
320249
func TestCheckCapacityAndRotate(t *testing.T) {
321250
dir, err := os.MkdirTemp("", t.Name())
322251
assert.NilError(t, err)

0 commit comments

Comments
 (0)