github.com/netdata/go.d.plugin@v0.58.1/agent/filestatus/manager_test.go (about) 1 // SPDX-License-Identifier: GPL-3.0-or-later 2 3 package filestatus 4 5 import ( 6 "context" 7 "os" 8 "path" 9 "strings" 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 ) 18 19 func TestNewManager(t *testing.T) { 20 mgr := NewManager("") 21 assert.NotNil(t, mgr.store) 22 } 23 24 func TestManager_Run(t *testing.T) { 25 type testAction struct { 26 name string 27 cfg confgroup.Config 28 status string 29 } 30 tests := map[string]struct { 31 actions []testAction 32 wantFile string 33 }{ 34 "save": { 35 actions: []testAction{ 36 { 37 name: "save", status: "ok", 38 cfg: prepareConfig("module", "module1", "name", "name1"), 39 }, 40 { 41 name: "save", status: "ok", 42 cfg: prepareConfig("module", "module2", "name", "name2"), 43 }, 44 }, 45 wantFile: ` 46 { 47 "module1": { 48 "name1:5956328514325012774": "ok" 49 }, 50 "module2": { 51 "name2:14684454322123948394": "ok" 52 } 53 } 54 `, 55 }, 56 "remove": { 57 actions: []testAction{ 58 { 59 name: "save", status: "ok", 60 cfg: prepareConfig("module", "module1", "name", "name1"), 61 }, 62 { 63 name: "save", status: "ok", 64 cfg: prepareConfig("module", "module2", "name", "name2"), 65 }, 66 { 67 name: "remove", 68 cfg: prepareConfig("module", "module2", "name", "name2"), 69 }, 70 }, 71 wantFile: ` 72 { 73 "module1": { 74 "name1:5956328514325012774": "ok" 75 } 76 } 77 `, 78 }, 79 } 80 81 for name, test := range tests { 82 t.Run(name, func(t *testing.T) { 83 dir, err := os.MkdirTemp(os.TempDir(), "netdata-go-test-filestatus-run") 84 require.NoError(t, err) 85 defer func() { assert.NoError(t, os.RemoveAll(dir)) }() 86 87 filename := path.Join(dir, "filestatus") 88 89 mgr := NewManager(filename) 90 91 ctx, cancel := context.WithCancel(context.Background()) 92 done := make(chan struct{}) 93 go func() { defer close(done); mgr.Run(ctx) }() 94 95 for _, v := range test.actions { 96 switch v.name { 97 case "save": 98 mgr.Save(v.cfg, v.status) 99 case "remove": 100 mgr.Remove(v.cfg) 101 } 102 } 103 104 cancel() 105 106 timeout := time.Second * 5 107 tk := time.NewTimer(timeout) 108 defer tk.Stop() 109 110 select { 111 case <-done: 112 case <-tk.C: 113 t.Errorf("timed out after %s", timeout) 114 } 115 116 bs, err := os.ReadFile(filename) 117 require.NoError(t, err) 118 119 assert.Equal(t, strings.TrimSpace(test.wantFile), string(bs)) 120 }) 121 } 122 }