github.com/rhatdan/docker@v0.7.7-0.20180119204836-47a0dcbcd20a/image/store_test.go (about) 1 package image 2 3 import ( 4 "runtime" 5 "testing" 6 7 "github.com/docker/docker/internal/testutil" 8 "github.com/docker/docker/layer" 9 "github.com/opencontainers/go-digest" 10 "github.com/stretchr/testify/assert" 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.NoError(t, err) 19 20 _, err = fs.Set([]byte(`invalid`)) 21 assert.NoError(t, err) 22 23 id2, err := fs.Set([]byte(`{"comment": "def", "rootfs": {"type": "layers", "diff_ids": ["2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae"]}}`)) 24 assert.NoError(t, err) 25 26 err = fs.SetMetadata(id2, "parent", []byte(id1)) 27 assert.NoError(t, err) 28 29 mlgrMap := make(map[string]LayerGetReleaser) 30 mlgrMap[runtime.GOOS] = &mockLayerGetReleaser{} 31 is, err := NewImageStore(fs, mlgrMap) 32 assert.NoError(t, err) 33 34 assert.Len(t, is.Map(), 2) 35 36 img1, err := is.Get(ID(id1)) 37 assert.NoError(t, err) 38 assert.Equal(t, ID(id1), img1.computedID) 39 assert.Equal(t, string(id1), img1.computedID.String()) 40 41 img2, err := is.Get(ID(id2)) 42 assert.NoError(t, err) 43 assert.Equal(t, "abc", img1.Comment) 44 assert.Equal(t, "def", img2.Comment) 45 46 _, err = is.GetParent(ID(id1)) 47 testutil.ErrorContains(t, err, "failed to read metadata") 48 49 p, err := is.GetParent(ID(id2)) 50 assert.NoError(t, err) 51 assert.Equal(t, ID(id1), p) 52 53 children := is.Children(ID(id1)) 54 assert.Len(t, children, 1) 55 assert.Equal(t, ID(id2), children[0]) 56 assert.Len(t, is.Heads(), 1) 57 58 sid1, err := is.Search(string(id1)[:10]) 59 assert.NoError(t, err) 60 assert.Equal(t, ID(id1), sid1) 61 62 sid1, err = is.Search(digest.Digest(id1).Hex()[:6]) 63 assert.NoError(t, err) 64 assert.Equal(t, ID(id1), sid1) 65 66 invalidPattern := digest.Digest(id1).Hex()[1:6] 67 _, err = is.Search(invalidPattern) 68 testutil.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.NoError(t, err) 77 assert.Equal(t, ID("sha256:8d25a9c45df515f9d0fe8e4a6b1c64dd3b965a84790ddbcc7954bb9bc89eb993"), id1) 78 79 img, err := is.Get(id1) 80 assert.NoError(t, err) 81 assert.Equal(t, "abc", img.Comment) 82 83 id2, err := is.Create([]byte(`{"comment": "def", "rootfs": {"type": "layers", "diff_ids": ["2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae"]}}`)) 84 assert.NoError(t, err) 85 86 err = is.SetParent(id2, id1) 87 assert.NoError(t, err) 88 89 pid1, err := is.GetParent(id2) 90 assert.NoError(t, err) 91 assert.Equal(t, pid1, id1) 92 93 _, err = is.Delete(id1) 94 assert.NoError(t, err) 95 96 _, err = is.Get(id1) 97 testutil.ErrorContains(t, err, "failed to get digest") 98 99 _, err = is.Get(id2) 100 assert.NoError(t, err) 101 102 _, err = is.GetParent(id2) 103 testutil.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.NoError(t, err) 112 113 id1, err := is.Search(string(id)[:15]) 114 assert.NoError(t, err) 115 assert.Equal(t, id1, id) 116 117 _, err = is.Delete(id) 118 assert.NoError(t, err) 119 120 _, err = is.Search(string(id)[:15]) 121 testutil.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.NoError(t, err) 130 131 id2, err := is.Create([]byte(`{"comment": "abc2", "rootfs": {"type": "layers"}}`)) 132 assert.NoError(t, err) 133 134 id3, err := is.Create([]byte(`{"comment": "abc3", "rootfs": {"type": "layers"}}`)) 135 assert.NoError(t, err) 136 137 assert.NoError(t, is.SetParent(id, id2)) 138 assert.Len(t, is.Children(id2), 1) 139 140 assert.NoError(t, is.SetParent(id, id3)) 141 assert.Len(t, is.Children(id2), 0) 142 assert.Len(t, 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.NoError(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.NoError(t, err) 162 163 updated, err := store.GetLastUpdated(id) 164 assert.NoError(t, err) 165 assert.Equal(t, updated.IsZero(), true) 166 167 assert.NoError(t, store.SetLastUpdated(id)) 168 169 updated, err = store.GetLastUpdated(id) 170 assert.NoError(t, err) 171 assert.Equal(t, updated.IsZero(), false) 172 } 173 174 type mockLayerGetReleaser struct{} 175 176 func (ls *mockLayerGetReleaser) Get(layer.ChainID) (layer.Layer, error) { 177 return nil, nil 178 } 179 180 func (ls *mockLayerGetReleaser) Release(layer.Layer) ([]layer.Metadata, error) { 181 return nil, nil 182 }