Pulse/internal/config/detect_public_url_test.go
rcourtman ed78509f92 Fix flaky tests and improve coverage across alerts, api, and config packages
- Fix deadlock and race conditions in internal/alerts
- Add comprehensive error path tests for internal/config
- Fix 401 handling in internal/api
- Fix Docker Swarm task filtering test logic
2026-01-03 18:36:17 +00:00

190 lines
4.7 KiB
Go

package config
import (
"fmt"
"net"
"os"
"os/exec"
"testing"
"github.com/stretchr/testify/assert"
)
// Helper process for mocking exec.Command
func TestHelperProcess(t *testing.T) {
if os.Getenv("GO_WANT_HELPER_PROCESS") != "1" {
return
}
defer os.Exit(0)
args := os.Args
for len(args) > 0 {
if args[0] == "--" {
args = args[1:]
break
}
args = args[1:]
}
if len(args) == 0 {
fmt.Fprintf(os.Stderr, "No command\n")
os.Exit(2)
}
cmd, args := args[0], args[1:]
switch cmd {
case "hostname":
if len(args) > 0 && args[0] == "-I" {
fmt.Print("192.168.1.100 172.17.0.1")
}
}
}
// Mock net.Conn
type mockConn struct {
net.Conn
localAddr net.Addr
}
func (m *mockConn) LocalAddr() net.Addr {
return m.localAddr
}
func (m *mockConn) Close() error { return nil }
type mockAddr struct {
ip string
}
func (m *mockAddr) Network() string { return "udp" }
func (m *mockAddr) String() string { return m.ip }
func TestDetectPublicURL(t *testing.T) {
// Backup original vars
origOsStat := osStat
origExecCommand := execCommand
origNetDial := netDial
origNetInterfaceAddrs := netInterfaceAddrs
defer func() {
osStat = origOsStat
execCommand = origExecCommand
netDial = origNetDial
netInterfaceAddrs = origNetInterfaceAddrs
}()
t.Run("Docker Environment", func(t *testing.T) {
osStat = func(name string) (os.FileInfo, error) {
if name == "/.dockerenv" {
return nil, nil // Exists
}
return nil, os.ErrNotExist
}
url := detectPublicURL(8080)
assert.Equal(t, "", url)
})
t.Run("Proxmox Environment (hostname -I)", func(t *testing.T) {
osStat = func(name string) (os.FileInfo, error) {
if name == "/etc/pve" {
return nil, nil // Exists
}
return nil, os.ErrNotExist
}
execCommand = func(name string, arg ...string) *exec.Cmd {
cs := []string{"-test.run=TestHelperProcess", "--", name}
cs = append(cs, arg...)
cmd := exec.Command(os.Args[0], cs...)
cmd.Env = []string{"GO_WANT_HELPER_PROCESS=1"}
return cmd
}
url := detectPublicURL(8080)
assert.Equal(t, "http://192.168.1.100:8080", url)
})
t.Run("Outbound (Method 2)", func(t *testing.T) {
osStat = func(name string) (os.FileInfo, error) { return nil, os.ErrNotExist }
netDial = func(network, address string) (net.Conn, error) {
return &mockConn{
localAddr: &net.UDPAddr{IP: net.ParseIP("10.0.0.50")},
}, nil
}
url := detectPublicURL(8080)
assert.Equal(t, "http://10.0.0.50:8080", url)
})
t.Run("Interface Addrs (Method 3 - Private)", func(t *testing.T) {
osStat = func(name string) (os.FileInfo, error) { return nil, os.ErrNotExist }
netDial = func(network, address string) (net.Conn, error) { return nil, fmt.Errorf("fail") }
netInterfaceAddrs = func() ([]net.Addr, error) {
return []net.Addr{
&net.IPNet{IP: net.ParseIP("127.0.0.1"), Mask: net.CIDRMask(8, 32)},
&net.IPNet{IP: net.ParseIP("192.168.1.200"), Mask: net.CIDRMask(24, 32)},
}, nil
}
url := detectPublicURL(8080)
assert.Equal(t, "http://192.168.1.200:8080", url)
})
t.Run("Interface Addrs (Method 3 - Public)", func(t *testing.T) {
osStat = func(name string) (os.FileInfo, error) { return nil, os.ErrNotExist }
netDial = func(network, address string) (net.Conn, error) { return nil, fmt.Errorf("fail") }
netInterfaceAddrs = func() ([]net.Addr, error) {
return []net.Addr{
&net.IPNet{IP: net.ParseIP("127.0.0.1"), Mask: net.CIDRMask(8, 32)},
&net.IPNet{IP: net.ParseIP("123.45.67.89"), Mask: net.CIDRMask(24, 32)},
}, nil
}
url := detectPublicURL(8080)
assert.Equal(t, "http://123.45.67.89:8080", url)
})
t.Run("None Found", func(t *testing.T) {
osStat = func(name string) (os.FileInfo, error) { return nil, os.ErrNotExist }
netDial = func(network, address string) (net.Conn, error) { return nil, fmt.Errorf("fail") }
netInterfaceAddrs = func() ([]net.Addr, error) { return nil, fmt.Errorf("fail") }
url := detectPublicURL(8080)
assert.Equal(t, "", url)
})
}
func TestGetOutboundIP_Fallback(t *testing.T) {
// Backup
origNetDial := netDial
defer func() { netDial = origNetDial }()
// Fail first dial, succeed second
netDial = func(network, address string) (net.Conn, error) {
if address == "8.8.8.8:80" {
return nil, fmt.Errorf("fail 1")
}
if address == "1.1.1.1:80" {
return &mockConn{
localAddr: &net.UDPAddr{IP: net.ParseIP("10.0.0.51")},
}, nil
}
return nil, fmt.Errorf("unexpected address")
}
ip := getOutboundIP()
assert.Equal(t, "10.0.0.51", ip)
}
func TestGetOutboundIP_AllFail(t *testing.T) {
origNetDial := netDial
defer func() { netDial = origNetDial }()
netDial = func(network, address string) (net.Conn, error) {
return nil, fmt.Errorf("fail")
}
ip := getOutboundIP()
assert.Equal(t, "", ip)
}