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) } }