package jsonfilelog // import "github.com/docker/docker/daemon/logger/jsonfilelog" import ( "bytes" "io" "testing" "time" "github.com/docker/docker/daemon/logger" "gotest.tools/assert" "gotest.tools/fs" ) func BenchmarkJSONFileLoggerReadLogs(b *testing.B) { tmp := fs.NewDir(b, "bench-jsonfilelog") defer tmp.Remove() jsonlogger, err := New(logger.Info{ ContainerID: "a7317399f3f857173c6179d44823594f8294678dea9999662e5c625b5a1c7657", LogPath: tmp.Join("container.log"), Config: map[string]string{ "labels": "first,second", }, ContainerLabels: map[string]string{ "first": "label_value", "second": "label_foo", }, }) assert.NilError(b, err) defer jsonlogger.Close() msg := &logger.Message{ Line: []byte("Line that thinks that it is log line from docker\n"), Source: "stderr", Timestamp: time.Now().UTC(), } buf := bytes.NewBuffer(nil) assert.NilError(b, marshalMessage(msg, nil, buf)) b.SetBytes(int64(buf.Len())) b.ResetTimer() chError := make(chan error, b.N+1) go func() { for i := 0; i < b.N; i++ { chError <- jsonlogger.Log(msg) } chError <- jsonlogger.Close() }() lw := jsonlogger.(*JSONFileLogger).ReadLogs(logger.ReadConfig{Follow: true}) for { select { case <-lw.Msg: case <-lw.WatchProducerGone(): return case err := <-chError: if err != nil { b.Fatal(err) } } } } func TestEncodeDecode(t *testing.T) { t.Parallel() m1 := &logger.Message{Line: []byte("hello 1"), Timestamp: time.Now(), Source: "stdout"} m2 := &logger.Message{Line: []byte("hello 2"), Timestamp: time.Now(), Source: "stdout"} m3 := &logger.Message{Line: []byte("hello 3"), Timestamp: time.Now(), Source: "stdout"} buf := bytes.NewBuffer(nil) assert.Assert(t, marshalMessage(m1, nil, buf)) assert.Assert(t, marshalMessage(m2, nil, buf)) assert.Assert(t, marshalMessage(m3, nil, buf)) decode := decodeFunc(buf) msg, err := decode() assert.NilError(t, err) assert.Assert(t, string(msg.Line) == "hello 1\n", string(msg.Line)) msg, err = decode() assert.NilError(t, err) assert.Assert(t, string(msg.Line) == "hello 2\n") msg, err = decode() assert.NilError(t, err) assert.Assert(t, string(msg.Line) == "hello 3\n") _, err = decode() assert.Assert(t, err == io.EOF) }