github.com/netdata/go.d.plugin@v0.58.1/modules/zookeeper/zookeeper_test.go (about) 1 // SPDX-License-Identifier: GPL-3.0-or-later 2 3 package zookeeper 4 5 import ( 6 "bufio" 7 "bytes" 8 "errors" 9 "os" 10 "testing" 11 12 "github.com/stretchr/testify/assert" 13 "github.com/stretchr/testify/require" 14 ) 15 16 var ( 17 testMntrData, _ = os.ReadFile("testdata/mntr.txt") 18 testMntrNotInWhiteListData, _ = os.ReadFile("testdata/mntr_notinwhitelist.txt") 19 ) 20 21 func Test_testDataLoad(t *testing.T) { 22 assert.NotNil(t, testMntrData) 23 assert.NotNil(t, testMntrNotInWhiteListData) 24 } 25 26 func TestNew(t *testing.T) { 27 job := New() 28 29 assert.IsType(t, (*Zookeeper)(nil), job) 30 } 31 32 func TestZookeeper_Init(t *testing.T) { 33 job := New() 34 35 assert.True(t, job.Init()) 36 assert.NotNil(t, job.fetcher) 37 } 38 39 func TestZookeeper_InitErrorOnCreatingTLSConfig(t *testing.T) { 40 job := New() 41 job.UseTLS = true 42 job.TLSConfig.TLSCA = "testdata/tls" 43 44 assert.False(t, job.Init()) 45 } 46 47 func TestZookeeper_Check(t *testing.T) { 48 job := New() 49 require.True(t, job.Init()) 50 job.fetcher = &mockZookeeperFetcher{data: testMntrData} 51 52 assert.True(t, job.Check()) 53 } 54 55 func TestZookeeper_CheckErrorOnFetch(t *testing.T) { 56 job := New() 57 require.True(t, job.Init()) 58 job.fetcher = &mockZookeeperFetcher{err: true} 59 60 assert.False(t, job.Check()) 61 } 62 63 func TestZookeeper_Charts(t *testing.T) { 64 assert.NotNil(t, New().Charts()) 65 } 66 67 func TestZookeeper_Cleanup(t *testing.T) { 68 New().Cleanup() 69 } 70 71 func TestZookeeper_Collect(t *testing.T) { 72 job := New() 73 require.True(t, job.Init()) 74 job.fetcher = &mockZookeeperFetcher{data: testMntrData} 75 76 expected := map[string]int64{ 77 "approximate_data_size": 44, 78 "avg_latency": 100, 79 "ephemerals_count": 0, 80 "max_file_descriptor_count": 1048576, 81 "max_latency": 100, 82 "min_latency": 100, 83 "num_alive_connections": 1, 84 "open_file_descriptor_count": 63, 85 "outstanding_requests": 0, 86 "packets_received": 92, 87 "packets_sent": 182, 88 "server_state": 4, 89 "watch_count": 0, 90 "znode_count": 5, 91 } 92 93 collected := job.Collect() 94 95 assert.Equal(t, expected, collected) 96 ensureCollectedHasAllChartsDimsVarsIDs(t, job, collected) 97 } 98 99 func TestZookeeper_CollectMntrNotInWhiteList(t *testing.T) { 100 job := New() 101 require.True(t, job.Init()) 102 job.fetcher = &mockZookeeperFetcher{data: testMntrNotInWhiteListData} 103 104 assert.Nil(t, job.Collect()) 105 } 106 107 func TestZookeeper_CollectMntrEmptyResponse(t *testing.T) { 108 job := New() 109 require.True(t, job.Init()) 110 job.fetcher = &mockZookeeperFetcher{} 111 112 assert.Nil(t, job.Collect()) 113 } 114 115 func TestZookeeper_CollectMntrInvalidData(t *testing.T) { 116 job := New() 117 require.True(t, job.Init()) 118 job.fetcher = &mockZookeeperFetcher{data: []byte("hello \nand good buy\n")} 119 120 assert.Nil(t, job.Collect()) 121 } 122 123 func TestZookeeper_CollectMntrReceiveError(t *testing.T) { 124 job := New() 125 require.True(t, job.Init()) 126 job.fetcher = &mockZookeeperFetcher{err: true} 127 128 assert.Nil(t, job.Collect()) 129 } 130 131 func ensureCollectedHasAllChartsDimsVarsIDs(t *testing.T, zk *Zookeeper, collected map[string]int64) { 132 for _, chart := range *zk.Charts() { 133 if chart.Obsolete { 134 continue 135 } 136 for _, dim := range chart.Dims { 137 _, ok := collected[dim.ID] 138 assert.Truef(t, ok, "collected metrics has no data for dim '%s' chart '%s'", dim.ID, chart.ID) 139 } 140 for _, v := range chart.Vars { 141 _, ok := collected[v.ID] 142 assert.Truef(t, ok, "collected metrics has no data for var '%s' chart '%s'", v.ID, chart.ID) 143 } 144 } 145 } 146 147 type mockZookeeperFetcher struct { 148 data []byte 149 err bool 150 } 151 152 func (m mockZookeeperFetcher) fetch(_ string) ([]string, error) { 153 if m.err { 154 return nil, errors.New("mock fetch error") 155 } 156 157 var lines []string 158 s := bufio.NewScanner(bytes.NewReader(m.data)) 159 for s.Scan() { 160 if !isZKLine(s.Bytes()) || isMntrLineOK(s.Bytes()) { 161 lines = append(lines, s.Text()) 162 } 163 } 164 return lines, nil 165 }