master
go 130 lines 2.81 KB
Raw
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/netdata/go/plugins/plugin/framework/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 any) {
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 }