Files
2026-09-10 20:19:11 +02:00

47 lines
1.6 KiB
Go

package engine
import (
"os"
"path/filepath"
"strings"
"testing"
)
func passwdRootfs(t *testing.T) string {
t.Helper()
rootfs := t.TempDir()
os.MkdirAll(filepath.Join(rootfs, "etc"), 0o755)
os.WriteFile(filepath.Join(rootfs, "etc", "passwd"), []byte("root:x:0:0:root:/root:/bin/sh\npostgres:x:999:999::/var/lib/postgresql:/bin/bash\n"), 0o644)
os.WriteFile(filepath.Join(rootfs, "etc", "group"), []byte("root:x:0:\npostgres:x:999:\nstaff:x:50:\n"), 0o644)
return rootfs
}
func TestLookupUser(t *testing.T) {
rootfs := passwdRootfs(t)
for spec, want := range map[string]User{
"postgres": {UID: 999, GID: 999, Home: "/var/lib/postgresql"},
"999": {UID: 999, GID: 999, Home: "/var/lib/postgresql"},
"postgres:staff": {UID: 999, GID: 50, Home: "/var/lib/postgresql"},
"postgres:50": {UID: 999, GID: 50, Home: "/var/lib/postgresql"},
"1000": {UID: 1000, GID: 1000},
"1000:1001": {UID: 1000, GID: 1001},
"root": {UID: 0, GID: 0, Home: "/root"},
} {
got, err := LookupUser(rootfs, spec)
if err != nil || got != want {
t.Errorf("%q: got %+v, %v; want %+v", spec, got, err, want)
}
}
for _, spec := range []string{"nobody", "postgres:nogroup", "", ":staff", "-1"} {
if _, err := LookupUser(rootfs, spec); err == nil {
t.Errorf("%q: accepted", spec)
}
}
if _, err := LookupUser(t.TempDir(), "postgres"); err == nil || !strings.Contains(err.Error(), "passwd") {
t.Errorf("no passwd file: got %v", err)
}
if got, err := LookupUser(t.TempDir(), "70"); err != nil || got != (User{UID: 70, GID: 70}) {
t.Errorf("numeric without passwd: got %+v, %v", got, err)
}
}