logfile_test.go 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. package loggerutils
  2. import (
  3. "bufio"
  4. "context"
  5. "io"
  6. "strings"
  7. "testing"
  8. "time"
  9. "github.com/docker/docker/daemon/logger"
  10. "github.com/docker/docker/pkg/tailfile"
  11. "gotest.tools/assert"
  12. )
  13. func TestTailFiles(t *testing.T) {
  14. s1 := strings.NewReader("Hello.\nMy name is Inigo Montoya.\n")
  15. s2 := strings.NewReader("I'm serious.\nDon't call me Shirley!\n")
  16. s3 := strings.NewReader("Roads?\nWhere we're going we don't need roads.\n")
  17. files := []SizeReaderAt{s1, s2, s3}
  18. watcher := logger.NewLogWatcher()
  19. createDecoder := func(r io.Reader) func() (*logger.Message, error) {
  20. scanner := bufio.NewScanner(r)
  21. return func() (*logger.Message, error) {
  22. if !scanner.Scan() {
  23. return nil, scanner.Err()
  24. }
  25. // some comment
  26. return &logger.Message{Line: scanner.Bytes(), Timestamp: time.Now()}, nil
  27. }
  28. }
  29. tailReader := func(ctx context.Context, r SizeReaderAt, lines int) (io.Reader, int, error) {
  30. return tailfile.NewTailReader(ctx, r, lines)
  31. }
  32. for desc, config := range map[string]logger.ReadConfig{} {
  33. t.Run(desc, func(t *testing.T) {
  34. started := make(chan struct{})
  35. go func() {
  36. close(started)
  37. tailFiles(files, watcher, createDecoder, tailReader, config)
  38. }()
  39. <-started
  40. })
  41. }
  42. config := logger.ReadConfig{Tail: 2}
  43. started := make(chan struct{})
  44. go func() {
  45. close(started)
  46. tailFiles(files, watcher, createDecoder, tailReader, config)
  47. }()
  48. <-started
  49. select {
  50. case <-time.After(60 * time.Second):
  51. t.Fatal("timeout waiting for tail line")
  52. case err := <-watcher.Err:
  53. assert.Assert(t, err)
  54. case msg := <-watcher.Msg:
  55. assert.Assert(t, msg != nil)
  56. assert.Assert(t, string(msg.Line) == "Roads?", string(msg.Line))
  57. }
  58. select {
  59. case <-time.After(60 * time.Second):
  60. t.Fatal("timeout waiting for tail line")
  61. case err := <-watcher.Err:
  62. assert.Assert(t, err)
  63. case msg := <-watcher.Msg:
  64. assert.Assert(t, msg != nil)
  65. assert.Assert(t, string(msg.Line) == "Where we're going we don't need roads.", string(msg.Line))
  66. }
  67. }