@@ -25,9 +25,17 @@ import (
2525 "strings"
2626 "testing"
2727
28+ "github.com/Sirupsen/logrus"
2829 "github.com/opencontainers/go-digest"
30+ "github.com/pkg/errors"
31+
32+ bz2 "github.com/dsnet/compress/bzip2"
2933)
3034
35+ func init () {
36+ logrus .SetLevel (logrus .DebugLevel )
37+ }
38+
3139func TestUnpackLayerDuplicateEntries (t * testing.T ) {
3240 tmp1 , err := ioutil .TempDir ("" , "test-dup" )
3341 if err != nil {
@@ -60,12 +68,12 @@ func TestUnpackLayerDuplicateEntries(t *testing.T) {
6068 t .Fatal (err )
6169 }
6270 defer os .RemoveAll (tmp2 )
63- if err := unpackLayer (tmp2 , r ); err != nil && ! strings .Contains (err .Error (), "duplicate entry for" ) {
71+ if err := unpackLayer ("application/vnd.oci.image.layer.v1.tar+gzip" , f . Name (), tmp2 , r ); err != nil && ! strings .Contains (err .Error (), "duplicate entry for" ) {
6472 t .Fatalf ("Expected to fail with duplicate entry, got %v" , err )
6573 }
6674}
6775
68- func TestUnpackLayer (t * testing.T ) {
76+ func testUnpackLayer (t * testing.T , compression string , invalid bool ) {
6977 tmp1 , err := ioutil .TempDir ("" , "test-layer" )
7078 if err != nil {
7179 t .Fatal (err )
@@ -81,14 +89,34 @@ func TestUnpackLayer(t *testing.T) {
8189 t .Fatal (err )
8290 }
8391
84- gw := gzip .NewWriter (f )
85- tw := tar .NewWriter (gw )
92+ var writer io.WriteCloser = f
93+
94+ if ! invalid {
95+ switch compression {
96+ case "gzip" :
97+ writer = gzip .NewWriter (f )
98+ case "bzip2" :
99+ writer , err = bz2 .NewWriter (f , nil )
100+ if err != nil {
101+ t .Fatal (errors .Wrap (err , "compiling bzip compressor" ))
102+ }
103+ }
104+ } else if invalid && compression == "" {
105+ writer = gzip .NewWriter (f )
106+ }
107+
108+ tw := tar .NewWriter (writer )
109+
110+ if headerErr := tw .WriteHeader (& tar.Header {Name : "test" , Size : 4 , Mode : 0600 }); headerErr != nil {
111+ t .Fatal (headerErr )
112+ }
113+
114+ if _ , copyErr := io .Copy (tw , bytes .NewReader ([]byte ("test" ))); copyErr != nil {
115+ t .Fatal (copyErr )
116+ }
86117
87- tw .WriteHeader (& tar.Header {Name : "test" , Size : 4 , Mode : 0600 })
88- io .Copy (tw , bytes .NewReader ([]byte ("test" )))
89118 tw .Close ()
90- gw .Close ()
91- f .Close ()
119+ writer .Close ()
92120
93121 digester := digest .SHA256 .Digester ()
94122 file , err := os .Open (tarfile )
@@ -100,28 +128,44 @@ func TestUnpackLayer(t *testing.T) {
100128 if err != nil {
101129 t .Fatal (err )
102130 }
103- err = os .Rename (tarfile , filepath .Join (tmp1 , "blobs" , "sha256" , digester .Digest ().Hex ()))
104- if err != nil {
105- t .Fatal (err )
131+
132+ blobPath := filepath .Join (tmp1 , "blobs" , "sha256" , digester .Digest ().Hex ())
133+
134+ if renameErr := os .Rename (tarfile , blobPath ); renameErr != nil {
135+ t .Fatal (errors .Wrap (renameErr , blobPath ))
136+ }
137+
138+ mediatype := "application/vnd.oci.image.layer.v1.tar"
139+ if compression != "" {
140+ mediatype += "+" + compression
106141 }
107142
108143 testManifest := manifest {
109144 Layers : []descriptor {descriptor {
110- MediaType : "application/vnd.oci.image.layer.v1.tar+gzip" ,
145+ MediaType : mediatype ,
111146 Digest : digester .Digest ().String (),
112147 }},
113148 }
114149 err = testManifest .unpack (newPathWalker (tmp1 ), filepath .Join (tmp1 , "rootfs" ))
115150 if err != nil {
116- t .Fatal (err )
151+ t .Fatal (errors . Wrapf ( err , "%q / %s" , blobPath , compression ) )
117152 }
118153
119154 _ , err = os .Stat (filepath .Join (tmp1 , "rootfs" , "test" ))
120155 if err != nil {
121- t .Fatal (err )
156+ t .Fatal (errors . Wrapf ( err , "%q / %s" , blobPath , compression ) )
122157 }
123158}
124159
160+ func TestUnpackLayer (t * testing.T ) {
161+ testUnpackLayer (t , "gzip" , true )
162+ testUnpackLayer (t , "gzip" , false )
163+ testUnpackLayer (t , "" , true )
164+ testUnpackLayer (t , "" , false )
165+ testUnpackLayer (t , "bzip2" , true )
166+ testUnpackLayer (t , "bzip2" , false )
167+ }
168+
125169func TestUnpackLayerRemovePartialyUnpackedFile (t * testing.T ) {
126170 // generate a tar file has duplicate entry which will failed on unpacking
127171 tmp1 , err := ioutil .TempDir ("" , "test-layer" )
0 commit comments