github.com/netdata/go.d.plugin@v0.58.1/agent/confgroup/cache_test.go (about) 1 // SPDX-License-Identifier: GPL-3.0-or-later 2 3 package confgroup 4 5 import ( 6 "sort" 7 "testing" 8 9 "github.com/stretchr/testify/assert" 10 ) 11 12 func TestConfigCache_Add(t *testing.T) { 13 tests := map[string]struct { 14 prepareGroups []Group 15 groups []Group 16 expectedAdd []Config 17 expectedRemove []Config 18 }{ 19 "new group, new configs": { 20 groups: []Group{ 21 prepareGroup("source", prepareCfg("name", "module")), 22 }, 23 expectedAdd: []Config{ 24 prepareCfg("name", "module"), 25 }, 26 }, 27 "several equal updates for the same group": { 28 groups: []Group{ 29 prepareGroup("source", prepareCfg("name", "module")), 30 prepareGroup("source", prepareCfg("name", "module")), 31 prepareGroup("source", prepareCfg("name", "module")), 32 prepareGroup("source", prepareCfg("name", "module")), 33 prepareGroup("source", prepareCfg("name", "module")), 34 }, 35 expectedAdd: []Config{ 36 prepareCfg("name", "module"), 37 }, 38 }, 39 "empty group update for cached group": { 40 prepareGroups: []Group{ 41 prepareGroup("source", prepareCfg("name1", "module"), prepareCfg("name2", "module")), 42 }, 43 groups: []Group{ 44 prepareGroup("source"), 45 }, 46 expectedRemove: []Config{ 47 prepareCfg("name1", "module"), 48 prepareCfg("name2", "module"), 49 }, 50 }, 51 "changed group update for cached group": { 52 prepareGroups: []Group{ 53 prepareGroup("source", prepareCfg("name1", "module"), prepareCfg("name2", "module")), 54 }, 55 groups: []Group{ 56 prepareGroup("source", prepareCfg("name2", "module")), 57 }, 58 expectedRemove: []Config{ 59 prepareCfg("name1", "module"), 60 }, 61 }, 62 "empty group update for uncached group": { 63 groups: []Group{ 64 prepareGroup("source"), 65 prepareGroup("source"), 66 }, 67 }, 68 "several updates with different source but same context": { 69 groups: []Group{ 70 prepareGroup("source1", prepareCfg("name1", "module"), prepareCfg("name2", "module")), 71 prepareGroup("source2", prepareCfg("name1", "module"), prepareCfg("name2", "module")), 72 }, 73 expectedAdd: []Config{ 74 prepareCfg("name1", "module"), 75 prepareCfg("name2", "module"), 76 }, 77 }, 78 "have equal configs from 2 sources, get empty group for the 1st source": { 79 prepareGroups: []Group{ 80 prepareGroup("source1", prepareCfg("name1", "module"), prepareCfg("name2", "module")), 81 prepareGroup("source2", prepareCfg("name1", "module"), prepareCfg("name2", "module")), 82 }, 83 groups: []Group{ 84 prepareGroup("source2"), 85 }, 86 }, 87 } 88 89 for name, test := range tests { 90 t.Run(name, func(t *testing.T) { 91 cache := NewCache() 92 93 for _, group := range test.prepareGroups { 94 cache.Add(&group) 95 } 96 97 var added, removed []Config 98 for _, group := range test.groups { 99 a, r := cache.Add(&group) 100 added = append(added, a...) 101 removed = append(removed, r...) 102 } 103 104 sortConfigs(added) 105 sortConfigs(removed) 106 sortConfigs(test.expectedAdd) 107 sortConfigs(test.expectedRemove) 108 109 assert.Equalf(t, test.expectedAdd, added, "added configs") 110 assert.Equalf(t, test.expectedRemove, removed, "removed configs") 111 }) 112 } 113 } 114 115 func prepareGroup(source string, cfgs ...Config) Group { 116 return Group{ 117 Configs: cfgs, 118 Source: source, 119 } 120 } 121 122 func prepareCfg(name, module string) Config { 123 return Config{ 124 "name": name, 125 "module": module, 126 } 127 } 128 129 func sortConfigs(cfgs []Config) { 130 if len(cfgs) == 0 { 131 return 132 } 133 sort.Slice(cfgs, func(i, j int) bool { return cfgs[i].FullName() < cfgs[j].FullName() }) 134 }