@@ -415,3 +415,70 @@ func TestGetDynamicAdvertisedAddress(t *testing.T) {
415415 })
416416 }
417417}
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