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&amp;feedType=atom_1.0</atom>
    24  <rss>queueBrowse/sandra?view=rss&amp;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&amp;feedType=atom_1.0</atom>
    31  <rss>queueBrowse/Test?view=rss&amp;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&amp;feedType=atom_1.0</atom>
    40  <rss>queueBrowse/sandra?view=rss&amp;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&amp;feedType=atom_1.0</atom>
    47  <rss>queueBrowse/Test?view=rss&amp;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&amp;feedType=atom_1.0</atom>
    54  <rss>queueBrowse/Test?view=rss&amp;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&amp;feedType=atom_1.0</atom>
    63  <rss>queueBrowse/sandra?view=rss&amp;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&amp;feedType=atom_1.0</atom>
    70  <rss>queueBrowse/Test?view=rss&amp;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  }