Skip to content

Commit 4ef4f18

Browse files
Fix issue around rendering a mqtt qos0 queue
1 parent 8806e56 commit 4ef4f18

File tree

4 files changed

+166
-2
lines changed

4 files changed

+166
-2
lines changed

deps/rabbitmq_management/priv/www/js/main.js

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1762,7 +1762,14 @@ function is_internal(queue) {
17621762
}
17631763

17641764
function get_queue_type (queue) {
1765-
return queue.type;
1765+
switch(queue.type) {
1766+
case "classic":
1767+
case "quorum":
1768+
case "stream":
1769+
return queue.type;
1770+
default:
1771+
return "default"
1772+
}
17661773
}
17671774

17681775
function is_quorum(queue) {
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
[rabbitmq_management,rabbitmq_stream,rabbitmq_stream_common,rabbitmq_stream_management,
2-
rabbitmq_top,rabbitmq_tracing,rabbitmq_federation_management,rabbitmq_shovel_management].
2+
rabbitmq_top,rabbitmq_tracing,rabbitmq_federation_management,rabbitmq_shovel_management,
3+
rabbitmq_mqtt].
Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,148 @@
1+
const { By, Key, until, Builder } = require('selenium-webdriver')
2+
require('chromedriver')
3+
const assert = require('assert')
4+
const { buildDriver, goToHome, goToQueue, captureScreensFor, teardown, doUntil, findTableRow } = require('../utils')
5+
const { createQueue, deleteQueue, getManagementUrl, basicAuthorization } = require('../mgt-api')
6+
const mqtt = require('mqtt')
7+
8+
const LoginPage = require('../pageobjects/LoginPage')
9+
const OverviewPage = require('../pageobjects/OverviewPage')
10+
const QueuesAndStreamsPage = require('../pageobjects/QueuesAndStreamsPage')
11+
const QueuePage = require('../pageobjects/QueuePage')
12+
const ConnectionsPage = require('../pageobjects/ConnectionsPage');
13+
14+
15+
describe('Given a mqtt 5.0 connection with a qos 0 subscription with zero sessionExpiryInterval', function () {
16+
let login
17+
let queuesAndStreams
18+
let queuePage
19+
let overview
20+
let captureScreen
21+
let queueName
22+
let mqttOptions
23+
24+
let mqttProtocol = process.env.MQTT_PROTOCOL || 'mqtt'
25+
let usemtls = process.env.MQTT_USE_MTLS || false
26+
let rabbit = process.env.RABBITMQ_HOSTNAME || 'localhost'
27+
let mqttUrl = process.env.RABBITMQ_MQTT_URL || "mqtt://" + rabbit + ":1883"
28+
let username = process.env.RABBITMQ_AMQP_USERNAME || 'management'
29+
let password = process.env.RABBITMQ_AMQP_PASSWORD || 'guest'
30+
let client_id = process.env.RABBITMQ_AMQP_USERNAME || 'selenium-client'
31+
let mqttClient
32+
33+
before(async function () {
34+
driver = buildDriver()
35+
await goToHome(driver)
36+
login = new LoginPage(driver)
37+
overview = new OverviewPage(driver)
38+
queuePage = new QueuePage(driver)
39+
connectionsPage = new ConnectionsPage(driver)
40+
queuesAndStreamsPage = new QueuesAndStreamsPage(driver)
41+
captureScreen = captureScreensFor(driver, __filename)
42+
43+
await login.login('management', 'guest')
44+
if (!await overview.isLoaded()) {
45+
throw new Error('Failed to login')
46+
}
47+
//await overview.selectRefreshOption("Do not refresh")
48+
49+
queueName = "test_" + Math.floor(Math.random() * 1000)
50+
createQueue(getManagementUrl(), basicAuthorization("management", "guest"),
51+
"/", queueName, {
52+
"x-queue-type": "quorum"
53+
})
54+
55+
mqttOptions = {
56+
clientId: client_id,
57+
protocolId: 'MQTT',
58+
protocol: mqttProtocol,
59+
protocolVersion: 5,
60+
keepalive: 10000,
61+
clean: false,
62+
reconnectPeriod: '1000',
63+
properties: {
64+
sessionExpiryInterval: 0
65+
}
66+
}
67+
if (mqttProtocol == 'mqtts') {
68+
mqttOptions["ca"] = [fs.readFileSync(process.env.RABBITMQ_CERTS + "/ca_rabbitmq_certificate.pem")]
69+
}
70+
if (usemtls) {
71+
mqttOptions["cert"] = fs.readFileSync(process.env.RABBITMQ_CERTS + "/client_rabbitmq_certificate.pem")
72+
mqttOptions["key"] = fs.readFileSync(process.env.RABBITMQ_CERTS + "/client_rabbitmq_key.pem")
73+
} else {
74+
mqttOptions["username"] = username
75+
mqttOptions["password"] = password
76+
}
77+
78+
mqttClient = mqtt.connect(mqttUrl, mqttOptions)
79+
let subscribed = new Promise((resolve, reject) => {
80+
mqttClient.on('error', function(err) {
81+
reject(err)
82+
assert.fail("Mqtt connection failed due to " + err)
83+
}),
84+
mqttClient.on('connect', function(err) {
85+
mqttClient.subscribe(queueName, {qos:0}, function (err2) {
86+
if (!err2) {
87+
resolve("ok")
88+
}else {
89+
reject(err2)
90+
}
91+
})
92+
})
93+
})
94+
assert.equal("ok", await subscribed)
95+
96+
})
97+
98+
it('should be an mqtt connection', async function () {
99+
await overview.clickOnConnectionsTab()
100+
101+
let table = await doUntil(async function() {
102+
return connectionsPage.getConnectionsTable()
103+
}, function(table) {
104+
return table.length > 0
105+
}, 6000)
106+
assert.equal(table[0][5], "MQTT 5-0")
107+
108+
})
109+
110+
it('should be an mqtt qos0 queue listed', async function () {
111+
await overview.clickOnQueuesTab()
112+
113+
await doUntil(function() {
114+
return queuesAndStreamsPage.getQueuesTable()
115+
}, function(table) {
116+
return findTableRow(table, function(row) {
117+
return row[2] === 'rabbit_mqtt_qos0_queue'
118+
})
119+
})
120+
121+
})
122+
123+
it('can view mqtt qos0 queue', async function () {
124+
await overview.clickOnQueuesTab()
125+
126+
let table = await doUntil(function() {
127+
return queuesAndStreamsPage.getQueuesTable()
128+
}, function(t) {
129+
return findTableRow(t, function(row) {
130+
return row[2] === 'rabbit_mqtt_qos0_queue'
131+
})
132+
})
133+
let mqttQueueName = findTableRow(table, function(row) {
134+
return row[2] === 'rabbit_mqtt_qos0_queue'
135+
})[1]
136+
137+
await goToQueue(driver, "/", mqttQueueName)
138+
await queuePage.isLoaded()
139+
140+
})
141+
142+
after(async function () {
143+
await teardown(driver, this, captureScreen)
144+
if (mqttClient) mqttClient.end()
145+
deleteQueue(getManagementUrl(), basicAuthorization("management", "guest"),
146+
"/", queueName)
147+
})
148+
})

selenium/test/utils.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,10 +126,18 @@ module.exports = {
126126
return d.driver.get(d.baseUrl + '#/login?access_token=' + token)
127127
},
128128

129+
goToConnections: (d) => {
130+
return d.driver.get(d.baseUrl + '#/connections')
131+
},
132+
129133
goToExchanges: (d) => {
130134
return d.driver.get(d.baseUrl + '#/exchanges')
131135
},
132136

137+
goToQueues: (d) => {
138+
return d.driver.get(d.baseUrl + '#/queues')
139+
},
140+
133141
goToQueue(d, vhost, queue) {
134142
return d.driver.get(d.baseUrl + '#/queues/' + encodeURIComponent(vhost) + '/' + encodeURIComponent(queue))
135143
},

0 commit comments

Comments
 (0)