mirror of
https://github.com/rcourtman/Pulse.git
synced 2026-04-28 11:30:15 +00:00
- 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
190 lines
4.7 KiB
Go
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)
|
|
}
|