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 queuesAndStreamsPage
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 listed' , 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+ } )
0 commit comments