Skip to content

Commit

Permalink
osutil/user: test with more realistic getent exit codes
Browse files Browse the repository at this point in the history
  • Loading branch information
valentindavid committed Sep 30, 2024
1 parent bd2458d commit 3e97142
Showing 1 changed file with 22 additions and 11 deletions.
33 changes: 22 additions & 11 deletions osutil/user/getent_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import (
"fmt"
"os"
"path/filepath"
"strconv"
"testing"

. "gopkg.in/check.v1"
Expand All @@ -46,12 +47,17 @@ func (s *getentSuite) SetUpTest(c *C) {
s.getentDir = c.MkDir()

s.mockGetent = testutil.MockCommand(c, "getent", fmt.Sprintf(`
cat '%s'/"${1}${2:+/}${2-}"
set -eu
base='%s'/"${1}${2:+/}${2-}"
cat "${base}"
if [ -f "${base}.exit" ]; then
exit "$(cat "${base}.exit")"
fi
`, s.getentDir))
s.AddCleanup(s.mockGetent.Restore)
}

func (s *getentSuite) mockGetentOutput(c *C, value string, params ...string) {
func (s *getentSuite) mockGetentOutput(c *C, value string, exit int, params ...string) {
path := []string{s.getentDir}
path = append(path, params...)
resultPath := filepath.Join(path...)
Expand All @@ -60,11 +66,16 @@ func (s *getentSuite) mockGetentOutput(c *C, value string, params ...string) {
b := []byte(value)
err = os.WriteFile(resultPath, b, 0644)
c.Assert(err, IsNil)
if exit != 0 {
exitBytes := []byte(strconv.Itoa(exit))
err = os.WriteFile(resultPath+".exit", exitBytes, 0644)
c.Assert(err, IsNil)
}
}

func (s *getentSuite) TestLookupGroupByName(c *C) {
s.mockGetentOutput(c, `mygroup:x:60000:myuser,someuser
`, "group", "mygroup")
`, 0, "group", "mygroup")

grp, err := user.LookupGroupFromGetent(user.GroupMatchGroupname("mygroup"))
c.Assert(err, IsNil)
Expand All @@ -79,7 +90,7 @@ func (s *getentSuite) TestLookupGroupByNameError(c *C) {
}

func (s *getentSuite) TestLookupGroupByNameDoesNotExist(c *C) {
s.mockGetentOutput(c, ``, "group", "mygroup")
s.mockGetentOutput(c, ``, 2, "group", "mygroup")

grp, err := user.LookupGroupFromGetent(user.GroupMatchGroupname("mygroup"))
c.Assert(err, IsNil)
Expand All @@ -90,7 +101,7 @@ func (s *getentSuite) TestLookupGroupByNumericalName(c *C) {
// This is probably not valid
s.mockGetentOutput(c, `mygroup:x:60001:myuser,someuser
1mygroup:x:60000:myuser,someuser
`, "group")
`, 0, "group")

grp, err := user.LookupGroupFromGetent(user.GroupMatchGroupname("1mygroup"))
c.Assert(err, IsNil)
Expand All @@ -101,7 +112,7 @@ func (s *getentSuite) TestLookupGroupByNumericalName(c *C) {

func (s *getentSuite) TestLookupUserByName(c *C) {
s.mockGetentOutput(c, `johndoe:x:60000:60000:John Doe:/home/johndoe:/bin/bash
`, "passwd", "johndoe")
`, 0, "passwd", "johndoe")

usr, err := user.LookupUserFromGetent(user.UserMatchUsername("johndoe"))
c.Assert(err, IsNil)
Expand All @@ -115,7 +126,7 @@ func (s *getentSuite) TestLookupUserByName(c *C) {

func (s *getentSuite) TestLookupUserByUid(c *C) {
s.mockGetentOutput(c, `johndoe:x:60000:60000:John Doe:/home/johndoe:/bin/bash
`, "passwd", "60000")
`, 0, "passwd", "60000")

usr, err := user.LookupUserFromGetent(user.UserMatchUid(60000))
c.Assert(err, IsNil)
Expand All @@ -131,7 +142,7 @@ func (s *getentSuite) TestLookupUserByNumericalName(c *C) {
// This is probably not valid
s.mockGetentOutput(c, `johndoe:x:60001:60001:John Doe2:/home/johndoe2:/bin/bash
1johndoe:x:60000:60000:John Doe:/home/johndoe:/bin/bash
`, "passwd")
`, 0, "passwd")

usr, err := user.LookupUserFromGetent(user.UserMatchUsername("1johndoe"))
c.Assert(err, IsNil)
Expand All @@ -144,23 +155,23 @@ func (s *getentSuite) TestLookupUserByNumericalName(c *C) {
}

func (s *getentSuite) TestLookupUserByNameMissing(c *C) {
s.mockGetentOutput(c, ``, "passwd", "johndoe")
s.mockGetentOutput(c, ``, 2, "passwd", "johndoe")

usr, err := user.LookupUserFromGetent(user.UserMatchUsername("johndoe"))
c.Assert(err, IsNil)
c.Assert(usr, IsNil)
}

func (s *getentSuite) TestLookupUserUidMissing(c *C) {
s.mockGetentOutput(c, ``, "passwd", "60000")
s.mockGetentOutput(c, ``, 2, "passwd", "60000")

usr, err := user.LookupUserFromGetent(user.UserMatchUid(60000))
c.Assert(err, IsNil)
c.Assert(usr, IsNil)
}

func (s *getentSuite) TestLookupGroupByNameMissing(c *C) {
s.mockGetentOutput(c, ``, "group", "mygroup")
s.mockGetentOutput(c, ``, 2, "group", "mygroup")

grp, err := user.LookupGroupFromGetent(user.GroupMatchGroupname("mygroup"))
c.Assert(err, IsNil)
Expand Down

0 comments on commit 3e97142

Please sign in to comment.