github.com/netdata/go.d.plugin@v0.58.1/modules/rabbitmq/rabbitmq_test.go (about) 1 // SPDX-License-Identifier: GPL-3.0-or-later 2 3 package rabbitmq 4 5 import ( 6 "net/http" 7 "net/http/httptest" 8 "os" 9 "path/filepath" 10 "testing" 11 12 "github.com/stretchr/testify/assert" 13 "github.com/stretchr/testify/require" 14 15 "github.com/netdata/go.d.plugin/pkg/web" 16 ) 17 18 var ( 19 testOverviewStats, _ = os.ReadFile("testdata/v3.11.5/api-overview.json") 20 testNodeStats, _ = os.ReadFile("testdata/v3.11.5/api-nodes-node.json") 21 testVhostsStats, _ = os.ReadFile("testdata/v3.11.5/api-vhosts.json") 22 testQueuesStats, _ = os.ReadFile("testdata/v3.11.5/api-queues.json") 23 ) 24 25 func Test_testDataIsValid(t *testing.T) { 26 for name, data := range map[string][]byte{ 27 "testOverviewStats": testOverviewStats, 28 "testNodeStats": testNodeStats, 29 "testVhostsStats": testVhostsStats, 30 "testQueuesStats": testQueuesStats, 31 } { 32 require.NotNilf(t, data, name) 33 } 34 } 35 36 func TestRabbitMQ_Init(t *testing.T) { 37 tests := map[string]struct { 38 wantFail bool 39 config Config 40 }{ 41 "success with default": { 42 wantFail: false, 43 config: New().Config, 44 }, 45 "fail when URL not set": { 46 wantFail: true, 47 config: Config{ 48 HTTP: web.HTTP{ 49 Request: web.Request{URL: ""}, 50 }, 51 }, 52 }, 53 } 54 55 for name, test := range tests { 56 t.Run(name, func(t *testing.T) { 57 rabbit := New() 58 rabbit.Config = test.config 59 60 if test.wantFail { 61 assert.False(t, rabbit.Init()) 62 } else { 63 assert.True(t, rabbit.Init()) 64 } 65 }) 66 } 67 } 68 69 func TestRabbitMQ_Charts(t *testing.T) { 70 assert.NotNil(t, New().Charts()) 71 } 72 73 func TestRabbitMQ_Cleanup(t *testing.T) { 74 assert.NotPanics(t, New().Cleanup) 75 76 rabbit := New() 77 require.True(t, rabbit.Init()) 78 79 assert.NotPanics(t, rabbit.Cleanup) 80 } 81 82 func TestRabbitMQ_Check(t *testing.T) { 83 tests := map[string]struct { 84 prepare func() (*RabbitMQ, func()) 85 wantFail bool 86 }{ 87 "success on valid response": {wantFail: false, prepare: caseSuccessAllRequests}, 88 "fails on invalid response": {wantFail: true, prepare: caseInvalidDataResponse}, 89 "fails on 404": {wantFail: true, prepare: case404}, 90 } 91 92 for name, test := range tests { 93 t.Run(name, func(t *testing.T) { 94 rabbit, cleanup := test.prepare() 95 defer cleanup() 96 97 require.True(t, rabbit.Init()) 98 99 if test.wantFail { 100 assert.False(t, rabbit.Check()) 101 } else { 102 assert.True(t, rabbit.Check()) 103 } 104 }) 105 } 106 } 107 108 func TestRabbitMQ_Collect(t *testing.T) { 109 tests := map[string]struct { 110 prepare func() (*RabbitMQ, func()) 111 wantCollected map[string]int64 112 wantCharts int 113 }{ 114 "success on valid response": { 115 prepare: caseSuccessAllRequests, 116 wantCharts: len(baseCharts) + len(chartsTmplVhost)*3 + len(chartsTmplQueue)*4, 117 wantCollected: map[string]int64{ 118 "churn_rates_channel_closed": 0, 119 "churn_rates_channel_created": 0, 120 "churn_rates_connection_closed": 0, 121 "churn_rates_connection_created": 0, 122 "churn_rates_queue_created": 6, 123 "churn_rates_queue_declared": 6, 124 "churn_rates_queue_deleted": 2, 125 "disk_free": 189799186432, 126 "fd_total": 1048576, 127 "fd_used": 43, 128 "mem_limit": 6713820774, 129 "mem_used": 172720128, 130 "message_stats_ack": 0, 131 "message_stats_confirm": 0, 132 "message_stats_deliver": 0, 133 "message_stats_deliver_get": 0, 134 "message_stats_deliver_no_ack": 0, 135 "message_stats_get": 0, 136 "message_stats_get_no_ack": 0, 137 "message_stats_publish": 0, 138 "message_stats_publish_in": 0, 139 "message_stats_publish_out": 0, 140 "message_stats_redeliver": 0, 141 "message_stats_return_unroutable": 0, 142 "object_totals_channels": 0, 143 "object_totals_connections": 0, 144 "object_totals_consumers": 0, 145 "object_totals_exchanges": 21, 146 "object_totals_queues": 4, 147 "proc_available": 1048135, 148 "proc_total": 1048576, 149 "proc_used": 441, 150 "queue_MyFirstQueue_vhost_mySecondVhost_message_stats_ack": 0, 151 "queue_MyFirstQueue_vhost_mySecondVhost_message_stats_confirm": 0, 152 "queue_MyFirstQueue_vhost_mySecondVhost_message_stats_deliver": 0, 153 "queue_MyFirstQueue_vhost_mySecondVhost_message_stats_deliver_get": 0, 154 "queue_MyFirstQueue_vhost_mySecondVhost_message_stats_deliver_no_ack": 0, 155 "queue_MyFirstQueue_vhost_mySecondVhost_message_stats_get": 0, 156 "queue_MyFirstQueue_vhost_mySecondVhost_message_stats_get_no_ack": 0, 157 "queue_MyFirstQueue_vhost_mySecondVhost_message_stats_publish": 0, 158 "queue_MyFirstQueue_vhost_mySecondVhost_message_stats_publish_in": 0, 159 "queue_MyFirstQueue_vhost_mySecondVhost_message_stats_publish_out": 0, 160 "queue_MyFirstQueue_vhost_mySecondVhost_message_stats_redeliver": 0, 161 "queue_MyFirstQueue_vhost_mySecondVhost_message_stats_return_unroutable": 0, 162 "queue_MyFirstQueue_vhost_mySecondVhost_messages": 1, 163 "queue_MyFirstQueue_vhost_mySecondVhost_messages_paged_out": 1, 164 "queue_MyFirstQueue_vhost_mySecondVhost_messages_persistent": 1, 165 "queue_MyFirstQueue_vhost_mySecondVhost_messages_ready": 1, 166 "queue_MyFirstQueue_vhost_mySecondVhost_messages_unacknowledged": 1, 167 "queue_myFirstQueue_vhost_/_message_stats_ack": 0, 168 "queue_myFirstQueue_vhost_/_message_stats_confirm": 0, 169 "queue_myFirstQueue_vhost_/_message_stats_deliver": 0, 170 "queue_myFirstQueue_vhost_/_message_stats_deliver_get": 0, 171 "queue_myFirstQueue_vhost_/_message_stats_deliver_no_ack": 0, 172 "queue_myFirstQueue_vhost_/_message_stats_get": 0, 173 "queue_myFirstQueue_vhost_/_message_stats_get_no_ack": 0, 174 "queue_myFirstQueue_vhost_/_message_stats_publish": 0, 175 "queue_myFirstQueue_vhost_/_message_stats_publish_in": 0, 176 "queue_myFirstQueue_vhost_/_message_stats_publish_out": 0, 177 "queue_myFirstQueue_vhost_/_message_stats_redeliver": 0, 178 "queue_myFirstQueue_vhost_/_message_stats_return_unroutable": 0, 179 "queue_myFirstQueue_vhost_/_messages": 1, 180 "queue_myFirstQueue_vhost_/_messages_paged_out": 1, 181 "queue_myFirstQueue_vhost_/_messages_persistent": 1, 182 "queue_myFirstQueue_vhost_/_messages_ready": 1, 183 "queue_myFirstQueue_vhost_/_messages_unacknowledged": 1, 184 "queue_myFirstQueue_vhost_myFirstVhost_message_stats_ack": 0, 185 "queue_myFirstQueue_vhost_myFirstVhost_message_stats_confirm": 0, 186 "queue_myFirstQueue_vhost_myFirstVhost_message_stats_deliver": 0, 187 "queue_myFirstQueue_vhost_myFirstVhost_message_stats_deliver_get": 0, 188 "queue_myFirstQueue_vhost_myFirstVhost_message_stats_deliver_no_ack": 0, 189 "queue_myFirstQueue_vhost_myFirstVhost_message_stats_get": 0, 190 "queue_myFirstQueue_vhost_myFirstVhost_message_stats_get_no_ack": 0, 191 "queue_myFirstQueue_vhost_myFirstVhost_message_stats_publish": 0, 192 "queue_myFirstQueue_vhost_myFirstVhost_message_stats_publish_in": 0, 193 "queue_myFirstQueue_vhost_myFirstVhost_message_stats_publish_out": 0, 194 "queue_myFirstQueue_vhost_myFirstVhost_message_stats_redeliver": 0, 195 "queue_myFirstQueue_vhost_myFirstVhost_message_stats_return_unroutable": 0, 196 "queue_myFirstQueue_vhost_myFirstVhost_messages": 1, 197 "queue_myFirstQueue_vhost_myFirstVhost_messages_paged_out": 1, 198 "queue_myFirstQueue_vhost_myFirstVhost_messages_persistent": 1, 199 "queue_myFirstQueue_vhost_myFirstVhost_messages_ready": 1, 200 "queue_myFirstQueue_vhost_myFirstVhost_messages_unacknowledged": 1, 201 "queue_mySecondQueue_vhost_/_message_stats_ack": 0, 202 "queue_mySecondQueue_vhost_/_message_stats_confirm": 0, 203 "queue_mySecondQueue_vhost_/_message_stats_deliver": 0, 204 "queue_mySecondQueue_vhost_/_message_stats_deliver_get": 0, 205 "queue_mySecondQueue_vhost_/_message_stats_deliver_no_ack": 0, 206 "queue_mySecondQueue_vhost_/_message_stats_get": 0, 207 "queue_mySecondQueue_vhost_/_message_stats_get_no_ack": 0, 208 "queue_mySecondQueue_vhost_/_message_stats_publish": 0, 209 "queue_mySecondQueue_vhost_/_message_stats_publish_in": 0, 210 "queue_mySecondQueue_vhost_/_message_stats_publish_out": 0, 211 "queue_mySecondQueue_vhost_/_message_stats_redeliver": 0, 212 "queue_mySecondQueue_vhost_/_message_stats_return_unroutable": 0, 213 "queue_mySecondQueue_vhost_/_messages": 1, 214 "queue_mySecondQueue_vhost_/_messages_paged_out": 1, 215 "queue_mySecondQueue_vhost_/_messages_persistent": 1, 216 "queue_mySecondQueue_vhost_/_messages_ready": 1, 217 "queue_mySecondQueue_vhost_/_messages_unacknowledged": 1, 218 "queue_totals_messages": 0, 219 "queue_totals_messages_ready": 0, 220 "queue_totals_messages_unacknowledged": 0, 221 "run_queue": 1, 222 "sockets_total": 943629, 223 "sockets_used": 0, 224 "vhost_/_message_stats_ack": 0, 225 "vhost_/_message_stats_confirm": 0, 226 "vhost_/_message_stats_deliver": 0, 227 "vhost_/_message_stats_deliver_get": 0, 228 "vhost_/_message_stats_deliver_no_ack": 0, 229 "vhost_/_message_stats_get": 0, 230 "vhost_/_message_stats_get_no_ack": 0, 231 "vhost_/_message_stats_publish": 0, 232 "vhost_/_message_stats_publish_in": 0, 233 "vhost_/_message_stats_publish_out": 0, 234 "vhost_/_message_stats_redeliver": 0, 235 "vhost_/_message_stats_return_unroutable": 0, 236 "vhost_/_messages": 1, 237 "vhost_/_messages_ready": 1, 238 "vhost_/_messages_unacknowledged": 1, 239 "vhost_myFirstVhost_message_stats_ack": 0, 240 "vhost_myFirstVhost_message_stats_confirm": 0, 241 "vhost_myFirstVhost_message_stats_deliver": 0, 242 "vhost_myFirstVhost_message_stats_deliver_get": 0, 243 "vhost_myFirstVhost_message_stats_deliver_no_ack": 0, 244 "vhost_myFirstVhost_message_stats_get": 0, 245 "vhost_myFirstVhost_message_stats_get_no_ack": 0, 246 "vhost_myFirstVhost_message_stats_publish": 0, 247 "vhost_myFirstVhost_message_stats_publish_in": 0, 248 "vhost_myFirstVhost_message_stats_publish_out": 0, 249 "vhost_myFirstVhost_message_stats_redeliver": 0, 250 "vhost_myFirstVhost_message_stats_return_unroutable": 0, 251 "vhost_myFirstVhost_messages": 1, 252 "vhost_myFirstVhost_messages_ready": 1, 253 "vhost_myFirstVhost_messages_unacknowledged": 1, 254 "vhost_mySecondVhost_message_stats_ack": 0, 255 "vhost_mySecondVhost_message_stats_confirm": 0, 256 "vhost_mySecondVhost_message_stats_deliver": 0, 257 "vhost_mySecondVhost_message_stats_deliver_get": 0, 258 "vhost_mySecondVhost_message_stats_deliver_no_ack": 0, 259 "vhost_mySecondVhost_message_stats_get": 0, 260 "vhost_mySecondVhost_message_stats_get_no_ack": 0, 261 "vhost_mySecondVhost_message_stats_publish": 0, 262 "vhost_mySecondVhost_message_stats_publish_in": 0, 263 "vhost_mySecondVhost_message_stats_publish_out": 0, 264 "vhost_mySecondVhost_message_stats_redeliver": 0, 265 "vhost_mySecondVhost_message_stats_return_unroutable": 0, 266 "vhost_mySecondVhost_messages": 1, 267 "vhost_mySecondVhost_messages_ready": 1, 268 "vhost_mySecondVhost_messages_unacknowledged": 1, 269 }, 270 }, 271 "fails on invalid response": { 272 prepare: caseInvalidDataResponse, 273 wantCollected: nil, 274 wantCharts: len(baseCharts), 275 }, 276 "fails on 404": { 277 prepare: case404, 278 wantCollected: nil, 279 wantCharts: len(baseCharts), 280 }, 281 } 282 283 for name, test := range tests { 284 t.Run(name, func(t *testing.T) { 285 rabbit, cleanup := test.prepare() 286 defer cleanup() 287 288 require.True(t, rabbit.Init()) 289 290 mx := rabbit.Collect() 291 292 assert.Equal(t, test.wantCollected, mx) 293 assert.Equal(t, test.wantCharts, len(*rabbit.Charts())) 294 }) 295 } 296 } 297 298 func caseSuccessAllRequests() (*RabbitMQ, func()) { 299 srv := prepareRabbitMQEndpoint() 300 rabbit := New() 301 rabbit.URL = srv.URL 302 rabbit.CollectQueues = true 303 304 return rabbit, srv.Close 305 } 306 307 func caseInvalidDataResponse() (*RabbitMQ, func()) { 308 srv := httptest.NewServer(http.HandlerFunc( 309 func(w http.ResponseWriter, r *http.Request) { 310 _, _ = w.Write([]byte("hello and\n goodbye")) 311 })) 312 rabbit := New() 313 rabbit.URL = srv.URL 314 315 return rabbit, srv.Close 316 } 317 318 func case404() (*RabbitMQ, func()) { 319 srv := httptest.NewServer(http.HandlerFunc( 320 func(w http.ResponseWriter, r *http.Request) { 321 w.WriteHeader(http.StatusNotFound) 322 })) 323 rabbit := New() 324 rabbit.URL = srv.URL 325 326 return rabbit, srv.Close 327 } 328 329 func prepareRabbitMQEndpoint() *httptest.Server { 330 srv := httptest.NewServer( 331 http.HandlerFunc( 332 func(w http.ResponseWriter, r *http.Request) { 333 switch r.URL.Path { 334 case urlPathAPIOverview: 335 _, _ = w.Write(testOverviewStats) 336 case filepath.Join(urlPathAPINodes, "rabbit@localhost"): 337 _, _ = w.Write(testNodeStats) 338 case urlPathAPIVhosts: 339 _, _ = w.Write(testVhostsStats) 340 case urlPathAPIQueues: 341 _, _ = w.Write(testQueuesStats) 342 default: 343 w.WriteHeader(404) 344 } 345 })) 346 return srv 347 }