aboutsummaryrefslogtreecommitdiffstats
path: root/client/go/internal/osutil/fix_fs_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'client/go/internal/osutil/fix_fs_test.go')
-rw-r--r--client/go/internal/osutil/fix_fs_test.go144
1 files changed, 144 insertions, 0 deletions
diff --git a/client/go/internal/osutil/fix_fs_test.go b/client/go/internal/osutil/fix_fs_test.go
new file mode 100644
index 00000000000..792986d7996
--- /dev/null
+++ b/client/go/internal/osutil/fix_fs_test.go
@@ -0,0 +1,144 @@
+// Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package osutil
+
+import (
+ "os"
+ "os/user"
+ "path/filepath"
+ "strconv"
+ "testing"
+
+ "github.com/stretchr/testify/assert"
+ "github.com/vespa-engine/vespa/client/go/internal/admin/trace"
+ "github.com/vespa-engine/vespa/client/go/internal/ioutil"
+)
+
+func setup(t *testing.T) string {
+ tt := t.TempDir()
+ tmpDir, _ := filepath.EvalSymlinks(tt)
+ err := os.MkdirAll(tmpDir+"/a", 0755)
+ assert.Nil(t, err)
+ err = os.MkdirAll(tmpDir+"/a/bad", 0)
+ assert.Nil(t, err)
+ err = os.WriteFile(tmpDir+"/a/f1", []byte{10}, 0644)
+ assert.Nil(t, err)
+ err = os.WriteFile(tmpDir+"/a/f2", []byte{10}, 0111)
+ return tmpDir
+}
+
+func testFixSpec(t *testing.T, spec FixSpec) {
+ tmpDir := setup(t)
+ spec.FixDir(tmpDir + "/a")
+ spec.FixDir(tmpDir + "/b")
+ spec.FixDir(tmpDir + "/a/bad")
+ spec.FixDir(tmpDir + "/a/bad/ok")
+ spec.FixFile(tmpDir + "/a/f1")
+ spec.FixFile(tmpDir + "/a/f2")
+ spec.FixFile(tmpDir + "/a/f3")
+ spec.FixFile(tmpDir + "/b/f4")
+ spec.FixFile(tmpDir + "/a/bad/f5")
+ assert.Equal(t, true, ioutil.IsDir(tmpDir+"/a"))
+ assert.Equal(t, true, ioutil.IsDir(tmpDir+"/b"))
+ assert.Equal(t, true, ioutil.IsDir(tmpDir+"/a/bad"))
+ assert.Equal(t, true, ioutil.IsDir(tmpDir+"/a/bad/ok"))
+ assert.Equal(t, true, ioutil.IsFile(tmpDir+"/a/f1"))
+ assert.Equal(t, true, ioutil.IsFile(tmpDir+"/a/f2"))
+ assert.Equal(t, false, ioutil.IsFile(tmpDir+"/a/f3"))
+ assert.Equal(t, false, ioutil.IsFile(tmpDir+"/b/f4"))
+ assert.Equal(t, false, ioutil.IsFile(tmpDir+"/a/bad/f5"))
+
+ info, err := os.Stat(tmpDir + "/a")
+ assert.Nil(t, err)
+ assert.Equal(t, true, info.IsDir())
+ assert.Equal(t, 0755, int(info.Mode())&0777)
+
+ info, err = os.Stat(tmpDir + "/b")
+ assert.Nil(t, err)
+ assert.Equal(t, true, info.IsDir())
+ assert.Equal(t, 0755, int(info.Mode())&0777)
+
+ info, err = os.Stat(tmpDir + "/a/bad")
+ assert.Nil(t, err)
+ assert.Equal(t, true, info.IsDir())
+ assert.Equal(t, 0755, int(info.Mode())&0777)
+
+ info, err = os.Stat(tmpDir + "/a/bad/ok")
+ assert.Nil(t, err)
+ assert.Equal(t, true, info.IsDir())
+ assert.Equal(t, 0755, int(info.Mode())&0777)
+
+ info, err = os.Stat(tmpDir + "/a/f1")
+ assert.Nil(t, err)
+ assert.Equal(t, false, info.IsDir())
+ assert.Equal(t, 0644, int(info.Mode())&0777)
+
+ info, err = os.Stat(tmpDir + "/a/f2")
+ assert.Nil(t, err)
+ assert.Equal(t, false, info.IsDir())
+ assert.Equal(t, 0644, int(info.Mode())&0777)
+}
+
+func TestSimpleFixes(t *testing.T) {
+ testFixSpec(t, NewFixSpec())
+}
+
+func TestSuperUserOnly(t *testing.T) {
+ trace.AdjustVerbosity(0)
+ var userId int = -1
+ var groupId int = -1
+ if os.Getuid() != 0 {
+ trace.Trace("skip TestSuperUserOnly, uid != 0")
+ return
+ }
+ u, err := user.Current()
+ if u.Username != "root" {
+ trace.Trace("skip TestSuperUserOnly, user != root")
+ return
+ }
+ u, err = user.Lookup("nobody")
+ if err != nil {
+ trace.Trace("skip TestSuperUserOnly, user nobody was not found")
+ return
+ }
+ userId, err = strconv.Atoi(u.Uid)
+ if err != nil || userId < 1 {
+ trace.Trace("skip TestSuperUserOnly, user ID of nobody was not found")
+ return
+ }
+ g, err := user.LookupGroup("users")
+ if err == nil {
+ groupId, _ = strconv.Atoi(g.Gid)
+ }
+ fixSpec := NewFixSpec()
+ fixSpec.UserId = userId
+ if groupId > 0 {
+ fixSpec.GroupId = groupId
+ }
+ testFixSpec(t, fixSpec)
+}
+
+func expectSimplePanic() {
+ if r := recover(); r != nil {
+ if jee, ok := r.(*ExitError); ok {
+ trace.Trace("got as expected:", jee)
+ return
+ }
+ panic(r)
+ }
+}
+
+func TestFailedFixdir(t *testing.T) {
+ tmpDir := setup(t)
+ spec := NewFixSpec()
+ defer expectSimplePanic()
+ spec.FixDir(tmpDir + "/a/f1")
+ assert.Equal(t, "", "should not be reached")
+}
+
+func TestFailedFixfile(t *testing.T) {
+ tmpDir := setup(t)
+ spec := NewFixSpec()
+ defer expectSimplePanic()
+ spec.FixFile(tmpDir + "/a")
+ assert.Equal(t, "", "should not be reached")
+}