github.com/docker/docker@v299999999.0.0-20200612211812-aaf470eca7b5+incompatible/image/store_test.go (about) 1 package image // import "github.com/docker/docker/image" 2 3 import ( 4 "fmt" 5 "runtime" 6 "testing" 7 8 "github.com/docker/docker/layer" 9 "gotest.tools/v3/assert" 10 "gotest.tools/v3/assert/cmp" 11 ) 12 13 func TestRestore(t *testing.T) { 14 fs, cleanup := defaultFSStoreBackend(t) 15 defer cleanup() 16 17 id1, err := fs.Set([]byte(`{"comment": "abc", "rootfs": {"type": "layers"}}`)) 18 assert.NilError(t, err) 19 20 _, err = fs.Set([]byte(`invalid`)) 21 assert.NilError(t, err) 22 23 id2, err := fs.Set([]byte(`{"comment": "def", "rootfs": {"type": "layers", "diff_ids": ["2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae"]}}`)) 24 assert.NilError(t, err) 25 26 err = fs.SetMetadata(id2, "parent", []byte(id1)) 27 assert.NilError(t, err) 28 29 mlgrMap := make(map[string]LayerGetReleaser) 30 mlgrMap[runtime.GOOS] = &mockLayerGetReleaser{} 31 is, err := NewImageStore(fs, mlgrMap) 32 assert.NilError(t, err) 33 34 assert.Check(t, cmp.Len(is.Map(), 2)) 35 36 img1, err := is.Get(ID(id1)) 37 assert.NilError(t, err) 38 assert.Check(t, cmp.Equal(ID(id1), img1.computedID)) 39 assert.Check(t, cmp.Equal(string(id1), img1.computedID.String())) 40 41 img2, err := is.Get(ID(id2)) 42 assert.NilError(t, err) 43 assert.Check(t, cmp.Equal("abc", img1.Comment)) 44 assert.Check(t, cmp.Equal("def", img2.Comment)) 45 46 _, err = is.GetParent(ID(id1)) 47 assert.ErrorContains(t, err, "failed to read metadata") 48 49 p, err := is.GetParent(ID(id2)) 50 assert.NilError(t, err) 51 assert.Check(t, cmp.Equal(ID(id1), p)) 52 53 children := is.Children(ID(id1)) 54 assert.Check(t, cmp.Len(children, 1)) 55 assert.Check(t, cmp.Equal(ID(id2), children[0])) 56 assert.Check(t, cmp.Len(is.Heads(), 1)) 57 58 sid1, err := is.Search(string(id1)[:10]) 59 assert.NilError(t, err) 60 assert.Check(t, cmp.Equal(ID(id1), sid1)) 61 62 sid1, err = is.Search(id1.Hex()[:6]) 63 assert.NilError(t, err) 64 assert.Check(t, cmp.Equal(ID(id1), sid1)) 65 66 invalidPattern := id1.Hex()[1:6] 67 _, err = is.Search(invalidPattern) 68 assert.ErrorContains(t, err, "No such image") 69 } 70 71 func TestAddDelete(t *testing.T) { 72 is, cleanup := defaultImageStore(t) 73 defer cleanup() 74 75 id1, err := is.Create([]byte(`{"comment": "abc", "rootfs": {"type": "layers", "diff_ids": ["2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae"]}}`)) 76 assert.NilError(t, err) 77 assert.Check(t, cmp.Equal(ID("sha256:8d25a9c45df515f9d0fe8e4a6b1c64dd3b965a84790ddbcc7954bb9bc89eb993"), id1)) 78 79 img, err := is.Get(id1) 80 assert.NilError(t, err) 81 assert.Check(t, cmp.Equal("abc", img.Comment)) 82 83 id2, err := is.Create([]byte(`{"comment": "def", "rootfs": {"type": "layers", "diff_ids": ["2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae"]}}`)) 84 assert.NilError(t, err) 85 86 err = is.SetParent(id2, id1) 87 assert.NilError(t, err) 88 89 pid1, err := is.GetParent(id2) 90 assert.NilError(t, err) 91 assert.Check(t, cmp.Equal(pid1, id1)) 92 93 _, err = is.Delete(id1) 94 assert.NilError(t, err) 95 96 _, err = is.Get(id1) 97 assert.ErrorContains(t, err, "failed to get digest") 98 99 _, err = is.Get(id2) 100 assert.NilError(t, err) 101 102 _, err = is.GetParent(id2) 103 assert.ErrorContains(t, err, "failed to read metadata") 104 } 105 106 func TestSearchAfterDelete(t *testing.T) { 107 is, cleanup := defaultImageStore(t) 108 defer cleanup() 109 110 id, err := is.Create([]byte(`{"comment": "abc", "rootfs": {"type": "layers"}}`)) 111 assert.NilError(t, err) 112 113 id1, err := is.Search(string(id)[:15]) 114 assert.NilError(t, err) 115 assert.Check(t, cmp.Equal(id1, id)) 116 117 _, err = is.Delete(id) 118 assert.NilError(t, err) 119 120 _, err = is.Search(string(id)[:15]) 121 assert.ErrorContains(t, err, "No such image") 122 } 123 124 func TestParentReset(t *testing.T) { 125 is, cleanup := defaultImageStore(t) 126 defer cleanup() 127 128 id, err := is.Create([]byte(`{"comment": "abc1", "rootfs": {"type": "layers"}}`)) 129 assert.NilError(t, err) 130 131 id2, err := is.Create([]byte(`{"comment": "abc2", "rootfs": {"type": "layers"}}`)) 132 assert.NilError(t, err) 133 134 id3, err := is.Create([]byte(`{"comment": "abc3", "rootfs": {"type": "layers"}}`)) 135 assert.NilError(t, err) 136 137 assert.Check(t, is.SetParent(id, id2)) 138 assert.Check(t, cmp.Len(is.Children(id2), 1)) 139 140 assert.Check(t, is.SetParent(id, id3)) 141 assert.Check(t, cmp.Len(is.Children(id2), 0)) 142 assert.Check(t, cmp.Len(is.Children(id3), 1)) 143 } 144 145 func defaultImageStore(t *testing.T) (Store, func()) { 146 fsBackend, cleanup := defaultFSStoreBackend(t) 147 148 mlgrMap := make(map[string]LayerGetReleaser) 149 mlgrMap[runtime.GOOS] = &mockLayerGetReleaser{} 150 store, err := NewImageStore(fsBackend, mlgrMap) 151 assert.NilError(t, err) 152 153 return store, cleanup 154 } 155 156 func TestGetAndSetLastUpdated(t *testing.T) { 157 store, cleanup := defaultImageStore(t) 158 defer cleanup() 159 160 id, err := store.Create([]byte(`{"comment": "abc1", "rootfs": {"type": "layers"}}`)) 161 assert.NilError(t, err) 162 163 updated, err := store.GetLastUpdated(id) 164 assert.NilError(t, err) 165 assert.Check(t, cmp.Equal(updated.IsZero(), true)) 166 167 assert.Check(t, store.SetLastUpdated(id)) 168 169 updated, err = store.GetLastUpdated(id) 170 assert.NilError(t, err) 171 assert.Check(t, cmp.Equal(updated.IsZero(), false)) 172 } 173 174 func TestStoreLen(t *testing.T) { 175 store, cleanup := defaultImageStore(t) 176 defer cleanup() 177 178 expected := 10 179 for i := 0; i < expected; i++ { 180 _, err := store.Create([]byte(fmt.Sprintf(`{"comment": "abc%d", "rootfs": {"type": "layers"}}`, i))) 181 assert.NilError(t, err) 182 } 183 numImages := store.Len() 184 assert.Equal(t, expected, numImages) 185 assert.Equal(t, len(store.Map()), numImages) 186 } 187 188 type mockLayerGetReleaser struct{} 189 190 func (ls *mockLayerGetReleaser) Get(layer.ChainID) (layer.Layer, error) { 191 return nil, nil 192 } 193 194 func (ls *mockLayerGetReleaser) Release(layer.Layer) ([]layer.Metadata, error) { 195 return nil, nil 196 }