1
18
19 package testutils
20
21 import (
22 "testing"
23
24 "google.golang.org/grpc/balancer"
25 "google.golang.org/grpc/internal/testutils"
26 )
27
28 func TestIsRoundRobin(t *testing.T) {
29 var (
30 sc1 = &testutils.TestSubConn{}
31 sc2 = &testutils.TestSubConn{}
32 sc3 = &testutils.TestSubConn{}
33 )
34
35 testCases := []struct {
36 desc string
37 want []balancer.SubConn
38 got []balancer.SubConn
39 pass bool
40 }{
41 {
42 desc: "0 element",
43 want: []balancer.SubConn{},
44 got: []balancer.SubConn{},
45 pass: true,
46 },
47 {
48 desc: "1 element RR",
49 want: []balancer.SubConn{sc1},
50 got: []balancer.SubConn{sc1, sc1, sc1, sc1},
51 pass: true,
52 },
53 {
54 desc: "1 element not RR",
55 want: []balancer.SubConn{sc1},
56 got: []balancer.SubConn{sc1, sc2, sc1},
57 pass: false,
58 },
59 {
60 desc: "2 elements RR",
61 want: []balancer.SubConn{sc1, sc2},
62 got: []balancer.SubConn{sc1, sc2, sc1, sc2, sc1, sc2},
63 pass: true,
64 },
65 {
66 desc: "2 elements RR different order from want",
67 want: []balancer.SubConn{sc2, sc1},
68 got: []balancer.SubConn{sc1, sc2, sc1, sc2, sc1, sc2},
69 pass: true,
70 },
71 {
72 desc: "2 elements RR not RR, mistake in first iter",
73 want: []balancer.SubConn{sc1, sc2},
74 got: []balancer.SubConn{sc1, sc1, sc1, sc2, sc1, sc2},
75 pass: false,
76 },
77 {
78 desc: "2 elements RR not RR, mistake in second iter",
79 want: []balancer.SubConn{sc1, sc2},
80 got: []balancer.SubConn{sc1, sc2, sc1, sc1, sc1, sc2},
81 pass: false,
82 },
83 {
84 desc: "2 elements weighted RR",
85 want: []balancer.SubConn{sc1, sc1, sc2},
86 got: []balancer.SubConn{sc1, sc1, sc2, sc1, sc1, sc2},
87 pass: true,
88 },
89 {
90 desc: "2 elements weighted RR different order",
91 want: []balancer.SubConn{sc1, sc1, sc2},
92 got: []balancer.SubConn{sc1, sc2, sc1, sc1, sc2, sc1},
93 pass: true,
94 },
95
96 {
97 desc: "3 elements RR",
98 want: []balancer.SubConn{sc1, sc2, sc3},
99 got: []balancer.SubConn{sc1, sc2, sc3, sc1, sc2, sc3, sc1, sc2, sc3},
100 pass: true,
101 },
102 {
103 desc: "3 elements RR different order",
104 want: []balancer.SubConn{sc1, sc2, sc3},
105 got: []balancer.SubConn{sc3, sc2, sc1, sc3, sc2, sc1},
106 pass: true,
107 },
108 {
109 desc: "3 elements weighted RR",
110 want: []balancer.SubConn{sc1, sc1, sc1, sc2, sc2, sc3},
111 got: []balancer.SubConn{sc1, sc2, sc3, sc1, sc2, sc1, sc1, sc2, sc3, sc1, sc2, sc1},
112 pass: true,
113 },
114 {
115 desc: "3 elements weighted RR not RR, mistake in first iter",
116 want: []balancer.SubConn{sc1, sc1, sc1, sc2, sc2, sc3},
117 got: []balancer.SubConn{sc1, sc2, sc1, sc1, sc2, sc1, sc1, sc2, sc3, sc1, sc2, sc1},
118 pass: false,
119 },
120 {
121 desc: "3 elements weighted RR not RR, mistake in second iter",
122 want: []balancer.SubConn{sc1, sc1, sc1, sc2, sc2, sc3},
123 got: []balancer.SubConn{sc1, sc2, sc3, sc1, sc2, sc1, sc1, sc1, sc3, sc1, sc2, sc1},
124 pass: false,
125 },
126 }
127 for _, tC := range testCases {
128 t.Run(tC.desc, func(t *testing.T) {
129 err := testutils.IsRoundRobin(tC.want, (&testClosure{r: tC.got}).next)
130 if err == nil != tC.pass {
131 t.Errorf("want pass %v, want %v, got err %v", tC.pass, tC.want, err)
132 }
133 })
134 }
135 }
136
137
138 type testClosure struct {
139 r []balancer.SubConn
140 i int
141 }
142
143 func (tc *testClosure) next() balancer.SubConn {
144 ret := tc.r[tc.i]
145 tc.i = (tc.i + 1) % len(tc.r)
146 return ret
147 }
148
View as plain text