github.com/netdata/go.d.plugin@v0.58.1/agent/discovery/sd/hostsocket/sim_test.go (about)

     1  // SPDX-License-Identifier: GPL-3.0-or-later
     2  
     3  package hostsocket
     4  
     5  import (
     6  	"context"
     7  	"testing"
     8  	"time"
     9  
    10  	"github.com/netdata/go.d.plugin/agent/discovery/sd/model"
    11  
    12  	"github.com/stretchr/testify/assert"
    13  	"github.com/stretchr/testify/require"
    14  )
    15  
    16  type discoverySim struct {
    17  	mock                 *mockLocalListenersExec
    18  	wantDoneBeforeCancel bool
    19  	wantTargetGroups     []model.TargetGroup
    20  }
    21  
    22  func (sim *discoverySim) run(t *testing.T) {
    23  	d, err := NewNetSocketDiscoverer(NetworkSocketConfig{Tags: "hostsocket net"})
    24  	require.NoError(t, err)
    25  
    26  	d.ll = sim.mock
    27  
    28  	ctx, cancel := context.WithCancel(context.Background())
    29  	tggs, done := sim.collectTargetGroups(t, ctx, d)
    30  
    31  	if sim.wantDoneBeforeCancel {
    32  		select {
    33  		case <-done:
    34  		default:
    35  			assert.Fail(t, "discovery hasn't finished before cancel")
    36  		}
    37  	}
    38  	assert.Equal(t, sim.wantTargetGroups, tggs)
    39  
    40  	cancel()
    41  	select {
    42  	case <-done:
    43  	case <-time.After(time.Second * 3):
    44  		assert.Fail(t, "discovery hasn't finished after cancel")
    45  	}
    46  }
    47  
    48  func (sim *discoverySim) collectTargetGroups(t *testing.T, ctx context.Context, d *NetDiscoverer) ([]model.TargetGroup, chan struct{}) {
    49  
    50  	in := make(chan []model.TargetGroup)
    51  	done := make(chan struct{})
    52  
    53  	go func() { defer close(done); d.Discover(ctx, in) }()
    54  
    55  	timeout := time.Second * 5
    56  	var tggs []model.TargetGroup
    57  
    58  	func() {
    59  		for {
    60  			select {
    61  			case groups := <-in:
    62  				if tggs = append(tggs, groups...); len(tggs) == len(sim.wantTargetGroups) {
    63  					return
    64  				}
    65  			case <-done:
    66  				return
    67  			case <-time.After(timeout):
    68  				t.Logf("discovery timed out after %s", timeout)
    69  				return
    70  			}
    71  		}
    72  	}()
    73  
    74  	return tggs, done
    75  }