mirror of
https://github.com/netbirdio/netbird.git
synced 2026-04-16 15:26:40 +00:00
- Automatic Unix daemon address discovery: if the default socket is missing, the client can find and use a single available socket. - Client startup now resolves daemon addresses more robustly while preserving non-Unix behavior.
122 lines
3.0 KiB
Go
122 lines
3.0 KiB
Go
//go:build !windows && !ios && !android
|
|
|
|
package daemonaddr
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
)
|
|
|
|
// createSockFile creates a regular file with a .sock extension.
|
|
// ResolveUnixDaemonAddr uses os.Stat (not net.Dial), so a regular file is
|
|
// sufficient and avoids Unix socket path-length limits on macOS.
|
|
func createSockFile(t *testing.T, path string) {
|
|
t.Helper()
|
|
if err := os.WriteFile(path, nil, 0o600); err != nil {
|
|
t.Fatalf("failed to create test sock file at %s: %v", path, err)
|
|
}
|
|
}
|
|
|
|
func TestResolveUnixDaemonAddr_DefaultExists(t *testing.T) {
|
|
tmp := t.TempDir()
|
|
sock := filepath.Join(tmp, "netbird.sock")
|
|
createSockFile(t, sock)
|
|
|
|
addr := "unix://" + sock
|
|
got := ResolveUnixDaemonAddr(addr)
|
|
if got != addr {
|
|
t.Errorf("expected %s, got %s", addr, got)
|
|
}
|
|
}
|
|
|
|
func TestResolveUnixDaemonAddr_SingleDiscovered(t *testing.T) {
|
|
tmp := t.TempDir()
|
|
|
|
// Default socket does not exist
|
|
defaultAddr := "unix://" + filepath.Join(tmp, "netbird.sock")
|
|
|
|
// Create a scan dir with one socket
|
|
sd := filepath.Join(tmp, "netbird")
|
|
if err := os.MkdirAll(sd, 0o755); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
instanceSock := filepath.Join(sd, "main.sock")
|
|
createSockFile(t, instanceSock)
|
|
|
|
origScanDir := scanDir
|
|
setScanDir(sd)
|
|
t.Cleanup(func() { setScanDir(origScanDir) })
|
|
|
|
got := ResolveUnixDaemonAddr(defaultAddr)
|
|
expected := "unix://" + instanceSock
|
|
if got != expected {
|
|
t.Errorf("expected %s, got %s", expected, got)
|
|
}
|
|
}
|
|
|
|
func TestResolveUnixDaemonAddr_MultipleDiscovered(t *testing.T) {
|
|
tmp := t.TempDir()
|
|
|
|
defaultAddr := "unix://" + filepath.Join(tmp, "netbird.sock")
|
|
|
|
sd := filepath.Join(tmp, "netbird")
|
|
if err := os.MkdirAll(sd, 0o755); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
createSockFile(t, filepath.Join(sd, "main.sock"))
|
|
createSockFile(t, filepath.Join(sd, "other.sock"))
|
|
|
|
origScanDir := scanDir
|
|
setScanDir(sd)
|
|
t.Cleanup(func() { setScanDir(origScanDir) })
|
|
|
|
got := ResolveUnixDaemonAddr(defaultAddr)
|
|
if got != defaultAddr {
|
|
t.Errorf("expected original %s, got %s", defaultAddr, got)
|
|
}
|
|
}
|
|
|
|
func TestResolveUnixDaemonAddr_NoSocketsFound(t *testing.T) {
|
|
tmp := t.TempDir()
|
|
|
|
defaultAddr := "unix://" + filepath.Join(tmp, "netbird.sock")
|
|
|
|
sd := filepath.Join(tmp, "netbird")
|
|
if err := os.MkdirAll(sd, 0o755); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
origScanDir := scanDir
|
|
setScanDir(sd)
|
|
t.Cleanup(func() { setScanDir(origScanDir) })
|
|
|
|
got := ResolveUnixDaemonAddr(defaultAddr)
|
|
if got != defaultAddr {
|
|
t.Errorf("expected original %s, got %s", defaultAddr, got)
|
|
}
|
|
}
|
|
|
|
func TestResolveUnixDaemonAddr_NonUnixAddr(t *testing.T) {
|
|
addr := "tcp://127.0.0.1:41731"
|
|
got := ResolveUnixDaemonAddr(addr)
|
|
if got != addr {
|
|
t.Errorf("expected %s, got %s", addr, got)
|
|
}
|
|
}
|
|
|
|
func TestResolveUnixDaemonAddr_ScanDirMissing(t *testing.T) {
|
|
tmp := t.TempDir()
|
|
|
|
defaultAddr := "unix://" + filepath.Join(tmp, "netbird.sock")
|
|
|
|
origScanDir := scanDir
|
|
setScanDir(filepath.Join(tmp, "nonexistent"))
|
|
t.Cleanup(func() { setScanDir(origScanDir) })
|
|
|
|
got := ResolveUnixDaemonAddr(defaultAddr)
|
|
if got != defaultAddr {
|
|
t.Errorf("expected original %s, got %s", defaultAddr, got)
|
|
}
|
|
}
|