Skip to content

Commit ebbfe3f

Browse files
committed
serverConfigMap unit tests
1 parent 3ef197c commit ebbfe3f

File tree

3 files changed

+221
-1
lines changed

3 files changed

+221
-1
lines changed

xds/internal/clients/internal/internal_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ func (s) TestServerIdentifierString_NonStringerExtension(t *testing.T) {
117117
}
118118
}
119119

120-
func TestServerIdentifier_Equal(t *testing.T) {
120+
func (s) TestServerIdentifier_Equal(t *testing.T) {
121121
tests := []struct {
122122
name string
123123
s1 clients.ServerIdentifier

xds/internal/clients/internal/map.go

+3
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,9 @@ func (s *ServerIdentifierMap) Get(si clients.ServerIdentifier) (value any, ok bo
7373

7474
// Set updates or adds the value to the server identifier in the map.
7575
func (s *ServerIdentifierMap) Set(si clients.ServerIdentifier, value any) {
76+
if _, ok := si.Extensions.(interface{ Equal(any) bool }); si.Extensions != nil && !ok {
77+
return
78+
}
7679
entryList := s.m[si.ServerURI]
7780
if entry := entryList.find(si); entry != -1 {
7881
entryList[entry].value = value
+217
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,217 @@
1+
/*
2+
*
3+
* Copyright 2025 gRPC authors.
4+
*
5+
* Licensed under the Apache License, Version 2.0 (the "License");
6+
* you may not use this file except in compliance with the License.
7+
* You may obtain a copy of the License at
8+
*
9+
* http://www.apache.org/licenses/LICENSE-2.0
10+
*
11+
* Unless required by applicable law or agreed to in writing, software
12+
* distributed under the License is distributed on an "AS IS" BASIS,
13+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
* See the License for the specific language governing permissions and
15+
* limitations under the License.
16+
*
17+
*/
18+
19+
package xdsclient
20+
21+
import (
22+
"sort"
23+
"testing"
24+
25+
"github.com/google/go-cmp/cmp"
26+
"google.golang.org/grpc/xds/internal/clients"
27+
)
28+
29+
type testServerIdentifierExtension struct{ x int }
30+
31+
func (ts *testServerIdentifierExtension) Equal(other any) bool {
32+
ots, ok := other.(*testServerIdentifierExtension)
33+
if !ok {
34+
return false
35+
}
36+
return ts.x == ots.x
37+
}
38+
39+
type testServerIdentifierExtensionWithoutEqual struct{ x int }
40+
41+
var (
42+
serverConfig1 = ServerConfig{ServerIdentifier: clients.ServerIdentifier{ServerURI: "s1", Extensions: &testServerIdentifierExtension{x: 1}}, IgnoreResourceDeletion: true}
43+
serverConfig2 = ServerConfig{ServerIdentifier: clients.ServerIdentifier{ServerURI: "s1", Extensions: &testServerIdentifierExtension{x: 1}}, IgnoreResourceDeletion: false}
44+
serverConfig3 = ServerConfig{ServerIdentifier: clients.ServerIdentifier{ServerURI: "s2", Extensions: &testServerIdentifierExtension{x: 1}}, IgnoreResourceDeletion: true}
45+
serverConfig4 = ServerConfig{ServerIdentifier: clients.ServerIdentifier{ServerURI: "s2", Extensions: nil}, IgnoreResourceDeletion: true}
46+
serverConfig5 = ServerConfig{ServerIdentifier: clients.ServerIdentifier{ServerURI: "s2", Extensions: &testServerIdentifierExtensionWithoutEqual{x: 1}}, IgnoreResourceDeletion: true}
47+
serverConfig6 = ServerConfig{ServerIdentifier: clients.ServerIdentifier{ServerURI: "s1", Extensions: &testServerIdentifierExtension{x: 1}}, IgnoreResourceDeletion: true}
48+
)
49+
50+
func (s) TestServerConfigsMap_Length(t *testing.T) {
51+
serverConfigMap := newServerConfigMap()
52+
if got := serverConfigMap.serverIdentifierMap.Len(); got != 0 {
53+
t.Fatalf("serverConfigMap.serverIdentifierMap.Len() = %v; want 0", got)
54+
}
55+
for i := 0; i < 10; i++ {
56+
serverConfigMap.set(serverConfig1, nil)
57+
if got, want := serverConfigMap.serverIdentifierMap.Len(), 1; got != want {
58+
t.Fatalf("serverConfigMap.serverIdentifierMap.Len() = %v; want %v", got, want)
59+
}
60+
serverConfigMap.set(serverConfig6, nil) // aliases serverConfig1
61+
entryList, ok := serverConfigMap.serverIdentifierMap.Get(serverConfig1.ServerIdentifier)
62+
if !ok {
63+
t.Fatalf("serverConfig1.ServerIdentifier not found in serverConfigMap.serverIdentifierMap")
64+
}
65+
entries := entryList.(serverConfigMapEntryList)
66+
if got, want := len(entries), 1; got != want {
67+
t.Fatalf("entries.Len() = %v; want %v", got, want)
68+
}
69+
}
70+
for i := 0; i < 10; i++ {
71+
serverConfigMap.set(serverConfig2, nil)
72+
if got, want := serverConfigMap.serverIdentifierMap.Len(), 1; got != want {
73+
t.Fatalf("serverConfigMap.serverIdentifierMap.Len() = %v; want %v", got, want)
74+
}
75+
entryList, ok := serverConfigMap.serverIdentifierMap.Get(serverConfig1.ServerIdentifier)
76+
if !ok {
77+
t.Fatalf("serverConfig1.ServerIdentifier not found in serverConfigMap.serverIdentifierMap")
78+
}
79+
entries := entryList.(serverConfigMapEntryList)
80+
if got, want := len(entries), 2; got != want {
81+
t.Fatalf("entries.Len() = %v; want %v", got, want)
82+
}
83+
}
84+
}
85+
86+
func (s) TestServerConfigsMap_Set(t *testing.T) {
87+
serverConfigMap := newServerConfigMap()
88+
serverConfigMap.set(serverConfig1, 1)
89+
serverConfigMap.set(serverConfig2, 2)
90+
serverConfigMap.set(serverConfig3, 3)
91+
serverConfigMap.set(serverConfig4, 4)
92+
serverConfigMap.set(serverConfig5, 5) // won't set because have extensions without Equal()
93+
serverConfigMap.set(serverConfig6, 6) // aliases serverConfig1
94+
95+
entryList, ok := serverConfigMap.serverIdentifierMap.Get(serverConfig1.ServerIdentifier)
96+
if !ok {
97+
t.Fatalf("serverConfig1.ServerIdentifier not found in serverConfigMap.serverIdentifierMap")
98+
}
99+
entries := entryList.(serverConfigMapEntryList)
100+
101+
if !isServerConfigEqual(&serverConfig1, &entries[0].serverConfig) {
102+
t.Fatalf("entries[0].serverConfig = %v; want %v", entries[0].serverConfig, serverConfig1)
103+
}
104+
if !isServerConfigEqual(&serverConfig6, &entries[0].serverConfig) {
105+
t.Fatalf("entries[0].serverConfig = %v; want %v", entries[0].serverConfig, serverConfig6)
106+
}
107+
if entries[0].value != 6 {
108+
t.Fatalf("entries[0].value = %v; want 6", entries[0].value)
109+
}
110+
111+
if !isServerConfigEqual(&serverConfig2, &entries[1].serverConfig) {
112+
t.Fatalf("entries[1].serverConfig = %v; want %v", entries[0].serverConfig, serverConfig2)
113+
}
114+
if entries[1].value != 2 {
115+
t.Fatalf("entries[0].value = %v; want 6", entries[0].value)
116+
}
117+
118+
entryList, ok = serverConfigMap.serverIdentifierMap.Get(serverConfig3.ServerIdentifier)
119+
if !ok {
120+
t.Fatalf("serverConfig3.ServerIdentifier not found in serverConfigMap.serverIdentifierMap")
121+
}
122+
entries = entryList.(serverConfigMapEntryList)
123+
124+
if !isServerConfigEqual(&serverConfig3, &entries[0].serverConfig) {
125+
t.Fatalf("entries[0].serverConfig = %v; want %v", entries[0].serverConfig, serverConfig3)
126+
}
127+
if entries[0].value != 3 {
128+
t.Fatalf("entries[0].value = %v; want 3", entries[0].value)
129+
}
130+
131+
entryList, ok = serverConfigMap.serverIdentifierMap.Get(serverConfig4.ServerIdentifier)
132+
if !ok {
133+
t.Fatalf("serverConfig4.ServerIdentifier not found in serverConfigMap.serverIdentifierMap")
134+
}
135+
entries = entryList.(serverConfigMapEntryList)
136+
137+
if !isServerConfigEqual(&serverConfig4, &entries[0].serverConfig) {
138+
t.Fatalf("entries[0].serverConfig = %v; want %v", entries[0].serverConfig, serverConfig4)
139+
}
140+
if entries[0].value != 4 {
141+
t.Fatalf("entries[1].value = %v; want 4", entries[0].value)
142+
}
143+
}
144+
145+
func (s) TestServerConfigsMap_Get(t *testing.T) {
146+
serverConfigMap := newServerConfigMap()
147+
serverConfigMap.set(serverConfig1, 1)
148+
149+
if got, ok := serverConfigMap.get(serverConfig2); ok || got != nil {
150+
t.Fatalf("serverConfigMap.get(serverConfig2) = %v, %v; want nil, false", got, ok)
151+
}
152+
153+
serverConfigMap.set(serverConfig2, 2)
154+
serverConfigMap.set(serverConfig3, 3)
155+
serverConfigMap.set(serverConfig4, 4)
156+
serverConfigMap.set(serverConfig5, 5) // won't set because have extensions without Equal()
157+
serverConfigMap.set(serverConfig6, 6) // aliases serverConfig1
158+
159+
if got, ok := serverConfigMap.get(serverConfig1); !ok || got.(int) != 6 {
160+
t.Fatalf("serverConfigMap.get(serverConfig1) = %v, %v; want %v, true", got, ok, 5)
161+
}
162+
if got, ok := serverConfigMap.get(serverConfig2); !ok || got.(int) != 2 {
163+
t.Fatalf("serverConfigMap.get(serverConfig2) = %v, %v; want %v, true", got, ok, 2)
164+
}
165+
if got, ok := serverConfigMap.get(serverConfig3); !ok || got.(int) != 3 {
166+
t.Fatalf("serverConfigMap.get(serverConfig3) = %v, %v; want %v, true", got, ok, 3)
167+
}
168+
if got, ok := serverConfigMap.get(serverConfig4); !ok || got.(int) != 4 {
169+
t.Fatalf("serverConfigMap.get(serverConfig4) = %v, %v; want %v, true", got, ok, 4)
170+
}
171+
if got, ok := serverConfigMap.get(serverConfig5); ok || got != nil {
172+
t.Fatalf("serverConfigMap.get(serverConfig5) = %v, %v; want nil, false", got, ok)
173+
}
174+
if got, ok := serverConfigMap.get(serverConfig6); !ok || got.(int) != 6 {
175+
t.Fatalf("serverConfigMap.get(serverConfig4) = %v, %v; want %v, true", got, ok, 6)
176+
}
177+
}
178+
179+
func (s) TestAddressMap_Delete(t *testing.T) {
180+
serverConfigMap := newServerConfigMap()
181+
serverConfigMap.set(serverConfig1, 1)
182+
serverConfigMap.set(serverConfig3, 3)
183+
if got, want := serverConfigMap.serverIdentifierMap.Len(), 2; got != want {
184+
t.Fatalf("serverConfigMap.serverIdentifierMap.Len() = %v; want %v", got, want)
185+
}
186+
serverConfigMap.delete(serverConfig2)
187+
serverConfigMap.delete(serverConfig4)
188+
serverConfigMap.delete(serverConfig6) // aliases serverConfig1
189+
if got, ok := serverConfigMap.get(serverConfig1); ok || got != nil {
190+
t.Fatalf("serverConfigMap.get(serverConfig1) = %v, %v; want nil, false", got, ok)
191+
}
192+
if got, ok := serverConfigMap.get(serverConfig5); ok || got != nil {
193+
t.Fatalf("serverConfigMap.get(serverConfig5) = %v, %v; want nil, false", got, ok)
194+
}
195+
if got, ok := serverConfigMap.get(serverConfig3); !ok || got.(int) != 3 {
196+
t.Fatalf("serverConfigMap.get(serverConfig2) = %v, %v; want %v, true", got, ok, 2)
197+
}
198+
}
199+
200+
func (s) TestAddressMap_Values(t *testing.T) {
201+
serverConfigMap := newServerConfigMap()
202+
serverConfigMap.set(serverConfig1, 1)
203+
serverConfigMap.set(serverConfig2, 2)
204+
serverConfigMap.set(serverConfig3, 3)
205+
serverConfigMap.set(serverConfig4, 4)
206+
serverConfigMap.set(serverConfig6, 6)
207+
208+
want := []int{2, 3, 4, 6}
209+
var got []int
210+
for _, v := range serverConfigMap.values() {
211+
got = append(got, v.(int))
212+
}
213+
sort.Ints(got)
214+
if diff := cmp.Diff(want, got); diff != "" {
215+
t.Fatalf("addrMap.Values returned unexpected elements (-want, +got):\n%v", diff)
216+
}
217+
}

0 commit comments

Comments
 (0)