copier_test.go 3.1 KB

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