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.
90 lines
2.0 KiB
Go
90 lines
2.0 KiB
Go
package mkdir
|
|
|
|
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_OverlayMkdir(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
overlayName string
|
|
dirName string
|
|
perm string
|
|
wantErr bool
|
|
system bool
|
|
}{
|
|
{
|
|
name: "simple mkdir",
|
|
overlayName: "test-overlay",
|
|
dirName: "testdir",
|
|
perm: "0755",
|
|
wantErr: false,
|
|
system: false,
|
|
},
|
|
{
|
|
name: "system overlay mkdir",
|
|
overlayName: "wwinit", // A known system overlay
|
|
dirName: "init.d",
|
|
perm: "0700",
|
|
wantErr: false,
|
|
system: true,
|
|
},
|
|
}
|
|
|
|
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)
|
|
err := os.MkdirAll(overlayDir, 0755)
|
|
assert.NoError(t, err)
|
|
} else {
|
|
overlayDir = filepath.Join(conf.Paths.WWOverlaydir, tt.overlayName)
|
|
err := os.MkdirAll(overlayDir, 0755)
|
|
assert.NoError(t, err)
|
|
}
|
|
|
|
baseCmd := GetCommand()
|
|
baseCmd.SetArgs([]string{"-m", tt.perm, tt.overlayName, tt.dirName})
|
|
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)
|
|
}
|
|
dirPath := filepath.Join(overlayDir, tt.dirName)
|
|
stat, err := os.Stat(dirPath)
|
|
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())
|
|
}
|
|
})
|
|
}
|
|
}
|