summaryrefslogtreecommitdiffstats
path: root/src/go/collectors/go.d.plugin/agent/filestatus/manager_test.go
blob: 7d45c64a2dde843c625c4770e3921c32667fede1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
// SPDX-License-Identifier: GPL-3.0-or-later

package filestatus

import (
	"context"
	"os"
	"path"
	"strings"
	"testing"
	"time"

	"github.com/netdata/netdata/go/go.d.plugin/agent/confgroup"

	"github.com/stretchr/testify/assert"
	"github.com/stretchr/testify/require"
)

func TestNewManager(t *testing.T) {
	mgr := NewManager("")
	assert.NotNil(t, mgr.store)
}

func TestManager_Run(t *testing.T) {
	type testAction struct {
		name   string
		cfg    confgroup.Config
		status string
	}
	tests := map[string]struct {
		actions  []testAction
		wantFile string
	}{
		"save": {
			actions: []testAction{
				{
					name: "save", status: "ok",
					cfg: prepareConfig("module", "module1", "name", "name1"),
				},
				{
					name: "save", status: "ok",
					cfg: prepareConfig("module", "module2", "name", "name2"),
				},
			},
			wantFile: `
{
 "module1": {
  "name1:5956328514325012774": "ok"
 },
 "module2": {
  "name2:14684454322123948394": "ok"
 }
}
`,
		},
		"remove": {
			actions: []testAction{
				{
					name: "save", status: "ok",
					cfg: prepareConfig("module", "module1", "name", "name1"),
				},
				{
					name: "save", status: "ok",
					cfg: prepareConfig("module", "module2", "name", "name2"),
				},
				{
					name: "remove",
					cfg:  prepareConfig("module", "module2", "name", "name2"),
				},
			},
			wantFile: `
{
 "module1": {
  "name1:5956328514325012774": "ok"
 }
}
`,
		},
	}

	for name, test := range tests {
		t.Run(name, func(t *testing.T) {
			dir, err := os.MkdirTemp(os.TempDir(), "netdata-go-test-filestatus-run")
			require.NoError(t, err)
			defer func() { assert.NoError(t, os.RemoveAll(dir)) }()

			filename := path.Join(dir, "filestatus")

			mgr := NewManager(filename)

			ctx, cancel := context.WithCancel(context.Background())
			done := make(chan struct{})
			go func() { defer close(done); mgr.Run(ctx) }()

			for _, v := range test.actions {
				switch v.name {
				case "save":
					mgr.Save(v.cfg, v.status)
				case "remove":
					mgr.Remove(v.cfg)
				}
			}

			cancel()

			timeout := time.Second * 5
			tk := time.NewTimer(timeout)
			defer tk.Stop()

			select {
			case <-done:
			case <-tk.C:
				t.Errorf("timed out after %s", timeout)
			}

			bs, err := os.ReadFile(filename)
			require.NoError(t, err)

			assert.Equal(t, strings.TrimSpace(test.wantFile), string(bs))
		})
	}
}