@@ -6,7 +6,7 @@ import sinon from 'sinon'
6
6
import fs from 'fs'
7
7
import levelStore from 'mqtt-level-store'
8
8
import Store from '../src/lib/store'
9
- import serverBuilder from './server_helpers_for_client_tests'
9
+ import serverBuilderFn from './server_helpers_for_client_tests'
10
10
import handlePubrel from '../src/lib/handlers/pubrel'
11
11
import TeardownHelper from './helpers/TeardownHelper'
12
12
import handle from '../src/lib/handlers/index'
@@ -50,16 +50,23 @@ const fakeTimersOptions = {
50
50
51
51
export default function abstractTest ( server , config , ports ) {
52
52
const version = config . protocolVersion || 4
53
+ const teardownHelper = new TeardownHelper ( )
53
54
54
55
function connect ( opts ?: IClientOptions | string ) {
55
56
if ( typeof opts === 'string' ) {
56
57
opts = { host : opts }
57
58
}
58
59
opts = { ...config , ...opts } as IClientOptions
59
- return mqtt . connect ( opts )
60
+ const instance = mqtt . connect ( opts )
61
+ teardownHelper . addClient ( instance )
62
+ return instance
60
63
}
61
64
62
- const teardownHelper = new TeardownHelper ( )
65
+ function serverBuilder ( ...args : Parameters < typeof serverBuilderFn > ) {
66
+ const instance = serverBuilderFn ( ...args )
67
+ teardownHelper . addServer ( instance )
68
+ return instance
69
+ }
63
70
64
71
async function beforeEachExec ( ) {
65
72
await teardownHelper . runAll ( )
@@ -74,6 +81,9 @@ export default function abstractTest(server, config, ports) {
74
81
after ( afterExec )
75
82
76
83
describe ( 'closing' , ( ) => {
84
+ beforeEach ( beforeEachExec )
85
+ after ( afterExec )
86
+
77
87
it ( 'should emit close if stream closes' , function _test ( t , done ) {
78
88
const client = connect ( )
79
89
@@ -254,14 +264,19 @@ export default function abstractTest(server, config, ports) {
254
264
255
265
it ( 'should emit end even on a failed connection' , function _test ( t , done ) {
256
266
const client = connect ( { host : 'this_hostname_should_not_exist' } )
267
+ let timeoutEmitted = false
257
268
258
269
const timeout = setTimeout ( ( ) => {
270
+ timeoutEmitted = true
259
271
done ( new Error ( 'Disconnected client has failed to emit end' ) )
260
272
} , 500 )
261
273
262
274
client . once ( 'end' , ( ) => {
263
- clearTimeout ( timeout )
264
- done ( )
275
+ // Prevent hanging test if `end` is not emitted before timeout
276
+ if ( ! timeoutEmitted ) {
277
+ clearTimeout ( timeout )
278
+ done ( )
279
+ }
265
280
} )
266
281
267
282
// after 200ms manually invoke client.end
@@ -298,6 +313,9 @@ export default function abstractTest(server, config, ports) {
298
313
} )
299
314
300
315
describe ( 'connecting' , ( ) => {
316
+ beforeEach ( beforeEachExec )
317
+ after ( afterExec )
318
+
301
319
it ( 'should connect to the broker' , function _test ( t , done ) {
302
320
const client = connect ( )
303
321
client . on ( 'error' , done )
@@ -326,7 +344,7 @@ export default function abstractTest(server, config, ports) {
326
344
server . once ( 'client' , ( serverClient ) => {
327
345
serverClient . once ( 'connect' , ( packet ) => {
328
346
assert . strictEqual ( packet . clean , true )
329
- done ( )
347
+ client . end ( ( err ) => done ( err ) )
330
348
} )
331
349
} )
332
350
} )
@@ -361,17 +379,24 @@ export default function abstractTest(server, config, ports) {
361
379
} )
362
380
363
381
it ( 'should require a clientId with clean=false' , function _test ( t , done ) {
382
+ let errorCaught = false
383
+
364
384
try {
365
385
const client = connect ( { clean : false } )
366
386
client . on ( 'error' , ( err ) => {
367
387
done ( err )
368
388
} )
369
389
} catch ( err ) {
390
+ errorCaught = true
370
391
assert . strictEqual (
371
392
err . message ,
372
393
'Missing clientId for unclean clients' ,
373
394
)
374
395
done ( )
396
+ } finally {
397
+ if ( ! errorCaught ) {
398
+ done ( new Error ( 'Client should have thrown an error' ) )
399
+ }
375
400
}
376
401
} )
377
402
@@ -384,7 +409,7 @@ export default function abstractTest(server, config, ports) {
384
409
server . once ( 'client' , ( serverClient ) => {
385
410
serverClient . once ( 'connect' , ( packet ) => {
386
411
assert . include ( packet . clientId , 'testclient' )
387
- done ( )
412
+ client . end ( ( err ) => done ( err ) )
388
413
} )
389
414
} )
390
415
} )
@@ -473,6 +498,9 @@ export default function abstractTest(server, config, ports) {
473
498
} )
474
499
475
500
describe ( 'handling offline states' , ( ) => {
501
+ beforeEach ( beforeEachExec )
502
+ after ( afterExec )
503
+
476
504
it ( 'should emit offline event once when the client transitions from connected states to disconnected ones' , function _test ( t , done ) {
477
505
const client = connect ( { reconnectPeriod : 20 } )
478
506
@@ -498,6 +526,9 @@ export default function abstractTest(server, config, ports) {
498
526
} )
499
527
500
528
describe ( 'topic validations when subscribing' , ( ) => {
529
+ beforeEach ( beforeEachExec )
530
+ after ( afterExec )
531
+
501
532
it ( 'should be ok for well-formated topics' , function _test ( t , done ) {
502
533
const client = connect ( )
503
534
client . subscribe (
@@ -549,7 +580,7 @@ export default function abstractTest(server, config, ports) {
549
580
}
550
581
assert . isArray ( granted2 )
551
582
assert . isEmpty ( granted2 )
552
- done ( )
583
+ client . end ( ( err3 ) => done ( err3 ) )
553
584
} )
554
585
} )
555
586
} )
@@ -629,9 +660,7 @@ export default function abstractTest(server, config, ports) {
629
660
630
661
client . once ( 'connect' , ( ) => {
631
662
assert . strictEqual ( client . queue . length , 0 )
632
- setTimeout ( ( ) => {
633
- client . end ( true , done )
634
- } , 10 )
663
+ client . end ( ( err ) => done ( err ) )
635
664
} )
636
665
} )
637
666
@@ -641,9 +670,7 @@ export default function abstractTest(server, config, ports) {
641
670
client . publish ( 'test' , 'test' , { qos : 0 } )
642
671
assert . strictEqual ( client . queue . length , 0 )
643
672
client . on ( 'connect' , ( ) => {
644
- setTimeout ( ( ) => {
645
- client . end ( true , done )
646
- } , 10 )
673
+ client . end ( ( err ) => done ( err ) )
647
674
} )
648
675
} )
649
676
@@ -656,9 +683,7 @@ export default function abstractTest(server, config, ports) {
656
683
client . unsubscribe ( 'test' )
657
684
assert . strictEqual ( client . queue . length , 2 )
658
685
client . on ( 'connect' , ( ) => {
659
- setTimeout ( ( ) => {
660
- client . end ( true , done )
661
- } , 10 )
686
+ client . end ( ( err ) => done ( err ) )
662
687
} )
663
688
} )
664
689
@@ -706,8 +731,6 @@ export default function abstractTest(server, config, ports) {
706
731
} )
707
732
} )
708
733
709
- teardownHelper . addServer ( server2 )
710
-
711
734
server2 . listen ( ports . PORTAND50 , ( ) => {
712
735
client = connect ( {
713
736
port : ports . PORTAND50 ,
@@ -719,7 +742,6 @@ export default function abstractTest(server, config, ports) {
719
742
outgoingStore,
720
743
queueQoSZero : true ,
721
744
} )
722
- teardownHelper . addClient ( client )
723
745
client . on ( 'packetreceive' , ( packet ) => {
724
746
if ( packet . cmd === 'connack' ) {
725
747
setImmediate ( ( ) => {
@@ -783,8 +805,6 @@ export default function abstractTest(server, config, ports) {
783
805
} )
784
806
} )
785
807
786
- teardownHelper . addServer ( server2 )
787
-
788
808
const clientOptions = {
789
809
port : ports . PORTAND72 ,
790
810
host : 'localhost' ,
@@ -799,8 +819,6 @@ export default function abstractTest(server, config, ports) {
799
819
server2 . listen ( ports . PORTAND72 , ( ) => {
800
820
client = connect ( clientOptions )
801
821
802
- teardownHelper . addClient ( client )
803
-
804
822
client . once ( 'close' , ( ) => {
805
823
client . once ( 'connect' , ( ) => {
806
824
client . publish ( 'test' , 'payload2' , { qos : 1 } , ( ) => {
@@ -833,9 +851,7 @@ export default function abstractTest(server, config, ports) {
833
851
834
852
client . on ( 'connect' , ( ) => {
835
853
assert . isTrue ( called )
836
- setTimeout ( ( ) => {
837
- client . end ( true , done )
838
- } , 10 )
854
+ client . end ( ( err ) => done ( err ) )
839
855
} )
840
856
} )
841
857
@@ -1158,8 +1174,6 @@ export default function abstractTest(server, config, ports) {
1158
1174
} )
1159
1175
} )
1160
1176
1161
- teardownHelper . addServer ( server2 )
1162
-
1163
1177
server2 . listen ( ports . PORTAND72 , ( ) => {
1164
1178
client = connect ( {
1165
1179
port : ports . PORTAND72 ,
@@ -1169,8 +1183,6 @@ export default function abstractTest(server, config, ports) {
1169
1183
reconnectPeriod : 0 ,
1170
1184
} )
1171
1185
1172
- teardownHelper . addClient ( client )
1173
-
1174
1186
client . once ( 'connect' , ( ) => {
1175
1187
client . publish (
1176
1188
'a' ,
@@ -1238,8 +1250,6 @@ export default function abstractTest(server, config, ports) {
1238
1250
} )
1239
1251
} )
1240
1252
1241
- teardownHelper . addServer ( server2 )
1242
-
1243
1253
server2 . listen ( ports . PORTAND103 , ( ) => {
1244
1254
client = connect ( {
1245
1255
port : ports . PORTAND103 ,
@@ -1249,8 +1259,6 @@ export default function abstractTest(server, config, ports) {
1249
1259
reconnectPeriod : 0 ,
1250
1260
} )
1251
1261
1252
- teardownHelper . addClient ( client )
1253
-
1254
1262
client . once ( 'connect' , ( ) => {
1255
1263
client . publish (
1256
1264
'a' ,
@@ -1340,6 +1348,17 @@ export default function abstractTest(server, config, ports) {
1340
1348
} )
1341
1349
1342
1350
function testQosHandleMessage ( qos , done ) {
1351
+ teardownHelper . add ( { executeOnce : true , order : 1 } , ( ) => {
1352
+ if ( clock ) {
1353
+ clock . restore ( )
1354
+ }
1355
+ } )
1356
+
1357
+ const clock = sinon . useFakeTimers ( {
1358
+ ...fakeTimersOptions ,
1359
+ toFake : [ 'setTimeout' ] ,
1360
+ } )
1361
+
1343
1362
const client = connect ( )
1344
1363
1345
1364
let messageEventCount = 0
@@ -1353,10 +1372,14 @@ export default function abstractTest(server, config, ports) {
1353
1372
if ( handleMessageCount === 10 ) {
1354
1373
setTimeout ( ( ) => {
1355
1374
client . end ( true , done )
1356
- } )
1375
+ } , 10 )
1376
+
1377
+ clock . tick ( 10 )
1357
1378
}
1358
1379
callback ( )
1359
1380
} , 10 )
1381
+
1382
+ clock . tick ( 10 )
1360
1383
}
1361
1384
1362
1385
client . on ( 'message' , ( topic , message , packet ) => {
@@ -1773,8 +1796,6 @@ export default function abstractTest(server, config, ports) {
1773
1796
} )
1774
1797
} )
1775
1798
1776
- teardownHelper . addServer ( server2 )
1777
-
1778
1799
server2 . listen ( ports . PORTAND50 , ( ) => {
1779
1800
client = connect ( {
1780
1801
port : ports . PORTAND50 ,
@@ -1786,8 +1807,6 @@ export default function abstractTest(server, config, ports) {
1786
1807
outgoingStore,
1787
1808
} )
1788
1809
1789
- teardownHelper . addClient ( client )
1790
-
1791
1810
client . on ( 'connect' , ( ) => {
1792
1811
if ( ! reconnect ) {
1793
1812
client . publish ( 'topic' , 'payload1' , { qos : 1 } )
@@ -1877,6 +1896,9 @@ export default function abstractTest(server, config, ports) {
1877
1896
} )
1878
1897
1879
1898
describe ( 'unsubscribing' , ( ) => {
1899
+ beforeEach ( beforeEachExec )
1900
+ after ( afterExec )
1901
+
1880
1902
it ( 'should send an unsubscribe packet (offline)' , function _test ( t , done ) {
1881
1903
const client = connect ( )
1882
1904
let received = false
@@ -2010,14 +2032,17 @@ export default function abstractTest(server, config, ports) {
2010
2032
let clock : sinon . SinonFakeTimers
2011
2033
2012
2034
// eslint-disable-next-line
2013
- beforeEach ( ( ) => {
2035
+ beforeEach ( async ( ) => {
2036
+ await beforeEachExec ( )
2014
2037
clock = sinon . useFakeTimers ( fakeTimersOptions )
2015
2038
} )
2016
2039
2017
2040
afterEach ( ( ) => {
2018
2041
clock . restore ( )
2019
2042
} )
2020
2043
2044
+ after ( afterExec )
2045
+
2021
2046
it ( 'should send ping at keepalive interval' , function _test ( t , done ) {
2022
2047
const interval = 3000
2023
2048
const client = connect ( { keepalive : interval / 1000 } )
@@ -2101,64 +2126,79 @@ export default function abstractTest(server, config, ports) {
2101
2126
} )
2102
2127
2103
2128
const reschedulePing = ( reschedulePings : boolean ) => {
2104
- it ( `should ${
2105
- ! reschedulePings ? 'not ' : ''
2106
- } reschedule pings if publishing at a higher rate than keepalive and reschedulePings===${ reschedulePings } `, function _test ( t , done ) {
2107
- const intervalMs = 3000
2108
- const client = connect ( {
2109
- keepalive : intervalMs / 1000 ,
2110
- reschedulePings,
2111
- } )
2112
-
2113
- const spyReschedule = sinon . spy (
2114
- client ,
2115
- '_reschedulePing' as any ,
2116
- )
2129
+ it (
2130
+ `should ${
2131
+ ! reschedulePings ? 'not ' : ''
2132
+ } reschedule pings if publishing at a higher rate than keepalive and reschedulePings===${ reschedulePings } `,
2133
+ {
2134
+ timeout : 4000 ,
2135
+ } ,
2136
+ function _test ( t , done ) {
2137
+ clock . restore ( )
2117
2138
2118
- let received = 0
2139
+ teardownHelper . add (
2140
+ {
2141
+ executeOnce : true ,
2142
+ order : 1 ,
2143
+ } ,
2144
+ ( ) => {
2145
+ if ( localClock ) {
2146
+ localClock . restore ( )
2147
+ }
2148
+ } ,
2149
+ )
2119
2150
2120
- client . on ( 'packetreceive' , ( packet ) => {
2121
- if ( packet . cmd === 'puback' ) {
2122
- process . nextTick ( ( ) => {
2123
- clock . tick ( intervalMs )
2151
+ const localClock = sinon . useFakeTimers ( {
2152
+ ...fakeTimersOptions ,
2153
+ toFake : [ 'setTimeout' ] ,
2154
+ } )
2155
+ const intervalMs = 3000
2156
+ const client = connect ( {
2157
+ keepalive : intervalMs / 1000 ,
2158
+ reschedulePings,
2159
+ } )
2124
2160
2125
- received ++
2161
+ const spyReschedule = sinon . spy (
2162
+ client ,
2163
+ '_reschedulePing' as any ,
2164
+ )
2126
2165
2127
- if ( received === 2 ) {
2128
- if ( reschedulePings ) {
2129
- assert . strictEqual (
2130
- spyReschedule . callCount ,
2131
- received ,
2132
- )
2133
- } else {
2134
- assert . strictEqual (
2135
- spyReschedule . callCount ,
2136
- 0 ,
2137
- )
2166
+ let received = 0
2167
+
2168
+ client . on ( 'packetreceive' , ( packet ) => {
2169
+ if ( packet . cmd === 'puback' ) {
2170
+ process . nextTick ( ( ) => {
2171
+ localClock . tick ( intervalMs )
2172
+
2173
+ ++ received
2174
+
2175
+ if ( received === 2 ) {
2176
+ if ( reschedulePings ) {
2177
+ assert . strictEqual (
2178
+ spyReschedule . callCount ,
2179
+ received ,
2180
+ )
2181
+ } else {
2182
+ assert . strictEqual (
2183
+ spyReschedule . callCount ,
2184
+ 0 ,
2185
+ )
2186
+ }
2187
+ client . end ( ( err ) => done ( err ) )
2138
2188
}
2139
- client . end ( true , done )
2140
- }
2141
- } )
2142
-
2143
- clock . tick ( 1 )
2144
- }
2145
- } )
2146
-
2147
- server . once ( 'client' , ( serverClient ) => {
2148
- serverClient . on ( 'publish' , ( ) => {
2149
- // needed to trigger the setImmediate inside server publish listener and send suback
2150
- clock . tick ( 1 )
2189
+ } )
2190
+ }
2151
2191
} )
2152
- } )
2153
2192
2154
- client . once ( 'connect' , ( ) => {
2155
- // reset call count (it's called also on connack)
2156
- spyReschedule . resetHistory ( )
2157
- // use qos1 so the puback is received (to reschedule ping)
2158
- client . publish ( 'foo' , 'bar' , { qos : 1 } )
2159
- client . publish ( 'foo' , 'bar' , { qos : 1 } )
2160
- } )
2161
- } )
2193
+ client . once ( 'connect' , ( ) => {
2194
+ // reset call count (it's called also on connack)
2195
+ spyReschedule . resetHistory ( )
2196
+ // use qos1 so the puback is received (to reschedule ping)
2197
+ client . publish ( 'foo' , 'bar' , { qos : 1 } )
2198
+ client . publish ( 'foo' , 'bar' , { qos : 1 } )
2199
+ } )
2200
+ } ,
2201
+ )
2162
2202
}
2163
2203
2164
2204
reschedulePing ( true )
@@ -2168,7 +2208,7 @@ export default function abstractTest(server, config, ports) {
2168
2208
it ( `should shift ping on pingresp when reschedulePings===${ reschedulePings } ` , function _test ( t , done ) {
2169
2209
const intervalMs = 3000
2170
2210
2171
- let client = connect ( {
2211
+ const client = connect ( {
2172
2212
keepalive : intervalMs / 1000 ,
2173
2213
reschedulePings,
2174
2214
} )
@@ -2180,7 +2220,6 @@ export default function abstractTest(server, config, ports) {
2180
2220
process . nextTick ( ( ) => {
2181
2221
assert . strictEqual ( spy . callCount , 1 )
2182
2222
client . end ( true , done )
2183
- client = null
2184
2223
} )
2185
2224
}
2186
2225
} )
@@ -2201,6 +2240,9 @@ export default function abstractTest(server, config, ports) {
2201
2240
} )
2202
2241
2203
2242
describe ( 'pinging' , ( ) => {
2243
+ beforeEach ( beforeEachExec )
2244
+ after ( afterExec )
2245
+
2204
2246
it ( 'should setup keepalive manager' , function _test ( t , done ) {
2205
2247
const client = connect ( { keepalive : 3 } )
2206
2248
client . once ( 'connect' , ( ) => {
@@ -2227,26 +2269,21 @@ export default function abstractTest(server, config, ports) {
2227
2269
2228
2270
t . after ( ( ) => {
2229
2271
clock . restore ( )
2230
- if ( client ) {
2231
- client . end ( true )
2232
- throw new Error ( 'Test timed out' )
2233
- }
2234
2272
} )
2235
2273
2236
2274
const options : IClientOptions = {
2237
2275
keepalive : 60 ,
2238
2276
reconnectPeriod : 5000 ,
2239
2277
}
2240
2278
2241
- let client = connect ( options )
2279
+ const client = connect ( options )
2242
2280
2243
2281
client . once ( 'connect' , ( ) => {
2244
2282
client . once ( 'error' , ( err ) => {
2245
2283
assert . equal ( err . message , 'Keepalive timeout' )
2246
2284
client . once ( 'connect' , ( ) => {
2247
2285
client . end ( true , done )
2248
2286
clock . tick ( 100 )
2249
- client = null
2250
2287
} )
2251
2288
} )
2252
2289
@@ -2271,12 +2308,9 @@ export default function abstractTest(server, config, ports) {
2271
2308
2272
2309
t . after ( ( ) => {
2273
2310
clock . restore ( )
2274
- if ( client ) {
2275
- client . end ( true )
2276
- }
2277
2311
} )
2278
2312
2279
- let client = connect ( { keepalive : 10 } )
2313
+ const client = connect ( { keepalive : 10 } )
2280
2314
client . once ( 'close' , ( ) => {
2281
2315
done ( new Error ( 'Client closed connection' ) )
2282
2316
} )
@@ -2295,7 +2329,6 @@ export default function abstractTest(server, config, ports) {
2295
2329
client . removeAllListeners ( 'close' )
2296
2330
client . end ( true , done )
2297
2331
clock . tick ( 100 )
2298
- client = null
2299
2332
}
2300
2333
} )
2301
2334
@@ -2306,14 +2339,17 @@ export default function abstractTest(server, config, ports) {
2306
2339
} )
2307
2340
2308
2341
describe ( 'subscribing' , ( ) => {
2342
+ beforeEach ( beforeEachExec )
2343
+ after ( afterExec )
2344
+
2309
2345
it ( 'should send a subscribe message (offline)' , function _test ( t , done ) {
2310
2346
const client = connect ( )
2311
2347
2312
2348
client . subscribe ( 'test' )
2313
2349
2314
2350
server . once ( 'client' , ( serverClient ) => {
2315
2351
serverClient . once ( 'subscribe' , ( ) => {
2316
- done ( )
2352
+ client . end ( ( err ) => done ( err ) )
2317
2353
} )
2318
2354
} )
2319
2355
} )
@@ -2338,7 +2374,7 @@ export default function abstractTest(server, config, ports) {
2338
2374
result . rh = 0
2339
2375
}
2340
2376
assert . include ( packet . subscriptions [ 0 ] , result )
2341
- done ( )
2377
+ client . end ( ( err ) => done ( err ) )
2342
2378
} )
2343
2379
} )
2344
2380
} )
@@ -2353,7 +2389,7 @@ export default function abstractTest(server, config, ports) {
2353
2389
2354
2390
client . on ( 'packetsend' , ( packet ) => {
2355
2391
if ( packet . cmd === 'subscribe' ) {
2356
- done ( )
2392
+ client . end ( ( err ) => done ( err ) )
2357
2393
}
2358
2394
} )
2359
2395
} )
@@ -2368,7 +2404,7 @@ export default function abstractTest(server, config, ports) {
2368
2404
2369
2405
client . on ( 'packetreceive' , ( packet ) => {
2370
2406
if ( packet . cmd === 'suback' ) {
2371
- done ( )
2407
+ client . end ( ( err ) => done ( err ) )
2372
2408
}
2373
2409
} )
2374
2410
} )
@@ -2464,7 +2500,7 @@ export default function abstractTest(server, config, ports) {
2464
2500
}
2465
2501
2466
2502
assert . deepStrictEqual ( packet . subscriptions , expected )
2467
- done ( )
2503
+ client . end ( ( err ) => done ( err ) )
2468
2504
} )
2469
2505
} )
2470
2506
} )
@@ -2581,6 +2617,9 @@ export default function abstractTest(server, config, ports) {
2581
2617
} )
2582
2618
2583
2619
describe ( 'receiving messages' , ( ) => {
2620
+ beforeEach ( beforeEachExec )
2621
+ after ( afterExec )
2622
+
2584
2623
it ( 'should fire the message event' , function _test ( t , done ) {
2585
2624
const client = connect ( )
2586
2625
const testPacket = {
@@ -2760,6 +2799,9 @@ export default function abstractTest(server, config, ports) {
2760
2799
} )
2761
2800
2762
2801
describe ( 'qos handling' , ( ) => {
2802
+ beforeEach ( beforeEachExec )
2803
+ after ( afterExec )
2804
+
2763
2805
it ( 'should follow qos 0 semantics (trivial)' , function _test ( t , done ) {
2764
2806
const client = connect ( )
2765
2807
const testTopic = 'test'
@@ -3159,8 +3201,7 @@ export default function abstractTest(server, config, ports) {
3159
3201
const client = connect ( )
3160
3202
3161
3203
client . on ( 'connect' , ( ) => {
3162
- client . end ( )
3163
- done ( ) // it will raise an exception if called two times
3204
+ client . end ( ( err ) => done ( err ) )
3164
3205
} )
3165
3206
} )
3166
3207
@@ -3238,15 +3279,33 @@ export default function abstractTest(server, config, ports) {
3238
3279
} )
3239
3280
3240
3281
it ( 'should always cleanup successfully on reconnection' , function _test ( t , done ) {
3282
+ teardownHelper . add ( { executeOnce : true , order : 1 } , ( ) => {
3283
+ if ( clock ) {
3284
+ clock . restore ( )
3285
+ }
3286
+ } )
3287
+
3288
+ const clock = sinon . useFakeTimers ( {
3289
+ ...fakeTimersOptions ,
3290
+ toFake : [ 'setTimeout' ] ,
3291
+ } )
3292
+
3241
3293
const client = connect ( {
3242
3294
host : 'this_hostname_should_not_exist' ,
3243
3295
connectTimeout : 0 ,
3244
3296
reconnectPeriod : 1 ,
3245
3297
} )
3298
+
3246
3299
// bind client.end so that when it is called it is automatically passed in the done callback
3247
3300
setTimeout ( ( ) => {
3248
- client . end ( done )
3249
- } , 100 )
3301
+ setTimeout ( ( ) => {
3302
+ client . end ( done )
3303
+ } , 10 )
3304
+
3305
+ clock . tick ( 10 )
3306
+ } , 10 )
3307
+
3308
+ clock . tick ( 10 )
3250
3309
} )
3251
3310
3252
3311
it ( 'should emit connack timeout error' , function _test ( t , done ) {
@@ -3282,13 +3341,7 @@ export default function abstractTest(server, config, ports) {
3282
3341
timeout : 4000 ,
3283
3342
} ,
3284
3343
function _test ( t , done ) {
3285
- t . after ( ( ) => {
3286
- // close client if not closed
3287
- if ( client ) {
3288
- client . end ( true )
3289
- }
3290
- } )
3291
- let client = connect ( { reconnectPeriod : 200 } )
3344
+ const client = connect ( { reconnectPeriod : 200 } )
3292
3345
let serverPublished = false
3293
3346
let clientCalledBack = false
3294
3347
@@ -3325,7 +3378,6 @@ export default function abstractTest(server, config, ports) {
3325
3378
setImmediate ( ( ) => {
3326
3379
assert . isTrue ( clientCalledBack )
3327
3380
client . end ( true , done )
3328
- client = null
3329
3381
} )
3330
3382
}
3331
3383
} )
@@ -3364,14 +3416,7 @@ export default function abstractTest(server, config, ports) {
3364
3416
timeout : 4000 ,
3365
3417
} ,
3366
3418
function _test ( t , done ) {
3367
- t . after ( ( ) => {
3368
- // close client if not closed
3369
- if ( client ) {
3370
- client . end ( true )
3371
- }
3372
- } )
3373
-
3374
- let client = connect ( { reconnectPeriod : 200 } )
3419
+ const client = connect ( { reconnectPeriod : 200 } )
3375
3420
let serverPublished = false
3376
3421
let clientCalledBack = false
3377
3422
@@ -3401,22 +3446,14 @@ export default function abstractTest(server, config, ports) {
3401
3446
setImmediate ( ( ) => {
3402
3447
assert . isTrue ( clientCalledBack )
3403
3448
client . end ( true , done )
3404
- client = null
3405
3449
} )
3406
3450
}
3407
3451
} )
3408
3452
} ,
3409
3453
)
3410
3454
3411
3455
it ( 'should not resend in-flight QoS 1 removed publish messages from the client' , function _test ( t , done ) {
3412
- t . after ( ( ) => {
3413
- // close client if not closed
3414
- if ( client ) {
3415
- client . end ( true )
3416
- }
3417
- } )
3418
-
3419
- let client = connect ( { reconnectPeriod : 100 } )
3456
+ const client = connect ( { reconnectPeriod : 100 } )
3420
3457
let clientCalledBack = false
3421
3458
3422
3459
server . once ( 'client' , ( serverClient ) => {
@@ -3450,7 +3487,6 @@ export default function abstractTest(server, config, ports) {
3450
3487
assert . isTrue ( clientCalledBack )
3451
3488
client . end ( true , ( err ) => {
3452
3489
done ( err )
3453
- client = null
3454
3490
} )
3455
3491
} )
3456
3492
@@ -3600,17 +3636,13 @@ export default function abstractTest(server, config, ports) {
3600
3636
} )
3601
3637
} )
3602
3638
3603
- teardownHelper . addServer ( server2 )
3604
-
3605
3639
server2 . listen ( ports . PORTAND49 , ( ) => {
3606
3640
client = connect ( {
3607
3641
port : ports . PORTAND49 ,
3608
3642
host : 'localhost' ,
3609
3643
reconnectPeriod : 100 ,
3610
3644
} )
3611
3645
3612
- teardownHelper . addClient ( client )
3613
-
3614
3646
client . on ( 'reconnect' , ( ) => {
3615
3647
reconnectEvent = true
3616
3648
} )
@@ -3679,8 +3711,6 @@ export default function abstractTest(server, config, ports) {
3679
3711
} )
3680
3712
} )
3681
3713
3682
- teardownHelper . addServer ( server2 )
3683
-
3684
3714
server2 . listen ( ports . PORTAND50 , ( ) => {
3685
3715
client = connect ( {
3686
3716
port : ports . PORTAND50 ,
@@ -3692,8 +3722,6 @@ export default function abstractTest(server, config, ports) {
3692
3722
outgoingStore,
3693
3723
} )
3694
3724
3695
- teardownHelper . addClient ( client )
3696
-
3697
3725
client . on ( 'connect' , ( ) => {
3698
3726
if ( ! reconnect ) {
3699
3727
client . subscribe ( 'test' , { qos : 2 } , ( ) => { } )
@@ -3728,8 +3756,6 @@ export default function abstractTest(server, config, ports) {
3728
3756
} )
3729
3757
} )
3730
3758
3731
- teardownHelper . addServer ( server2 )
3732
-
3733
3759
server2 . listen ( ports . PORTAND50 , ( ) => {
3734
3760
client = connect ( {
3735
3761
port : ports . PORTAND50 ,
@@ -3740,8 +3766,6 @@ export default function abstractTest(server, config, ports) {
3740
3766
reconnectPeriod : 0 ,
3741
3767
} )
3742
3768
3743
- teardownHelper . addClient ( client )
3744
-
3745
3769
client . on ( 'connect' , ( ) => {
3746
3770
client . subscribe ( 'test' , { qos : 2 } , ( e ) => {
3747
3771
if ( ! e ) {
@@ -3791,8 +3815,6 @@ export default function abstractTest(server, config, ports) {
3791
3815
} )
3792
3816
} )
3793
3817
3794
- teardownHelper . addServer ( server2 )
3795
-
3796
3818
server2 . listen ( ports . PORTAND50 , ( ) => {
3797
3819
client = connect ( {
3798
3820
port : ports . PORTAND50 ,
@@ -3804,8 +3826,6 @@ export default function abstractTest(server, config, ports) {
3804
3826
outgoingStore,
3805
3827
} )
3806
3828
3807
- teardownHelper . addClient ( client )
3808
-
3809
3829
client . on ( 'connect' , ( ) => {
3810
3830
if ( ! reconnect ) {
3811
3831
client . publish ( 'topic' , 'payload' , { qos : 1 } )
@@ -3841,8 +3861,6 @@ export default function abstractTest(server, config, ports) {
3841
3861
} )
3842
3862
} )
3843
3863
3844
- teardownHelper . addServer ( server2 )
3845
-
3846
3864
server2 . listen ( ports . PORTAND50 , ( ) => {
3847
3865
client = connect ( {
3848
3866
port : ports . PORTAND50 ,
@@ -3854,8 +3872,6 @@ export default function abstractTest(server, config, ports) {
3854
3872
outgoingStore,
3855
3873
} )
3856
3874
3857
- teardownHelper . addClient ( client )
3858
-
3859
3875
client . on ( 'connect' , ( ) => {
3860
3876
if ( ! reconnect ) {
3861
3877
client . publish ( 'topic' , 'payload' , { qos : 2 } )
@@ -3896,8 +3912,6 @@ export default function abstractTest(server, config, ports) {
3896
3912
} )
3897
3913
} )
3898
3914
3899
- teardownHelper . addServer ( server2 )
3900
-
3901
3915
server2 . listen ( ports . PORTAND50 , ( ) => {
3902
3916
client = connect ( {
3903
3917
port : ports . PORTAND50 ,
@@ -3909,8 +3923,6 @@ export default function abstractTest(server, config, ports) {
3909
3923
outgoingStore,
3910
3924
} )
3911
3925
3912
- teardownHelper . addClient ( client )
3913
-
3914
3926
client . on ( 'connect' , ( ) => {
3915
3927
if ( ! reconnect ) {
3916
3928
client . publish (
@@ -3983,8 +3995,6 @@ export default function abstractTest(server, config, ports) {
3983
3995
} )
3984
3996
} )
3985
3997
3986
- teardownHelper . addServer ( server2 )
3987
-
3988
3998
server2 . listen ( ports . PORTAND50 , ( ) => {
3989
3999
client = connect ( {
3990
4000
port : ports . PORTAND50 ,
@@ -3996,8 +4006,6 @@ export default function abstractTest(server, config, ports) {
3996
4006
outgoingStore,
3997
4007
} )
3998
4008
3999
- teardownHelper . addClient ( client )
4000
-
4001
4009
client [ 'nextId' ] = 65535
4002
4010
4003
4011
client . on ( 'connect' , ( ) => {
@@ -4042,6 +4050,17 @@ export default function abstractTest(server, config, ports) {
4042
4050
} )
4043
4051
4044
4052
it ( 'should be able to pub/sub if reconnect() is called at out of close handler' , function _test ( t , done ) {
4053
+ teardownHelper . add ( { executeOnce : true , order : 1 } , ( ) => {
4054
+ if ( clock ) {
4055
+ clock . restore ( )
4056
+ }
4057
+ } )
4058
+
4059
+ const clock = sinon . useFakeTimers ( {
4060
+ ...fakeTimersOptions ,
4061
+ toFake : [ 'setTimeout' ] ,
4062
+ } )
4063
+
4045
4064
const client = connect ( { reconnectPeriod : 0 } )
4046
4065
let tryReconnect = true
4047
4066
let reconnectEvent = false
@@ -4052,6 +4071,8 @@ export default function abstractTest(server, config, ports) {
4052
4071
setTimeout ( ( ) => {
4053
4072
client . reconnect ( )
4054
4073
} , 100 )
4074
+
4075
+ clock . tick ( 100 )
4055
4076
} else {
4056
4077
assert . isTrue ( reconnectEvent )
4057
4078
done ( )
@@ -4078,7 +4099,8 @@ export default function abstractTest(server, config, ports) {
4078
4099
const connack =
4079
4100
version === 5 ? { reasonCode : 0 } : { returnCode : 0 }
4080
4101
4081
- beforeEach ( ( ) => {
4102
+ beforeEach ( async ( ) => {
4103
+ await beforeEachExec ( )
4082
4104
cachedClientListeners = server . listeners ( 'client' )
4083
4105
server . removeAllListeners ( 'client' )
4084
4106
} )
@@ -4090,6 +4112,8 @@ export default function abstractTest(server, config, ports) {
4090
4112
} )
4091
4113
} )
4092
4114
4115
+ after ( afterExec )
4116
+
4093
4117
it ( 'should resubscribe even if disconnect is before suback' , function _test ( t , done ) {
4094
4118
const client = connect ( { reconnectPeriod : 100 , ...config } )
4095
4119
let subscribeCount = 0
@@ -4152,6 +4176,9 @@ export default function abstractTest(server, config, ports) {
4152
4176
} )
4153
4177
4154
4178
describe ( 'message id to subscription topic mapping' , ( ) => {
4179
+ beforeEach ( beforeEachExec )
4180
+ after ( afterExec )
4181
+
4155
4182
it ( 'should not create a mapping if resubscribe is disabled' , function _test ( t , done ) {
4156
4183
const client = connect ( { resubscribe : false } )
4157
4184
client . subscribe ( 'test1' )
0 commit comments