Browse code

pkg/tarsum: adding more tests

Ensuring case size of headers will still be accounted for.
https://github.com/docker/docker/pull/8869#discussion_r20114401

Signed-off-by: Vincent Batts <vbatts@redhat.com>

Vincent Batts authored on 2014/11/11 22:48:11
Showing 1 changed files
... ...
@@ -318,6 +318,153 @@ func TestTarSums(t *testing.T) {
318 318
 	}
319 319
 }
320 320
 
321
+func TestIteration(t *testing.T) {
322
+	headerTests := []struct {
323
+		expectedSum string // TODO(vbatts) it would be nice to get individual sums of each
324
+		version     Version
325
+		hdr         *tar.Header
326
+		data        []byte
327
+	}{
328
+		{
329
+			"tarsum+sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
330
+			Version0,
331
+			&tar.Header{
332
+				Name:     "file.txt",
333
+				Size:     0,
334
+				Typeflag: tar.TypeReg,
335
+				Devminor: 0,
336
+				Devmajor: 0,
337
+			},
338
+			[]byte(""),
339
+		},
340
+		{
341
+			"tarsum.dev+sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
342
+			VersionDev,
343
+			&tar.Header{
344
+				Name:     "file.txt",
345
+				Size:     0,
346
+				Typeflag: tar.TypeReg,
347
+				Devminor: 0,
348
+				Devmajor: 0,
349
+			},
350
+			[]byte(""),
351
+		},
352
+		{
353
+			"tarsum.dev+sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
354
+			VersionDev,
355
+			&tar.Header{
356
+				Name:     "another.txt",
357
+				Uid:      1000,
358
+				Gid:      1000,
359
+				Uname:    "slartibartfast",
360
+				Gname:    "users",
361
+				Size:     4,
362
+				Typeflag: tar.TypeReg,
363
+				Devminor: 0,
364
+				Devmajor: 0,
365
+			},
366
+			[]byte("test"),
367
+		},
368
+		{
369
+			"tarsum.dev+sha256:4cc2e71ac5d31833ab2be9b4f7842a14ce595ec96a37af4ed08f87bc374228cd",
370
+			VersionDev,
371
+			&tar.Header{
372
+				Name:     "xattrs.txt",
373
+				Uid:      1000,
374
+				Gid:      1000,
375
+				Uname:    "slartibartfast",
376
+				Gname:    "users",
377
+				Size:     4,
378
+				Typeflag: tar.TypeReg,
379
+				Xattrs: map[string]string{
380
+					"user.key1": "value1",
381
+					"user.key2": "value2",
382
+				},
383
+			},
384
+			[]byte("test"),
385
+		},
386
+		{
387
+			"tarsum.dev+sha256:65f4284fa32c0d4112dd93c3637697805866415b570587e4fd266af241503760",
388
+			VersionDev,
389
+			&tar.Header{
390
+				Name:     "xattrs.txt",
391
+				Uid:      1000,
392
+				Gid:      1000,
393
+				Uname:    "slartibartfast",
394
+				Gname:    "users",
395
+				Size:     4,
396
+				Typeflag: tar.TypeReg,
397
+				Xattrs: map[string]string{
398
+					"user.KEY1": "value1", // adding different case to ensure different sum
399
+					"user.key2": "value2",
400
+				},
401
+			},
402
+			[]byte("test"),
403
+		},
404
+		{
405
+			"tarsum+sha256:c12bb6f1303a9ddbf4576c52da74973c00d14c109bcfa76b708d5da1154a07fa",
406
+			Version0,
407
+			&tar.Header{
408
+				Name:     "xattrs.txt",
409
+				Uid:      1000,
410
+				Gid:      1000,
411
+				Uname:    "slartibartfast",
412
+				Gname:    "users",
413
+				Size:     4,
414
+				Typeflag: tar.TypeReg,
415
+				Xattrs: map[string]string{
416
+					"user.NOT": "CALCULATED",
417
+				},
418
+			},
419
+			[]byte("test"),
420
+		},
421
+	}
422
+	for _, htest := range headerTests {
423
+		s, err := renderSumForHeader(htest.version, htest.hdr, htest.data)
424
+		if err != nil {
425
+			t.Fatal(err)
426
+		}
427
+
428
+		if s != htest.expectedSum {
429
+			t.Errorf("expected sum: %q, got: %q", htest.expectedSum, s)
430
+		}
431
+	}
432
+
433
+}
434
+
435
+func renderSumForHeader(v Version, h *tar.Header, data []byte) (string, error) {
436
+	buf := bytes.NewBuffer(nil)
437
+	// first build our test tar
438
+	tw := tar.NewWriter(buf)
439
+	if err := tw.WriteHeader(h); err != nil {
440
+		return "", err
441
+	}
442
+	if _, err := tw.Write(data); err != nil {
443
+		return "", err
444
+	}
445
+	tw.Close()
446
+
447
+	ts, err := NewTarSum(buf, true, v)
448
+	if err != nil {
449
+		return "", err
450
+	}
451
+	tr := tar.NewReader(ts)
452
+	for {
453
+		hdr, err := tr.Next()
454
+		if hdr == nil || err == io.EOF {
455
+			break
456
+		}
457
+		if err != nil {
458
+			return "", err
459
+		}
460
+		if _, err = io.Copy(ioutil.Discard, tr); err != nil {
461
+			return "", err
462
+		}
463
+		break // we're just reading one header ...
464
+	}
465
+	return ts.Sum(nil), nil
466
+}
467
+
321 468
 func Benchmark9kTar(b *testing.B) {
322 469
 	buf := bytes.NewBuffer([]byte{})
323 470
 	fh, err := os.Open("testdata/46af0962ab5afeb5ce6740d4d91652e69206fc991fd5328c1a94d364ad00e457/layer.tar")