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 }