github.com/pwn-term/docker@v0.0.0-20210616085119-6e977cce2565/moby/daemon/images/store_test.go (about) 1 package images 2 3 import ( 4 "context" 5 "io/ioutil" 6 "os" 7 "path/filepath" 8 "testing" 9 10 "github.com/containerd/containerd/content" 11 "github.com/containerd/containerd/content/local" 12 c8derrdefs "github.com/containerd/containerd/errdefs" 13 "github.com/containerd/containerd/leases" 14 "github.com/containerd/containerd/metadata" 15 "github.com/containerd/containerd/namespaces" 16 "github.com/docker/docker/image" 17 digest "github.com/opencontainers/go-digest" 18 v1 "github.com/opencontainers/image-spec/specs-go/v1" 19 "go.etcd.io/bbolt" 20 "gotest.tools/v3/assert" 21 "gotest.tools/v3/assert/cmp" 22 ) 23 24 func setupTestStores(t *testing.T) (context.Context, content.Store, *imageStoreWithLease, func(t *testing.T)) { 25 dir, err := ioutil.TempDir("", t.Name()) 26 assert.NilError(t, err) 27 28 backend, err := image.NewFSStoreBackend(filepath.Join(dir, "images")) 29 assert.NilError(t, err) 30 is, err := image.NewImageStore(backend, nil) 31 assert.NilError(t, err) 32 33 db, err := bbolt.Open(filepath.Join(dir, "metadata.db"), 0600, nil) 34 assert.NilError(t, err) 35 36 cs, err := local.NewStore(filepath.Join(dir, "content")) 37 assert.NilError(t, err) 38 mdb := metadata.NewDB(db, cs, nil) 39 40 cleanup := func(t *testing.T) { 41 assert.Check(t, db.Close()) 42 assert.Check(t, os.RemoveAll(dir)) 43 } 44 ctx := namespaces.WithNamespace(context.Background(), t.Name()) 45 images := &imageStoreWithLease{Store: is, ns: t.Name(), leases: metadata.NewLeaseManager(mdb)} 46 47 return ctx, cs, images, cleanup 48 } 49 50 func TestImageDelete(t *testing.T) { 51 ctx, _, images, cleanup := setupTestStores(t) 52 defer cleanup(t) 53 54 t.Run("no lease", func(t *testing.T) { 55 id, err := images.Create([]byte(`{"rootFS": {}}`)) 56 assert.NilError(t, err) 57 defer images.Delete(id) 58 59 ls, err := images.leases.List(ctx) 60 assert.NilError(t, err) 61 assert.Equal(t, len(ls), 0, ls) 62 63 _, err = images.Delete(id) 64 assert.NilError(t, err, "should not error when there is no lease") 65 }) 66 67 t.Run("lease exists", func(t *testing.T) { 68 id, err := images.Create([]byte(`{"rootFS": {}}`)) 69 assert.NilError(t, err) 70 defer images.Delete(id) 71 72 leaseID := imageKey(digest.Digest(id)) 73 _, err = images.leases.Create(ctx, leases.WithID(leaseID)) 74 assert.NilError(t, err) 75 defer images.leases.Delete(ctx, leases.Lease{ID: leaseID}) 76 77 ls, err := images.leases.List(ctx) 78 assert.NilError(t, err) 79 assert.Check(t, cmp.Equal(len(ls), 1), ls) 80 81 _, err = images.Delete(id) 82 assert.NilError(t, err) 83 84 ls, err = images.leases.List(ctx) 85 assert.NilError(t, err) 86 assert.Check(t, cmp.Equal(len(ls), 0), ls) 87 }) 88 } 89 90 func TestContentStoreForPull(t *testing.T) { 91 ctx, cs, is, cleanup := setupTestStores(t) 92 defer cleanup(t) 93 94 csP := &contentStoreForPull{ 95 ContentStore: cs, 96 leases: is.leases, 97 } 98 99 data := []byte(`{}`) 100 desc := v1.Descriptor{ 101 Digest: digest.Canonical.FromBytes(data), 102 Size: int64(len(data)), 103 } 104 105 w, err := csP.Writer(ctx, content.WithRef(t.Name()), content.WithDescriptor(desc)) 106 assert.NilError(t, err) 107 108 _, err = w.Write(data) 109 assert.NilError(t, err) 110 defer w.Close() 111 112 err = w.Commit(ctx, desc.Size, desc.Digest) 113 assert.NilError(t, err) 114 115 assert.Equal(t, len(csP.digested), 1) 116 assert.Check(t, cmp.Equal(csP.digested[0], desc.Digest)) 117 118 // Test already exists 119 csP.digested = nil 120 _, err = csP.Writer(ctx, content.WithRef(t.Name()), content.WithDescriptor(desc)) 121 assert.Check(t, c8derrdefs.IsAlreadyExists(err)) 122 assert.Equal(t, len(csP.digested), 1) 123 assert.Check(t, cmp.Equal(csP.digested[0], desc.Digest)) 124 }