Skip to content

Commit b2a923b

Browse files
committed
Test nextDynamicPort method
1 parent e2629c9 commit b2a923b

File tree

2 files changed

+71
-1
lines changed

2 files changed

+71
-1
lines changed

Diff for: proxy/proxy.go

+4-1
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,9 @@ func (p *Listeners) findListenerConfig(brokerId int32) *ListenerConfig {
156156
// Make sure all dynamically allocated ports are within the half open interval
157157
// [dynamicSequentialMinPort, dynamicSequentialMinPort + dynamicSequentialMaxPorts).
158158
func (p *Listeners) nextDynamicPort(portOffset uint64, brokerAddress string, brokerId int32) (uint16, error) {
159+
if p.dynamicSequentialMaxPorts == 0 {
160+
return 0, fmt.Errorf("dynamic sequential max ports is 0")
161+
}
159162
port := p.dynamicSequentialMinPort + uint16(portOffset%uint64(p.dynamicSequentialMaxPorts))
160163
if port < p.dynamicSequentialMinPort {
161164
return 0, fmt.Errorf("port assignment overflow %s %d: %d", brokerAddress, brokerId, port)
@@ -198,7 +201,7 @@ func (p *Listeners) ListenDynamicInstance(brokerAddress string, brokerId int32)
198201
listenerAddress = net.JoinHostPort(p.defaultListenerIP, strconv.Itoa(0))
199202
} else {
200203
// Use sequentially allocated port.
201-
port, err := p.nextDynamicPort(uint64(p.currentDynamicPortCounter), brokerAddress, brokerId)
204+
port, err := p.nextDynamicPort(p.currentDynamicPortCounter, brokerAddress, brokerId)
202205
if err != nil {
203206
return "", 0, err
204207
}

Diff for: proxy/proxy_test.go

+67
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)