1// Copyright 2022 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5package x509
6
7import "testing"
8
9func TestCertPoolEqual(t *testing.T) {
10	tc := &Certificate{Raw: []byte{1, 2, 3}, RawSubject: []byte{2}}
11	otherTC := &Certificate{Raw: []byte{9, 8, 7}, RawSubject: []byte{8}}
12
13	emptyPool := NewCertPool()
14	nonSystemPopulated := NewCertPool()
15	nonSystemPopulated.AddCert(tc)
16	nonSystemPopulatedAlt := NewCertPool()
17	nonSystemPopulatedAlt.AddCert(otherTC)
18	emptySystem, err := SystemCertPool()
19	if err != nil {
20		t.Fatal(err)
21	}
22	populatedSystem, err := SystemCertPool()
23	if err != nil {
24		t.Fatal(err)
25	}
26	populatedSystem.AddCert(tc)
27	populatedSystemAlt, err := SystemCertPool()
28	if err != nil {
29		t.Fatal(err)
30	}
31	populatedSystemAlt.AddCert(otherTC)
32	tests := []struct {
33		name  string
34		a     *CertPool
35		b     *CertPool
36		equal bool
37	}{
38		{
39			name:  "two empty pools",
40			a:     emptyPool,
41			b:     emptyPool,
42			equal: true,
43		},
44		{
45			name:  "one empty pool, one populated pool",
46			a:     emptyPool,
47			b:     nonSystemPopulated,
48			equal: false,
49		},
50		{
51			name:  "two populated pools",
52			a:     nonSystemPopulated,
53			b:     nonSystemPopulated,
54			equal: true,
55		},
56		{
57			name:  "two populated pools, different content",
58			a:     nonSystemPopulated,
59			b:     nonSystemPopulatedAlt,
60			equal: false,
61		},
62		{
63			name:  "two empty system pools",
64			a:     emptySystem,
65			b:     emptySystem,
66			equal: true,
67		},
68		{
69			name:  "one empty system pool, one populated system pool",
70			a:     emptySystem,
71			b:     populatedSystem,
72			equal: false,
73		},
74		{
75			name:  "two populated system pools",
76			a:     populatedSystem,
77			b:     populatedSystem,
78			equal: true,
79		},
80		{
81			name:  "two populated pools, different content",
82			a:     populatedSystem,
83			b:     populatedSystemAlt,
84			equal: false,
85		},
86		{
87			name:  "two nil pools",
88			a:     nil,
89			b:     nil,
90			equal: true,
91		},
92		{
93			name:  "one nil pool, one empty pool",
94			a:     nil,
95			b:     emptyPool,
96			equal: false,
97		},
98	}
99
100	for _, tc := range tests {
101		t.Run(tc.name, func(t *testing.T) {
102			equal := tc.a.Equal(tc.b)
103			if equal != tc.equal {
104				t.Errorf("Unexpected Equal result: got %t, want %t", equal, tc.equal)
105			}
106		})
107	}
108}
109