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 }