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