github.com/AliyunContainerService/cli@v0.0.0-20181009023821-814ced4b30d0/cli/manifest/store/store_test.go (about) 1 package store 2 3 import ( 4 "io/ioutil" 5 "os" 6 "testing" 7 8 "github.com/docker/cli/cli/manifest/types" 9 "github.com/docker/distribution/reference" 10 "github.com/google/go-cmp/cmp" 11 "gotest.tools/assert" 12 is "gotest.tools/assert/cmp" 13 ) 14 15 type fakeRef struct { 16 name string 17 } 18 19 func (f fakeRef) String() string { 20 return f.name 21 } 22 23 func (f fakeRef) Name() string { 24 return f.name 25 } 26 27 func ref(name string) fakeRef { 28 return fakeRef{name: name} 29 } 30 31 func sref(t *testing.T, name string) *types.SerializableNamed { 32 named, err := reference.ParseNamed("example.com/" + name) 33 assert.NilError(t, err) 34 return &types.SerializableNamed{Named: named} 35 } 36 37 func newTestStore(t *testing.T) (Store, func()) { 38 tmpdir, err := ioutil.TempDir("", "manifest-store-test") 39 assert.NilError(t, err) 40 41 return NewStore(tmpdir), func() { os.RemoveAll(tmpdir) } 42 } 43 44 func getFiles(t *testing.T, store Store) []os.FileInfo { 45 infos, err := ioutil.ReadDir(store.(*fsStore).root) 46 assert.NilError(t, err) 47 return infos 48 } 49 50 func TestStoreRemove(t *testing.T) { 51 store, cleanup := newTestStore(t) 52 defer cleanup() 53 54 listRef := ref("list") 55 data := types.ImageManifest{Ref: sref(t, "abcdef")} 56 assert.NilError(t, store.Save(listRef, ref("manifest"), data)) 57 assert.Assert(t, is.Len(getFiles(t, store), 1)) 58 59 assert.Check(t, store.Remove(listRef)) 60 assert.Check(t, is.Len(getFiles(t, store), 0)) 61 } 62 63 func TestStoreSaveAndGet(t *testing.T) { 64 store, cleanup := newTestStore(t) 65 defer cleanup() 66 67 listRef := ref("list") 68 data := types.ImageManifest{Ref: sref(t, "abcdef")} 69 err := store.Save(listRef, ref("exists"), data) 70 assert.NilError(t, err) 71 72 var testcases = []struct { 73 listRef reference.Reference 74 manifestRef reference.Reference 75 expected types.ImageManifest 76 expectedErr string 77 }{ 78 { 79 listRef: listRef, 80 manifestRef: ref("exists"), 81 expected: data, 82 }, 83 { 84 listRef: listRef, 85 manifestRef: ref("exist:does-not"), 86 expectedErr: "No such manifest: exist:does-not", 87 }, 88 { 89 listRef: ref("list:does-not-exist"), 90 manifestRef: ref("manifest:does-not-exist"), 91 expectedErr: "No such manifest: manifest:does-not-exist", 92 }, 93 } 94 95 for _, testcase := range testcases { 96 t.Run(testcase.manifestRef.String(), func(t *testing.T) { 97 actual, err := store.Get(testcase.listRef, testcase.manifestRef) 98 if testcase.expectedErr != "" { 99 assert.Error(t, err, testcase.expectedErr) 100 assert.Check(t, IsNotFound(err)) 101 return 102 } 103 assert.NilError(t, err) 104 assert.DeepEqual(t, testcase.expected, actual, cmpReferenceNamed) 105 }) 106 } 107 } 108 109 var cmpReferenceNamed = cmp.Transformer("namedref", func(r reference.Named) string { 110 return r.String() 111 }) 112 113 func TestStoreGetList(t *testing.T) { 114 store, cleanup := newTestStore(t) 115 defer cleanup() 116 117 listRef := ref("list") 118 first := types.ImageManifest{Ref: sref(t, "first")} 119 assert.NilError(t, store.Save(listRef, ref("first"), first)) 120 second := types.ImageManifest{Ref: sref(t, "second")} 121 assert.NilError(t, store.Save(listRef, ref("exists"), second)) 122 123 list, err := store.GetList(listRef) 124 assert.NilError(t, err) 125 assert.Check(t, is.Len(list, 2)) 126 } 127 128 func TestStoreGetListDoesNotExist(t *testing.T) { 129 store, cleanup := newTestStore(t) 130 defer cleanup() 131 132 listRef := ref("list") 133 _, err := store.GetList(listRef) 134 assert.Error(t, err, "No such manifest: list") 135 assert.Check(t, IsNotFound(err)) 136 }