create_test.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. package logger
  2. import (
  3. "io"
  4. "testing"
  5. "github.com/pkg/errors"
  6. "github.com/rs/zerolog"
  7. "github.com/stretchr/testify/assert"
  8. )
  9. type mockedWriter struct {
  10. wantErr bool
  11. writeCalls int
  12. }
  13. func (c *mockedWriter) Write(p []byte) (int, error) {
  14. c.writeCalls++
  15. if c.wantErr {
  16. return -1, errors.New("Expected error")
  17. }
  18. return len(p), nil
  19. }
  20. // Tests that a new writer is only used if it actually works.
  21. func TestResilientMultiWriter_Errors(t *testing.T) {
  22. tests := []struct {
  23. name string
  24. writers []*mockedWriter
  25. }{
  26. {
  27. name: "All valid writers",
  28. writers: []*mockedWriter{
  29. {
  30. wantErr: false,
  31. },
  32. {
  33. wantErr: false,
  34. },
  35. },
  36. },
  37. {
  38. name: "All invalid writers",
  39. writers: []*mockedWriter{
  40. {
  41. wantErr: true,
  42. },
  43. {
  44. wantErr: true,
  45. },
  46. },
  47. },
  48. {
  49. name: "First invalid writer",
  50. writers: []*mockedWriter{
  51. {
  52. wantErr: true,
  53. },
  54. {
  55. wantErr: false,
  56. },
  57. },
  58. },
  59. {
  60. name: "First valid writer",
  61. writers: []*mockedWriter{
  62. {
  63. wantErr: false,
  64. },
  65. {
  66. wantErr: true,
  67. },
  68. },
  69. },
  70. }
  71. for _, test := range tests {
  72. t.Run(test.name, func(t *testing.T) {
  73. writers := []io.Writer{}
  74. for _, w := range test.writers {
  75. writers = append(writers, w)
  76. }
  77. multiWriter := resilientMultiWriter{zerolog.InfoLevel, writers, nil}
  78. logger := zerolog.New(multiWriter).With().Timestamp().Logger()
  79. logger.Info().Msg("Test msg")
  80. for _, w := range test.writers {
  81. // Expect each writer to be written to regardless of the previous writers returning an error
  82. assert.Equal(t, 1, w.writeCalls)
  83. }
  84. })
  85. }
  86. }
  87. type mockedManagementWriter struct {
  88. WriteCalls int
  89. }
  90. func (c *mockedManagementWriter) Write(p []byte) (int, error) {
  91. return len(p), nil
  92. }
  93. func (c *mockedManagementWriter) WriteLevel(level zerolog.Level, p []byte) (int, error) {
  94. c.WriteCalls++
  95. return len(p), nil
  96. }
  97. // Tests that management writer receives write calls of all levels except Disabled
  98. func TestResilientMultiWriter_Management(t *testing.T) {
  99. for _, level := range []zerolog.Level{
  100. zerolog.DebugLevel,
  101. zerolog.InfoLevel,
  102. zerolog.WarnLevel,
  103. zerolog.ErrorLevel,
  104. zerolog.FatalLevel,
  105. zerolog.PanicLevel,
  106. } {
  107. t.Run(level.String(), func(t *testing.T) {
  108. managementWriter := mockedManagementWriter{}
  109. multiWriter := resilientMultiWriter{level, []io.Writer{&mockedWriter{}}, &managementWriter}
  110. logger := zerolog.New(multiWriter).With().Timestamp().Logger()
  111. logger.Info().Msg("Test msg")
  112. // Always write to management
  113. assert.Equal(t, 1, managementWriter.WriteCalls)
  114. })
  115. }
  116. }