github.com/netdata/go.d.plugin@v0.58.1/modules/activemq/activemq_test.go (about) 1 // SPDX-License-Identifier: GPL-3.0-or-later 2 3 package activemq 4 5 import ( 6 "net/http" 7 "net/http/httptest" 8 "testing" 9 10 "github.com/netdata/go.d.plugin/pkg/web" 11 12 "github.com/netdata/go.d.plugin/agent/module" 13 "github.com/stretchr/testify/assert" 14 "github.com/stretchr/testify/require" 15 ) 16 17 var ( 18 queuesData = []string{ 19 `<queues> 20 <queue name="sandra"> 21 <stats size="1" consumerCount="1" enqueueCount="2" dequeueCount="1"/> 22 <feed> 23 <atom>queueBrowse/sandra?view=rss&feedType=atom_1.0</atom> 24 <rss>queueBrowse/sandra?view=rss&feedType=rss_2.0</rss> 25 </feed> 26 </queue> 27 <queue name="Test"> 28 <stats size="1" consumerCount="1" enqueueCount="2" dequeueCount="1"/> 29 <feed> 30 <atom>queueBrowse/Test?view=rss&feedType=atom_1.0</atom> 31 <rss>queueBrowse/Test?view=rss&feedType=rss_2.0</rss> 32 </feed> 33 </queue> 34 </queues>`, 35 `<queues> 36 <queue name="sandra"> 37 <stats size="2" consumerCount="2" enqueueCount="3" dequeueCount="2"/> 38 <feed> 39 <atom>queueBrowse/sandra?view=rss&feedType=atom_1.0</atom> 40 <rss>queueBrowse/sandra?view=rss&feedType=rss_2.0</rss> 41 </feed> 42 </queue> 43 <queue name="Test"> 44 <stats size="2" consumerCount="2" enqueueCount="3" dequeueCount="2"/> 45 <feed> 46 <atom>queueBrowse/Test?view=rss&feedType=atom_1.0</atom> 47 <rss>queueBrowse/Test?view=rss&feedType=rss_2.0</rss> 48 </feed> 49 </queue> 50 <queue name="Test2"> 51 <stats size="0" consumerCount="0" enqueueCount="0" dequeueCount="0"/> 52 <feed> 53 <atom>queueBrowse/Test?view=rss&feedType=atom_1.0</atom> 54 <rss>queueBrowse/Test?view=rss&feedType=rss_2.0</rss> 55 </feed> 56 </queue> 57 </queues>`, 58 `<queues> 59 <queue name="sandra"> 60 <stats size="3" consumerCount="3" enqueueCount="4" dequeueCount="3"/> 61 <feed> 62 <atom>queueBrowse/sandra?view=rss&feedType=atom_1.0</atom> 63 <rss>queueBrowse/sandra?view=rss&feedType=rss_2.0</rss> 64 </feed> 65 </queue> 66 <queue name="Test"> 67 <stats size="3" consumerCount="3" enqueueCount="4" dequeueCount="3"/> 68 <feed> 69 <atom>queueBrowse/Test?view=rss&feedType=atom_1.0</atom> 70 <rss>queueBrowse/Test?view=rss&feedType=rss_2.0</rss> 71 </feed> 72 </queue> 73 </queues>`, 74 } 75 76 topicsData = []string{ 77 `<topics> 78 <topic name="ActiveMQ.Advisory.MasterBroker "> 79 <stats size="0" consumerCount="0" enqueueCount="1" dequeueCount="0"/> 80 </topic> 81 <topic name="AAA "> 82 <stats size="1" consumerCount="1" enqueueCount="2" dequeueCount="1"/> 83 </topic> 84 <topic name="ActiveMQ.Advisory.Topic "> 85 <stats size="0" consumerCount="0" enqueueCount="1" dequeueCount="0"/> 86 </topic> 87 <topic name="ActiveMQ.Advisory.Queue "> 88 <stats size="0" consumerCount="0" enqueueCount="2" dequeueCount="0"/> 89 </topic> 90 <topic name="AAAA "> 91 <stats size="1" consumerCount="1" enqueueCount="2" dequeueCount="1"/> 92 </topic> 93 </topics>`, 94 `<topics> 95 <topic name="ActiveMQ.Advisory.MasterBroker "> 96 <stats size="0" consumerCount="0" enqueueCount="1" dequeueCount="0"/> 97 </topic> 98 <topic name="AAA "> 99 <stats size="2" consumerCount="2" enqueueCount="3" dequeueCount="2"/> 100 </topic> 101 <topic name="ActiveMQ.Advisory.Topic "> 102 <stats size="0" consumerCount="0" enqueueCount="1" dequeueCount="0"/> 103 </topic> 104 <topic name="ActiveMQ.Advisory.Queue "> 105 <stats size="0" consumerCount="0" enqueueCount="2" dequeueCount="0"/> 106 </topic> 107 <topic name="AAAA "> 108 <stats size="2" consumerCount="2" enqueueCount="3" dequeueCount="2"/> 109 </topic> 110 <topic name="BBB "> 111 <stats size="1" consumerCount="1" enqueueCount="2" dequeueCount="1"/> 112 </topic> 113 </topics>`, 114 `<topics> 115 <topic name="ActiveMQ.Advisory.MasterBroker "> 116 <stats size="0" consumerCount="0" enqueueCount="1" dequeueCount="0"/> 117 </topic> 118 <topic name="AAA "> 119 <stats size="3" consumerCount="3" enqueueCount="4" dequeueCount="3"/> 120 </topic> 121 <topic name="ActiveMQ.Advisory.Topic "> 122 <stats size="0" consumerCount="0" enqueueCount="1" dequeueCount="0"/> 123 </topic> 124 <topic name="ActiveMQ.Advisory.Queue "> 125 <stats size="0" consumerCount="0" enqueueCount="2" dequeueCount="0"/> 126 </topic> 127 <topic name="AAAA "> 128 <stats size="3" consumerCount="3" enqueueCount="4" dequeueCount="3"/> 129 </topic> 130 </topics>`, 131 } 132 ) 133 134 func TestNew(t *testing.T) { 135 job := New() 136 137 assert.Implements(t, (*module.Module)(nil), job) 138 assert.Equal(t, defaultURL, job.URL) 139 assert.Equal(t, defaultHTTPTimeout, job.Client.Timeout.Duration) 140 assert.Equal(t, defaultMaxQueues, job.MaxQueues) 141 assert.Equal(t, defaultMaxTopics, job.MaxTopics) 142 } 143 144 func TestActiveMQ_Init(t *testing.T) { 145 job := New() 146 147 // NG case 148 assert.False(t, job.Init()) 149 150 // OK case 151 job.Webadmin = "webadmin" 152 assert.True(t, job.Init()) 153 assert.NotNil(t, job.apiClient) 154 } 155 156 func TestActiveMQ_Check(t *testing.T) { 157 ts := httptest.NewServer( 158 http.HandlerFunc( 159 func(w http.ResponseWriter, r *http.Request) { 160 switch r.URL.Path { 161 case "/webadmin/xml/queues.jsp": 162 _, _ = w.Write([]byte(queuesData[0])) 163 case "/webadmin/xml/topics.jsp": 164 _, _ = w.Write([]byte(topicsData[0])) 165 } 166 })) 167 defer ts.Close() 168 169 job := New() 170 job.HTTP.Request = web.Request{URL: ts.URL} 171 job.Webadmin = "webadmin" 172 173 require.True(t, job.Init()) 174 require.True(t, job.Check()) 175 } 176 177 func TestActiveMQ_Charts(t *testing.T) { 178 assert.NotNil(t, New().Charts()) 179 } 180 181 func TestActiveMQ_Cleanup(t *testing.T) { 182 New().Cleanup() 183 } 184 185 func TestActiveMQ_Collect(t *testing.T) { 186 var collectNum int 187 getQueues := func() string { return queuesData[collectNum] } 188 getTopics := func() string { return topicsData[collectNum] } 189 190 ts := httptest.NewServer( 191 http.HandlerFunc( 192 func(w http.ResponseWriter, r *http.Request) { 193 switch r.URL.Path { 194 case "/webadmin/xml/queues.jsp": 195 _, _ = w.Write([]byte(getQueues())) 196 case "/webadmin/xml/topics.jsp": 197 _, _ = w.Write([]byte(getTopics())) 198 } 199 })) 200 defer ts.Close() 201 202 job := New() 203 job.HTTP.Request = web.Request{URL: ts.URL} 204 job.Webadmin = "webadmin" 205 206 require.True(t, job.Init()) 207 require.True(t, job.Check()) 208 209 cases := []struct { 210 expected map[string]int64 211 numQueues int 212 numTopics int 213 numCharts int 214 }{ 215 { 216 expected: map[string]int64{ 217 "queues_sandra_consumers": 1, 218 "queues_sandra_dequeued": 1, 219 "queues_Test_enqueued": 2, 220 "queues_Test_unprocessed": 1, 221 "topics_AAA_dequeued": 1, 222 "topics_AAAA_unprocessed": 1, 223 "queues_Test_dequeued": 1, 224 "topics_AAA_enqueued": 2, 225 "topics_AAA_unprocessed": 1, 226 "topics_AAAA_consumers": 1, 227 "topics_AAAA_dequeued": 1, 228 "queues_Test_consumers": 1, 229 "queues_sandra_enqueued": 2, 230 "queues_sandra_unprocessed": 1, 231 "topics_AAA_consumers": 1, 232 "topics_AAAA_enqueued": 2, 233 }, 234 numQueues: 2, 235 numTopics: 2, 236 numCharts: 12, 237 }, 238 { 239 expected: map[string]int64{ 240 "queues_sandra_enqueued": 3, 241 "queues_Test_enqueued": 3, 242 "queues_Test_unprocessed": 1, 243 "queues_Test2_dequeued": 0, 244 "topics_BBB_enqueued": 2, 245 "queues_sandra_dequeued": 2, 246 "queues_sandra_unprocessed": 1, 247 "queues_Test2_enqueued": 0, 248 "topics_AAAA_enqueued": 3, 249 "topics_AAAA_dequeued": 2, 250 "topics_BBB_unprocessed": 1, 251 "topics_AAA_dequeued": 2, 252 "topics_AAAA_unprocessed": 1, 253 "queues_Test_consumers": 2, 254 "queues_Test_dequeued": 2, 255 "queues_Test2_consumers": 0, 256 "queues_Test2_unprocessed": 0, 257 "topics_AAA_consumers": 2, 258 "topics_AAA_enqueued": 3, 259 "topics_BBB_dequeued": 1, 260 "queues_sandra_consumers": 2, 261 "topics_AAA_unprocessed": 1, 262 "topics_AAAA_consumers": 2, 263 "topics_BBB_consumers": 1, 264 }, 265 numQueues: 3, 266 numTopics: 3, 267 numCharts: 18, 268 }, 269 { 270 expected: map[string]int64{ 271 "queues_sandra_unprocessed": 1, 272 "queues_Test_unprocessed": 1, 273 "queues_sandra_consumers": 3, 274 "topics_AAAA_enqueued": 4, 275 "queues_sandra_dequeued": 3, 276 "queues_Test_consumers": 3, 277 "queues_Test_enqueued": 4, 278 "queues_Test_dequeued": 3, 279 "topics_AAA_consumers": 3, 280 "topics_AAA_unprocessed": 1, 281 "topics_AAAA_consumers": 3, 282 "topics_AAAA_unprocessed": 1, 283 "queues_sandra_enqueued": 4, 284 "topics_AAA_enqueued": 4, 285 "topics_AAA_dequeued": 3, 286 "topics_AAAA_dequeued": 3, 287 }, 288 numQueues: 2, 289 numTopics: 2, 290 numCharts: 18, 291 }, 292 } 293 294 for _, c := range cases { 295 require.Equal(t, c.expected, job.Collect()) 296 assert.Len(t, job.activeQueues, c.numQueues) 297 assert.Len(t, job.activeTopics, c.numTopics) 298 assert.Len(t, *job.charts, c.numCharts) 299 collectNum++ 300 } 301 } 302 303 func TestActiveMQ_404(t *testing.T) { 304 ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 305 w.WriteHeader(404) 306 })) 307 defer ts.Close() 308 309 job := New() 310 job.Webadmin = "webadmin" 311 job.HTTP.Request = web.Request{URL: ts.URL} 312 313 require.True(t, job.Init()) 314 assert.False(t, job.Check()) 315 } 316 317 func TestActiveMQ_InvalidData(t *testing.T) { 318 ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 319 _, _ = w.Write([]byte("hello and goodbye!")) 320 })) 321 defer ts.Close() 322 323 mod := New() 324 mod.Webadmin = "webadmin" 325 mod.HTTP.Request = web.Request{URL: ts.URL} 326 327 require.True(t, mod.Init()) 328 assert.False(t, mod.Check()) 329 }