Signed-off-by: Daniel Nephin <dnephin@docker.com>
| ... | ... |
@@ -11,79 +11,51 @@ import ( |
| 11 | 11 |
"path/filepath" |
| 12 | 12 |
"testing" |
| 13 | 13 |
|
| 14 |
+ "github.com/docker/docker/pkg/testutil/assert" |
|
| 14 | 15 |
"github.com/opencontainers/go-digest" |
| 15 | 16 |
) |
| 16 | 17 |
|
| 17 |
-func TestFSGetSet(t *testing.T) {
|
|
| 18 |
+func defaultFSStoreBackend(t *testing.T) (StoreBackend, func()) {
|
|
| 18 | 19 |
tmpdir, err := ioutil.TempDir("", "images-fs-store")
|
| 19 |
- if err != nil {
|
|
| 20 |
- t.Fatal(err) |
|
| 21 |
- } |
|
| 22 |
- defer os.RemoveAll(tmpdir) |
|
| 23 |
- fs, err := NewFSStoreBackend(tmpdir) |
|
| 24 |
- if err != nil {
|
|
| 25 |
- t.Fatal(err) |
|
| 26 |
- } |
|
| 20 |
+ assert.NilError(t, err) |
|
| 27 | 21 |
|
| 28 |
- testGetSet(t, fs) |
|
| 22 |
+ fsBackend, err := NewFSStoreBackend(tmpdir) |
|
| 23 |
+ assert.NilError(t, err) |
|
| 24 |
+ |
|
| 25 |
+ return fsBackend, func() { os.RemoveAll(tmpdir) }
|
|
| 29 | 26 |
} |
| 30 | 27 |
|
| 31 | 28 |
func TestFSGetInvalidData(t *testing.T) {
|
| 32 |
- tmpdir, err := ioutil.TempDir("", "images-fs-store")
|
|
| 33 |
- if err != nil {
|
|
| 34 |
- t.Fatal(err) |
|
| 35 |
- } |
|
| 36 |
- defer os.RemoveAll(tmpdir) |
|
| 37 |
- fs, err := NewFSStoreBackend(tmpdir) |
|
| 38 |
- if err != nil {
|
|
| 39 |
- t.Fatal(err) |
|
| 40 |
- } |
|
| 29 |
+ store, cleanup := defaultFSStoreBackend(t) |
|
| 30 |
+ defer cleanup() |
|
| 41 | 31 |
|
| 42 |
- id, err := fs.Set([]byte("foobar"))
|
|
| 43 |
- if err != nil {
|
|
| 44 |
- t.Fatal(err) |
|
| 45 |
- } |
|
| 32 |
+ id, err := store.Set([]byte("foobar"))
|
|
| 33 |
+ assert.NilError(t, err) |
|
| 46 | 34 |
|
| 47 | 35 |
dgst := digest.Digest(id) |
| 48 | 36 |
|
| 49 |
- if err := ioutil.WriteFile(filepath.Join(tmpdir, contentDirName, string(dgst.Algorithm()), dgst.Hex()), []byte("foobar2"), 0600); err != nil {
|
|
| 50 |
- t.Fatal(err) |
|
| 51 |
- } |
|
| 37 |
+ err = ioutil.WriteFile(filepath.Join(store.(*fs).root, contentDirName, string(dgst.Algorithm()), dgst.Hex()), []byte("foobar2"), 0600)
|
|
| 38 |
+ assert.NilError(t, err) |
|
| 52 | 39 |
|
| 53 |
- _, err = fs.Get(id) |
|
| 54 |
- if err == nil {
|
|
| 55 |
- t.Fatal("expected get to fail after data modification.")
|
|
| 56 |
- } |
|
| 40 |
+ _, err = store.Get(id) |
|
| 41 |
+ assert.Error(t, err, "failed to verify") |
|
| 57 | 42 |
} |
| 58 | 43 |
|
| 59 | 44 |
func TestFSInvalidSet(t *testing.T) {
|
| 60 |
- tmpdir, err := ioutil.TempDir("", "images-fs-store")
|
|
| 61 |
- if err != nil {
|
|
| 62 |
- t.Fatal(err) |
|
| 63 |
- } |
|
| 64 |
- defer os.RemoveAll(tmpdir) |
|
| 65 |
- fs, err := NewFSStoreBackend(tmpdir) |
|
| 66 |
- if err != nil {
|
|
| 67 |
- t.Fatal(err) |
|
| 68 |
- } |
|
| 45 |
+ store, cleanup := defaultFSStoreBackend(t) |
|
| 46 |
+ defer cleanup() |
|
| 69 | 47 |
|
| 70 | 48 |
id := digest.FromBytes([]byte("foobar"))
|
| 71 |
- err = os.Mkdir(filepath.Join(tmpdir, contentDirName, string(id.Algorithm()), id.Hex()), 0700) |
|
| 72 |
- if err != nil {
|
|
| 73 |
- t.Fatal(err) |
|
| 74 |
- } |
|
| 49 |
+ err := os.Mkdir(filepath.Join(store.(*fs).root, contentDirName, string(id.Algorithm()), id.Hex()), 0700) |
|
| 50 |
+ assert.NilError(t, err) |
|
| 75 | 51 |
|
| 76 |
- _, err = fs.Set([]byte("foobar"))
|
|
| 77 |
- if err == nil {
|
|
| 78 |
- t.Fatal("expected error from invalid filesystem data.")
|
|
| 79 |
- } |
|
| 52 |
+ _, err = store.Set([]byte("foobar"))
|
|
| 53 |
+ assert.Error(t, err, "is a directory") |
|
| 80 | 54 |
} |
| 81 | 55 |
|
| 82 | 56 |
func TestFSInvalidRoot(t *testing.T) {
|
| 83 | 57 |
tmpdir, err := ioutil.TempDir("", "images-fs-store")
|
| 84 |
- if err != nil {
|
|
| 85 |
- t.Fatal(err) |
|
| 86 |
- } |
|
| 58 |
+ assert.NilError(t, err) |
|
| 87 | 59 |
defer os.RemoveAll(tmpdir) |
| 88 | 60 |
|
| 89 | 61 |
tcases := []struct {
|
| ... | ... |
@@ -98,34 +70,29 @@ func TestFSInvalidRoot(t *testing.T) {
|
| 98 | 98 |
root := filepath.Join(tmpdir, tc.root) |
| 99 | 99 |
filePath := filepath.Join(tmpdir, tc.invalidFile) |
| 100 | 100 |
err := os.MkdirAll(filepath.Dir(filePath), 0700) |
| 101 |
- if err != nil {
|
|
| 102 |
- t.Fatal(err) |
|
| 103 |
- } |
|
| 101 |
+ assert.NilError(t, err) |
|
| 102 |
+ |
|
| 104 | 103 |
f, err := os.Create(filePath) |
| 105 |
- if err != nil {
|
|
| 106 |
- t.Fatal(err) |
|
| 107 |
- } |
|
| 108 |
- f.Close() |
|
| 104 |
+ defer f.Close() |
|
| 105 |
+ assert.NilError(t, err) |
|
| 109 | 106 |
|
| 110 | 107 |
_, err = NewFSStoreBackend(root) |
| 111 |
- if err == nil {
|
|
| 112 |
- t.Fatalf("expected error from root %q and invalid file %q", tc.root, tc.invalidFile)
|
|
| 113 |
- } |
|
| 108 |
+ assert.Error(t, err, "not a directory") |
|
| 114 | 109 |
|
| 115 | 110 |
os.RemoveAll(root) |
| 116 | 111 |
} |
| 117 | 112 |
|
| 118 | 113 |
} |
| 119 | 114 |
|
| 120 |
-func testMetadataGetSet(t *testing.T, store StoreBackend) {
|
|
| 115 |
+func TestFSMetadataGetSet(t *testing.T) {
|
|
| 116 |
+ store, cleanup := defaultFSStoreBackend(t) |
|
| 117 |
+ defer cleanup() |
|
| 118 |
+ |
|
| 121 | 119 |
id, err := store.Set([]byte("foo"))
|
| 122 |
- if err != nil {
|
|
| 123 |
- t.Fatal(err) |
|
| 124 |
- } |
|
| 120 |
+ assert.NilError(t, err) |
|
| 121 |
+ |
|
| 125 | 122 |
id2, err := store.Set([]byte("bar"))
|
| 126 |
- if err != nil {
|
|
| 127 |
- t.Fatal(err) |
|
| 128 |
- } |
|
| 123 |
+ assert.NilError(t, err) |
|
| 129 | 124 |
|
| 130 | 125 |
tcases := []struct {
|
| 131 | 126 |
id digest.Digest |
| ... | ... |
@@ -139,115 +106,51 @@ func testMetadataGetSet(t *testing.T, store StoreBackend) {
|
| 139 | 139 |
|
| 140 | 140 |
for _, tc := range tcases {
|
| 141 | 141 |
err = store.SetMetadata(tc.id, tc.key, tc.value) |
| 142 |
- if err != nil {
|
|
| 143 |
- t.Fatal(err) |
|
| 144 |
- } |
|
| 142 |
+ assert.NilError(t, err) |
|
| 145 | 143 |
|
| 146 | 144 |
actual, err := store.GetMetadata(tc.id, tc.key) |
| 147 |
- if err != nil {
|
|
| 148 |
- t.Fatal(err) |
|
| 149 |
- } |
|
| 145 |
+ assert.NilError(t, err) |
|
| 146 |
+ |
|
| 150 | 147 |
if bytes.Compare(actual, tc.value) != 0 {
|
| 151 | 148 |
t.Fatalf("Metadata expected %q, got %q", tc.value, actual)
|
| 152 | 149 |
} |
| 153 | 150 |
} |
| 154 | 151 |
|
| 155 | 152 |
_, err = store.GetMetadata(id2, "tkey2") |
| 156 |
- if err == nil {
|
|
| 157 |
- t.Fatal("expected error for getting metadata for unknown key")
|
|
| 158 |
- } |
|
| 153 |
+ assert.Error(t, err, "no such file or directory") |
|
| 159 | 154 |
|
| 160 | 155 |
id3 := digest.FromBytes([]byte("baz"))
|
| 161 | 156 |
err = store.SetMetadata(id3, "tkey", []byte("tval"))
|
| 162 |
- if err == nil {
|
|
| 163 |
- t.Fatal("expected error for setting metadata for unknown ID.")
|
|
| 164 |
- } |
|
| 157 |
+ assert.Error(t, err, "no such file or directory") |
|
| 165 | 158 |
|
| 166 | 159 |
_, err = store.GetMetadata(id3, "tkey") |
| 167 |
- if err == nil {
|
|
| 168 |
- t.Fatal("expected error for getting metadata for unknown ID.")
|
|
| 169 |
- } |
|
| 170 |
-} |
|
| 171 |
- |
|
| 172 |
-func TestFSMetadataGetSet(t *testing.T) {
|
|
| 173 |
- tmpdir, err := ioutil.TempDir("", "images-fs-store")
|
|
| 174 |
- if err != nil {
|
|
| 175 |
- t.Fatal(err) |
|
| 176 |
- } |
|
| 177 |
- defer os.RemoveAll(tmpdir) |
|
| 178 |
- fs, err := NewFSStoreBackend(tmpdir) |
|
| 179 |
- if err != nil {
|
|
| 180 |
- t.Fatal(err) |
|
| 181 |
- } |
|
| 182 |
- |
|
| 183 |
- testMetadataGetSet(t, fs) |
|
| 184 |
-} |
|
| 185 |
- |
|
| 186 |
-func TestFSDelete(t *testing.T) {
|
|
| 187 |
- tmpdir, err := ioutil.TempDir("", "images-fs-store")
|
|
| 188 |
- if err != nil {
|
|
| 189 |
- t.Fatal(err) |
|
| 190 |
- } |
|
| 191 |
- defer os.RemoveAll(tmpdir) |
|
| 192 |
- fs, err := NewFSStoreBackend(tmpdir) |
|
| 193 |
- if err != nil {
|
|
| 194 |
- t.Fatal(err) |
|
| 195 |
- } |
|
| 196 |
- |
|
| 197 |
- testDelete(t, fs) |
|
| 198 |
-} |
|
| 199 |
- |
|
| 200 |
-func TestFSWalker(t *testing.T) {
|
|
| 201 |
- tmpdir, err := ioutil.TempDir("", "images-fs-store")
|
|
| 202 |
- if err != nil {
|
|
| 203 |
- t.Fatal(err) |
|
| 204 |
- } |
|
| 205 |
- defer os.RemoveAll(tmpdir) |
|
| 206 |
- fs, err := NewFSStoreBackend(tmpdir) |
|
| 207 |
- if err != nil {
|
|
| 208 |
- t.Fatal(err) |
|
| 209 |
- } |
|
| 210 |
- |
|
| 211 |
- testWalker(t, fs) |
|
| 160 |
+ assert.Error(t, err, "no such file or directory") |
|
| 212 | 161 |
} |
| 213 | 162 |
|
| 214 | 163 |
func TestFSInvalidWalker(t *testing.T) {
|
| 215 |
- tmpdir, err := ioutil.TempDir("", "images-fs-store")
|
|
| 216 |
- if err != nil {
|
|
| 217 |
- t.Fatal(err) |
|
| 218 |
- } |
|
| 219 |
- defer os.RemoveAll(tmpdir) |
|
| 220 |
- fs, err := NewFSStoreBackend(tmpdir) |
|
| 221 |
- if err != nil {
|
|
| 222 |
- t.Fatal(err) |
|
| 223 |
- } |
|
| 164 |
+ store, cleanup := defaultFSStoreBackend(t) |
|
| 165 |
+ defer cleanup() |
|
| 224 | 166 |
|
| 225 |
- fooID, err := fs.Set([]byte("foo"))
|
|
| 226 |
- if err != nil {
|
|
| 227 |
- t.Fatal(err) |
|
| 228 |
- } |
|
| 167 |
+ fooID, err := store.Set([]byte("foo"))
|
|
| 168 |
+ assert.NilError(t, err) |
|
| 229 | 169 |
|
| 230 |
- if err := ioutil.WriteFile(filepath.Join(tmpdir, contentDirName, "sha256/foobar"), []byte("foobar"), 0600); err != nil {
|
|
| 231 |
- t.Fatal(err) |
|
| 232 |
- } |
|
| 170 |
+ err = ioutil.WriteFile(filepath.Join(store.(*fs).root, contentDirName, "sha256/foobar"), []byte("foobar"), 0600)
|
|
| 171 |
+ assert.NilError(t, err) |
|
| 233 | 172 |
|
| 234 | 173 |
n := 0 |
| 235 |
- err = fs.Walk(func(id digest.Digest) error {
|
|
| 236 |
- if id != fooID {
|
|
| 237 |
- t.Fatalf("invalid walker ID %q, expected %q", id, fooID)
|
|
| 238 |
- } |
|
| 174 |
+ err = store.Walk(func(id digest.Digest) error {
|
|
| 175 |
+ assert.Equal(t, id, fooID) |
|
| 239 | 176 |
n++ |
| 240 | 177 |
return nil |
| 241 | 178 |
}) |
| 242 |
- if err != nil {
|
|
| 243 |
- t.Fatalf("invalid data should not have caused walker error, got %v", err)
|
|
| 244 |
- } |
|
| 245 |
- if n != 1 {
|
|
| 246 |
- t.Fatalf("expected 1 walk initialization, got %d", n)
|
|
| 247 |
- } |
|
| 179 |
+ assert.NilError(t, err) |
|
| 180 |
+ assert.Equal(t, n, 1) |
|
| 248 | 181 |
} |
| 249 | 182 |
|
| 250 |
-func testGetSet(t *testing.T, store StoreBackend) {
|
|
| 183 |
+func TestFSGetSet(t *testing.T) {
|
|
| 184 |
+ store, cleanup := defaultFSStoreBackend(t) |
|
| 185 |
+ defer cleanup() |
|
| 186 |
+ |
|
| 251 | 187 |
type tcase struct {
|
| 252 | 188 |
input []byte |
| 253 | 189 |
expected digest.Digest |
| ... | ... |
@@ -258,15 +161,13 @@ func testGetSet(t *testing.T, store StoreBackend) {
|
| 258 | 258 |
|
| 259 | 259 |
randomInput := make([]byte, 8*1024) |
| 260 | 260 |
_, err := rand.Read(randomInput) |
| 261 |
- if err != nil {
|
|
| 262 |
- t.Fatal(err) |
|
| 263 |
- } |
|
| 261 |
+ assert.NilError(t, err) |
|
| 262 |
+ |
|
| 264 | 263 |
// skipping use of digest pkg because it is used by the implementation |
| 265 | 264 |
h := sha256.New() |
| 266 | 265 |
_, err = h.Write(randomInput) |
| 267 |
- if err != nil {
|
|
| 268 |
- t.Fatal(err) |
|
| 269 |
- } |
|
| 266 |
+ assert.NilError(t, err) |
|
| 267 |
+ |
|
| 270 | 268 |
tcases = append(tcases, tcase{
|
| 271 | 269 |
input: randomInput, |
| 272 | 270 |
expected: digest.Digest("sha256:" + hex.EncodeToString(h.Sum(nil))),
|
| ... | ... |
@@ -274,83 +175,74 @@ func testGetSet(t *testing.T, store StoreBackend) {
|
| 274 | 274 |
|
| 275 | 275 |
for _, tc := range tcases {
|
| 276 | 276 |
id, err := store.Set([]byte(tc.input)) |
| 277 |
- if err != nil {
|
|
| 278 |
- t.Fatal(err) |
|
| 279 |
- } |
|
| 280 |
- if id != tc.expected {
|
|
| 281 |
- t.Fatalf("expected ID %q, got %q", tc.expected, id)
|
|
| 282 |
- } |
|
| 283 |
- } |
|
| 284 |
- |
|
| 285 |
- for _, emptyData := range [][]byte{nil, {}} {
|
|
| 286 |
- _, err := store.Set(emptyData) |
|
| 287 |
- if err == nil {
|
|
| 288 |
- t.Fatal("expected error for nil input.")
|
|
| 289 |
- } |
|
| 277 |
+ assert.NilError(t, err) |
|
| 278 |
+ assert.Equal(t, id, tc.expected) |
|
| 290 | 279 |
} |
| 291 | 280 |
|
| 292 | 281 |
for _, tc := range tcases {
|
| 293 | 282 |
data, err := store.Get(tc.expected) |
| 294 |
- if err != nil {
|
|
| 295 |
- t.Fatal(err) |
|
| 296 |
- } |
|
| 283 |
+ assert.NilError(t, err) |
|
| 297 | 284 |
if bytes.Compare(data, tc.input) != 0 {
|
| 298 | 285 |
t.Fatalf("expected data %q, got %q", tc.input, data)
|
| 299 | 286 |
} |
| 300 | 287 |
} |
| 288 |
+} |
|
| 289 |
+ |
|
| 290 |
+func TestFSGetUnsetKey(t *testing.T) {
|
|
| 291 |
+ store, cleanup := defaultFSStoreBackend(t) |
|
| 292 |
+ defer cleanup() |
|
| 301 | 293 |
|
| 302 | 294 |
for _, key := range []digest.Digest{"foobar:abc", "sha256:abc", "sha256:c3ab8ff13720e8ad9047dd39466b3c8974e592c2fa383d4a3960714caef0c4f2a"} {
|
| 303 | 295 |
_, err := store.Get(key) |
| 304 |
- if err == nil {
|
|
| 305 |
- t.Fatalf("expected error for ID %q.", key)
|
|
| 306 |
- } |
|
| 296 |
+ assert.Error(t, err, "no such file or directory") |
|
| 307 | 297 |
} |
| 298 |
+} |
|
| 308 | 299 |
|
| 300 |
+func TestFSGetEmptyData(t *testing.T) {
|
|
| 301 |
+ store, cleanup := defaultFSStoreBackend(t) |
|
| 302 |
+ defer cleanup() |
|
| 303 |
+ |
|
| 304 |
+ for _, emptyData := range [][]byte{nil, {}} {
|
|
| 305 |
+ _, err := store.Set(emptyData) |
|
| 306 |
+ assert.Error(t, err, "invalid empty data") |
|
| 307 |
+ } |
|
| 309 | 308 |
} |
| 310 | 309 |
|
| 311 |
-func testDelete(t *testing.T, store StoreBackend) {
|
|
| 310 |
+func TestFSDelete(t *testing.T) {
|
|
| 311 |
+ store, cleanup := defaultFSStoreBackend(t) |
|
| 312 |
+ defer cleanup() |
|
| 313 |
+ |
|
| 312 | 314 |
id, err := store.Set([]byte("foo"))
|
| 313 |
- if err != nil {
|
|
| 314 |
- t.Fatal(err) |
|
| 315 |
- } |
|
| 315 |
+ assert.NilError(t, err) |
|
| 316 |
+ |
|
| 316 | 317 |
id2, err := store.Set([]byte("bar"))
|
| 317 |
- if err != nil {
|
|
| 318 |
- t.Fatal(err) |
|
| 319 |
- } |
|
| 318 |
+ assert.NilError(t, err) |
|
| 320 | 319 |
|
| 321 | 320 |
err = store.Delete(id) |
| 322 |
- if err != nil {
|
|
| 323 |
- t.Fatal(err) |
|
| 324 |
- } |
|
| 321 |
+ assert.NilError(t, err) |
|
| 325 | 322 |
|
| 326 | 323 |
_, err = store.Get(id) |
| 327 |
- if err == nil {
|
|
| 328 |
- t.Fatalf("expected getting deleted item %q to fail", id)
|
|
| 329 |
- } |
|
| 324 |
+ assert.Error(t, err, "no such file or directory") |
|
| 325 |
+ |
|
| 330 | 326 |
_, err = store.Get(id2) |
| 331 |
- if err != nil {
|
|
| 332 |
- t.Fatal(err) |
|
| 333 |
- } |
|
| 327 |
+ assert.NilError(t, err) |
|
| 334 | 328 |
|
| 335 | 329 |
err = store.Delete(id2) |
| 336 |
- if err != nil {
|
|
| 337 |
- t.Fatal(err) |
|
| 338 |
- } |
|
| 330 |
+ assert.NilError(t, err) |
|
| 331 |
+ |
|
| 339 | 332 |
_, err = store.Get(id2) |
| 340 |
- if err == nil {
|
|
| 341 |
- t.Fatalf("expected getting deleted item %q to fail", id2)
|
|
| 342 |
- } |
|
| 333 |
+ assert.Error(t, err, "no such file or directory") |
|
| 343 | 334 |
} |
| 344 | 335 |
|
| 345 |
-func testWalker(t *testing.T, store StoreBackend) {
|
|
| 336 |
+func TestFSWalker(t *testing.T) {
|
|
| 337 |
+ store, cleanup := defaultFSStoreBackend(t) |
|
| 338 |
+ defer cleanup() |
|
| 339 |
+ |
|
| 346 | 340 |
id, err := store.Set([]byte("foo"))
|
| 347 |
- if err != nil {
|
|
| 348 |
- t.Fatal(err) |
|
| 349 |
- } |
|
| 341 |
+ assert.NilError(t, err) |
|
| 342 |
+ |
|
| 350 | 343 |
id2, err := store.Set([]byte("bar"))
|
| 351 |
- if err != nil {
|
|
| 352 |
- t.Fatal(err) |
|
| 353 |
- } |
|
| 344 |
+ assert.NilError(t, err) |
|
| 354 | 345 |
|
| 355 | 346 |
tcases := make(map[digest.Digest]struct{})
|
| 356 | 347 |
tcases[id] = struct{}{}
|
| ... | ... |
@@ -361,24 +253,22 @@ func testWalker(t *testing.T, store StoreBackend) {
|
| 361 | 361 |
n++ |
| 362 | 362 |
return nil |
| 363 | 363 |
}) |
| 364 |
- if err != nil {
|
|
| 365 |
- t.Fatal(err) |
|
| 366 |
- } |
|
| 364 |
+ assert.NilError(t, err) |
|
| 365 |
+ assert.Equal(t, n, 2) |
|
| 366 |
+ assert.Equal(t, len(tcases), 0) |
|
| 367 |
+} |
|
| 367 | 368 |
|
| 368 |
- if n != 2 {
|
|
| 369 |
- t.Fatalf("expected 2 walk initializations, got %d", n)
|
|
| 370 |
- } |
|
| 371 |
- if len(tcases) != 0 {
|
|
| 372 |
- t.Fatalf("expected empty unwalked set, got %+v", tcases)
|
|
| 373 |
- } |
|
| 369 |
+func TestFSWalkerStopOnError(t *testing.T) {
|
|
| 370 |
+ store, cleanup := defaultFSStoreBackend(t) |
|
| 371 |
+ defer cleanup() |
|
| 374 | 372 |
|
| 375 |
- // stop on error |
|
| 376 |
- tcases = make(map[digest.Digest]struct{})
|
|
| 373 |
+ id, err := store.Set([]byte("foo"))
|
|
| 374 |
+ assert.NilError(t, err) |
|
| 375 |
+ |
|
| 376 |
+ tcases := make(map[digest.Digest]struct{})
|
|
| 377 | 377 |
tcases[id] = struct{}{}
|
| 378 | 378 |
err = store.Walk(func(id digest.Digest) error {
|
| 379 |
- return errors.New("")
|
|
| 379 |
+ return errors.New("what")
|
|
| 380 | 380 |
}) |
| 381 |
- if err == nil {
|
|
| 382 |
- t.Fatalf("expected error from walker.")
|
|
| 383 |
- } |
|
| 381 |
+ assert.Error(t, err, "what") |
|
| 384 | 382 |
} |
| ... | ... |
@@ -5,6 +5,8 @@ import ( |
| 5 | 5 |
"sort" |
| 6 | 6 |
"strings" |
| 7 | 7 |
"testing" |
| 8 |
+ |
|
| 9 |
+ "github.com/docker/docker/pkg/testutil/assert" |
|
| 8 | 10 |
) |
| 9 | 11 |
|
| 10 | 12 |
const sampleImageJSON = `{
|
| ... | ... |
@@ -17,22 +19,15 @@ const sampleImageJSON = `{
|
| 17 | 17 |
} |
| 18 | 18 |
}` |
| 19 | 19 |
|
| 20 |
-func TestJSON(t *testing.T) {
|
|
| 20 |
+func TestNewFromJSON(t *testing.T) {
|
|
| 21 | 21 |
img, err := NewFromJSON([]byte(sampleImageJSON)) |
| 22 |
- if err != nil {
|
|
| 23 |
- t.Fatal(err) |
|
| 24 |
- } |
|
| 25 |
- rawJSON := img.RawJSON() |
|
| 26 |
- if string(rawJSON) != sampleImageJSON {
|
|
| 27 |
- t.Fatalf("raw JSON of config didn't match: expected %+v, got %v", sampleImageJSON, rawJSON)
|
|
| 28 |
- } |
|
| 22 |
+ assert.NilError(t, err) |
|
| 23 |
+ assert.Equal(t, string(img.RawJSON()), sampleImageJSON) |
|
| 29 | 24 |
} |
| 30 | 25 |
|
| 31 |
-func TestInvalidJSON(t *testing.T) {
|
|
| 26 |
+func TestNewFromJSONWithInvalidJSON(t *testing.T) {
|
|
| 32 | 27 |
_, err := NewFromJSON([]byte("{}"))
|
| 33 |
- if err == nil {
|
|
| 34 |
- t.Fatal("expected JSON parse error")
|
|
| 35 |
- } |
|
| 28 |
+ assert.Error(t, err, "invalid image JSON, no RootFS key") |
|
| 36 | 29 |
} |
| 37 | 30 |
|
| 38 | 31 |
func TestMarshalKeyOrder(t *testing.T) {
|
| ... | ... |
@@ -43,9 +38,7 @@ func TestMarshalKeyOrder(t *testing.T) {
|
| 43 | 43 |
Architecture: "c", |
| 44 | 44 |
}, |
| 45 | 45 |
}) |
| 46 |
- if err != nil {
|
|
| 47 |
- t.Fatal(err) |
|
| 48 |
- } |
|
| 46 |
+ assert.NilError(t, err) |
|
| 49 | 47 |
|
| 50 | 48 |
expectedOrder := []string{"architecture", "author", "comment"}
|
| 51 | 49 |
var indexes []int |
| ... | ... |
@@ -1,292 +1,150 @@ |
| 1 | 1 |
package image |
| 2 | 2 |
|
| 3 | 3 |
import ( |
| 4 |
- "io/ioutil" |
|
| 5 |
- "os" |
|
| 6 | 4 |
"testing" |
| 7 | 5 |
|
| 8 | 6 |
"github.com/docker/docker/layer" |
| 7 |
+ "github.com/docker/docker/pkg/testutil/assert" |
|
| 9 | 8 |
"github.com/opencontainers/go-digest" |
| 10 | 9 |
) |
| 11 | 10 |
|
| 12 | 11 |
func TestRestore(t *testing.T) {
|
| 13 |
- tmpdir, err := ioutil.TempDir("", "images-fs-store")
|
|
| 14 |
- if err != nil {
|
|
| 15 |
- t.Fatal(err) |
|
| 16 |
- } |
|
| 17 |
- defer os.RemoveAll(tmpdir) |
|
| 18 |
- fs, err := NewFSStoreBackend(tmpdir) |
|
| 19 |
- if err != nil {
|
|
| 20 |
- t.Fatal(err) |
|
| 21 |
- } |
|
| 12 |
+ fs, cleanup := defaultFSStoreBackend(t) |
|
| 13 |
+ defer cleanup() |
|
| 22 | 14 |
|
| 23 | 15 |
id1, err := fs.Set([]byte(`{"comment": "abc", "rootfs": {"type": "layers"}}`))
|
| 24 |
- if err != nil {
|
|
| 25 |
- t.Fatal(err) |
|
| 26 |
- } |
|
| 16 |
+ assert.NilError(t, err) |
|
| 17 |
+ |
|
| 27 | 18 |
_, err = fs.Set([]byte(`invalid`)) |
| 28 |
- if err != nil {
|
|
| 29 |
- t.Fatal(err) |
|
| 30 |
- } |
|
| 19 |
+ assert.NilError(t, err) |
|
| 20 |
+ |
|
| 31 | 21 |
id2, err := fs.Set([]byte(`{"comment": "def", "rootfs": {"type": "layers", "diff_ids": ["2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae"]}}`))
|
| 32 |
- if err != nil {
|
|
| 33 |
- t.Fatal(err) |
|
| 34 |
- } |
|
| 22 |
+ assert.NilError(t, err) |
|
| 23 |
+ |
|
| 35 | 24 |
err = fs.SetMetadata(id2, "parent", []byte(id1)) |
| 36 |
- if err != nil {
|
|
| 37 |
- t.Fatal(err) |
|
| 38 |
- } |
|
| 25 |
+ assert.NilError(t, err) |
|
| 39 | 26 |
|
| 40 | 27 |
is, err := NewImageStore(fs, &mockLayerGetReleaser{})
|
| 41 |
- if err != nil {
|
|
| 42 |
- t.Fatal(err) |
|
| 43 |
- } |
|
| 28 |
+ assert.NilError(t, err) |
|
| 44 | 29 |
|
| 45 |
- imgs := is.Map() |
|
| 46 |
- if actual, expected := len(imgs), 2; actual != expected {
|
|
| 47 |
- t.Fatalf("invalid images length, expected 2, got %q", len(imgs))
|
|
| 48 |
- } |
|
| 30 |
+ assert.Equal(t, len(is.Map()), 2) |
|
| 49 | 31 |
|
| 50 | 32 |
img1, err := is.Get(ID(id1)) |
| 51 |
- if err != nil {
|
|
| 52 |
- t.Fatal(err) |
|
| 53 |
- } |
|
| 54 |
- |
|
| 55 |
- if actual, expected := img1.computedID, ID(id1); actual != expected {
|
|
| 56 |
- t.Fatalf("invalid image ID: expected %q, got %q", expected, actual)
|
|
| 57 |
- } |
|
| 58 |
- |
|
| 59 |
- if actual, expected := img1.computedID.String(), string(id1); actual != expected {
|
|
| 60 |
- t.Fatalf("invalid image ID string: expected %q, got %q", expected, actual)
|
|
| 61 |
- } |
|
| 33 |
+ assert.NilError(t, err) |
|
| 34 |
+ assert.Equal(t, img1.computedID, ID(id1)) |
|
| 35 |
+ assert.Equal(t, img1.computedID.String(), string(id1)) |
|
| 62 | 36 |
|
| 63 | 37 |
img2, err := is.Get(ID(id2)) |
| 64 |
- if err != nil {
|
|
| 65 |
- t.Fatal(err) |
|
| 66 |
- } |
|
| 67 |
- |
|
| 68 |
- if actual, expected := img1.Comment, "abc"; actual != expected {
|
|
| 69 |
- t.Fatalf("invalid comment for image1: expected %q, got %q", expected, actual)
|
|
| 70 |
- } |
|
| 71 |
- |
|
| 72 |
- if actual, expected := img2.Comment, "def"; actual != expected {
|
|
| 73 |
- t.Fatalf("invalid comment for image2: expected %q, got %q", expected, actual)
|
|
| 74 |
- } |
|
| 38 |
+ assert.NilError(t, err) |
|
| 39 |
+ assert.Equal(t, img1.Comment, "abc") |
|
| 40 |
+ assert.Equal(t, img2.Comment, "def") |
|
| 75 | 41 |
|
| 76 | 42 |
p, err := is.GetParent(ID(id1)) |
| 77 |
- if err == nil {
|
|
| 78 |
- t.Fatal("expected error for getting parent")
|
|
| 79 |
- } |
|
| 43 |
+ assert.Error(t, err, "no such file") |
|
| 80 | 44 |
|
| 81 | 45 |
p, err = is.GetParent(ID(id2)) |
| 82 |
- if err != nil {
|
|
| 83 |
- t.Fatal(err) |
|
| 84 |
- } |
|
| 85 |
- if actual, expected := p, ID(id1); actual != expected {
|
|
| 86 |
- t.Fatalf("invalid parent: expected %q, got %q", expected, actual)
|
|
| 87 |
- } |
|
| 46 |
+ assert.NilError(t, err) |
|
| 47 |
+ assert.Equal(t, p, ID(id1)) |
|
| 88 | 48 |
|
| 89 | 49 |
children := is.Children(ID(id1)) |
| 90 |
- if len(children) != 1 {
|
|
| 91 |
- t.Fatalf("invalid children length: %q", len(children))
|
|
| 92 |
- } |
|
| 93 |
- if actual, expected := children[0], ID(id2); actual != expected {
|
|
| 94 |
- t.Fatalf("invalid child for id1: expected %q, got %q", expected, actual)
|
|
| 95 |
- } |
|
| 96 |
- |
|
| 97 |
- heads := is.Heads() |
|
| 98 |
- if actual, expected := len(heads), 1; actual != expected {
|
|
| 99 |
- t.Fatalf("invalid images length: expected %q, got %q", expected, actual)
|
|
| 100 |
- } |
|
| 50 |
+ assert.Equal(t, len(children), 1) |
|
| 51 |
+ assert.Equal(t, children[0], ID(id2)) |
|
| 52 |
+ assert.Equal(t, len(is.Heads()), 1) |
|
| 101 | 53 |
|
| 102 | 54 |
sid1, err := is.Search(string(id1)[:10]) |
| 103 |
- if err != nil {
|
|
| 104 |
- t.Fatal(err) |
|
| 105 |
- } |
|
| 106 |
- if actual, expected := sid1, ID(id1); actual != expected {
|
|
| 107 |
- t.Fatalf("searched ID mismatch: expected %q, got %q", expected, actual)
|
|
| 108 |
- } |
|
| 55 |
+ assert.NilError(t, err) |
|
| 56 |
+ assert.Equal(t, sid1, ID(id1)) |
|
| 109 | 57 |
|
| 110 | 58 |
sid1, err = is.Search(digest.Digest(id1).Hex()[:6]) |
| 111 |
- if err != nil {
|
|
| 112 |
- t.Fatal(err) |
|
| 113 |
- } |
|
| 114 |
- if actual, expected := sid1, ID(id1); actual != expected {
|
|
| 115 |
- t.Fatalf("searched ID mismatch: expected %q, got %q", expected, actual)
|
|
| 116 |
- } |
|
| 59 |
+ assert.NilError(t, err) |
|
| 60 |
+ assert.Equal(t, sid1, ID(id1)) |
|
| 117 | 61 |
|
| 118 | 62 |
invalidPattern := digest.Digest(id1).Hex()[1:6] |
| 119 | 63 |
_, err = is.Search(invalidPattern) |
| 120 |
- if err == nil {
|
|
| 121 |
- t.Fatalf("expected search for %q to fail", invalidPattern)
|
|
| 122 |
- } |
|
| 123 |
- |
|
| 64 |
+ assert.Error(t, err, "No such image") |
|
| 124 | 65 |
} |
| 125 | 66 |
|
| 126 | 67 |
func TestAddDelete(t *testing.T) {
|
| 127 |
- tmpdir, err := ioutil.TempDir("", "images-fs-store")
|
|
| 128 |
- if err != nil {
|
|
| 129 |
- t.Fatal(err) |
|
| 130 |
- } |
|
| 131 |
- defer os.RemoveAll(tmpdir) |
|
| 132 |
- fs, err := NewFSStoreBackend(tmpdir) |
|
| 133 |
- if err != nil {
|
|
| 134 |
- t.Fatal(err) |
|
| 135 |
- } |
|
| 136 |
- |
|
| 137 |
- is, err := NewImageStore(fs, &mockLayerGetReleaser{})
|
|
| 138 |
- if err != nil {
|
|
| 139 |
- t.Fatal(err) |
|
| 140 |
- } |
|
| 68 |
+ is, cleanup := defaultImageStore(t) |
|
| 69 |
+ defer cleanup() |
|
| 141 | 70 |
|
| 142 | 71 |
id1, err := is.Create([]byte(`{"comment": "abc", "rootfs": {"type": "layers", "diff_ids": ["2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae"]}}`))
|
| 143 |
- if err != nil {
|
|
| 144 |
- t.Fatal(err) |
|
| 145 |
- } |
|
| 146 |
- |
|
| 147 |
- if actual, expected := id1, ID("sha256:8d25a9c45df515f9d0fe8e4a6b1c64dd3b965a84790ddbcc7954bb9bc89eb993"); actual != expected {
|
|
| 148 |
- t.Fatalf("create ID mismatch: expected %q, got %q", expected, actual)
|
|
| 149 |
- } |
|
| 72 |
+ assert.NilError(t, err) |
|
| 73 |
+ assert.Equal(t, id1, ID("sha256:8d25a9c45df515f9d0fe8e4a6b1c64dd3b965a84790ddbcc7954bb9bc89eb993"))
|
|
| 150 | 74 |
|
| 151 | 75 |
img, err := is.Get(id1) |
| 152 |
- if err != nil {
|
|
| 153 |
- t.Fatal(err) |
|
| 154 |
- } |
|
| 155 |
- |
|
| 156 |
- if actual, expected := img.Comment, "abc"; actual != expected {
|
|
| 157 |
- t.Fatalf("invalid comment in image: expected %q, got %q", expected, actual)
|
|
| 158 |
- } |
|
| 76 |
+ assert.NilError(t, err) |
|
| 77 |
+ assert.Equal(t, img.Comment, "abc") |
|
| 159 | 78 |
|
| 160 | 79 |
id2, err := is.Create([]byte(`{"comment": "def", "rootfs": {"type": "layers", "diff_ids": ["2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae"]}}`))
|
| 161 |
- if err != nil {
|
|
| 162 |
- t.Fatal(err) |
|
| 163 |
- } |
|
| 80 |
+ assert.NilError(t, err) |
|
| 164 | 81 |
|
| 165 | 82 |
err = is.SetParent(id2, id1) |
| 166 |
- if err != nil {
|
|
| 167 |
- t.Fatal(err) |
|
| 168 |
- } |
|
| 83 |
+ assert.NilError(t, err) |
|
| 169 | 84 |
|
| 170 | 85 |
pid1, err := is.GetParent(id2) |
| 171 |
- if err != nil {
|
|
| 172 |
- t.Fatal(err) |
|
| 173 |
- } |
|
| 174 |
- if actual, expected := pid1, id1; actual != expected {
|
|
| 175 |
- t.Fatalf("invalid parent for image: expected %q, got %q", expected, actual)
|
|
| 176 |
- } |
|
| 86 |
+ assert.NilError(t, err) |
|
| 87 |
+ assert.Equal(t, pid1, id1) |
|
| 177 | 88 |
|
| 178 | 89 |
_, err = is.Delete(id1) |
| 179 |
- if err != nil {
|
|
| 180 |
- t.Fatal(err) |
|
| 181 |
- } |
|
| 90 |
+ assert.NilError(t, err) |
|
| 91 |
+ |
|
| 182 | 92 |
_, err = is.Get(id1) |
| 183 |
- if err == nil {
|
|
| 184 |
- t.Fatalf("expected get for deleted image %q to fail", id1)
|
|
| 185 |
- } |
|
| 93 |
+ assert.Error(t, err, "no such file or directory") |
|
| 94 |
+ |
|
| 186 | 95 |
_, err = is.Get(id2) |
| 187 |
- if err != nil {
|
|
| 188 |
- t.Fatal(err) |
|
| 189 |
- } |
|
| 190 |
- pid1, err = is.GetParent(id2) |
|
| 191 |
- if err == nil {
|
|
| 192 |
- t.Fatalf("expected parent check for image %q to fail, got %q", id2, pid1)
|
|
| 193 |
- } |
|
| 96 |
+ assert.NilError(t, err) |
|
| 194 | 97 |
|
| 98 |
+ _, err = is.GetParent(id2) |
|
| 99 |
+ assert.Error(t, err, "no such file or directory") |
|
| 195 | 100 |
} |
| 196 | 101 |
|
| 197 | 102 |
func TestSearchAfterDelete(t *testing.T) {
|
| 198 |
- tmpdir, err := ioutil.TempDir("", "images-fs-store")
|
|
| 199 |
- if err != nil {
|
|
| 200 |
- t.Fatal(err) |
|
| 201 |
- } |
|
| 202 |
- defer os.RemoveAll(tmpdir) |
|
| 203 |
- fs, err := NewFSStoreBackend(tmpdir) |
|
| 204 |
- if err != nil {
|
|
| 205 |
- t.Fatal(err) |
|
| 206 |
- } |
|
| 207 |
- |
|
| 208 |
- is, err := NewImageStore(fs, &mockLayerGetReleaser{})
|
|
| 209 |
- if err != nil {
|
|
| 210 |
- t.Fatal(err) |
|
| 211 |
- } |
|
| 103 |
+ is, cleanup := defaultImageStore(t) |
|
| 104 |
+ defer cleanup() |
|
| 212 | 105 |
|
| 213 | 106 |
id, err := is.Create([]byte(`{"comment": "abc", "rootfs": {"type": "layers"}}`))
|
| 214 |
- if err != nil {
|
|
| 215 |
- t.Fatal(err) |
|
| 216 |
- } |
|
| 107 |
+ assert.NilError(t, err) |
|
| 217 | 108 |
|
| 218 | 109 |
id1, err := is.Search(string(id)[:15]) |
| 219 |
- if err != nil {
|
|
| 220 |
- t.Fatal(err) |
|
| 221 |
- } |
|
| 110 |
+ assert.NilError(t, err) |
|
| 111 |
+ assert.Equal(t, id1, id) |
|
| 222 | 112 |
|
| 223 |
- if actual, expected := id1, id; expected != actual {
|
|
| 224 |
- t.Fatalf("wrong id returned from search: expected %q, got %q", expected, actual)
|
|
| 225 |
- } |
|
| 113 |
+ _, err = is.Delete(id) |
|
| 114 |
+ assert.NilError(t, err) |
|
| 226 | 115 |
|
| 227 |
- if _, err := is.Delete(id); err != nil {
|
|
| 228 |
- t.Fatal(err) |
|
| 229 |
- } |
|
| 230 |
- |
|
| 231 |
- if _, err := is.Search(string(id)[:15]); err == nil {
|
|
| 232 |
- t.Fatal("expected search after deletion to fail")
|
|
| 233 |
- } |
|
| 116 |
+ _, err = is.Search(string(id)[:15]) |
|
| 117 |
+ assert.Error(t, err, "No such image") |
|
| 234 | 118 |
} |
| 235 | 119 |
|
| 236 | 120 |
func TestParentReset(t *testing.T) {
|
| 237 |
- tmpdir, err := ioutil.TempDir("", "images-fs-store")
|
|
| 238 |
- if err != nil {
|
|
| 239 |
- t.Fatal(err) |
|
| 240 |
- } |
|
| 241 |
- defer os.RemoveAll(tmpdir) |
|
| 242 |
- fs, err := NewFSStoreBackend(tmpdir) |
|
| 243 |
- if err != nil {
|
|
| 244 |
- t.Fatal(err) |
|
| 245 |
- } |
|
| 246 |
- |
|
| 247 |
- is, err := NewImageStore(fs, &mockLayerGetReleaser{})
|
|
| 248 |
- if err != nil {
|
|
| 249 |
- t.Fatal(err) |
|
| 250 |
- } |
|
| 121 |
+ is, cleanup := defaultImageStore(t) |
|
| 122 |
+ defer cleanup() |
|
| 251 | 123 |
|
| 252 | 124 |
id, err := is.Create([]byte(`{"comment": "abc1", "rootfs": {"type": "layers"}}`))
|
| 253 |
- if err != nil {
|
|
| 254 |
- t.Fatal(err) |
|
| 255 |
- } |
|
| 125 |
+ assert.NilError(t, err) |
|
| 256 | 126 |
|
| 257 | 127 |
id2, err := is.Create([]byte(`{"comment": "abc2", "rootfs": {"type": "layers"}}`))
|
| 258 |
- if err != nil {
|
|
| 259 |
- t.Fatal(err) |
|
| 260 |
- } |
|
| 128 |
+ assert.NilError(t, err) |
|
| 261 | 129 |
|
| 262 | 130 |
id3, err := is.Create([]byte(`{"comment": "abc3", "rootfs": {"type": "layers"}}`))
|
| 263 |
- if err != nil {
|
|
| 264 |
- t.Fatal(err) |
|
| 265 |
- } |
|
| 131 |
+ assert.NilError(t, err) |
|
| 266 | 132 |
|
| 267 |
- if err := is.SetParent(id, id2); err != nil {
|
|
| 268 |
- t.Fatal(err) |
|
| 269 |
- } |
|
| 133 |
+ assert.NilError(t, is.SetParent(id, id2)) |
|
| 134 |
+ assert.Equal(t, len(is.Children(id2)), 1) |
|
| 270 | 135 |
|
| 271 |
- ids := is.Children(id2) |
|
| 272 |
- if actual, expected := len(ids), 1; expected != actual {
|
|
| 273 |
- t.Fatalf("wrong number of children: %d, got %d", expected, actual)
|
|
| 274 |
- } |
|
| 275 |
- |
|
| 276 |
- if err := is.SetParent(id, id3); err != nil {
|
|
| 277 |
- t.Fatal(err) |
|
| 278 |
- } |
|
| 136 |
+ assert.NilError(t, is.SetParent(id, id3)) |
|
| 137 |
+ assert.Equal(t, len(is.Children(id2)), 0) |
|
| 138 |
+ assert.Equal(t, len(is.Children(id3)), 1) |
|
| 139 |
+} |
|
| 279 | 140 |
|
| 280 |
- ids = is.Children(id2) |
|
| 281 |
- if actual, expected := len(ids), 0; expected != actual {
|
|
| 282 |
- t.Fatalf("wrong number of children after parent reset: %d, got %d", expected, actual)
|
|
| 283 |
- } |
|
| 141 |
+func defaultImageStore(t *testing.T) (Store, func()) {
|
|
| 142 |
+ fsBackend, cleanup := defaultFSStoreBackend(t) |
|
| 284 | 143 |
|
| 285 |
- ids = is.Children(id3) |
|
| 286 |
- if actual, expected := len(ids), 1; expected != actual {
|
|
| 287 |
- t.Fatalf("wrong number of children after parent reset: %d, got %d", expected, actual)
|
|
| 288 |
- } |
|
| 144 |
+ store, err := NewImageStore(fsBackend, &mockLayerGetReleaser{})
|
|
| 145 |
+ assert.NilError(t, err) |
|
| 289 | 146 |
|
| 147 |
+ return store, cleanup |
|
| 290 | 148 |
} |
| 291 | 149 |
|
| 292 | 150 |
type mockLayerGetReleaser struct{}
|