1package monitor 2 3import ( 4 "fmt" 5 "strings" 6 "testing" 7 "time" 8 9 log "github.com/hashicorp/go-hclog" 10 "github.com/stretchr/testify/require" 11) 12 13func TestMonitor_Start(t *testing.T) { 14 t.Parallel() 15 16 logger := log.NewInterceptLogger(&log.LoggerOptions{ 17 Level: log.Error, 18 }) 19 20 m, _ := NewMonitor(512, logger, &log.LoggerOptions{ 21 Level: log.Debug, 22 }) 23 24 logCh := m.Start() 25 defer m.Stop() 26 27 go func() { 28 logger.Debug("test log") 29 time.Sleep(10 * time.Millisecond) 30 }() 31 32 select { 33 case l := <-logCh: 34 require.Contains(t, string(l), "[DEBUG] test log") 35 return 36 case <-time.After(5 * time.Second): 37 t.Fatal("Expected to receive from log channel") 38 } 39} 40 41func TestMonitor_Start_Unbuffered(t *testing.T) { 42 t.Parallel() 43 44 logger := log.NewInterceptLogger(&log.LoggerOptions{ 45 Level: log.Error, 46 }) 47 48 _, err := NewMonitor(0, logger, &log.LoggerOptions{ 49 Level: log.Debug, 50 }) 51 52 if err == nil { 53 t.Fatal("expected to get an error, but didn't") 54 } else { 55 if !strings.Contains(err.Error(), "greater than zero") { 56 t.Fatal("expected an error about buf being greater than zero") 57 } 58 } 59} 60 61// Ensure number of dropped messages are logged 62func TestMonitor_DroppedMessages(t *testing.T) { 63 t.Parallel() 64 65 logger := log.NewInterceptLogger(&log.LoggerOptions{ 66 Level: log.Warn, 67 }) 68 69 m, _ := newMonitor(5, logger, &log.LoggerOptions{ 70 Level: log.Debug, 71 }) 72 m.dropCheckInterval = 5 * time.Millisecond 73 74 logCh := m.Start() 75 defer m.Stop() 76 77 for i := 0; i <= 100; i++ { 78 logger.Debug(fmt.Sprintf("test message %d", i)) 79 } 80 81 passed := make(chan struct{}) 82 go func() { 83 for recv := range logCh { 84 if strings.Contains(string(recv), "Monitor dropped") { 85 close(passed) 86 return 87 } 88 } 89 }() 90 91 select { 92 case <-passed: 93 case <-time.After(2 * time.Second): 94 require.Fail(t, "expected to see warn dropped messages") 95 } 96} 97