Files
LinkPort/internal/gateway/rabbitmq_management_test.go
T

61 lines
1.7 KiB
Go

package gateway
import (
"errors"
"linkport/internal/model"
"net"
"strconv"
"testing"
"time"
)
func TestRabbitManagementListenerLifecycle(t *testing.T) {
m, p, entered := testManager(t)
m.handlers["rabbitmq"], m.handlers["http"] = heldHandler{entered}, heldHandler{entered}
p.Type = "rabbitmq"
p.MaxConnections = 2
reserved, err := net.Listen("tcp", "127.0.0.1:0")
if err != nil {
t.Fatal(err)
}
_, port, _ := net.SplitHostPort(reserved.Addr().String())
p.ManagementListenPort, _ = strconv.Atoi(port)
if err = m.Start(p); err == nil {
t.Fatal("started with occupied management port")
}
reserved.Close()
if _, err = m.StartFrom(func() (model.Proxy, error) { return p, nil }, func(model.Proxy) error { return errors.New("persist failed") }); err == nil {
t.Fatal("expected rollback")
}
if err = m.Start(p); err != nil {
t.Fatal("listener leaked after rollback", err)
}
status := m.Status(p.ID)
next := p
next.ManagementListenPort = 0
persisted := false
if err = m.UpdateConfig(next, func() error { persisted = true; return nil }); err == nil || persisted {
t.Fatal("running management listener changed without stopping")
}
for _, address := range []string{status.BoundAddress, status.ManagementBoundAddress} {
c, e := net.DialTimeout("tcp", address, time.Second)
if e != nil {
t.Fatal(e)
}
defer c.Close()
select {
case <-entered:
case <-time.After(time.Second):
t.Fatal("listener did not admit connection")
}
}
m.Stop(p.ID)
for _, address := range []string{status.BoundAddress, status.ManagementBoundAddress} {
l, e := net.Listen("tcp", address)
if e != nil {
t.Fatal("listener leaked on stop", e)
}
l.Close()
}
}