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  }