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