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

     1  // SPDX-License-Identifier: GPL-3.0-or-later
     2  
     3  package file
     4  
     5  import (
     6  	"context"
     7  	"os"
     8  	"path/filepath"
     9  	"sort"
    10  	"testing"
    11  	"time"
    12  
    13  	"github.com/netdata/go.d.plugin/agent/confgroup"
    14  
    15  	"github.com/stretchr/testify/assert"
    16  	"github.com/stretchr/testify/require"
    17  	"gopkg.in/yaml.v2"
    18  )
    19  
    20  type (
    21  	discoverySim struct {
    22  		discovery      *Discovery
    23  		beforeRun      func()
    24  		afterRun       func()
    25  		expectedGroups []*confgroup.Group
    26  	}
    27  )
    28  
    29  func (sim discoverySim) run(t *testing.T) {
    30  	t.Helper()
    31  	require.NotNil(t, sim.discovery)
    32  
    33  	if sim.beforeRun != nil {
    34  		sim.beforeRun()
    35  	}
    36  
    37  	in, out := make(chan []*confgroup.Group), make(chan []*confgroup.Group)
    38  	go sim.collectGroups(t, in, out)
    39  
    40  	ctx, cancel := context.WithTimeout(context.Background(), time.Minute)
    41  	defer cancel()
    42  	go sim.discovery.Run(ctx, in)
    43  	time.Sleep(time.Millisecond * 250)
    44  
    45  	if sim.afterRun != nil {
    46  		sim.afterRun()
    47  	}
    48  
    49  	actual := <-out
    50  
    51  	sortGroups(actual)
    52  	sortGroups(sim.expectedGroups)
    53  
    54  	assert.Equal(t, sim.expectedGroups, actual)
    55  }
    56  
    57  func (sim discoverySim) collectGroups(t *testing.T, in, out chan []*confgroup.Group) {
    58  	timeout := time.Second * 5
    59  	var groups []*confgroup.Group
    60  loop:
    61  	for {
    62  		select {
    63  		case updates := <-in:
    64  			if groups = append(groups, updates...); len(groups) >= len(sim.expectedGroups) {
    65  				break loop
    66  			}
    67  		case <-time.After(timeout):
    68  			t.Logf("discovery %s timed out after %s, got %d groups, expected %d, some events are skipped",
    69  				sim.discovery.discoverers, timeout, len(groups), len(sim.expectedGroups))
    70  			break loop
    71  		}
    72  	}
    73  	out <- groups
    74  }
    75  
    76  type tmpDir struct {
    77  	dir string
    78  	t   *testing.T
    79  }
    80  
    81  func newTmpDir(t *testing.T, pattern string) *tmpDir {
    82  	pattern = "netdata-go-test-discovery-file-" + pattern
    83  	dir, err := os.MkdirTemp(os.TempDir(), pattern)
    84  	require.NoError(t, err)
    85  	return &tmpDir{dir: dir, t: t}
    86  }
    87  
    88  func (d *tmpDir) cleanup() {
    89  	assert.NoError(d.t, os.RemoveAll(d.dir))
    90  }
    91  
    92  func (d *tmpDir) join(filename string) string {
    93  	return filepath.Join(d.dir, filename)
    94  }
    95  
    96  func (d *tmpDir) createFile(pattern string) string {
    97  	f, err := os.CreateTemp(d.dir, pattern)
    98  	require.NoError(d.t, err)
    99  	_ = f.Close()
   100  	return f.Name()
   101  }
   102  
   103  func (d *tmpDir) removeFile(filename string) {
   104  	err := os.Remove(filename)
   105  	require.NoError(d.t, err)
   106  }
   107  
   108  func (d *tmpDir) renameFile(origFilename, newFilename string) {
   109  	err := os.Rename(origFilename, newFilename)
   110  	require.NoError(d.t, err)
   111  }
   112  
   113  func (d *tmpDir) writeYAML(filename string, in interface{}) {
   114  	bs, err := yaml.Marshal(in)
   115  	require.NoError(d.t, err)
   116  	err = os.WriteFile(filename, bs, 0644)
   117  	require.NoError(d.t, err)
   118  }
   119  
   120  func (d *tmpDir) writeString(filename, data string) {
   121  	err := os.WriteFile(filename, []byte(data), 0644)
   122  	require.NoError(d.t, err)
   123  }
   124  
   125  func sortGroups(groups []*confgroup.Group) {
   126  	if len(groups) == 0 {
   127  		return
   128  	}
   129  	sort.Slice(groups, func(i, j int) bool { return groups[i].Source < groups[j].Source })
   130  }