overlay.GetOverlay(name) returns now an error if the overlay doesn't exist. This is the most canonical way to act if there is no overlay.
96 lines
2.2 KiB
Go
96 lines
2.2 KiB
Go
package chmod
|
|
|
|
import (
|
|
"bytes"
|
|
"io/fs"
|
|
"os"
|
|
"path/filepath"
|
|
"strconv"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/warewulf/warewulf/internal/pkg/testenv"
|
|
"github.com/warewulf/warewulf/internal/pkg/warewulfd"
|
|
)
|
|
|
|
func Test_OverlayChmod(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
overlayName string
|
|
fileName string
|
|
perm string
|
|
wantErr bool
|
|
system bool
|
|
startPerm fs.FileMode
|
|
}{
|
|
{
|
|
name: "simple chmod",
|
|
overlayName: "test-overlay",
|
|
fileName: "test.txt",
|
|
perm: "0600",
|
|
wantErr: false,
|
|
system: false,
|
|
startPerm: 0644,
|
|
},
|
|
{
|
|
name: "system overlay chmod",
|
|
overlayName: "wwinit", // A known system overlay
|
|
fileName: "init.sh",
|
|
perm: "0700",
|
|
wantErr: false,
|
|
system: true,
|
|
startPerm: 0755,
|
|
},
|
|
}
|
|
|
|
warewulfd.SetNoDaemon()
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
env := testenv.New(t)
|
|
conf := env.Configure()
|
|
|
|
// Setup overlay
|
|
var overlayDir string
|
|
if tt.system {
|
|
overlayDir = filepath.Join(conf.Paths.DistributionOverlaydir(), tt.overlayName)
|
|
} else {
|
|
overlayDir = filepath.Join(conf.Paths.WWOverlaydir, tt.overlayName)
|
|
}
|
|
err := os.MkdirAll(overlayDir, 0755)
|
|
assert.NoError(t, err)
|
|
filePath := filepath.Join(overlayDir, tt.fileName)
|
|
err = os.WriteFile(filePath, []byte("test"), tt.startPerm)
|
|
assert.NoError(t, err)
|
|
|
|
baseCmd := GetCommand()
|
|
baseCmd.SetArgs([]string{tt.overlayName, tt.fileName, tt.perm})
|
|
buf := new(bytes.Buffer)
|
|
baseCmd.SetOut(buf)
|
|
baseCmd.SetErr(buf)
|
|
err = baseCmd.Execute()
|
|
|
|
if tt.wantErr {
|
|
assert.Error(t, err)
|
|
} else {
|
|
assert.NoError(t, err)
|
|
}
|
|
|
|
// Check permissions
|
|
// for system overlays, the file is copied to a site overlay
|
|
if tt.system {
|
|
overlayDir = filepath.Join(conf.Paths.WWOverlaydir, tt.overlayName)
|
|
filePath = filepath.Join(overlayDir, tt.fileName)
|
|
}
|
|
stat, err := os.Stat(filePath)
|
|
assert.NoError(t, err)
|
|
if !tt.wantErr {
|
|
mode, err := strconv.ParseUint(tt.perm, 8, 32)
|
|
assert.NoError(t, err)
|
|
assert.Equal(t, fs.FileMode(mode), stat.Mode().Perm())
|
|
} else {
|
|
assert.Equal(t, tt.startPerm, stat.Mode().Perm())
|
|
}
|
|
})
|
|
}
|
|
}
|