1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
|
// Copyright (c) 2021-2023, Sylabs Inc. All rights reserved.
// This software is licensed under a 3-clause BSD license. Please consult the
// LICENSE.md file distributed with the sources of this project regarding your
// rights to use or distribute this software.
package archive
import (
"os"
"path"
"path/filepath"
"testing"
"github.com/sylabs/singularity/v4/internal/pkg/test"
"github.com/sylabs/singularity/v4/internal/pkg/util/fs"
)
func TestCopyWithTar(t *testing.T) {
t.Run("unprivileged", func(t *testing.T) {
test.DropPrivilege(t)
defer test.ResetPrivilege(t)
testCopyWithTar(t)
})
}
func testCopyWithTar(t *testing.T) {
srcRoot := t.TempDir()
t.Logf("srcRoot location: %s\n", srcRoot)
// Source Files
srcFile := filepath.Join(srcRoot, "srcFile")
if err := os.WriteFile(srcFile, []byte("test"), 0o644); err != nil {
t.Fatal(err)
}
// Source Dirs
srcDir := filepath.Join(srcRoot, "srcDir")
if err := os.Mkdir(srcDir, 0o755); err != nil {
t.Fatal(err)
}
// Source Symlink
srcLink := filepath.Join(srcRoot, "srcLink")
if err := os.Symlink("srcFile", srcLink); err != nil {
t.Fatal(err)
}
dstRoot := t.TempDir()
t.Logf("dstRoot location: %s\n", dstRoot)
// Perform the actual copy to a subdir of our dst tempdir.
// This ensures CopyWithTar has to create the dest directory, which is
// where the non-wrapped call would fail for unprivileged users.
err := CopyWithTar(srcRoot, path.Join(dstRoot, "dst"), false)
if err != nil {
t.Fatalf("Error during CopyWithTar: %v", err)
}
tests := []struct {
name string
expectPath string
expectFile bool
expectDir bool
expectLink bool
}{
{
name: "file",
expectPath: "dst/srcFile",
expectFile: true,
},
{
name: "dir",
expectPath: "dst/srcDir",
expectDir: true,
},
{
name: "symlink",
expectPath: "dst/srcLink",
expectFile: true,
expectLink: true,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
dstFinal := filepath.Join(dstRoot, tt.expectPath)
// verify file was copied
_, err = os.Stat(dstFinal)
if err != nil && !os.IsNotExist(err) {
t.Fatalf("while checking for destination file: %s", err)
}
if os.IsNotExist(err) {
t.Errorf("expected destination %s does not exist", dstFinal)
}
// File when expected?
if tt.expectFile && !fs.IsFile(dstFinal) {
t.Errorf("destination %s should be a file, but isn't", dstFinal)
}
// Dir when expected?
if tt.expectDir && !fs.IsDir(dstFinal) {
t.Errorf("destination %s should be a directory, but isn't", dstFinal)
}
// Symlink when expected
if tt.expectLink && !fs.IsLink(dstFinal) {
t.Errorf("destination %s should be a symlink, but isn't", dstFinal)
}
if !tt.expectLink && fs.IsLink(dstFinal) {
t.Errorf("destination %s should be a symlink, but is", dstFinal)
}
})
}
}
|