github.com/opencontainers/umoci@v0.4.8-0.20240508124516-656e4836fb0d/oci/layer/generate_linux_test.go (about) 1 //go:build linux 2 // +build linux 3 4 package layer 5 6 import ( 7 "archive/tar" 8 "io" 9 "io/ioutil" 10 "os" 11 "path" 12 "testing" 13 14 "github.com/opencontainers/umoci/pkg/fseval" 15 "github.com/opencontainers/umoci/pkg/system" 16 "github.com/stretchr/testify/assert" 17 "github.com/vbatts/go-mtree" 18 "golang.org/x/sys/unix" 19 ) 20 21 func TestInsertLayerTranslateOverlayWhiteouts(t *testing.T) { 22 assert := assert.New(t) 23 dir, err := ioutil.TempDir("", "umoci-TestTranslateOverlayWhiteouts") 24 assert.NoError(err) 25 defer os.RemoveAll(dir) 26 27 mknodOk, err := canMknod(dir) 28 if err != nil { 29 t.Fatalf("couldn't mknod in dir: %v", err) 30 } 31 32 if !mknodOk { 33 t.Skip("skipping overlayfs test on kernel < 5.8") 34 } 35 36 testNode := path.Join(dir, "test") 37 err = system.Mknod(testNode, unix.S_IFCHR|0666, unix.Mkdev(0, 0)) 38 assert.NoError(err) 39 40 packOptions := RepackOptions{TranslateOverlayWhiteouts: true} 41 reader := GenerateInsertLayer(dir, "/", false, &packOptions) 42 defer reader.Close() 43 44 tr := tar.NewReader(reader) 45 hdr, err := tr.Next() 46 assert.NoError(err) 47 assert.Equal(hdr.Name, "/") 48 49 hdr, err = tr.Next() 50 assert.NoError(err) 51 52 assert.Equal(int32(hdr.Typeflag), int32(tar.TypeReg)) 53 assert.Equal(hdr.Name, whPrefix+"test") 54 _, err = tr.Next() 55 assert.Equal(err, io.EOF) 56 } 57 58 func TestGenerateLayerTranslateOverlayWhiteouts(t *testing.T) { 59 assert := assert.New(t) 60 dir, err := ioutil.TempDir("", "umoci-TestTranslateOverlayWhiteouts") 61 assert.NoError(err) 62 defer os.RemoveAll(dir) 63 64 mknodOk, err := canMknod(dir) 65 if err != nil { 66 t.Fatalf("couldn't mknod in dir: %v", err) 67 } 68 69 if !mknodOk { 70 t.Skip("skipping overlayfs test on kernel < 5.8") 71 } 72 73 testNode := path.Join(dir, "test") 74 err = system.Mknod(testNode, unix.S_IFCHR|0666, unix.Mkdev(0, 0)) 75 assert.NoError(err) 76 77 packOptions := RepackOptions{TranslateOverlayWhiteouts: true} 78 // something reasonable 79 mtreeKeywords := []mtree.Keyword{ 80 "size", 81 "type", 82 "uid", 83 "gid", 84 "mode", 85 } 86 deltas, err := mtree.Check(dir, nil, mtreeKeywords, fseval.Default) 87 assert.NoError(err) 88 89 reader, err := GenerateLayer(dir, deltas, &packOptions) 90 assert.NoError(err) 91 defer reader.Close() 92 93 tr := tar.NewReader(reader) 94 95 hdr, err := tr.Next() 96 assert.NoError(err) 97 98 assert.Equal(int32(hdr.Typeflag), int32(tar.TypeReg)) 99 assert.Equal(path.Base(hdr.Name), whPrefix+"test") 100 _, err = tr.Next() 101 assert.Equal(err, io.EOF) 102 }