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