github.com/uber/kraken@v0.1.4/lib/dockerregistry/storage_driver_test.go (about) 1 // Copyright (c) 2016-2019 Uber Technologies, Inc. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 package dockerregistry 15 16 import ( 17 "context" 18 "fmt" 19 "io/ioutil" 20 "log" 21 "math/rand" 22 "testing" 23 "time" 24 25 "github.com/uber/kraken/core" 26 "github.com/stretchr/testify/require" 27 ) 28 29 func TestStorageDriverGetContent(t *testing.T) { 30 td, cleanup := newTestDriver() 31 defer cleanup() 32 33 sd, testImage := td.setup() 34 35 var sa startedAtMetadata 36 if err := td.cas.GetUploadFileMetadata(testImage.upload, &sa); err != nil { 37 log.Panic(err) 38 } 39 uploadTime, err := sa.Serialize() 40 if err != nil { 41 log.Panic(err) 42 } 43 44 testCases := []struct { 45 input string 46 data []byte 47 err error 48 }{ 49 {genLayerLinkPath(testImage.layer1.Digest.Hex()), []byte(testImage.layer1.Digest.String()), nil}, 50 {genUploadStartedAtPath(testImage.upload), uploadTime, nil}, 51 {genUploadHashStatesPath(testImage.upload), []byte(hashStateContent), nil}, 52 {genManifestTagCurrentLinkPath(testImage.repo, testImage.tag, testImage.manifest), []byte("sha256:" + testImage.manifest), nil}, 53 {genManifestRevisionLinkPath(testImage.repo, testImage.manifest), []byte("sha256:" + testImage.manifest), nil}, 54 {genBlobDataPath(testImage.layer1.Digest.Hex()), testImage.layer1.Content, nil}, 55 } 56 57 for _, tc := range testCases { 58 t.Run(fmt.Sprintf("GetContent %s", tc.input), func(t *testing.T) { 59 require := require.New(t) 60 data, err := sd.GetContent(contextFixture(), tc.input) 61 if tc.err == nil { 62 require.NoError(err) 63 return 64 } 65 require.Equal(tc.data, data) 66 require.Equal(tc.err, err) 67 }) 68 } 69 } 70 71 func TestStorageDriverReader(t *testing.T) { 72 td, cleanup := newTestDriver() 73 defer cleanup() 74 75 sd, testImage := td.setup() 76 77 testCases := []struct { 78 input string 79 data []byte 80 err error 81 }{ 82 {genUploadDataPath(testImage.upload), []byte(uploadContent), nil}, 83 {genBlobDataPath(testImage.layer1.Digest.Hex()), testImage.layer1.Content, nil}, 84 } 85 86 for _, tc := range testCases { 87 t.Run(fmt.Sprintf("GetReader %s", tc.input), func(t *testing.T) { 88 require := require.New(t) 89 reader, err := sd.Reader(contextFixture(), tc.input, 0) 90 data, err := ioutil.ReadAll(reader) 91 require.Equal(tc.data, data) 92 require.Equal(tc.err, err) 93 }) 94 } 95 } 96 97 func TestStorageDriverPutContent(t *testing.T) { 98 td, cleanup := newTestDriver() 99 defer cleanup() 100 101 sd, testImage := td.setup() 102 103 r := rand.New(rand.NewSource(time.Now().UnixNano())) 104 imageID := r.Int() 105 repo := fmt.Sprintf("repo-%d", imageID) 106 tag := fmt.Sprintf("tag-%d", imageID) 107 upload := fmt.Sprintf("upload-%d", imageID) 108 109 testCases := []struct { 110 inputPath string 111 inputContent []byte 112 err error 113 }{ 114 {genUploadStartedAtPath(upload), nil, nil}, 115 {genUploadHashStatesPath(testImage.upload), []byte{}, nil}, 116 {genLayerLinkPath(testImage.layer1.Digest.Hex()), nil, nil}, 117 {genBlobDataPath(testImage.layer1.Digest.Hex()), testImage.layer1.Content, nil}, 118 {genManifestRevisionLinkPath(repo, testImage.manifest), nil, nil}, 119 {genManifestTagShaLinkPath(repo, tag, testImage.manifest), nil, nil}, 120 {genManifestTagCurrentLinkPath(repo, tag, testImage.manifest), nil, nil}, 121 } 122 123 for _, tc := range testCases { 124 t.Run(fmt.Sprintf("PutContent %s", tc.inputPath), func(t *testing.T) { 125 require.Equal(t, tc.err, sd.PutContent(contextFixture(), tc.inputPath, tc.inputContent)) 126 }) 127 } 128 129 // TODO (@evelynl): check content written 130 } 131 132 func TestStorageDriverWriter(t *testing.T) { 133 td, cleanup := newTestDriver() 134 defer cleanup() 135 136 sd, testImage := td.setup() 137 138 testCases := []struct { 139 input string 140 data []byte 141 err error 142 }{ 143 {genUploadDataPath(testImage.upload), []byte(uploadContent), nil}, 144 {genBlobDataPath(testImage.layer1.Digest.Hex()), nil, InvalidRequestError{genBlobDataPath(testImage.layer1.Digest.Hex())}}, 145 } 146 147 content := []byte("this is a test for upload writer") 148 for _, tc := range testCases { 149 t.Run(fmt.Sprintf("GetWriter %s", tc.input), func(t *testing.T) { 150 require := require.New(t) 151 w, err := sd.Writer(contextFixture(), tc.input, false) 152 require.Equal(tc.err, err) 153 if err != nil { 154 return 155 } 156 w.Write(content) 157 w.Close() 158 r, err := sd.Reader(contextFixture(), tc.input, 0) 159 require.NoError(err) 160 defer r.Close() 161 data, err := ioutil.ReadAll(r) 162 require.NoError(err) 163 require.Equal(content, data) 164 }) 165 } 166 } 167 168 func TestStorageDriverStat(t *testing.T) { 169 td, cleanup := newTestDriver() 170 defer cleanup() 171 172 sd, testImage := td.setup() 173 174 testCases := []struct { 175 input string 176 path string 177 size int64 178 err error 179 }{ 180 {genBlobDataPath(testImage.layer1.Digest.Hex()), testImage.layer1.Digest.Hex(), int64(len(testImage.layer1.Content)), nil}, 181 {genUploadDataPath(testImage.upload), testImage.upload, int64(len(uploadContent)), nil}, 182 } 183 184 for _, tc := range testCases { 185 t.Run(fmt.Sprintf("GetStat %s", tc.input), func(t *testing.T) { 186 require := require.New(t) 187 fi, err := sd.Stat(contextFixture(), tc.input) 188 require.Equal(tc.err, err) 189 if err != nil { 190 return 191 } 192 require.Equal(tc.path, fi.Path()) 193 require.Equal(tc.size, fi.Size()) 194 }) 195 } 196 } 197 198 func TestStorageDriverList(t *testing.T) { 199 td, cleanup := newTestDriver() 200 defer cleanup() 201 202 sd, testImage := td.setup() 203 204 testCases := []struct { 205 input string 206 list []string 207 err error 208 }{ 209 {genUploadHashStatesPath(testImage.upload), []string{genUploadHashStatesPath(testImage.upload)}, nil}, 210 {genManifestListPath(testImage.repo), []string{testImage.tag}, nil}, 211 } 212 213 for _, tc := range testCases { 214 t.Run(fmt.Sprintf("List %s", tc.input), func(t *testing.T) { 215 require := require.New(t) 216 list, err := sd.List(contextFixture(), tc.input) 217 require.Equal(tc.err, err) 218 require.Equal(tc.list, list) 219 }) 220 } 221 } 222 223 func TestStorageDriverMove(t *testing.T) { 224 require := require.New(t) 225 226 td, cleanup := newTestDriver() 227 defer cleanup() 228 229 sd, testImage := td.setup() 230 231 d, err := core.NewDigester().FromBytes([]byte(uploadContent)) 232 require.NoError(err) 233 234 require.NoError(sd.Move(context.TODO(), genUploadDataPath(testImage.upload), genBlobDataPath(d.Hex()))) 235 236 reader, err := td.cas.GetCacheFileReader(d.Hex()) 237 require.NoError(err) 238 data, err := ioutil.ReadAll(reader) 239 require.NoError(err) 240 require.Equal(uploadContent, string(data)) 241 }