Browse code

Use assertions in image package unit tests.

Signed-off-by: Daniel Nephin <dnephin@docker.com>

Daniel Nephin authored on 2017/03/04 02:38:06
Showing 3 changed files
... ...
@@ -11,79 +11,51 @@ import (
11 11
 	"path/filepath"
12 12
 	"testing"
13 13
 
14
+	"github.com/docker/docker/pkg/testutil/assert"
14 15
 	"github.com/opencontainers/go-digest"
15 16
 )
16 17
 
17
-func TestFSGetSet(t *testing.T) {
18
+func defaultFSStoreBackend(t *testing.T) (StoreBackend, func()) {
18 19
 	tmpdir, err := ioutil.TempDir("", "images-fs-store")
19
-	if err != nil {
20
-		t.Fatal(err)
21
-	}
22
-	defer os.RemoveAll(tmpdir)
23
-	fs, err := NewFSStoreBackend(tmpdir)
24
-	if err != nil {
25
-		t.Fatal(err)
26
-	}
20
+	assert.NilError(t, err)
27 21
 
28
-	testGetSet(t, fs)
22
+	fsBackend, err := NewFSStoreBackend(tmpdir)
23
+	assert.NilError(t, err)
24
+
25
+	return fsBackend, func() { os.RemoveAll(tmpdir) }
29 26
 }
30 27
 
31 28
 func TestFSGetInvalidData(t *testing.T) {
32
-	tmpdir, err := ioutil.TempDir("", "images-fs-store")
33
-	if err != nil {
34
-		t.Fatal(err)
35
-	}
36
-	defer os.RemoveAll(tmpdir)
37
-	fs, err := NewFSStoreBackend(tmpdir)
38
-	if err != nil {
39
-		t.Fatal(err)
40
-	}
29
+	store, cleanup := defaultFSStoreBackend(t)
30
+	defer cleanup()
41 31
 
42
-	id, err := fs.Set([]byte("foobar"))
43
-	if err != nil {
44
-		t.Fatal(err)
45
-	}
32
+	id, err := store.Set([]byte("foobar"))
33
+	assert.NilError(t, err)
46 34
 
47 35
 	dgst := digest.Digest(id)
48 36
 
49
-	if err := ioutil.WriteFile(filepath.Join(tmpdir, contentDirName, string(dgst.Algorithm()), dgst.Hex()), []byte("foobar2"), 0600); err != nil {
50
-		t.Fatal(err)
51
-	}
37
+	err = ioutil.WriteFile(filepath.Join(store.(*fs).root, contentDirName, string(dgst.Algorithm()), dgst.Hex()), []byte("foobar2"), 0600)
38
+	assert.NilError(t, err)
52 39
 
53
-	_, err = fs.Get(id)
54
-	if err == nil {
55
-		t.Fatal("expected get to fail after data modification.")
56
-	}
40
+	_, err = store.Get(id)
41
+	assert.Error(t, err, "failed to verify")
57 42
 }
58 43
 
59 44
 func TestFSInvalidSet(t *testing.T) {
60
-	tmpdir, err := ioutil.TempDir("", "images-fs-store")
61
-	if err != nil {
62
-		t.Fatal(err)
63
-	}
64
-	defer os.RemoveAll(tmpdir)
65
-	fs, err := NewFSStoreBackend(tmpdir)
66
-	if err != nil {
67
-		t.Fatal(err)
68
-	}
45
+	store, cleanup := defaultFSStoreBackend(t)
46
+	defer cleanup()
69 47
 
70 48
 	id := digest.FromBytes([]byte("foobar"))
71
-	err = os.Mkdir(filepath.Join(tmpdir, contentDirName, string(id.Algorithm()), id.Hex()), 0700)
72
-	if err != nil {
73
-		t.Fatal(err)
74
-	}
49
+	err := os.Mkdir(filepath.Join(store.(*fs).root, contentDirName, string(id.Algorithm()), id.Hex()), 0700)
50
+	assert.NilError(t, err)
75 51
 
76
-	_, err = fs.Set([]byte("foobar"))
77
-	if err == nil {
78
-		t.Fatal("expected error from invalid filesystem data.")
79
-	}
52
+	_, err = store.Set([]byte("foobar"))
53
+	assert.Error(t, err, "is a directory")
80 54
 }
81 55
 
82 56
 func TestFSInvalidRoot(t *testing.T) {
83 57
 	tmpdir, err := ioutil.TempDir("", "images-fs-store")
84
-	if err != nil {
85
-		t.Fatal(err)
86
-	}
58
+	assert.NilError(t, err)
87 59
 	defer os.RemoveAll(tmpdir)
88 60
 
89 61
 	tcases := []struct {
... ...
@@ -98,34 +70,29 @@ func TestFSInvalidRoot(t *testing.T) {
98 98
 		root := filepath.Join(tmpdir, tc.root)
99 99
 		filePath := filepath.Join(tmpdir, tc.invalidFile)
100 100
 		err := os.MkdirAll(filepath.Dir(filePath), 0700)
101
-		if err != nil {
102
-			t.Fatal(err)
103
-		}
101
+		assert.NilError(t, err)
102
+
104 103
 		f, err := os.Create(filePath)
105
-		if err != nil {
106
-			t.Fatal(err)
107
-		}
108
-		f.Close()
104
+		defer f.Close()
105
+		assert.NilError(t, err)
109 106
 
110 107
 		_, err = NewFSStoreBackend(root)
111
-		if err == nil {
112
-			t.Fatalf("expected error from root %q and invalid file %q", tc.root, tc.invalidFile)
113
-		}
108
+		assert.Error(t, err, "not a directory")
114 109
 
115 110
 		os.RemoveAll(root)
116 111
 	}
117 112
 
118 113
 }
119 114
 
120
-func testMetadataGetSet(t *testing.T, store StoreBackend) {
115
+func TestFSMetadataGetSet(t *testing.T) {
116
+	store, cleanup := defaultFSStoreBackend(t)
117
+	defer cleanup()
118
+
121 119
 	id, err := store.Set([]byte("foo"))
122
-	if err != nil {
123
-		t.Fatal(err)
124
-	}
120
+	assert.NilError(t, err)
121
+
125 122
 	id2, err := store.Set([]byte("bar"))
126
-	if err != nil {
127
-		t.Fatal(err)
128
-	}
123
+	assert.NilError(t, err)
129 124
 
130 125
 	tcases := []struct {
131 126
 		id    digest.Digest
... ...
@@ -139,115 +106,51 @@ func testMetadataGetSet(t *testing.T, store StoreBackend) {
139 139
 
140 140
 	for _, tc := range tcases {
141 141
 		err = store.SetMetadata(tc.id, tc.key, tc.value)
142
-		if err != nil {
143
-			t.Fatal(err)
144
-		}
142
+		assert.NilError(t, err)
145 143
 
146 144
 		actual, err := store.GetMetadata(tc.id, tc.key)
147
-		if err != nil {
148
-			t.Fatal(err)
149
-		}
145
+		assert.NilError(t, err)
146
+
150 147
 		if bytes.Compare(actual, tc.value) != 0 {
151 148
 			t.Fatalf("Metadata expected %q, got %q", tc.value, actual)
152 149
 		}
153 150
 	}
154 151
 
155 152
 	_, err = store.GetMetadata(id2, "tkey2")
156
-	if err == nil {
157
-		t.Fatal("expected error for getting metadata for unknown key")
158
-	}
153
+	assert.Error(t, err, "no such file or directory")
159 154
 
160 155
 	id3 := digest.FromBytes([]byte("baz"))
161 156
 	err = store.SetMetadata(id3, "tkey", []byte("tval"))
162
-	if err == nil {
163
-		t.Fatal("expected error for setting metadata for unknown ID.")
164
-	}
157
+	assert.Error(t, err, "no such file or directory")
165 158
 
166 159
 	_, err = store.GetMetadata(id3, "tkey")
167
-	if err == nil {
168
-		t.Fatal("expected error for getting metadata for unknown ID.")
169
-	}
170
-}
171
-
172
-func TestFSMetadataGetSet(t *testing.T) {
173
-	tmpdir, err := ioutil.TempDir("", "images-fs-store")
174
-	if err != nil {
175
-		t.Fatal(err)
176
-	}
177
-	defer os.RemoveAll(tmpdir)
178
-	fs, err := NewFSStoreBackend(tmpdir)
179
-	if err != nil {
180
-		t.Fatal(err)
181
-	}
182
-
183
-	testMetadataGetSet(t, fs)
184
-}
185
-
186
-func TestFSDelete(t *testing.T) {
187
-	tmpdir, err := ioutil.TempDir("", "images-fs-store")
188
-	if err != nil {
189
-		t.Fatal(err)
190
-	}
191
-	defer os.RemoveAll(tmpdir)
192
-	fs, err := NewFSStoreBackend(tmpdir)
193
-	if err != nil {
194
-		t.Fatal(err)
195
-	}
196
-
197
-	testDelete(t, fs)
198
-}
199
-
200
-func TestFSWalker(t *testing.T) {
201
-	tmpdir, err := ioutil.TempDir("", "images-fs-store")
202
-	if err != nil {
203
-		t.Fatal(err)
204
-	}
205
-	defer os.RemoveAll(tmpdir)
206
-	fs, err := NewFSStoreBackend(tmpdir)
207
-	if err != nil {
208
-		t.Fatal(err)
209
-	}
210
-
211
-	testWalker(t, fs)
160
+	assert.Error(t, err, "no such file or directory")
212 161
 }
213 162
 
214 163
 func TestFSInvalidWalker(t *testing.T) {
215
-	tmpdir, err := ioutil.TempDir("", "images-fs-store")
216
-	if err != nil {
217
-		t.Fatal(err)
218
-	}
219
-	defer os.RemoveAll(tmpdir)
220
-	fs, err := NewFSStoreBackend(tmpdir)
221
-	if err != nil {
222
-		t.Fatal(err)
223
-	}
164
+	store, cleanup := defaultFSStoreBackend(t)
165
+	defer cleanup()
224 166
 
225
-	fooID, err := fs.Set([]byte("foo"))
226
-	if err != nil {
227
-		t.Fatal(err)
228
-	}
167
+	fooID, err := store.Set([]byte("foo"))
168
+	assert.NilError(t, err)
229 169
 
230
-	if err := ioutil.WriteFile(filepath.Join(tmpdir, contentDirName, "sha256/foobar"), []byte("foobar"), 0600); err != nil {
231
-		t.Fatal(err)
232
-	}
170
+	err = ioutil.WriteFile(filepath.Join(store.(*fs).root, contentDirName, "sha256/foobar"), []byte("foobar"), 0600)
171
+	assert.NilError(t, err)
233 172
 
234 173
 	n := 0
235
-	err = fs.Walk(func(id digest.Digest) error {
236
-		if id != fooID {
237
-			t.Fatalf("invalid walker ID %q, expected %q", id, fooID)
238
-		}
174
+	err = store.Walk(func(id digest.Digest) error {
175
+		assert.Equal(t, id, fooID)
239 176
 		n++
240 177
 		return nil
241 178
 	})
242
-	if err != nil {
243
-		t.Fatalf("invalid data should not have caused walker error, got %v", err)
244
-	}
245
-	if n != 1 {
246
-		t.Fatalf("expected 1 walk initialization, got %d", n)
247
-	}
179
+	assert.NilError(t, err)
180
+	assert.Equal(t, n, 1)
248 181
 }
249 182
 
250
-func testGetSet(t *testing.T, store StoreBackend) {
183
+func TestFSGetSet(t *testing.T) {
184
+	store, cleanup := defaultFSStoreBackend(t)
185
+	defer cleanup()
186
+
251 187
 	type tcase struct {
252 188
 		input    []byte
253 189
 		expected digest.Digest
... ...
@@ -258,15 +161,13 @@ func testGetSet(t *testing.T, store StoreBackend) {
258 258
 
259 259
 	randomInput := make([]byte, 8*1024)
260 260
 	_, err := rand.Read(randomInput)
261
-	if err != nil {
262
-		t.Fatal(err)
263
-	}
261
+	assert.NilError(t, err)
262
+
264 263
 	// skipping use of digest pkg because it is used by the implementation
265 264
 	h := sha256.New()
266 265
 	_, err = h.Write(randomInput)
267
-	if err != nil {
268
-		t.Fatal(err)
269
-	}
266
+	assert.NilError(t, err)
267
+
270 268
 	tcases = append(tcases, tcase{
271 269
 		input:    randomInput,
272 270
 		expected: digest.Digest("sha256:" + hex.EncodeToString(h.Sum(nil))),
... ...
@@ -274,83 +175,74 @@ func testGetSet(t *testing.T, store StoreBackend) {
274 274
 
275 275
 	for _, tc := range tcases {
276 276
 		id, err := store.Set([]byte(tc.input))
277
-		if err != nil {
278
-			t.Fatal(err)
279
-		}
280
-		if id != tc.expected {
281
-			t.Fatalf("expected ID %q, got %q", tc.expected, id)
282
-		}
283
-	}
284
-
285
-	for _, emptyData := range [][]byte{nil, {}} {
286
-		_, err := store.Set(emptyData)
287
-		if err == nil {
288
-			t.Fatal("expected error for nil input.")
289
-		}
277
+		assert.NilError(t, err)
278
+		assert.Equal(t, id, tc.expected)
290 279
 	}
291 280
 
292 281
 	for _, tc := range tcases {
293 282
 		data, err := store.Get(tc.expected)
294
-		if err != nil {
295
-			t.Fatal(err)
296
-		}
283
+		assert.NilError(t, err)
297 284
 		if bytes.Compare(data, tc.input) != 0 {
298 285
 			t.Fatalf("expected data %q, got %q", tc.input, data)
299 286
 		}
300 287
 	}
288
+}
289
+
290
+func TestFSGetUnsetKey(t *testing.T) {
291
+	store, cleanup := defaultFSStoreBackend(t)
292
+	defer cleanup()
301 293
 
302 294
 	for _, key := range []digest.Digest{"foobar:abc", "sha256:abc", "sha256:c3ab8ff13720e8ad9047dd39466b3c8974e592c2fa383d4a3960714caef0c4f2a"} {
303 295
 		_, err := store.Get(key)
304
-		if err == nil {
305
-			t.Fatalf("expected error for ID %q.", key)
306
-		}
296
+		assert.Error(t, err, "no such file or directory")
307 297
 	}
298
+}
308 299
 
300
+func TestFSGetEmptyData(t *testing.T) {
301
+	store, cleanup := defaultFSStoreBackend(t)
302
+	defer cleanup()
303
+
304
+	for _, emptyData := range [][]byte{nil, {}} {
305
+		_, err := store.Set(emptyData)
306
+		assert.Error(t, err, "invalid empty data")
307
+	}
309 308
 }
310 309
 
311
-func testDelete(t *testing.T, store StoreBackend) {
310
+func TestFSDelete(t *testing.T) {
311
+	store, cleanup := defaultFSStoreBackend(t)
312
+	defer cleanup()
313
+
312 314
 	id, err := store.Set([]byte("foo"))
313
-	if err != nil {
314
-		t.Fatal(err)
315
-	}
315
+	assert.NilError(t, err)
316
+
316 317
 	id2, err := store.Set([]byte("bar"))
317
-	if err != nil {
318
-		t.Fatal(err)
319
-	}
318
+	assert.NilError(t, err)
320 319
 
321 320
 	err = store.Delete(id)
322
-	if err != nil {
323
-		t.Fatal(err)
324
-	}
321
+	assert.NilError(t, err)
325 322
 
326 323
 	_, err = store.Get(id)
327
-	if err == nil {
328
-		t.Fatalf("expected getting deleted item %q to fail", id)
329
-	}
324
+	assert.Error(t, err, "no such file or directory")
325
+
330 326
 	_, err = store.Get(id2)
331
-	if err != nil {
332
-		t.Fatal(err)
333
-	}
327
+	assert.NilError(t, err)
334 328
 
335 329
 	err = store.Delete(id2)
336
-	if err != nil {
337
-		t.Fatal(err)
338
-	}
330
+	assert.NilError(t, err)
331
+
339 332
 	_, err = store.Get(id2)
340
-	if err == nil {
341
-		t.Fatalf("expected getting deleted item %q to fail", id2)
342
-	}
333
+	assert.Error(t, err, "no such file or directory")
343 334
 }
344 335
 
345
-func testWalker(t *testing.T, store StoreBackend) {
336
+func TestFSWalker(t *testing.T) {
337
+	store, cleanup := defaultFSStoreBackend(t)
338
+	defer cleanup()
339
+
346 340
 	id, err := store.Set([]byte("foo"))
347
-	if err != nil {
348
-		t.Fatal(err)
349
-	}
341
+	assert.NilError(t, err)
342
+
350 343
 	id2, err := store.Set([]byte("bar"))
351
-	if err != nil {
352
-		t.Fatal(err)
353
-	}
344
+	assert.NilError(t, err)
354 345
 
355 346
 	tcases := make(map[digest.Digest]struct{})
356 347
 	tcases[id] = struct{}{}
... ...
@@ -361,24 +253,22 @@ func testWalker(t *testing.T, store StoreBackend) {
361 361
 		n++
362 362
 		return nil
363 363
 	})
364
-	if err != nil {
365
-		t.Fatal(err)
366
-	}
364
+	assert.NilError(t, err)
365
+	assert.Equal(t, n, 2)
366
+	assert.Equal(t, len(tcases), 0)
367
+}
367 368
 
368
-	if n != 2 {
369
-		t.Fatalf("expected 2 walk initializations, got %d", n)
370
-	}
371
-	if len(tcases) != 0 {
372
-		t.Fatalf("expected empty unwalked set, got %+v", tcases)
373
-	}
369
+func TestFSWalkerStopOnError(t *testing.T) {
370
+	store, cleanup := defaultFSStoreBackend(t)
371
+	defer cleanup()
374 372
 
375
-	// stop on error
376
-	tcases = make(map[digest.Digest]struct{})
373
+	id, err := store.Set([]byte("foo"))
374
+	assert.NilError(t, err)
375
+
376
+	tcases := make(map[digest.Digest]struct{})
377 377
 	tcases[id] = struct{}{}
378 378
 	err = store.Walk(func(id digest.Digest) error {
379
-		return errors.New("")
379
+		return errors.New("what")
380 380
 	})
381
-	if err == nil {
382
-		t.Fatalf("expected error from walker.")
383
-	}
381
+	assert.Error(t, err, "what")
384 382
 }
... ...
@@ -5,6 +5,8 @@ import (
5 5
 	"sort"
6 6
 	"strings"
7 7
 	"testing"
8
+
9
+	"github.com/docker/docker/pkg/testutil/assert"
8 10
 )
9 11
 
10 12
 const sampleImageJSON = `{
... ...
@@ -17,22 +19,15 @@ const sampleImageJSON = `{
17 17
 	}
18 18
 }`
19 19
 
20
-func TestJSON(t *testing.T) {
20
+func TestNewFromJSON(t *testing.T) {
21 21
 	img, err := NewFromJSON([]byte(sampleImageJSON))
22
-	if err != nil {
23
-		t.Fatal(err)
24
-	}
25
-	rawJSON := img.RawJSON()
26
-	if string(rawJSON) != sampleImageJSON {
27
-		t.Fatalf("raw JSON of config didn't match: expected %+v, got %v", sampleImageJSON, rawJSON)
28
-	}
22
+	assert.NilError(t, err)
23
+	assert.Equal(t, string(img.RawJSON()), sampleImageJSON)
29 24
 }
30 25
 
31
-func TestInvalidJSON(t *testing.T) {
26
+func TestNewFromJSONWithInvalidJSON(t *testing.T) {
32 27
 	_, err := NewFromJSON([]byte("{}"))
33
-	if err == nil {
34
-		t.Fatal("expected JSON parse error")
35
-	}
28
+	assert.Error(t, err, "invalid image JSON, no RootFS key")
36 29
 }
37 30
 
38 31
 func TestMarshalKeyOrder(t *testing.T) {
... ...
@@ -43,9 +38,7 @@ func TestMarshalKeyOrder(t *testing.T) {
43 43
 			Architecture: "c",
44 44
 		},
45 45
 	})
46
-	if err != nil {
47
-		t.Fatal(err)
48
-	}
46
+	assert.NilError(t, err)
49 47
 
50 48
 	expectedOrder := []string{"architecture", "author", "comment"}
51 49
 	var indexes []int
... ...
@@ -1,292 +1,150 @@
1 1
 package image
2 2
 
3 3
 import (
4
-	"io/ioutil"
5
-	"os"
6 4
 	"testing"
7 5
 
8 6
 	"github.com/docker/docker/layer"
7
+	"github.com/docker/docker/pkg/testutil/assert"
9 8
 	"github.com/opencontainers/go-digest"
10 9
 )
11 10
 
12 11
 func TestRestore(t *testing.T) {
13
-	tmpdir, err := ioutil.TempDir("", "images-fs-store")
14
-	if err != nil {
15
-		t.Fatal(err)
16
-	}
17
-	defer os.RemoveAll(tmpdir)
18
-	fs, err := NewFSStoreBackend(tmpdir)
19
-	if err != nil {
20
-		t.Fatal(err)
21
-	}
12
+	fs, cleanup := defaultFSStoreBackend(t)
13
+	defer cleanup()
22 14
 
23 15
 	id1, err := fs.Set([]byte(`{"comment": "abc", "rootfs": {"type": "layers"}}`))
24
-	if err != nil {
25
-		t.Fatal(err)
26
-	}
16
+	assert.NilError(t, err)
17
+
27 18
 	_, err = fs.Set([]byte(`invalid`))
28
-	if err != nil {
29
-		t.Fatal(err)
30
-	}
19
+	assert.NilError(t, err)
20
+
31 21
 	id2, err := fs.Set([]byte(`{"comment": "def", "rootfs": {"type": "layers", "diff_ids": ["2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae"]}}`))
32
-	if err != nil {
33
-		t.Fatal(err)
34
-	}
22
+	assert.NilError(t, err)
23
+
35 24
 	err = fs.SetMetadata(id2, "parent", []byte(id1))
36
-	if err != nil {
37
-		t.Fatal(err)
38
-	}
25
+	assert.NilError(t, err)
39 26
 
40 27
 	is, err := NewImageStore(fs, &mockLayerGetReleaser{})
41
-	if err != nil {
42
-		t.Fatal(err)
43
-	}
28
+	assert.NilError(t, err)
44 29
 
45
-	imgs := is.Map()
46
-	if actual, expected := len(imgs), 2; actual != expected {
47
-		t.Fatalf("invalid images length, expected 2, got %q", len(imgs))
48
-	}
30
+	assert.Equal(t, len(is.Map()), 2)
49 31
 
50 32
 	img1, err := is.Get(ID(id1))
51
-	if err != nil {
52
-		t.Fatal(err)
53
-	}
54
-
55
-	if actual, expected := img1.computedID, ID(id1); actual != expected {
56
-		t.Fatalf("invalid image ID: expected %q, got %q", expected, actual)
57
-	}
58
-
59
-	if actual, expected := img1.computedID.String(), string(id1); actual != expected {
60
-		t.Fatalf("invalid image ID string: expected %q, got %q", expected, actual)
61
-	}
33
+	assert.NilError(t, err)
34
+	assert.Equal(t, img1.computedID, ID(id1))
35
+	assert.Equal(t, img1.computedID.String(), string(id1))
62 36
 
63 37
 	img2, err := is.Get(ID(id2))
64
-	if err != nil {
65
-		t.Fatal(err)
66
-	}
67
-
68
-	if actual, expected := img1.Comment, "abc"; actual != expected {
69
-		t.Fatalf("invalid comment for image1: expected %q, got %q", expected, actual)
70
-	}
71
-
72
-	if actual, expected := img2.Comment, "def"; actual != expected {
73
-		t.Fatalf("invalid comment for image2: expected %q, got %q", expected, actual)
74
-	}
38
+	assert.NilError(t, err)
39
+	assert.Equal(t, img1.Comment, "abc")
40
+	assert.Equal(t, img2.Comment, "def")
75 41
 
76 42
 	p, err := is.GetParent(ID(id1))
77
-	if err == nil {
78
-		t.Fatal("expected error for getting parent")
79
-	}
43
+	assert.Error(t, err, "no such file")
80 44
 
81 45
 	p, err = is.GetParent(ID(id2))
82
-	if err != nil {
83
-		t.Fatal(err)
84
-	}
85
-	if actual, expected := p, ID(id1); actual != expected {
86
-		t.Fatalf("invalid parent: expected %q, got %q", expected, actual)
87
-	}
46
+	assert.NilError(t, err)
47
+	assert.Equal(t, p, ID(id1))
88 48
 
89 49
 	children := is.Children(ID(id1))
90
-	if len(children) != 1 {
91
-		t.Fatalf("invalid children length: %q", len(children))
92
-	}
93
-	if actual, expected := children[0], ID(id2); actual != expected {
94
-		t.Fatalf("invalid child for id1: expected %q, got %q", expected, actual)
95
-	}
96
-
97
-	heads := is.Heads()
98
-	if actual, expected := len(heads), 1; actual != expected {
99
-		t.Fatalf("invalid images length: expected %q, got %q", expected, actual)
100
-	}
50
+	assert.Equal(t, len(children), 1)
51
+	assert.Equal(t, children[0], ID(id2))
52
+	assert.Equal(t, len(is.Heads()), 1)
101 53
 
102 54
 	sid1, err := is.Search(string(id1)[:10])
103
-	if err != nil {
104
-		t.Fatal(err)
105
-	}
106
-	if actual, expected := sid1, ID(id1); actual != expected {
107
-		t.Fatalf("searched ID mismatch: expected %q, got %q", expected, actual)
108
-	}
55
+	assert.NilError(t, err)
56
+	assert.Equal(t, sid1, ID(id1))
109 57
 
110 58
 	sid1, err = is.Search(digest.Digest(id1).Hex()[:6])
111
-	if err != nil {
112
-		t.Fatal(err)
113
-	}
114
-	if actual, expected := sid1, ID(id1); actual != expected {
115
-		t.Fatalf("searched ID mismatch: expected %q, got %q", expected, actual)
116
-	}
59
+	assert.NilError(t, err)
60
+	assert.Equal(t, sid1, ID(id1))
117 61
 
118 62
 	invalidPattern := digest.Digest(id1).Hex()[1:6]
119 63
 	_, err = is.Search(invalidPattern)
120
-	if err == nil {
121
-		t.Fatalf("expected search for %q to fail", invalidPattern)
122
-	}
123
-
64
+	assert.Error(t, err, "No such image")
124 65
 }
125 66
 
126 67
 func TestAddDelete(t *testing.T) {
127
-	tmpdir, err := ioutil.TempDir("", "images-fs-store")
128
-	if err != nil {
129
-		t.Fatal(err)
130
-	}
131
-	defer os.RemoveAll(tmpdir)
132
-	fs, err := NewFSStoreBackend(tmpdir)
133
-	if err != nil {
134
-		t.Fatal(err)
135
-	}
136
-
137
-	is, err := NewImageStore(fs, &mockLayerGetReleaser{})
138
-	if err != nil {
139
-		t.Fatal(err)
140
-	}
68
+	is, cleanup := defaultImageStore(t)
69
+	defer cleanup()
141 70
 
142 71
 	id1, err := is.Create([]byte(`{"comment": "abc", "rootfs": {"type": "layers", "diff_ids": ["2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae"]}}`))
143
-	if err != nil {
144
-		t.Fatal(err)
145
-	}
146
-
147
-	if actual, expected := id1, ID("sha256:8d25a9c45df515f9d0fe8e4a6b1c64dd3b965a84790ddbcc7954bb9bc89eb993"); actual != expected {
148
-		t.Fatalf("create ID mismatch: expected %q, got %q", expected, actual)
149
-	}
72
+	assert.NilError(t, err)
73
+	assert.Equal(t, id1, ID("sha256:8d25a9c45df515f9d0fe8e4a6b1c64dd3b965a84790ddbcc7954bb9bc89eb993"))
150 74
 
151 75
 	img, err := is.Get(id1)
152
-	if err != nil {
153
-		t.Fatal(err)
154
-	}
155
-
156
-	if actual, expected := img.Comment, "abc"; actual != expected {
157
-		t.Fatalf("invalid comment in image: expected %q, got %q", expected, actual)
158
-	}
76
+	assert.NilError(t, err)
77
+	assert.Equal(t, img.Comment, "abc")
159 78
 
160 79
 	id2, err := is.Create([]byte(`{"comment": "def", "rootfs": {"type": "layers", "diff_ids": ["2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae"]}}`))
161
-	if err != nil {
162
-		t.Fatal(err)
163
-	}
80
+	assert.NilError(t, err)
164 81
 
165 82
 	err = is.SetParent(id2, id1)
166
-	if err != nil {
167
-		t.Fatal(err)
168
-	}
83
+	assert.NilError(t, err)
169 84
 
170 85
 	pid1, err := is.GetParent(id2)
171
-	if err != nil {
172
-		t.Fatal(err)
173
-	}
174
-	if actual, expected := pid1, id1; actual != expected {
175
-		t.Fatalf("invalid parent for image: expected %q, got %q", expected, actual)
176
-	}
86
+	assert.NilError(t, err)
87
+	assert.Equal(t, pid1, id1)
177 88
 
178 89
 	_, err = is.Delete(id1)
179
-	if err != nil {
180
-		t.Fatal(err)
181
-	}
90
+	assert.NilError(t, err)
91
+
182 92
 	_, err = is.Get(id1)
183
-	if err == nil {
184
-		t.Fatalf("expected get for deleted image %q to fail", id1)
185
-	}
93
+	assert.Error(t, err, "no such file or directory")
94
+
186 95
 	_, err = is.Get(id2)
187
-	if err != nil {
188
-		t.Fatal(err)
189
-	}
190
-	pid1, err = is.GetParent(id2)
191
-	if err == nil {
192
-		t.Fatalf("expected parent check for image %q to fail, got %q", id2, pid1)
193
-	}
96
+	assert.NilError(t, err)
194 97
 
98
+	_, err = is.GetParent(id2)
99
+	assert.Error(t, err, "no such file or directory")
195 100
 }
196 101
 
197 102
 func TestSearchAfterDelete(t *testing.T) {
198
-	tmpdir, err := ioutil.TempDir("", "images-fs-store")
199
-	if err != nil {
200
-		t.Fatal(err)
201
-	}
202
-	defer os.RemoveAll(tmpdir)
203
-	fs, err := NewFSStoreBackend(tmpdir)
204
-	if err != nil {
205
-		t.Fatal(err)
206
-	}
207
-
208
-	is, err := NewImageStore(fs, &mockLayerGetReleaser{})
209
-	if err != nil {
210
-		t.Fatal(err)
211
-	}
103
+	is, cleanup := defaultImageStore(t)
104
+	defer cleanup()
212 105
 
213 106
 	id, err := is.Create([]byte(`{"comment": "abc", "rootfs": {"type": "layers"}}`))
214
-	if err != nil {
215
-		t.Fatal(err)
216
-	}
107
+	assert.NilError(t, err)
217 108
 
218 109
 	id1, err := is.Search(string(id)[:15])
219
-	if err != nil {
220
-		t.Fatal(err)
221
-	}
110
+	assert.NilError(t, err)
111
+	assert.Equal(t, id1, id)
222 112
 
223
-	if actual, expected := id1, id; expected != actual {
224
-		t.Fatalf("wrong id returned from search: expected %q, got %q", expected, actual)
225
-	}
113
+	_, err = is.Delete(id)
114
+	assert.NilError(t, err)
226 115
 
227
-	if _, err := is.Delete(id); err != nil {
228
-		t.Fatal(err)
229
-	}
230
-
231
-	if _, err := is.Search(string(id)[:15]); err == nil {
232
-		t.Fatal("expected search after deletion to fail")
233
-	}
116
+	_, err = is.Search(string(id)[:15])
117
+	assert.Error(t, err, "No such image")
234 118
 }
235 119
 
236 120
 func TestParentReset(t *testing.T) {
237
-	tmpdir, err := ioutil.TempDir("", "images-fs-store")
238
-	if err != nil {
239
-		t.Fatal(err)
240
-	}
241
-	defer os.RemoveAll(tmpdir)
242
-	fs, err := NewFSStoreBackend(tmpdir)
243
-	if err != nil {
244
-		t.Fatal(err)
245
-	}
246
-
247
-	is, err := NewImageStore(fs, &mockLayerGetReleaser{})
248
-	if err != nil {
249
-		t.Fatal(err)
250
-	}
121
+	is, cleanup := defaultImageStore(t)
122
+	defer cleanup()
251 123
 
252 124
 	id, err := is.Create([]byte(`{"comment": "abc1", "rootfs": {"type": "layers"}}`))
253
-	if err != nil {
254
-		t.Fatal(err)
255
-	}
125
+	assert.NilError(t, err)
256 126
 
257 127
 	id2, err := is.Create([]byte(`{"comment": "abc2", "rootfs": {"type": "layers"}}`))
258
-	if err != nil {
259
-		t.Fatal(err)
260
-	}
128
+	assert.NilError(t, err)
261 129
 
262 130
 	id3, err := is.Create([]byte(`{"comment": "abc3", "rootfs": {"type": "layers"}}`))
263
-	if err != nil {
264
-		t.Fatal(err)
265
-	}
131
+	assert.NilError(t, err)
266 132
 
267
-	if err := is.SetParent(id, id2); err != nil {
268
-		t.Fatal(err)
269
-	}
133
+	assert.NilError(t, is.SetParent(id, id2))
134
+	assert.Equal(t, len(is.Children(id2)), 1)
270 135
 
271
-	ids := is.Children(id2)
272
-	if actual, expected := len(ids), 1; expected != actual {
273
-		t.Fatalf("wrong number of children: %d, got %d", expected, actual)
274
-	}
275
-
276
-	if err := is.SetParent(id, id3); err != nil {
277
-		t.Fatal(err)
278
-	}
136
+	assert.NilError(t, is.SetParent(id, id3))
137
+	assert.Equal(t, len(is.Children(id2)), 0)
138
+	assert.Equal(t, len(is.Children(id3)), 1)
139
+}
279 140
 
280
-	ids = is.Children(id2)
281
-	if actual, expected := len(ids), 0; expected != actual {
282
-		t.Fatalf("wrong number of children after parent reset: %d, got %d", expected, actual)
283
-	}
141
+func defaultImageStore(t *testing.T) (Store, func()) {
142
+	fsBackend, cleanup := defaultFSStoreBackend(t)
284 143
 
285
-	ids = is.Children(id3)
286
-	if actual, expected := len(ids), 1; expected != actual {
287
-		t.Fatalf("wrong number of children after parent reset: %d, got %d", expected, actual)
288
-	}
144
+	store, err := NewImageStore(fsBackend, &mockLayerGetReleaser{})
145
+	assert.NilError(t, err)
289 146
 
147
+	return store, cleanup
290 148
 }
291 149
 
292 150
 type mockLayerGetReleaser struct{}