//go:build !windows package sockets import ( "fmt" "net" "os" "syscall" "testing" ) func runTest(t *testing.T, path string, l net.Listener, echoStr string) { go func() { for { conn, err := l.Accept() if err != nil { return } _, _ = conn.Write([]byte(echoStr)) _ = conn.Close() } }() conn, err := net.Dial("unix", path) if err != nil { t.Fatal(err) } buf := make([]byte, 5) if _, err := conn.Read(buf); err != nil { t.Fatal(err) } else if string(buf) != echoStr { t.Fatal(fmt.Errorf("msg may lost")) } } // TestNewUnixSocket run under root user. func TestNewUnixSocket(t *testing.T) { if os.Getuid() != 0 { t.Skip("requires root") } gid := os.Getgid() path := "/tmp/test.sock" echoStr := "hello" l, err := NewUnixSocket(path, gid) if err != nil { t.Fatal(err) } defer l.Close() runTest(t, path, l, echoStr) } func TestUnixSocketWithOpts(t *testing.T) { uid, gid := os.Getuid(), os.Getgid() perms := os.FileMode(0o660) path := "/tmp/test.sock" echoStr := "hello" l, err := NewUnixSocketWithOpts(path, WithChown(uid, gid), WithChmod(perms)) if err != nil { t.Fatal(err) } defer l.Close() p, err := os.Stat(path) if err != nil { t.Fatal(err) } if p.Mode().Perm() != perms { t.Fatalf("unexpected file permissions: expected: %#o, got: %#o", perms, p.Mode().Perm()) } if stat, ok := p.Sys().(*syscall.Stat_t); ok { if stat.Uid != uint32(uid) || stat.Gid != uint32(gid) { t.Fatalf("unexpected file ownership: expected: %d:%d, got: %d:%d", uid, gid, stat.Uid, stat.Gid) } } runTest(t, path, l, echoStr) }