Browse code

Add test coverage for pkg/tarsum

And removing unused code.
- tarsum.go :
NewTarSumHash could be non exported (for now)
NewTarSumForLabel is never used, except for the tests
- fileinfosums.go:
SortByPos is never used, except for the tests
- versionning.go:
GetVersions is never used, expect for the tests

Signed-off-by: Vincent Demeester <vincent@sbr.pm>

Vincent Demeester authored on 2015/06/02 16:08:01
Showing 5 changed files
1 1
new file mode 100644
... ...
@@ -0,0 +1,63 @@
0
+package tarsum
1
+
2
+import (
3
+	"io"
4
+	"io/ioutil"
5
+	"os"
6
+	"testing"
7
+)
8
+
9
+// Try to remove tarsum (in the BuilderContext) that do not exists, won't change a thing
10
+func TestTarSumRemoveNonExistent(t *testing.T) {
11
+	filename := "testdata/46af0962ab5afeb5ce6740d4d91652e69206fc991fd5328c1a94d364ad00e457/layer.tar"
12
+	reader, err := os.Open(filename)
13
+	if err != nil {
14
+		t.Fatal(err)
15
+	}
16
+	ts, err := NewTarSum(reader, false, Version0)
17
+	if err != nil {
18
+		t.Fatal(err)
19
+	}
20
+
21
+	// Read and discard bytes so that it populates sums
22
+	_, err = io.Copy(ioutil.Discard, ts)
23
+	if err != nil {
24
+		t.Errorf("failed to read from %s: %s", filename, err)
25
+	}
26
+
27
+	expected := len(ts.GetSums())
28
+
29
+	ts.(BuilderContext).Remove("")
30
+	ts.(BuilderContext).Remove("Anything")
31
+
32
+	if len(ts.GetSums()) != expected {
33
+		t.Fatalf("Expected %v sums, go %v.", expected, ts.GetSums())
34
+	}
35
+}
36
+
37
+// Remove a tarsum (in the BuilderContext)
38
+func TestTarSumRemove(t *testing.T) {
39
+	filename := "testdata/46af0962ab5afeb5ce6740d4d91652e69206fc991fd5328c1a94d364ad00e457/layer.tar"
40
+	reader, err := os.Open(filename)
41
+	if err != nil {
42
+		t.Fatal(err)
43
+	}
44
+	ts, err := NewTarSum(reader, false, Version0)
45
+	if err != nil {
46
+		t.Fatal(err)
47
+	}
48
+
49
+	// Read and discard bytes so that it populates sums
50
+	_, err = io.Copy(ioutil.Discard, ts)
51
+	if err != nil {
52
+		t.Errorf("failed to read from %s: %s", filename, err)
53
+	}
54
+
55
+	expected := len(ts.GetSums()) - 1
56
+
57
+	ts.(BuilderContext).Remove("etc/sudoers")
58
+
59
+	if len(ts.GetSums()) != expected {
60
+		t.Fatalf("Expected %v sums, go %v.", expected, len(ts.GetSums()))
61
+	}
62
+}
... ...
@@ -51,15 +51,6 @@ func (fis FileInfoSums) GetAllFile(name string) FileInfoSums {
51 51
 	return f
52 52
 }
53 53
 
54
-func contains(s []string, e string) bool {
55
-	for _, a := range s {
56
-		if a == e {
57
-			return true
58
-		}
59
-	}
60
-	return false
61
-}
62
-
63 54
 func (fis FileInfoSums) GetDuplicatePaths() (dups FileInfoSums) {
64 55
 	seen := make(map[string]int, len(fis)) // allocate earl. no need to grow this map.
65 56
 	for i := range fis {
... ...
@@ -42,4 +42,21 @@ func TestSortFileInfoSums(t *testing.T) {
42 42
 	if gotFis.Pos() != 4 {
43 43
 		t.Errorf("Expected %d, got %d", 4, gotFis.Pos())
44 44
 	}
45
+
46
+	fis = newFileInfoSums()
47
+	fis.SortByPos()
48
+	if fis[0].Pos() != 0 {
49
+		t.Errorf("sorted fileInfoSums by Pos should order them by position.")
50
+	}
51
+
52
+	fis = newFileInfoSums()
53
+	expected = "deadbeef1"
54
+	gotFileInfoSum := fis.GetFile("dup1")
55
+	if gotFileInfoSum.Sum() != expected {
56
+		t.Errorf("Expected %q, got %q", expected, gotFileInfoSum)
57
+	}
58
+	if fis.GetFile("noPresent") != nil {
59
+		t.Errorf("Should have return nil if name not found.")
60
+	}
61
+
45 62
 }
... ...
@@ -14,6 +14,7 @@ import (
14 14
 	"io"
15 15
 	"io/ioutil"
16 16
 	"os"
17
+	"strings"
17 18
 	"testing"
18 19
 )
19 20
 
... ...
@@ -175,6 +176,45 @@ func emptyTarSum(gzip bool) (TarSum, error) {
175 175
 	return NewTarSum(reader, !gzip, Version0)
176 176
 }
177 177
 
178
+// Test errors on NewTarsumForLabel
179
+func TestNewTarSumForLabelInvalid(t *testing.T) {
180
+	reader := strings.NewReader("")
181
+
182
+	if _, err := NewTarSumForLabel(reader, true, "invalidlabel"); err == nil {
183
+		t.Fatalf("Expected an error, got nothing.")
184
+	}
185
+
186
+	if _, err := NewTarSumForLabel(reader, true, "invalid+sha256"); err == nil {
187
+		t.Fatalf("Expected an error, got nothing.")
188
+	}
189
+	if _, err := NewTarSumForLabel(reader, true, "tarsum.v1+invalid"); err == nil {
190
+		t.Fatalf("Expected an error, got nothing.")
191
+	}
192
+}
193
+
194
+func TestNewTarSumForLabel(t *testing.T) {
195
+
196
+	layer := testLayers[0]
197
+
198
+	reader, err := os.Open(layer.filename)
199
+	if err != nil {
200
+		t.Fatal(err)
201
+	}
202
+	label := strings.Split(layer.tarsum, ":")[0]
203
+	ts, err := NewTarSumForLabel(reader, false, label)
204
+	if err != nil {
205
+		t.Fatal(err)
206
+	}
207
+
208
+	// Make sure it actually worked by reading a little bit of it
209
+	nbByteToRead := 8 * 1024
210
+	dBuf := make([]byte, nbByteToRead)
211
+	_, err = ts.Read(dBuf)
212
+	if err != nil {
213
+		t.Errorf("failed to read %vKB from %s: %s", nbByteToRead, layer.filename, err)
214
+	}
215
+}
216
+
178 217
 // TestEmptyTar tests that tarsum does not fail to read an empty tar
179 218
 // and correctly returns the hex digest of an empty hash.
180 219
 func TestEmptyTar(t *testing.T) {
... ...
@@ -251,6 +291,33 @@ var (
251 251
 	sha512Hash = NewTHash("sha512", sha512.New)
252 252
 )
253 253
 
254
+// Test all the build-in read size : buf8K, buf16K, buf32K and more
255
+func TestTarSumsReadSize(t *testing.T) {
256
+	// Test always on the same layer (that is big enough)
257
+	layer := testLayers[0]
258
+
259
+	for i := 0; i < 5; i++ {
260
+
261
+		reader, err := os.Open(layer.filename)
262
+		if err != nil {
263
+			t.Fatal(err)
264
+		}
265
+		ts, err := NewTarSum(reader, false, layer.version)
266
+		if err != nil {
267
+			t.Fatal(err)
268
+		}
269
+
270
+		// Read and discard bytes so that it populates sums
271
+		nbByteToRead := (i + 1) * 8 * 1024
272
+		dBuf := make([]byte, nbByteToRead)
273
+		_, err = ts.Read(dBuf)
274
+		if err != nil {
275
+			t.Errorf("failed to read %vKB from %s: %s", nbByteToRead, layer.filename, err)
276
+			continue
277
+		}
278
+	}
279
+}
280
+
254 281
 func TestTarSums(t *testing.T) {
255 282
 	for _, layer := range testLayers {
256 283
 		var (
... ...
@@ -326,6 +393,15 @@ func TestTarSums(t *testing.T) {
326 326
 		if layer.tarsum != gotSum {
327 327
 			t.Errorf("expecting [%s], but got [%s]", layer.tarsum, gotSum)
328 328
 		}
329
+		var expectedHashName string
330
+		if layer.hash != nil {
331
+			expectedHashName = layer.hash.Name()
332
+		} else {
333
+			expectedHashName = DefaultTHash.Name()
334
+		}
335
+		if expectedHashName != ts.Hash().Name() {
336
+			t.Errorf("expecting hash [%v], but got [%s]", expectedHashName, ts.Hash().Name())
337
+		}
329 338
 	}
330 339
 }
331 340
 
... ...
@@ -4,6 +4,25 @@ import (
4 4
 	"testing"
5 5
 )
6 6
 
7
+func TestVersionLabelForChecksum(t *testing.T) {
8
+	version := VersionLabelForChecksum("tarsum+sha256:deadbeef")
9
+	if version != "tarsum" {
10
+		t.Fatalf("Version should have been 'tarsum', was %v", version)
11
+	}
12
+	version = VersionLabelForChecksum("tarsum.v1+sha256:deadbeef")
13
+	if version != "tarsum.v1" {
14
+		t.Fatalf("Version should have been 'tarsum.v1', was %v", version)
15
+	}
16
+	version = VersionLabelForChecksum("something+somethingelse")
17
+	if version != "something" {
18
+		t.Fatalf("Version should have been 'something', was %v", version)
19
+	}
20
+	version = VersionLabelForChecksum("invalidChecksum")
21
+	if version != "" {
22
+		t.Fatalf("Version should have been empty, was %v", version)
23
+	}
24
+}
25
+
7 26
 func TestVersion(t *testing.T) {
8 27
 	expected := "tarsum"
9 28
 	var v Version
... ...
@@ -53,3 +72,27 @@ func TestGetVersion(t *testing.T) {
53 53
 		t.Fatalf("%q : %s", err, str)
54 54
 	}
55 55
 }
56
+
57
+func TestGetVersions(t *testing.T) {
58
+	expected := []Version{
59
+		Version0,
60
+		Version1,
61
+		VersionDev,
62
+	}
63
+	versions := GetVersions()
64
+	if len(versions) != len(expected) {
65
+		t.Fatalf("Expected %v versions, got %v", len(expected), len(versions))
66
+	}
67
+	if !containsVersion(versions, expected[0]) || !containsVersion(versions, expected[1]) || !containsVersion(versions, expected[2]) {
68
+		t.Fatalf("Expected [%v], got [%v]", expected, versions)
69
+	}
70
+}
71
+
72
+func containsVersion(versions []Version, version Version) bool {
73
+	for _, v := range versions {
74
+		if v == version {
75
+			return true
76
+		}
77
+	}
78
+	return false
79
+}