log_cache_test.go 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. package cache
  2. import (
  3. "bytes"
  4. "context"
  5. "testing"
  6. "time"
  7. "github.com/docker/docker/daemon/logger"
  8. "gotest.tools/v3/assert"
  9. is "gotest.tools/v3/assert/cmp"
  10. )
  11. type fakeLogger struct {
  12. messages chan logger.Message
  13. close chan struct{}
  14. }
  15. func (l *fakeLogger) Log(msg *logger.Message) error {
  16. select {
  17. case l.messages <- *msg:
  18. case <-l.close:
  19. }
  20. logger.PutMessage(msg)
  21. return nil
  22. }
  23. func (l *fakeLogger) Name() string {
  24. return "fake"
  25. }
  26. func (l *fakeLogger) Close() error {
  27. close(l.close)
  28. return nil
  29. }
  30. func TestLog(t *testing.T) {
  31. cacher := &fakeLogger{make(chan logger.Message), make(chan struct{})}
  32. l := &loggerWithCache{
  33. l: &fakeLogger{make(chan logger.Message, 100), make(chan struct{})},
  34. cache: cacher,
  35. }
  36. defer l.Close()
  37. var messages []logger.Message
  38. for i := 0; i < 100; i++ {
  39. messages = append(messages, logger.Message{
  40. Timestamp: time.Now(),
  41. Line: append(bytes.Repeat([]byte("a"), 100), '\n'),
  42. })
  43. }
  44. ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second)
  45. defer cancel()
  46. go func() {
  47. for _, msg := range messages {
  48. select {
  49. case <-ctx.Done():
  50. return
  51. default:
  52. }
  53. m := logger.NewMessage()
  54. dumbCopyMessage(m, &msg)
  55. l.Log(m)
  56. }
  57. }()
  58. for _, m := range messages {
  59. var msg logger.Message
  60. select {
  61. case <-ctx.Done():
  62. t.Fatal("timed out waiting for messages... this is probably a test implementation error")
  63. case msg = <-cacher.messages:
  64. assert.Assert(t, is.DeepEqual(msg, m))
  65. }
  66. }
  67. }