github.com/lmars/docker@v1.6.0-rc2/daemon/logger/copier_test.go (about) 1 package logger 2 3 import ( 4 "bytes" 5 "encoding/json" 6 "io" 7 "testing" 8 "time" 9 ) 10 11 type TestLoggerJSON struct { 12 *json.Encoder 13 } 14 15 func (l *TestLoggerJSON) Log(m *Message) error { 16 return l.Encode(m) 17 } 18 19 func (l *TestLoggerJSON) Close() error { 20 return nil 21 } 22 23 func (l *TestLoggerJSON) Name() string { 24 return "json" 25 } 26 27 type TestLoggerText struct { 28 *bytes.Buffer 29 } 30 31 func (l *TestLoggerText) Log(m *Message) error { 32 _, err := l.WriteString(m.ContainerID + " " + m.Source + " " + string(m.Line) + "\n") 33 return err 34 } 35 36 func (l *TestLoggerText) Close() error { 37 return nil 38 } 39 40 func (l *TestLoggerText) Name() string { 41 return "text" 42 } 43 44 func TestCopier(t *testing.T) { 45 stdoutLine := "Line that thinks that it is log line from docker stdout" 46 stderrLine := "Line that thinks that it is log line from docker stderr" 47 var stdout bytes.Buffer 48 var stderr bytes.Buffer 49 for i := 0; i < 30; i++ { 50 if _, err := stdout.WriteString(stdoutLine + "\n"); err != nil { 51 t.Fatal(err) 52 } 53 if _, err := stderr.WriteString(stderrLine + "\n"); err != nil { 54 t.Fatal(err) 55 } 56 } 57 58 var jsonBuf bytes.Buffer 59 60 jsonLog := &TestLoggerJSON{Encoder: json.NewEncoder(&jsonBuf)} 61 62 cid := "a7317399f3f857173c6179d44823594f8294678dea9999662e5c625b5a1c7657" 63 c, err := NewCopier(cid, 64 map[string]io.Reader{ 65 "stdout": &stdout, 66 "stderr": &stderr, 67 }, 68 jsonLog) 69 if err != nil { 70 t.Fatal(err) 71 } 72 c.Run() 73 wait := make(chan struct{}) 74 go func() { 75 c.Wait() 76 close(wait) 77 }() 78 select { 79 case <-time.After(1 * time.Second): 80 t.Fatal("Copier failed to do its work in 1 second") 81 case <-wait: 82 } 83 dec := json.NewDecoder(&jsonBuf) 84 for { 85 var msg Message 86 if err := dec.Decode(&msg); err != nil { 87 if err == io.EOF { 88 break 89 } 90 t.Fatal(err) 91 } 92 if msg.Source != "stdout" && msg.Source != "stderr" { 93 t.Fatalf("Wrong Source: %q, should be %q or %q", msg.Source, "stdout", "stderr") 94 } 95 if msg.ContainerID != cid { 96 t.Fatalf("Wrong ContainerID: %q, expected %q", msg.ContainerID, cid) 97 } 98 if msg.Source == "stdout" { 99 if string(msg.Line) != stdoutLine { 100 t.Fatalf("Wrong Line: %q, expected %q", msg.Line, stdoutLine) 101 } 102 } 103 if msg.Source == "stderr" { 104 if string(msg.Line) != stderrLine { 105 t.Fatalf("Wrong Line: %q, expected %q", msg.Line, stderrLine) 106 } 107 } 108 } 109 }