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>
| 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 |
+} |