github.com/mgoltzsche/ctnr@v0.7.1-alpha/pkg/fs/writer/dirwriter_test.go (about)

     1  package writer
     2  
     3  import (
     4  	"io/ioutil"
     5  	"log"
     6  	"os"
     7  	"path/filepath"
     8  	"testing"
     9  
    10  	"github.com/mgoltzsche/ctnr/pkg/fs"
    11  	"github.com/mgoltzsche/ctnr/pkg/fs/testutils"
    12  	"github.com/stretchr/testify/require"
    13  )
    14  
    15  func TestDirWriter(t *testing.T) {
    16  	tmpDir, err := ioutil.TempDir("", "ctnr-test-dirfswriter-")
    17  	require.NoError(t, err)
    18  	defer os.RemoveAll(tmpDir)
    19  	opts := fs.NewFSOptions(true)
    20  	warn := log.New(os.Stdout, "warn: ", 0)
    21  	rootfs := filepath.Join(tmpDir, "rootfs")
    22  
    23  	testee := NewDirWriter(rootfs, opts, warn)
    24  	testutils.WriteTestFileSystem(t, testee)
    25  	err = testee.Close()
    26  	require.NoError(t, err)
    27  
    28  	testutils.AssertFsState(t, rootfs, "", testutils.MtreeTestkeywordsWithTarTime, testutils.ExpectedTestfsState)
    29  
    30  	// Test fs boundaries
    31  	fileOutsideRootfs := filepath.Join(tmpDir, "outsiderootfs")
    32  	err = ioutil.WriteFile(fileOutsideRootfs, []byte{}, 0644)
    33  	require.NoError(t, err)
    34  	err = testee.Link("etc/link-invalid", fileOutsideRootfs)
    35  	if err == nil {
    36  		t.Errorf("should return error when linking outside rootfs boundaries")
    37  		t.FailNow()
    38  	}
    39  
    40  	invalidSymlinkFile := filepath.Join(rootfs, "etc", "symlink-invalid")
    41  	err = os.Symlink(filepath.Join("..", ".."), invalidSymlinkFile)
    42  	require.NoError(t, err)
    43  	_, err = testee.File("etc/symlink-invalid/filefrominvalidsymlink", testutils.NewSourceMock(fs.TypeFile, fs.FileAttrs{Mode: 0644, Size: 11}, ""))
    44  	if err != nil {
    45  		t.Errorf("should not return error when attempting write linked outside rootfs boundaries (/etc/symlink-invalid/filefrominvalidsymlink) but was: %s", err)
    46  		t.FailNow()
    47  	}
    48  	_, err = os.Stat(filepath.Join(rootfs, "filefrominvalidsymlink"))
    49  	require.NoError(t, err, "invalid symlink parent resolution")
    50  	err = os.Remove(invalidSymlinkFile)
    51  	require.NoError(t, err)
    52  
    53  	// Test testee reuses existing dir
    54  	testee = NewDirWriter(rootfs, opts, warn)
    55  	err = testee.Dir(".", "", fs.FileAttrs{Mode: os.ModeDir | 0755})
    56  	require.NoError(t, err)
    57  }