github.com/mgoltzsche/ctnr@v0.7.1-alpha/pkg/idutils/idutils_test.go (about) 1 package idutils 2 3 import ( 4 "io/ioutil" 5 "os" 6 "path/filepath" 7 "testing" 8 9 "github.com/stretchr/testify/assert" 10 "github.com/stretchr/testify/require" 11 ) 12 13 var ( 14 etcPasswd = ` 15 root:x:0:0:root:/root:/bin/bash 16 17 daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin 18 # comment 19 myuser:x:9000:7:bin:/bin:/usr/sbin/nologin 20 ` 21 etcGroup = ` 22 root:!:0: 23 24 daemon:x:1:usera 25 # comment 26 testgroup:x:7777:usera,userb 27 ` 28 ) 29 30 func TestLookupGid(t *testing.T) { 31 rootfs := newTestRootfs(t) 32 defer os.RemoveAll(rootfs) 33 dir, err := ioutil.TempDir("", "ctnr-test-gid-") 34 require.NoError(t, err) 35 defer os.RemoveAll(dir) 36 for _, c := range []struct { 37 name string 38 gid uint 39 rootfs string 40 resolve bool 41 }{ 42 {"root", 0, rootfs, true}, 43 {"daemon", 1, rootfs, true}, 44 {"testgroup", 7777, rootfs, true}, 45 {"9", 9, dir, true}, 46 {"unknowngroup", 0, rootfs, false}, 47 {"-1", 0, rootfs, false}, 48 } { 49 gid, err := LookupGid(c.name, c.rootfs) 50 if c.resolve { 51 require.NoError(t, err, "unexpected error for group "+c.name) 52 assert.Equal(t, c.gid, gid) 53 } else if err == nil { 54 t.Errorf("lookup of group %q should fail", c.name) 55 } 56 } 57 } 58 59 func TestLookupUser(t *testing.T) { 60 rootfs := newTestRootfs(t) 61 defer os.RemoveAll(rootfs) 62 dir, err := ioutil.TempDir("", "ctnr-test-usr-") 63 require.NoError(t, err) 64 defer os.RemoveAll(dir) 65 for _, c := range []struct { 66 name string 67 uid uint 68 gid uint 69 rootfs string 70 resolve bool 71 }{ 72 {"root", 0, 0, rootfs, true}, 73 {"daemon", 1, 1, rootfs, true}, 74 {"myuser", 9000, 7, rootfs, true}, 75 {"9", 9, 9, dir, true}, 76 {"unknownuser", 0, 0, rootfs, false}, 77 {"-1", 0, 0, rootfs, false}, 78 } { 79 u, err := LookupUser(c.name, c.rootfs) 80 if c.resolve { 81 require.NoError(t, err, "unexpected error for user "+c.name) 82 assert.Equal(t, c.uid, u.Uid, "did not resolve uid properly: "+c.name) 83 assert.Equal(t, c.gid, u.Gid, "did not resolve gid properly: "+c.name) 84 } else if err == nil { 85 t.Errorf("lookup of user %q should fail", c.name) 86 } 87 } 88 } 89 90 func newTestRootfs(t *testing.T) string { 91 rootfs, err := ioutil.TempDir("", "ctnr-idutils-test-") 92 require.NoError(t, err) 93 err = os.Mkdir(filepath.Join(rootfs, "etc"), 0755) 94 require.NoError(t, err) 95 err = ioutil.WriteFile(filepath.Join(rootfs, "etc", "passwd"), []byte(etcPasswd), 0600) 96 require.NoError(t, err) 97 err = ioutil.WriteFile(filepath.Join(rootfs, "etc", "group"), []byte(etcGroup), 0600) 98 require.NoError(t, err) 99 return rootfs 100 }