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