77 lines
1.9 KiB
Go
77 lines
1.9 KiB
Go
//go:build linux || darwin
|
|
|
|
package chunkplan
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
"syscall"
|
|
"testing"
|
|
)
|
|
|
|
func TestFilesystemStorePermissions(t *testing.T) {
|
|
for _, test := range []struct {
|
|
name string
|
|
umask int
|
|
dirMode os.FileMode
|
|
fileMode os.FileMode
|
|
}{
|
|
{name: "private", umask: 0o077, dirMode: 0o700, fileMode: 0o600},
|
|
{name: "group", umask: 0o007, dirMode: 0o770, fileMode: 0o660},
|
|
} {
|
|
t.Run(test.name, func(t *testing.T) {
|
|
previousUmask := syscall.Umask(test.umask)
|
|
defer syscall.Umask(previousUmask)
|
|
|
|
root := filepath.Join(t.TempDir(), "plans")
|
|
store := newStore(t, root)
|
|
if err := store.Save(testRecord(t, 1)); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
digestDir := filepath.Join(root, strings.TrimPrefix(testSourceDigest, "sha256:"))
|
|
for path, want := range map[string]os.FileMode{
|
|
root: test.dirMode,
|
|
digestDir: test.dirMode,
|
|
filepath.Join(digestDir, "plan.json"): test.fileMode,
|
|
} {
|
|
assertStorePermissions(t, path, want)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestFilesystemStoreLeavesExistingDirectoriesUntouched(t *testing.T) {
|
|
previousUmask := syscall.Umask(0o077)
|
|
defer syscall.Umask(previousUmask)
|
|
|
|
root := filepath.Join(t.TempDir(), "plans")
|
|
digestDir := filepath.Join(root, strings.TrimPrefix(testSourceDigest, "sha256:"))
|
|
syscall.Umask(0)
|
|
if err := os.Mkdir(root, 0o751); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if err := os.Mkdir(digestDir, 0o753); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
syscall.Umask(0o077)
|
|
|
|
store := newStore(t, root)
|
|
if err := store.Save(testRecord(t, 1)); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
assertStorePermissions(t, root, 0o751)
|
|
assertStorePermissions(t, digestDir, 0o753)
|
|
}
|
|
|
|
func assertStorePermissions(t *testing.T, path string, want os.FileMode) {
|
|
t.Helper()
|
|
info, err := os.Stat(path)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if got := info.Mode().Perm(); got != want {
|
|
t.Fatalf("%s mode = %#o, want %#o", path, got, want)
|
|
}
|
|
}
|