61 lines
1.7 KiB
Go
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()
|
|
}
|
|
}
|