@@ -415,3 +415,70 @@ func TestGetDynamicAdvertisedAddress(t *testing.T) {
415
415
})
416
416
}
417
417
}
418
+
419
+ func TestNextDynamicPort (t * testing.T ) {
420
+ tests := []struct {
421
+ name string
422
+ portOffset uint64
423
+ minPort uint16
424
+ maxPorts uint16
425
+ expectedNextPort uint16
426
+ expectError bool
427
+ }{
428
+ {
429
+ name : "should not happen (checked in config) - max ports is 0" ,
430
+ expectError : true ,
431
+ },
432
+ {
433
+ name : "broker 0" ,
434
+ portOffset : 0 ,
435
+ minPort : 30000 ,
436
+ maxPorts : 1 ,
437
+ expectedNextPort : 30000 ,
438
+ },
439
+ {
440
+ name : "broker 999" ,
441
+ portOffset : 999 ,
442
+ minPort : 30000 ,
443
+ maxPorts : 1000 ,
444
+ expectedNextPort : 30999 ,
445
+ },
446
+ {
447
+ name : "wrap-around : maxPorts 1, portOffsets 0 and 1 produce the same port 30000, listen will fail with bind: address already in use" ,
448
+ portOffset : 1 ,
449
+ minPort : 30000 ,
450
+ maxPorts : 1 ,
451
+ expectedNextPort : 30000 ,
452
+ },
453
+ {
454
+ name : "wrap-around : broker 1000" ,
455
+ portOffset : 1000 ,
456
+ minPort : 30000 ,
457
+ maxPorts : 1000 ,
458
+ expectedNextPort : 30000 ,
459
+ },
460
+ {
461
+ name : "port assignment overflow" ,
462
+ portOffset : 15 ,
463
+ minPort : 65530 ,
464
+ maxPorts : 100 ,
465
+ expectError : true ,
466
+ },
467
+ }
468
+
469
+ for _ , tt := range tests {
470
+ t .Run (tt .name , func (t * testing.T ) {
471
+ listeners := & Listeners {
472
+ dynamicSequentialMinPort : tt .minPort ,
473
+ dynamicSequentialMaxPorts : tt .maxPorts ,
474
+ }
475
+ nextPort , err := listeners .nextDynamicPort (tt .portOffset , "" , int32 (tt .portOffset ))
476
+ if tt .expectError {
477
+ assert .Error (t , err )
478
+ } else {
479
+ assert .NoError (t , err )
480
+ assert .Equal (t , tt .expectedNextPort , nextPort )
481
+ }
482
+ })
483
+ }
484
+ }
0 commit comments