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  }