github.com/hernad/nomad@v1.6.112/command/agent/monitor/monitor_test.go (about)

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