engine: resources: Add a test case for resource owner check

This adds FileOwnerExpect as a new Step which allows validating if the
owner was set properly on a resource.
This commit is contained in:
Francois Rompre-Lanctot
2020-02-04 00:55:01 -05:00
parent 104af7e86f
commit f3b4a8d055

View File

@@ -23,9 +23,12 @@ import (
"fmt"
"io/ioutil"
"os"
"os/user"
"path"
"strconv"
"strings"
"sync"
"syscall"
"testing"
"time"
@@ -174,6 +177,28 @@ func FileExpect(p, s string) Step { // path & string
}
}
// FileOwnerExpect takes a path and a uid to expect from that file, and builds a
// Step that checks that out of them.
func FileOwnerExpect(p, o string) Step { // path & owner
return &manualStep{
action: func() error { return nil },
expect: func() error {
var stat syscall.Stat_t
if err := syscall.Stat(p, &stat); err != nil {
return err
}
i, err := strconv.ParseUint(o, 10, 32)
if err != nil {
return err
}
if i != uint64(stat.Uid) {
return fmt.Errorf("file uid did not match in %s", p)
}
return nil
},
}
}
// FileWrite takes a path and a string to write to that file, and builds a Step
// that does that to them.
func FileWrite(p, s string) Step { // path & string
@@ -195,6 +220,15 @@ func ErrIsNotExistOK(e error) error {
return errwrap.Wrapf(e, "unexpected error")
}
// GetUID returns the UID of the user running this test.
func GetUID() (string, error) {
u, err := user.Lookup(os.Getenv("USER"))
if err != nil {
return "", err
}
return u.Uid, nil
}
func TestResources1(t *testing.T) {
type test struct { // an individual test
name string
@@ -335,6 +369,33 @@ func TestResources1(t *testing.T) {
cleanup: func() error { return os.Remove(p) },
})
}
{
r := makeRes("file", "r1")
res := r.(*FileRes) // if this panics, the test will panic
p := "/tmp/ownerfile"
uid, _ := GetUID()
res.Path = p
res.State = FileStateExists
res.Owner = uid
content := "some test file owned by uid " + uid
timeline := []Step{
NewStartupStep(1000 * 60), // startup
NewChangedStep(1000*60, true), // did we do something?
FileExpect(p, content), // check file content
FileOwnerExpect(p, uid), // check uid of the file
}
testCases = append(testCases, test{
name: "uid test file",
res: res,
fail: false,
timeline: timeline,
expect: func() error { return nil },
startup: func() error { return ioutil.WriteFile(p, []byte(content), 0666) },
cleanup: func() error { return os.Remove(p) },
})
}
names := []string{}
for index, tc := range testCases { // run all the tests