github.com/superfly/nomad@v0.10.5-fly/command/agent/monitor/monitor_test.go (about)

     1  package monitor
     2  
     3  import (
     4  	"fmt"
     5  	"strings"
     6  	"testing"
     7  	"time"
     8  
     9  	log "github.com/hashicorp/go-hclog"
    10  	"github.com/stretchr/testify/require"
    11  )
    12  
    13  func TestMonitor_Start(t *testing.T) {
    14  	t.Parallel()
    15  
    16  	logger := log.NewInterceptLogger(&log.LoggerOptions{
    17  		Level: log.Error,
    18  	})
    19  
    20  	m := New(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  	for {
    33  		select {
    34  		case log := <-logCh:
    35  			require.Contains(t, string(log), "[DEBUG] test log")
    36  			return
    37  		case <-time.After(3 * time.Second):
    38  			t.Fatal("Expected to receive from log channel")
    39  		}
    40  	}
    41  }
    42  
    43  // Ensure number of dropped messages are logged
    44  func TestMonitor_DroppedMessages(t *testing.T) {
    45  	t.Parallel()
    46  
    47  	logger := log.NewInterceptLogger(&log.LoggerOptions{
    48  		Level: log.Warn,
    49  	})
    50  
    51  	m := new(5, logger, &log.LoggerOptions{
    52  		Level: log.Debug,
    53  	})
    54  	m.droppedDuration = 5 * time.Millisecond
    55  
    56  	doneCh := make(chan struct{})
    57  	defer close(doneCh)
    58  
    59  	logCh := m.Start()
    60  
    61  	for i := 0; i <= 100; i++ {
    62  		logger.Debug(fmt.Sprintf("test message %d", i))
    63  	}
    64  
    65  	received := ""
    66  	passed := make(chan struct{})
    67  	go func() {
    68  		for {
    69  			select {
    70  			case recv := <-logCh:
    71  				received += string(recv)
    72  				if strings.Contains(received, "[WARN] Monitor dropped") {
    73  					close(passed)
    74  				}
    75  			}
    76  		}
    77  	}()
    78  
    79  TEST:
    80  	for {
    81  		select {
    82  		case <-passed:
    83  			break TEST
    84  		case <-time.After(2 * time.Second):
    85  			require.Fail(t, "expected to see warn dropped messages")
    86  		}
    87  	}
    88  }