github.com/docker/docker@v299999999.0.0-20200612211812-aaf470eca7b5+incompatible/daemon/logger/jsonfilelog/read_test.go (about)

     1  package jsonfilelog // import "github.com/docker/docker/daemon/logger/jsonfilelog"
     2  
     3  import (
     4  	"bytes"
     5  	"io"
     6  	"testing"
     7  	"time"
     8  
     9  	"github.com/docker/docker/daemon/logger"
    10  	"gotest.tools/v3/assert"
    11  	"gotest.tools/v3/fs"
    12  )
    13  
    14  func BenchmarkJSONFileLoggerReadLogs(b *testing.B) {
    15  	tmp := fs.NewDir(b, "bench-jsonfilelog")
    16  	defer tmp.Remove()
    17  
    18  	jsonlogger, err := New(logger.Info{
    19  		ContainerID: "a7317399f3f857173c6179d44823594f8294678dea9999662e5c625b5a1c7657",
    20  		LogPath:     tmp.Join("container.log"),
    21  		Config: map[string]string{
    22  			"labels": "first,second",
    23  		},
    24  		ContainerLabels: map[string]string{
    25  			"first":  "label_value",
    26  			"second": "label_foo",
    27  		},
    28  	})
    29  	assert.NilError(b, err)
    30  	defer jsonlogger.Close()
    31  
    32  	msg := &logger.Message{
    33  		Line:      []byte("Line that thinks that it is log line from docker\n"),
    34  		Source:    "stderr",
    35  		Timestamp: time.Now().UTC(),
    36  	}
    37  
    38  	buf := bytes.NewBuffer(nil)
    39  	assert.NilError(b, marshalMessage(msg, nil, buf))
    40  	b.SetBytes(int64(buf.Len()))
    41  
    42  	b.ResetTimer()
    43  
    44  	chError := make(chan error, b.N+1)
    45  	go func() {
    46  		for i := 0; i < b.N; i++ {
    47  			chError <- jsonlogger.Log(msg)
    48  		}
    49  		chError <- jsonlogger.Close()
    50  	}()
    51  
    52  	lw := jsonlogger.(*JSONFileLogger).ReadLogs(logger.ReadConfig{Follow: true})
    53  	for {
    54  		select {
    55  		case <-lw.Msg:
    56  		case <-lw.WatchProducerGone():
    57  			return
    58  		case err := <-chError:
    59  			if err != nil {
    60  				b.Fatal(err)
    61  			}
    62  		}
    63  	}
    64  }
    65  
    66  func TestEncodeDecode(t *testing.T) {
    67  	t.Parallel()
    68  
    69  	m1 := &logger.Message{Line: []byte("hello 1"), Timestamp: time.Now(), Source: "stdout"}
    70  	m2 := &logger.Message{Line: []byte("hello 2"), Timestamp: time.Now(), Source: "stdout"}
    71  	m3 := &logger.Message{Line: []byte("hello 3"), Timestamp: time.Now(), Source: "stdout"}
    72  
    73  	buf := bytes.NewBuffer(nil)
    74  	assert.Assert(t, marshalMessage(m1, nil, buf))
    75  	assert.Assert(t, marshalMessage(m2, nil, buf))
    76  	assert.Assert(t, marshalMessage(m3, nil, buf))
    77  
    78  	dec := decodeFunc(buf)
    79  	defer dec.Close()
    80  
    81  	msg, err := dec.Decode()
    82  	assert.NilError(t, err)
    83  	assert.Assert(t, string(msg.Line) == "hello 1\n", string(msg.Line))
    84  
    85  	msg, err = dec.Decode()
    86  	assert.NilError(t, err)
    87  	assert.Assert(t, string(msg.Line) == "hello 2\n")
    88  
    89  	msg, err = dec.Decode()
    90  	assert.NilError(t, err)
    91  	assert.Assert(t, string(msg.Line) == "hello 3\n")
    92  
    93  	_, err = dec.Decode()
    94  	assert.Assert(t, err == io.EOF)
    95  }