Skip to content

Commit 78e8f13

Browse files
authored
fix: improve some flaky tests (#1801)
1 parent 950cee0 commit 78e8f13

File tree

1 file changed

+80
-40
lines changed

1 file changed

+80
-40
lines changed

test/abstract_client.ts

+80-40
Original file line numberDiff line numberDiff line change
@@ -3106,35 +3106,53 @@ export default function abstractTest(server, config, ports) {
31063106
timeout: 4000,
31073107
},
31083108
function _test(t, done) {
3109-
const client = connect({ reconnectPeriod: 200 })
3109+
t.after(() => {
3110+
// close client if not closed
3111+
if (client) {
3112+
client.end(true)
3113+
}
3114+
})
3115+
let client = connect({ reconnectPeriod: 100 })
31103116
let serverPublished = false
31113117
let clientCalledBack = false
31123118

3119+
// client is connected the first time
31133120
server.once('client', (serverClient) => {
3114-
serverClient.on('connect', () => {
3121+
// destroy the stream before the publish is acknowledged
3122+
serverClient.once('connect', () => {
31153123
setImmediate(() => {
31163124
serverClient.stream.destroy()
31173125
})
31183126
})
31193127

3128+
// after 100ms the client should reconnect
31203129
server.once('client', (serverClientNew) => {
31213130
serverClientNew.on('publish', () => {
31223131
serverPublished = true
3123-
check()
31243132
})
31253133
})
31263134
})
31273135

3136+
// ensure that on first reconnect the publish is still not acknowledged
3137+
client.once('reconnect', () => {
3138+
// client callback should not be triggered on first connection
3139+
assert.isFalse(clientCalledBack)
3140+
})
3141+
31283142
client.publish('hello', 'world', { qos: 1 }, () => {
31293143
clientCalledBack = true
3130-
check()
31313144
})
31323145

3133-
function check() {
3134-
if (serverPublished && clientCalledBack) {
3135-
client.end(true, done)
3146+
client.on('packetreceive', (packet) => {
3147+
if (packet.cmd === 'puback') {
3148+
assert.isTrue(serverPublished)
3149+
setImmediate(() => {
3150+
assert.isTrue(clientCalledBack)
3151+
client.end(true, done)
3152+
client = null
3153+
})
31363154
}
3137-
}
3155+
})
31383156
},
31393157
)
31403158

@@ -3143,7 +3161,7 @@ export default function abstractTest(server, config, ports) {
31433161
let serverPublished = false
31443162
let clientCalledBack = false
31453163
server.once('client', (serverClient) => {
3146-
serverClient.on('connect', () => {
3164+
serverClient.once('connect', () => {
31473165
setImmediate(() => {
31483166
serverClient.stream.destroy()
31493167
client.end(true, (err) => {
@@ -3164,42 +3182,65 @@ export default function abstractTest(server, config, ports) {
31643182
})
31653183
})
31663184

3167-
it('should resend in-flight QoS 2 publish messages from the client', function _test(t, done) {
3168-
const client = connect({ reconnectPeriod: 200 })
3169-
let serverPublished = false
3170-
let clientCalledBack = false
3185+
it(
3186+
'should resend in-flight QoS 2 publish messages from the client',
3187+
{
3188+
timeout: 4000,
3189+
},
3190+
function _test(t, done) {
3191+
t.after(() => {
3192+
// close client if not closed
3193+
if (client) {
3194+
client.end(true)
3195+
}
3196+
})
31713197

3172-
server.once('client', (serverClient) => {
3173-
// ignore errors
3174-
serverClient.on('error', () => {})
3175-
serverClient.on('publish', () => {
3176-
setImmediate(() => {
3177-
serverClient.stream.destroy()
3198+
let client = connect({ reconnectPeriod: 100 })
3199+
let serverPublished = false
3200+
let clientCalledBack = false
3201+
3202+
server.once('client', (serverClient) => {
3203+
// ignore errors
3204+
serverClient.on('error', () => {})
3205+
serverClient.on('publish', () => {
3206+
setImmediate(() => {
3207+
serverClient.stream.destroy()
3208+
})
31783209
})
3179-
})
31803210

3181-
server.once('client', (serverClientNew) => {
3182-
serverClientNew.on('pubrel', () => {
3183-
serverPublished = true
3184-
check()
3211+
server.once('client', (serverClientNew) => {
3212+
serverClientNew.on('pubrel', () => {
3213+
serverPublished = true
3214+
})
31853215
})
31863216
})
3187-
})
31883217

3189-
client.publish('hello', 'world', { qos: 2 }, () => {
3190-
clientCalledBack = true
3191-
check()
3192-
})
3218+
client.publish('hello', 'world', { qos: 2 }, () => {
3219+
clientCalledBack = true
3220+
})
31933221

3194-
function check() {
3195-
if (serverPublished && clientCalledBack) {
3196-
client.end(true, done)
3197-
}
3198-
}
3199-
})
3222+
client.on('packetreceive', (packet) => {
3223+
if (packet.cmd === 'pubcomp') {
3224+
assert.isTrue(serverPublished)
3225+
setImmediate(() => {
3226+
assert.isTrue(clientCalledBack)
3227+
client.end(true, done)
3228+
client = null
3229+
})
3230+
}
3231+
})
3232+
},
3233+
)
32003234

32013235
it('should not resend in-flight QoS 1 removed publish messages from the client', function _test(t, done) {
3202-
const client = connect({ reconnectPeriod: 200 })
3236+
t.after(() => {
3237+
// close client if not closed
3238+
if (client) {
3239+
client.end(true)
3240+
}
3241+
})
3242+
3243+
let client = connect({ reconnectPeriod: 100 })
32033244
let clientCalledBack = false
32043245

32053246
server.once('client', (serverClient) => {
@@ -3211,8 +3252,7 @@ export default function abstractTest(server, config, ports) {
32113252

32123253
server.once('client', (serverClientNew) => {
32133254
serverClientNew.on('publish', () => {
3214-
fail()
3215-
done()
3255+
done(Error('should not have received publish'))
32163256
})
32173257
})
32183258
})
@@ -3234,6 +3274,7 @@ export default function abstractTest(server, config, ports) {
32343274
assert.isTrue(clientCalledBack)
32353275
client.end(true, (err) => {
32363276
done(err)
3277+
client = null
32373278
})
32383279
})
32393280

@@ -3250,8 +3291,7 @@ export default function abstractTest(server, config, ports) {
32503291

32513292
server.once('client', (serverClientNew) => {
32523293
serverClientNew.on('publish', () => {
3253-
fail()
3254-
done()
3294+
done(Error('should not have received publish'))
32553295
})
32563296
})
32573297
})

0 commit comments

Comments
 (0)