99 lines
2.5 KiB
Go
99 lines
2.5 KiB
Go
//go:build linux || darwin
|
|
|
|
package checkpoint
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
"syscall"
|
|
"testing"
|
|
|
|
"gitea.maximumdirect.net/eric/notarius/internal/core/source"
|
|
)
|
|
|
|
func TestFilesystemCheckpointPermissionsFollowUmask(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(), "checkpoints")
|
|
identity, err := NewIdentity(representativeIdentityInput())
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
recorder, err := NewFilesystemRecorder(root, identity)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if err := recorder.SourceSucceeded("source-module", sourceDocumentForPermissions()); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
relative, err := identity.RelativePath()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
identityRoot := filepath.Join(root, filepath.FromSlash(relative))
|
|
sourceRoot := filepath.Join(identityRoot, "source")
|
|
for path, want := range map[string]os.FileMode{
|
|
root: test.dirMode,
|
|
identityRoot: test.dirMode,
|
|
sourceRoot: test.dirMode,
|
|
filepath.Join(sourceRoot, "manifest.json"): test.fileMode,
|
|
filepath.Join(sourceRoot, "source-document.json"): test.fileMode,
|
|
} {
|
|
assertCheckpointPermissions(t, path, want)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestFilesystemCheckpointLeavesExistingRootUntouched(t *testing.T) {
|
|
previousUmask := syscall.Umask(0o077)
|
|
defer syscall.Umask(previousUmask)
|
|
|
|
root := filepath.Join(t.TempDir(), "checkpoints")
|
|
syscall.Umask(0)
|
|
if err := os.Mkdir(root, 0o751); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
syscall.Umask(0o077)
|
|
identity, err := NewIdentity(representativeIdentityInput())
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
recorder, err := NewFilesystemRecorder(root, identity)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if err := recorder.SourceSucceeded("source-module", sourceDocumentForPermissions()); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
assertCheckpointPermissions(t, root, 0o751)
|
|
}
|
|
|
|
func sourceDocumentForPermissions() *source.SourceDocument {
|
|
document := checkpointDocument()
|
|
return &document
|
|
}
|
|
|
|
func assertCheckpointPermissions(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)
|
|
}
|
|
}
|