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  }