Skip to content

Commit 938a2f5

Browse files
Merge pull request #13968 from rabbitmq/mergify/bp/v4.1.x/pr-13950
Selenium: Verify consumer state when using SAC (backport #13950)
2 parents 5d2a54d + ce3c5b9 commit 938a2f5

File tree

14 files changed

+513
-41
lines changed

14 files changed

+513
-41
lines changed

deps/rabbit/src/rabbit_fifo.erl

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1529,9 +1529,12 @@ activate_next_consumer(#?STATE{consumers = Cons0,
15291529
State = State0#?STATE{consumers = Cons,
15301530
service_queue = ServiceQueue1,
15311531
waiting_consumers = Waiting},
1532+
Effects1 = consumer_update_active_effects(State, Active,
1533+
false, waiting,
1534+
Effects0),
15321535
Effects = consumer_update_active_effects(State, Consumer,
15331536
true, single_active,
1534-
Effects0),
1537+
Effects1),
15351538
{State, Effects};
15361539
{{ActiveCKey, ?CONSUMER_PRIORITY(ActivePriority) = Active},
15371540
{_NextCKey, ?CONSUMER_PRIORITY(WaitingPriority)}}
@@ -1829,8 +1832,22 @@ complete_and_checkout(#{} = Meta, MsgIds, ConsumerKey,
18291832
Effects0, State0) ->
18301833
State1 = complete(Meta, ConsumerKey, MsgIds, Con0, State0),
18311834
%% a completion could have removed the active/quiescing consumer
1832-
{State2, Effects1} = activate_next_consumer(State1, Effects0),
1833-
checkout(Meta, State0, State2, Effects1).
1835+
Effects1 = add_active_effect(Con0, State1, Effects0),
1836+
{State2, Effects2} = activate_next_consumer(State1, Effects1),
1837+
checkout(Meta, State0, State2, Effects2).
1838+
1839+
add_active_effect(#consumer{status = quiescing} = Consumer,
1840+
#?STATE{cfg = #cfg{consumer_strategy = single_active},
1841+
consumers = Consumers} = State,
1842+
Effects) ->
1843+
case active_consumer(Consumers) of
1844+
undefined ->
1845+
consumer_update_active_effects(State, Consumer, false, waiting, Effects);
1846+
_ ->
1847+
Effects
1848+
end;
1849+
add_active_effect(_, _, Effects) ->
1850+
Effects.
18341851

18351852
cancel_consumer_effects(ConsumerId,
18361853
#?STATE{cfg = #cfg{resource = QName}},

deps/rabbitmq_management/priv/www/js/tmpl/consumers.ejs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<% if (consumers.length > 0) { %>
2-
<table class="list">
2+
<table class="list" id="consumers">
33
<thead>
44
<tr>
55
<% if (mode == 'queue') { %>

deps/rabbitmq_management/priv/www/js/tmpl/queue.ejs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,10 @@
1111
<% } %>
1212

1313
<h3>Details</h3>
14-
<table class="facts facts-l">
14+
<table class="facts facts-l" id="details-queue-table">
1515
<tr>
1616
<th>Features</th>
17-
<td><%= fmt_features(queue) %></td>
17+
<td id="details-queue-features"><%= fmt_features(queue) %></td>
1818
</tr>
1919
<% if(!disable_stats) { %>
2020
<tr>
@@ -76,20 +76,20 @@
7676
</table>
7777

7878
<% if(!disable_stats) { %>
79-
<table class="facts facts-l">
79+
<table class="facts facts-l" id="details-queue-stats-table">
8080
<tr>
8181
<th>State</th>
8282
<td><%= fmt_object_state(queue) %></td>
8383
</tr>
8484
<% if(queue.consumers) { %>
8585
<tr>
8686
<th>Consumers</th>
87-
<td><%= fmt_string(queue.consumers) %></td>
87+
<td id="consumers"><%= fmt_string(queue.consumers) %></td>
8888
</tr>
8989
<% } else if(queue.hasOwnProperty('consumer_details')) { %>
9090
<tr>
9191
<th>Consumers</th>
92-
<td><%= fmt_string(queue.consumer_details.length) %></td>
92+
<td id="consumers"><%= fmt_string(queue.consumer_details.length) %></td>
9393
</tr>
9494
<% } %>
9595
<% if (is_classic(queue)) { %>
@@ -277,7 +277,7 @@
277277
<% } %>
278278

279279
<% if(!disable_stats) { %>
280-
<div class="section-hidden">
280+
<div class="section-hidden" id="queue-consumers-section">
281281
<h2 class="updatable">Consumers (<%=(queue.consumer_details.length)%>) </h2>
282282
<div class="hider updatable">
283283
<%= format('consumers', {'mode': 'queue', 'consumers': queue.consumer_details}) %>
Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
<table class="facts facts-l" id="details-queue-stats-table">
2+
<tbody>
3+
<tr>
4+
<th>State</th>
5+
<td><%= fmt_object_state(queue) %></td>
6+
</tr>
7+
<% if(queue.consumers) { %>
8+
<tr>
9+
<th>Consumers</th>
10+
<td id="consumers"><%= fmt_string(queue.consumers) %></td>
11+
</tr>
12+
<% } else if(queue.hasOwnProperty('consumer_details')) { %>
13+
<tr>
14+
<th>Consumers</th>
15+
<td id="consumers"><%= fmt_string(queue.consumer_details.length) %></td>
16+
</tr>
17+
<% } %>
18+
<% if(queue.hasOwnProperty('publishers')) { %>
19+
<tr>
20+
<th>Publishers</th>
21+
<td id="publishers"><%= fmt_string(queue.publishers) %></td>
22+
</tr>
23+
<% } %>
24+
<tr>
25+
<th>Open files</th>
26+
<td><%= fmt_table_short(queue.open_files) %></td>
27+
</tr>
28+
<% if (queue.hasOwnProperty('delivery_limit')) { %>
29+
<tr>
30+
<th>Delivery limit <span class="help" id="queue-delivery-limit"></th>
31+
<td><%= fmt_string(queue.delivery_limit) %></td>
32+
</tr>
33+
<% } %>
34+
</tbody>
35+
</table>
36+
37+
<table class="facts">
38+
<tr>
39+
<td></td>
40+
<th class="horizontal">Total</th>
41+
<th class="horizontal">Ready</th>
42+
<th class="horizontal">Unacked</th>
43+
<th class="horizontal">High priority</th>
44+
<th class="horizontal">Normal priority</th>
45+
<th class="horizontal">Returned</th>
46+
<th class="horizontal">Dead-lettered
47+
<span class="help" id="queue-dead-lettered"></span>
48+
</th>
49+
</tr>
50+
<tr>
51+
<th>
52+
Messages
53+
<span class="help" id="queue-messages"></span>
54+
</th>
55+
<td class="r">
56+
<%= fmt_num_thousands(queue.messages) %>
57+
</td>
58+
<td class="r">
59+
<%= fmt_num_thousands(queue.messages_ready) %>
60+
</td>
61+
<td class="r">
62+
<%= fmt_num_thousands(queue.messages_unacknowledged) %>
63+
</td>
64+
<td class="r">
65+
<%= fmt_num_thousands(queue.messages_ready_high) %>
66+
</td>
67+
<td class="r">
68+
<%= fmt_num_thousands(queue.messages_ready_normal) %>
69+
</td>
70+
<td class="r">
71+
<%= fmt_num_thousands(queue.messages_ready_returned) %>
72+
</td>
73+
<td class="r">
74+
<%= fmt_num_thousands(queue.messages_dlx) %>
75+
</td>
76+
</tr>
77+
<tr>
78+
<th>
79+
Message body bytes
80+
<span class="help" id="queue-message-body-bytes"></span>
81+
</th>
82+
<td class="r">
83+
<%= fmt_bytes(queue.message_bytes) %>
84+
</td>
85+
<td class="r">
86+
<%= fmt_bytes(queue.message_bytes_ready) %>
87+
</td>
88+
<td class="r">
89+
<%= fmt_bytes(queue.message_bytes_unacknowledged) %>
90+
</td>
91+
<td class="r">
92+
</td>
93+
<td class="r">
94+
</td>
95+
<td class="r">
96+
</td>
97+
<td class="r">
98+
<%= fmt_bytes(queue.message_bytes_dlx) %>
99+
</td>
100+
</tr>
101+
<tr>
102+
<th>
103+
Process memory
104+
<span class="help" id="queue-process-memory"></span>
105+
</th>
106+
<td class="r"><%= fmt_bytes(queue.memory) %></td>
107+
</tr>
108+
</table>

selenium/Dockerfile

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
# syntax=docker/dockerfile:1
2-
FROM atools/jdk-maven-node:mvn3-jdk11-node16 as base
1+
FROM node:18 as base
32

43
WORKDIR /code
54

selenium/package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@
2222
"proxy": "^1.0.2",
2323
"rhea": "^3.0.3",
2424
"selenium-webdriver": "^4.26.0",
25-
"xmlhttprequest": "^1.8.0"
25+
"xmlhttprequest": "^1.8.0",
26+
"amqplib": "0.8.0"
2627
},
2728
"devDependencies": {
2829
"chai": "^4.3.6",

selenium/test/amqp.js

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ var connectionOptions = getConnectionOptions()
77

88
function getAmqpConnectionOptions() {
99
return {
10+
'scheme': process.env.RABBITMQ_AMQP_SCHEME || 'amqp',
1011
'host': process.env.RABBITMQ_HOSTNAME || 'rabbitmq',
1112
'port': process.env.RABBITMQ_AMQP_PORT || 5672,
1213
'username' : process.env.RABBITMQ_AMQP_USERNAME || 'guest',
@@ -39,21 +40,28 @@ function getConnectionOptions() {
3940
}
4041
}
4142
module.exports = {
42-
43-
open: () => {
43+
getAmqpConnectionOptions: () => { return connectionOptions },
44+
getAmqpUrl: () => {
45+
return connectionOptions.scheme + '://' +
46+
connectionOptions.username + ":" + connectionOptions.password + "@" +
47+
connectionOptions.host + ":" + connectionOptions.port
48+
},
49+
open: (queueName = "my-queue") => {
4450
let promise = new Promise((resolve, reject) => {
4551
container.on('connection_open', function(context) {
4652
resolve()
4753
})
4854
})
55+
console.log("Opening amqp connection using " + JSON.stringify(connectionOptions))
56+
4957
let connection = container.connect(connectionOptions)
5058
let receiver = connection.open_receiver({
51-
source: 'my-queue',
59+
source: queueName,
5260
target: 'receiver-target',
5361
name: 'receiver-link'
5462
})
5563
let sender = connection.open_sender({
56-
target: 'my-queue',
64+
target: queueName,
5765
source: 'sender-source',
5866
name: 'sender-link'
5967
})
@@ -64,6 +72,13 @@ module.exports = {
6472
'sender' : sender
6573
}
6674
},
75+
openReceiver: (handler, queueName = "my-queue") => {
76+
return handler.connection.open_receiver({
77+
source: queueName,
78+
target: 'receiver-target',
79+
name: 'receiver-link'
80+
})
81+
},
6782
close: (connection) => {
6883
if (connection != null) {
6984
connection.close()

selenium/test/exchanges/management.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@ describe('Exchange management', function () {
3030
if (!await overview.isLoaded()) {
3131
throw new Error('Failed to login')
3232
}
33-
overview.clickOnExchangesTab()
33+
await overview.selectRefreshOption("Do not refresh")
34+
await overview.clickOnExchangesTab()
3435
})
3536

3637
it('display summary of exchanges', async function () {

selenium/test/mgt-api.js

Lines changed: 9 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -114,18 +114,17 @@ module.exports = {
114114
throw new Error(req.responseText)
115115
}
116116
},
117-
createVhost: (url, name, description = "", tags = []) => {
117+
createVhost: (url, authorization, name, description = "", tags = []) => {
118118
let vhost = {
119119
"description": description,
120120
"tags": tags
121121
}
122122
log("Create vhost " + JSON.stringify(vhost)
123123
+ " with name " + name + " on " + url)
124124
const req = new XMLHttpRequest()
125-
let base64Credentials = btoa('administrator-only' + ":" + 'guest')
126125
let finalUrl = url + "/api/vhosts/" + encodeURIComponent(name)
127126
req.open('PUT', finalUrl, false)
128-
req.setRequestHeader("Authorization", "Basic " + base64Credentials)
127+
req.setRequestHeader("Authorization", authorization)
129128
req.setRequestHeader('Content-Type', 'application/json')
130129

131130
req.send(JSON.stringify(vhost))
@@ -158,13 +157,12 @@ module.exports = {
158157
throw new Error(req.responseText)
159158
}
160159
},
161-
deleteVhost: (url, vhost) => {
160+
deleteVhost: (url, authorization, vhost) => {
162161
log("Deleting vhost " + vhost)
163162
const req = new XMLHttpRequest()
164-
let base64Credentials = btoa('administrator-only' + ":" + 'guest')
165163
let finalUrl = url + "/api/vhosts/" + encodeURIComponent(vhost)
166164
req.open('DELETE', finalUrl, false)
167-
req.setRequestHeader("Authorization", "Basic " + base64Credentials)
165+
req.setRequestHeader("Authorization", authorization)
168166

169167
req.send()
170168
if (req.status == 200 || req.status == 204) {
@@ -194,21 +192,18 @@ module.exports = {
194192
throw new Error(req.responseText)
195193
}
196194
},
197-
createQueue: (url, name, vhost, queueType = "quorum") => {
195+
createQueue: (url, authorization, vhost, name, arguments = {}) => {
198196
log("Create queue " + JSON.stringify(name)
199197
+ " in vhost " + vhost + " on " + url)
200198
const req = new XMLHttpRequest()
201-
let base64Credentials = btoa('administrator-only' + ":" + 'guest')
202199
let finalUrl = url + "/api/queues/" + encodeURIComponent(vhost) + "/"
203200
+ encodeURIComponent(name)
204201
req.open('PUT', finalUrl, false)
205-
req.setRequestHeader("Authorization", "Basic " + base64Credentials)
202+
req.setRequestHeader("Authorization", authorization)
206203
req.setRequestHeader('Content-Type', 'application/json')
207204
let payload = {
208205
"durable": true,
209-
"arguments":{
210-
"x-queue-type" : queueType
211-
}
206+
"arguments": arguments
212207
}
213208
req.send(JSON.stringify(payload))
214209
if (req.status == 200 || req.status == 204 || req.status == 201) {
@@ -219,14 +214,13 @@ module.exports = {
219214
throw new Error(req.responseText)
220215
}
221216
},
222-
deleteQueue: (url, name, vhost) => {
217+
deleteQueue: (url, authorization, vhost, name) => {
223218
log("Deleting queue " + name + " on vhost " + vhost)
224219
const req = new XMLHttpRequest()
225-
let base64Credentials = btoa('administrator-only' + ":" + 'guest')
226220
let finalUrl = url + "/api/queues/" + encodeURIComponent(vhost) + "/"
227221
+ encodeURIComponent(name)
228222
req.open('DELETE', finalUrl, false)
229-
req.setRequestHeader("Authorization", "Basic " + base64Credentials)
223+
req.setRequestHeader("Authorization", authorization)
230224

231225
req.send()
232226
if (req.status == 200 || req.status == 204) {

0 commit comments

Comments
 (0)