1package continuity 2 3import ( 4 "fmt" 5 "reflect" 6 "testing" 7 8 "github.com/opencontainers/go-digest" 9) 10 11// TestUniqifyDigests ensures that we deterministically sort digest entries 12// for a resource. 13func TestUniqifyDigests(t *testing.T) { 14 for _, testcase := range []struct { 15 description string 16 input [][]digest.Digest // input is a series of digest collections from separate resources. 17 expected []digest.Digest 18 err error 19 }{ 20 { 21 description: "simple merge", 22 input: [][]digest.Digest{ 23 {"sha1:abc", "sha256:def"}, 24 {"sha1:abc", "sha256:def"}, 25 }, 26 expected: []digest.Digest{"sha1:abc", "sha256:def"}, 27 }, 28 { 29 description: "simple reversed order", 30 input: [][]digest.Digest{ 31 {"sha1:abc", "sha256:def"}, 32 {"sha256:def", "sha1:abc"}, 33 }, 34 expected: []digest.Digest{"sha1:abc", "sha256:def"}, 35 }, 36 { 37 description: "conflicting values for sha1", 38 input: [][]digest.Digest{ 39 {"sha1:abc", "sha256:def"}, 40 {"sha256:def", "sha1:def"}, 41 }, 42 err: fmt.Errorf("conflicting digests for sha1 found"), 43 }, 44 } { 45 fatalf := func(format string, args ...interface{}) { 46 t.Fatalf(testcase.description+": "+format, args...) 47 } 48 49 var assembled []digest.Digest 50 51 for _, ds := range testcase.input { 52 assembled = append(assembled, ds...) 53 } 54 55 merged, err := uniqifyDigests(assembled...) 56 if err != testcase.err { 57 if testcase.err == nil { 58 fatalf("unexpected error uniqifying digests: %v", err) 59 } 60 61 if err != testcase.err && err.Error() != testcase.err.Error() { 62 // compare by string till we create nice error type 63 fatalf("unexpected error uniqifying digests: %v != %v", err, testcase.err) 64 } 65 } 66 67 if !reflect.DeepEqual(merged, testcase.expected) { 68 fatalf("unexpected uniquification: %v != %v", merged, testcase.expected) 69 } 70 71 } 72} 73