mirror of https://github.com/grpc/grpc-go.git
				
				
				
			tests: refactor tests to use testutils helper functions (#5728)
This commit is contained in:
		
							parent
							
								
									28fae96c98
								
							
						
					
					
						commit
						7c16802641
					
				| 
						 | 
				
			
			@ -19,6 +19,7 @@
 | 
			
		|||
package weightedtarget
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"context"
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"errors"
 | 
			
		||||
	"fmt"
 | 
			
		||||
| 
						 | 
				
			
			@ -40,6 +41,10 @@ import (
 | 
			
		|||
	"google.golang.org/grpc/serviceconfig"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	defaultTestTimeout = 5 * time.Second
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type s struct {
 | 
			
		||||
	grpctest.Tester
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -58,6 +63,20 @@ func newTestConfigBalancerBuilder() *testConfigBalancerBuilder {
 | 
			
		|||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// pickAndCheckError returns a function which takes a picker, invokes the Pick() method
 | 
			
		||||
// multiple times and ensures that the error returned by the picker matches the provided error.
 | 
			
		||||
func pickAndCheckError(want error) func(balancer.Picker) error {
 | 
			
		||||
	const rpcCount = 5
 | 
			
		||||
	return func(p balancer.Picker) error {
 | 
			
		||||
		for i := 0; i < rpcCount; i++ {
 | 
			
		||||
			if _, err := p.Pick(balancer.PickInfo{}); err == nil || !strings.Contains(err.Error(), want.Error()) {
 | 
			
		||||
				return fmt.Errorf("picker.Pick() returned error: %v, want: %v", err, want)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (t *testConfigBalancerBuilder) Build(cc balancer.ClientConn, opts balancer.BuildOptions) balancer.Balancer {
 | 
			
		||||
	rr := t.Builder.Build(cc, opts)
 | 
			
		||||
	return &testConfigBalancer{
 | 
			
		||||
| 
						 | 
				
			
			@ -289,13 +308,6 @@ func (s) TestWeightedTarget(t *testing.T) {
 | 
			
		|||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func subConnFromPicker(p balancer.Picker) func() balancer.SubConn {
 | 
			
		||||
	return func() balancer.SubConn {
 | 
			
		||||
		scst, _ := p.Pick(balancer.PickInfo{})
 | 
			
		||||
		return scst.SubConn
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// TestWeightedTarget_OneSubBalancer_AddRemoveBackend tests the case where we
 | 
			
		||||
// have a weighted target balancer will one sub-balancer, and we add and remove
 | 
			
		||||
// backends from the subBalancer.
 | 
			
		||||
| 
						 | 
				
			
			@ -366,7 +378,7 @@ func (s) TestWeightedTarget_OneSubBalancer_AddRemoveBackend(t *testing.T) {
 | 
			
		|||
 | 
			
		||||
	// Test round robin pick.
 | 
			
		||||
	want := []balancer.SubConn{sc1, sc2}
 | 
			
		||||
	if err := testutils.IsRoundRobin(want, subConnFromPicker(p)); err != nil {
 | 
			
		||||
	if err := testutils.IsRoundRobin(want, testutils.SubConnFromPicker(p)); err != nil {
 | 
			
		||||
		t.Fatalf("want %v, got %v", want, err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -455,7 +467,7 @@ func (s) TestWeightedTarget_TwoSubBalancers_OneBackend(t *testing.T) {
 | 
			
		|||
 | 
			
		||||
	// Test roundrobin on the last picker.
 | 
			
		||||
	want := []balancer.SubConn{sc1, sc2}
 | 
			
		||||
	if err := testutils.IsRoundRobin(want, subConnFromPicker(p)); err != nil {
 | 
			
		||||
	if err := testutils.IsRoundRobin(want, testutils.SubConnFromPicker(p)); err != nil {
 | 
			
		||||
		t.Fatalf("want %v, got %v", want, err)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -536,7 +548,7 @@ func (s) TestWeightedTarget_TwoSubBalancers_MoreBackends(t *testing.T) {
 | 
			
		|||
	// Test roundrobin on the last picker. RPCs should be sent equally to all
 | 
			
		||||
	// backends.
 | 
			
		||||
	want := []balancer.SubConn{sc1, sc2, sc3, sc4}
 | 
			
		||||
	if err := testutils.IsRoundRobin(want, subConnFromPicker(p)); err != nil {
 | 
			
		||||
	if err := testutils.IsRoundRobin(want, testutils.SubConnFromPicker(p)); err != nil {
 | 
			
		||||
		t.Fatalf("want %v, got %v", want, err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -544,7 +556,7 @@ func (s) TestWeightedTarget_TwoSubBalancers_MoreBackends(t *testing.T) {
 | 
			
		|||
	wtb.UpdateSubConnState(sc2, balancer.SubConnState{ConnectivityState: connectivity.TransientFailure})
 | 
			
		||||
	p = <-cc.NewPickerCh
 | 
			
		||||
	want = []balancer.SubConn{sc1, sc1, sc3, sc4}
 | 
			
		||||
	if err := testutils.IsRoundRobin(want, subConnFromPicker(p)); err != nil {
 | 
			
		||||
	if err := testutils.IsRoundRobin(want, testutils.SubConnFromPicker(p)); err != nil {
 | 
			
		||||
		t.Fatalf("want %v, got %v", want, err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -566,19 +578,19 @@ func (s) TestWeightedTarget_TwoSubBalancers_MoreBackends(t *testing.T) {
 | 
			
		|||
	wtb.UpdateSubConnState(scRemoved, balancer.SubConnState{ConnectivityState: connectivity.Shutdown})
 | 
			
		||||
	p = <-cc.NewPickerCh
 | 
			
		||||
	want = []balancer.SubConn{sc1, sc4}
 | 
			
		||||
	if err := testutils.IsRoundRobin(want, subConnFromPicker(p)); err != nil {
 | 
			
		||||
	if err := testutils.IsRoundRobin(want, testutils.SubConnFromPicker(p)); err != nil {
 | 
			
		||||
		t.Fatalf("want %v, got %v", want, err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Turn sc1's connection down.
 | 
			
		||||
	scConnErr := errors.New("subConn connection error")
 | 
			
		||||
	wantSubConnErr := errors.New("subConn connection error")
 | 
			
		||||
	wtb.UpdateSubConnState(sc1, balancer.SubConnState{
 | 
			
		||||
		ConnectivityState: connectivity.TransientFailure,
 | 
			
		||||
		ConnectionError:   scConnErr,
 | 
			
		||||
		ConnectionError:   wantSubConnErr,
 | 
			
		||||
	})
 | 
			
		||||
	p = <-cc.NewPickerCh
 | 
			
		||||
	want = []balancer.SubConn{sc4}
 | 
			
		||||
	if err := testutils.IsRoundRobin(want, subConnFromPicker(p)); err != nil {
 | 
			
		||||
	if err := testutils.IsRoundRobin(want, testutils.SubConnFromPicker(p)); err != nil {
 | 
			
		||||
		t.Fatalf("want %v, got %v", want, err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -594,13 +606,13 @@ func (s) TestWeightedTarget_TwoSubBalancers_MoreBackends(t *testing.T) {
 | 
			
		|||
	// Turn all connections down.
 | 
			
		||||
	wtb.UpdateSubConnState(sc4, balancer.SubConnState{
 | 
			
		||||
		ConnectivityState: connectivity.TransientFailure,
 | 
			
		||||
		ConnectionError:   scConnErr,
 | 
			
		||||
		ConnectionError:   wantSubConnErr,
 | 
			
		||||
	})
 | 
			
		||||
	p = <-cc.NewPickerCh
 | 
			
		||||
	for i := 0; i < 5; i++ {
 | 
			
		||||
		if _, err := p.Pick(balancer.PickInfo{}); err == nil || !strings.Contains(err.Error(), scConnErr.Error()) {
 | 
			
		||||
			t.Fatalf("want pick error %q, got error %q", scConnErr, err)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	ctx, cancel := context.WithTimeout(context.Background(), defaultTestTimeout)
 | 
			
		||||
	defer cancel()
 | 
			
		||||
	if err := cc.WaitForPicker(ctx, pickAndCheckError(wantSubConnErr)); err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -680,7 +692,7 @@ func (s) TestWeightedTarget_TwoSubBalancers_DifferentWeight_MoreBackends(t *test
 | 
			
		|||
	// Test roundrobin on the last picker. Twice the number of RPCs should be
 | 
			
		||||
	// sent to cluster_1 when compared to cluster_2.
 | 
			
		||||
	want := []balancer.SubConn{sc1, sc1, sc2, sc2, sc3, sc4}
 | 
			
		||||
	if err := testutils.IsRoundRobin(want, subConnFromPicker(p)); err != nil {
 | 
			
		||||
	if err := testutils.IsRoundRobin(want, testutils.SubConnFromPicker(p)); err != nil {
 | 
			
		||||
		t.Fatalf("want %v, got %v", want, err)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -757,7 +769,7 @@ func (s) TestWeightedTarget_ThreeSubBalancers_RemoveBalancer(t *testing.T) {
 | 
			
		|||
	p := <-cc.NewPickerCh
 | 
			
		||||
 | 
			
		||||
	want := []balancer.SubConn{sc1, sc2, sc3}
 | 
			
		||||
	if err := testutils.IsRoundRobin(want, subConnFromPicker(p)); err != nil {
 | 
			
		||||
	if err := testutils.IsRoundRobin(want, testutils.SubConnFromPicker(p)); err != nil {
 | 
			
		||||
		t.Fatalf("want %v, got %v", want, err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -797,15 +809,15 @@ func (s) TestWeightedTarget_ThreeSubBalancers_RemoveBalancer(t *testing.T) {
 | 
			
		|||
		t.Fatalf("RemoveSubConn, want %v, got %v", sc2, scRemoved)
 | 
			
		||||
	}
 | 
			
		||||
	want = []balancer.SubConn{sc1, sc3}
 | 
			
		||||
	if err := testutils.IsRoundRobin(want, subConnFromPicker(p)); err != nil {
 | 
			
		||||
	if err := testutils.IsRoundRobin(want, testutils.SubConnFromPicker(p)); err != nil {
 | 
			
		||||
		t.Fatalf("want %v, got %v", want, err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Move balancer 3 into transient failure.
 | 
			
		||||
	scConnErr := errors.New("subConn connection error")
 | 
			
		||||
	wantSubConnErr := errors.New("subConn connection error")
 | 
			
		||||
	wtb.UpdateSubConnState(sc3, balancer.SubConnState{
 | 
			
		||||
		ConnectivityState: connectivity.TransientFailure,
 | 
			
		||||
		ConnectionError:   scConnErr,
 | 
			
		||||
		ConnectionError:   wantSubConnErr,
 | 
			
		||||
	})
 | 
			
		||||
	<-cc.NewPickerCh
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -833,16 +845,16 @@ func (s) TestWeightedTarget_ThreeSubBalancers_RemoveBalancer(t *testing.T) {
 | 
			
		|||
 | 
			
		||||
	// Removing a subBalancer causes the weighted target LB policy to push a new
 | 
			
		||||
	// picker which ensures that the removed subBalancer is not picked for RPCs.
 | 
			
		||||
	p = <-cc.NewPickerCh
 | 
			
		||||
 | 
			
		||||
	scRemoved = <-cc.RemoveSubConnCh
 | 
			
		||||
	if !cmp.Equal(scRemoved, sc1, cmp.AllowUnexported(testutils.TestSubConn{})) {
 | 
			
		||||
		t.Fatalf("RemoveSubConn, want %v, got %v", sc1, scRemoved)
 | 
			
		||||
	}
 | 
			
		||||
	for i := 0; i < 5; i++ {
 | 
			
		||||
		if _, err := p.Pick(balancer.PickInfo{}); err == nil || !strings.Contains(err.Error(), scConnErr.Error()) {
 | 
			
		||||
			t.Fatalf("want pick error %q, got error %q", scConnErr, err)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	ctx, cancel := context.WithTimeout(context.Background(), defaultTestTimeout)
 | 
			
		||||
	defer cancel()
 | 
			
		||||
	if err := cc.WaitForPicker(ctx, pickAndCheckError(wantSubConnErr)); err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -922,7 +934,7 @@ func (s) TestWeightedTarget_TwoSubBalancers_ChangeWeight_MoreBackends(t *testing
 | 
			
		|||
	// Test roundrobin on the last picker. Twice the number of RPCs should be
 | 
			
		||||
	// sent to cluster_1 when compared to cluster_2.
 | 
			
		||||
	want := []balancer.SubConn{sc1, sc1, sc2, sc2, sc3, sc4}
 | 
			
		||||
	if err := testutils.IsRoundRobin(want, subConnFromPicker(p)); err != nil {
 | 
			
		||||
	if err := testutils.IsRoundRobin(want, testutils.SubConnFromPicker(p)); err != nil {
 | 
			
		||||
		t.Fatalf("want %v, got %v", want, err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -958,7 +970,7 @@ func (s) TestWeightedTarget_TwoSubBalancers_ChangeWeight_MoreBackends(t *testing
 | 
			
		|||
	// Weight change causes a new picker to be pushed to the channel.
 | 
			
		||||
	p = <-cc.NewPickerCh
 | 
			
		||||
	want = []balancer.SubConn{sc1, sc1, sc1, sc2, sc2, sc2, sc3, sc4}
 | 
			
		||||
	if err := testutils.IsRoundRobin(want, subConnFromPicker(p)); err != nil {
 | 
			
		||||
	if err := testutils.IsRoundRobin(want, testutils.SubConnFromPicker(p)); err != nil {
 | 
			
		||||
		t.Fatalf("want %v, got %v", want, err)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1077,21 +1089,21 @@ func (s) TestBalancerGroup_SubBalancerTurnsConnectingFromTransientFailure(t *tes
 | 
			
		|||
 | 
			
		||||
	// Set both subconn to TransientFailure, this will put both sub-balancers in
 | 
			
		||||
	// transient failure.
 | 
			
		||||
	scConnErr := errors.New("subConn connection error")
 | 
			
		||||
	wantSubConnErr := errors.New("subConn connection error")
 | 
			
		||||
	wtb.UpdateSubConnState(sc1, balancer.SubConnState{
 | 
			
		||||
		ConnectivityState: connectivity.TransientFailure,
 | 
			
		||||
		ConnectionError:   scConnErr,
 | 
			
		||||
		ConnectionError:   wantSubConnErr,
 | 
			
		||||
	})
 | 
			
		||||
	<-cc.NewPickerCh
 | 
			
		||||
	wtb.UpdateSubConnState(sc2, balancer.SubConnState{
 | 
			
		||||
		ConnectivityState: connectivity.TransientFailure,
 | 
			
		||||
		ConnectionError:   scConnErr,
 | 
			
		||||
		ConnectionError:   wantSubConnErr,
 | 
			
		||||
	})
 | 
			
		||||
	p := <-cc.NewPickerCh
 | 
			
		||||
 | 
			
		||||
	for i := 0; i < 5; i++ {
 | 
			
		||||
		if _, err := p.Pick(balancer.PickInfo{}); err == nil || !strings.Contains(err.Error(), scConnErr.Error()) {
 | 
			
		||||
			t.Fatalf("want pick error %q, got error %q", scConnErr, err)
 | 
			
		||||
		if _, err := p.Pick(balancer.PickInfo{}); err == nil || !strings.Contains(err.Error(), wantSubConnErr.Error()) {
 | 
			
		||||
			t.Fatalf("picker.Pick() returned error: %v, want: %v", err, wantSubConnErr)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1104,9 +1116,8 @@ func (s) TestBalancerGroup_SubBalancerTurnsConnectingFromTransientFailure(t *tes
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	for i := 0; i < 5; i++ {
 | 
			
		||||
		r, err := p.Pick(balancer.PickInfo{})
 | 
			
		||||
		if err == nil || !strings.Contains(err.Error(), scConnErr.Error()) {
 | 
			
		||||
			t.Fatalf("want pick error %q, got result %v, err %q", scConnErr, r, err)
 | 
			
		||||
		if _, err := p.Pick(balancer.PickInfo{}); err == nil || !strings.Contains(err.Error(), wantSubConnErr.Error()) {
 | 
			
		||||
			t.Fatalf("picker.Pick() returned error: %v, want: %v", err, wantSubConnErr)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -67,13 +67,6 @@ func Test(t *testing.T) {
 | 
			
		|||
	grpctest.RunSubTests(t, s{})
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func subConnFromPicker(p balancer.Picker) func() balancer.SubConn {
 | 
			
		||||
	return func() balancer.SubConn {
 | 
			
		||||
		scst, _ := p.Pick(balancer.PickInfo{})
 | 
			
		||||
		return scst.SubConn
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Create a new balancer group, add balancer and backends, but not start.
 | 
			
		||||
// - b1, weight 2, backends [0,1]
 | 
			
		||||
// - b2, weight 1, backends [2,3]
 | 
			
		||||
| 
						 | 
				
			
			@ -116,7 +109,7 @@ func (s) TestBalancerGroup_start_close(t *testing.T) {
 | 
			
		|||
		m1[testBackendAddrs[1]], m1[testBackendAddrs[1]],
 | 
			
		||||
		m1[testBackendAddrs[2]], m1[testBackendAddrs[3]],
 | 
			
		||||
	}
 | 
			
		||||
	if err := testutils.IsRoundRobin(want, subConnFromPicker(p1)); err != nil {
 | 
			
		||||
	if err := testutils.IsRoundRobin(want, testutils.SubConnFromPicker(p1)); err != nil {
 | 
			
		||||
		t.Fatalf("want %v, got %v", want, err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -158,7 +151,7 @@ func (s) TestBalancerGroup_start_close(t *testing.T) {
 | 
			
		|||
		m2[testBackendAddrs[3]], m2[testBackendAddrs[3]], m2[testBackendAddrs[3]],
 | 
			
		||||
		m2[testBackendAddrs[1]], m2[testBackendAddrs[2]],
 | 
			
		||||
	}
 | 
			
		||||
	if err := testutils.IsRoundRobin(want, subConnFromPicker(p2)); err != nil {
 | 
			
		||||
	if err := testutils.IsRoundRobin(want, testutils.SubConnFromPicker(p2)); err != nil {
 | 
			
		||||
		t.Fatalf("want %v, got %v", want, err)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -241,7 +234,7 @@ func initBalancerGroupForCachingTest(t *testing.T) (*weightedaggregator.Aggregat
 | 
			
		|||
		m1[testBackendAddrs[1]], m1[testBackendAddrs[1]],
 | 
			
		||||
		m1[testBackendAddrs[2]], m1[testBackendAddrs[3]],
 | 
			
		||||
	}
 | 
			
		||||
	if err := testutils.IsRoundRobin(want, subConnFromPicker(p1)); err != nil {
 | 
			
		||||
	if err := testutils.IsRoundRobin(want, testutils.SubConnFromPicker(p1)); err != nil {
 | 
			
		||||
		t.Fatalf("want %v, got %v", want, err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -263,7 +256,7 @@ func initBalancerGroupForCachingTest(t *testing.T) (*weightedaggregator.Aggregat
 | 
			
		|||
	want = []balancer.SubConn{
 | 
			
		||||
		m1[testBackendAddrs[0]], m1[testBackendAddrs[1]],
 | 
			
		||||
	}
 | 
			
		||||
	if err := testutils.IsRoundRobin(want, subConnFromPicker(p2)); err != nil {
 | 
			
		||||
	if err := testutils.IsRoundRobin(want, testutils.SubConnFromPicker(p2)); err != nil {
 | 
			
		||||
		t.Fatalf("want %v, got %v", want, err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -304,7 +297,7 @@ func (s) TestBalancerGroup_locality_caching(t *testing.T) {
 | 
			
		|||
		// addr2 is down, b2 only has addr3 in READY state.
 | 
			
		||||
		addrToSC[testBackendAddrs[3]], addrToSC[testBackendAddrs[3]],
 | 
			
		||||
	}
 | 
			
		||||
	if err := testutils.IsRoundRobin(want, subConnFromPicker(p3)); err != nil {
 | 
			
		||||
	if err := testutils.IsRoundRobin(want, testutils.SubConnFromPicker(p3)); err != nil {
 | 
			
		||||
		t.Fatalf("want %v, got %v", want, err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -452,7 +445,7 @@ func (s) TestBalancerGroup_locality_caching_readd_with_different_builder(t *test
 | 
			
		|||
		addrToSC[testBackendAddrs[1]], addrToSC[testBackendAddrs[1]],
 | 
			
		||||
		addrToSC[testBackendAddrs[4]], addrToSC[testBackendAddrs[5]],
 | 
			
		||||
	}
 | 
			
		||||
	if err := testutils.IsRoundRobin(want, subConnFromPicker(p3)); err != nil {
 | 
			
		||||
	if err := testutils.IsRoundRobin(want, testutils.SubConnFromPicker(p3)); err != nil {
 | 
			
		||||
		t.Fatalf("want %v, got %v", want, err)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -583,7 +576,7 @@ func (s) TestBalancerGracefulSwitch(t *testing.T) {
 | 
			
		|||
	want := []balancer.SubConn{
 | 
			
		||||
		m1[testBackendAddrs[0]], m1[testBackendAddrs[1]],
 | 
			
		||||
	}
 | 
			
		||||
	if err := testutils.IsRoundRobin(want, subConnFromPicker(p1)); err != nil {
 | 
			
		||||
	if err := testutils.IsRoundRobin(want, testutils.SubConnFromPicker(p1)); err != nil {
 | 
			
		||||
		t.Fatalf("want %v, got %v", want, err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -339,6 +339,16 @@ func IsRoundRobin(want []balancer.SubConn, f func() balancer.SubConn) error {
 | 
			
		|||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SubConnFromPicker returns a function which returns a SubConn by calling the
 | 
			
		||||
// Pick() method of the provided picker. There is no caching of SubConns here.
 | 
			
		||||
// Every invocation of the returned function results in a new pick.
 | 
			
		||||
func SubConnFromPicker(p balancer.Picker) func() balancer.SubConn {
 | 
			
		||||
	return func() balancer.SubConn {
 | 
			
		||||
		scst, _ := p.Pick(balancer.PickInfo{})
 | 
			
		||||
		return scst.SubConn
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ErrTestConstPicker is error returned by test const picker.
 | 
			
		||||
var ErrTestConstPicker = fmt.Errorf("const picker error")
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -117,7 +117,9 @@ func (s) TestEDSPriority_HighPriorityReady(t *testing.T) {
 | 
			
		|||
	edsb.UpdateSubConnState(sc1, balancer.SubConnState{ConnectivityState: connectivity.Ready})
 | 
			
		||||
 | 
			
		||||
	// Test roundrobin with only p0 subconns.
 | 
			
		||||
	if err := testRoundRobinPickerFromCh(cc.NewPickerCh, []balancer.SubConn{sc1}); err != nil {
 | 
			
		||||
	ctx, cancel := context.WithTimeout(context.Background(), defaultTestTimeout)
 | 
			
		||||
	defer cancel()
 | 
			
		||||
	if err := cc.WaitForRoundRobinPicker(ctx, sc1); err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -139,8 +141,8 @@ func (s) TestEDSPriority_HighPriorityReady(t *testing.T) {
 | 
			
		|||
	select {
 | 
			
		||||
	case p := <-cc.NewPickerCh:
 | 
			
		||||
		// If we do get a new picker, ensure it is still a p1 picker.
 | 
			
		||||
		if err := testutils.IsRoundRobin([]balancer.SubConn{sc1}, subConnFromPicker(p)); err != nil {
 | 
			
		||||
			t.Fatal(err.Error())
 | 
			
		||||
		if err := testutils.IsRoundRobin([]balancer.SubConn{sc1}, testutils.SubConnFromPicker(p)); err != nil {
 | 
			
		||||
			t.Fatal(err)
 | 
			
		||||
		}
 | 
			
		||||
	default:
 | 
			
		||||
		// No new picker; we were previously using p1 and should still be using
 | 
			
		||||
| 
						 | 
				
			
			@ -165,8 +167,8 @@ func (s) TestEDSPriority_HighPriorityReady(t *testing.T) {
 | 
			
		|||
	select {
 | 
			
		||||
	case p := <-cc.NewPickerCh:
 | 
			
		||||
		// If we do get a new picker, ensure it is still a p1 picker.
 | 
			
		||||
		if err := testutils.IsRoundRobin([]balancer.SubConn{sc1}, subConnFromPicker(p)); err != nil {
 | 
			
		||||
			t.Fatal(err.Error())
 | 
			
		||||
		if err := testutils.IsRoundRobin([]balancer.SubConn{sc1}, testutils.SubConnFromPicker(p)); err != nil {
 | 
			
		||||
			t.Fatal(err)
 | 
			
		||||
		}
 | 
			
		||||
	default:
 | 
			
		||||
		// No new picker; we were previously using p1 and should still be using
 | 
			
		||||
| 
						 | 
				
			
			@ -201,7 +203,9 @@ func (s) TestEDSPriority_SwitchPriority(t *testing.T) {
 | 
			
		|||
	edsb.UpdateSubConnState(sc0, balancer.SubConnState{ConnectivityState: connectivity.Ready})
 | 
			
		||||
 | 
			
		||||
	// Test roundrobin with only p0 subconns.
 | 
			
		||||
	if err := testRoundRobinPickerFromCh(cc.NewPickerCh, []balancer.SubConn{sc0}); err != nil {
 | 
			
		||||
	ctx, cancel := context.WithTimeout(context.Background(), defaultTestTimeout)
 | 
			
		||||
	defer cancel()
 | 
			
		||||
	if err := cc.WaitForRoundRobinPicker(ctx, sc0); err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -216,7 +220,7 @@ func (s) TestEDSPriority_SwitchPriority(t *testing.T) {
 | 
			
		|||
	edsb.UpdateSubConnState(sc1, balancer.SubConnState{ConnectivityState: connectivity.Ready})
 | 
			
		||||
 | 
			
		||||
	// Test pick with 1.
 | 
			
		||||
	if err := testRoundRobinPickerFromCh(cc.NewPickerCh, []balancer.SubConn{sc1}); err != nil {
 | 
			
		||||
	if err := cc.WaitForRoundRobinPicker(ctx, sc1); err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -238,8 +242,8 @@ func (s) TestEDSPriority_SwitchPriority(t *testing.T) {
 | 
			
		|||
	select {
 | 
			
		||||
	case p := <-cc.NewPickerCh:
 | 
			
		||||
		// If we do get a new picker, ensure it is still a p1 picker.
 | 
			
		||||
		if err := testutils.IsRoundRobin([]balancer.SubConn{sc1}, subConnFromPicker(p)); err != nil {
 | 
			
		||||
			t.Fatal(err.Error())
 | 
			
		||||
		if err := testutils.IsRoundRobin([]balancer.SubConn{sc1}, testutils.SubConnFromPicker(p)); err != nil {
 | 
			
		||||
			t.Fatal(err)
 | 
			
		||||
		}
 | 
			
		||||
	default:
 | 
			
		||||
		// No new picker; we were previously using p1 and should still be using
 | 
			
		||||
| 
						 | 
				
			
			@ -262,7 +266,7 @@ func (s) TestEDSPriority_SwitchPriority(t *testing.T) {
 | 
			
		|||
	edsb.UpdateSubConnState(sc2, balancer.SubConnState{ConnectivityState: connectivity.Ready})
 | 
			
		||||
 | 
			
		||||
	// Test pick with 2.
 | 
			
		||||
	if err := testRoundRobinPickerFromCh(cc.NewPickerCh, []balancer.SubConn{sc2}); err != nil {
 | 
			
		||||
	if err := cc.WaitForRoundRobinPicker(ctx, sc2); err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -280,7 +284,7 @@ func (s) TestEDSPriority_SwitchPriority(t *testing.T) {
 | 
			
		|||
 | 
			
		||||
	// Should get an update with 1's old picker, to override 2's old picker.
 | 
			
		||||
	want := errors.New("last connection error: subConn connection error")
 | 
			
		||||
	if err := testErrPickerFromCh(cc.NewPickerCh, want); err != nil {
 | 
			
		||||
	if err := cc.WaitForPickerWithErr(ctx, want); err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -318,8 +322,10 @@ func (s) TestEDSPriority_HigherDownWhileAddingLower(t *testing.T) {
 | 
			
		|||
	})
 | 
			
		||||
 | 
			
		||||
	// Test pick failure.
 | 
			
		||||
	ctx, cancel := context.WithTimeout(context.Background(), defaultTestTimeout)
 | 
			
		||||
	defer cancel()
 | 
			
		||||
	want := errors.New("last connection error: subConn connection error")
 | 
			
		||||
	if err := testErrPickerFromCh(cc.NewPickerCh, want); err != nil {
 | 
			
		||||
	if err := cc.WaitForPickerWithErr(ctx, want); err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -338,7 +344,7 @@ func (s) TestEDSPriority_HigherDownWhileAddingLower(t *testing.T) {
 | 
			
		|||
	edsb.UpdateSubConnState(sc2, balancer.SubConnState{ConnectivityState: connectivity.Ready})
 | 
			
		||||
 | 
			
		||||
	// Test pick with 2.
 | 
			
		||||
	if err := testRoundRobinPickerFromCh(cc.NewPickerCh, []balancer.SubConn{sc2}); err != nil {
 | 
			
		||||
	if err := cc.WaitForRoundRobinPicker(ctx, sc2); err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -380,7 +386,9 @@ func (s) TestEDSPriority_HigherReadyCloseAllLower(t *testing.T) {
 | 
			
		|||
	edsb.UpdateSubConnState(sc2, balancer.SubConnState{ConnectivityState: connectivity.Ready})
 | 
			
		||||
 | 
			
		||||
	// Test pick with 2.
 | 
			
		||||
	if err := testRoundRobinPickerFromCh(cc.NewPickerCh, []balancer.SubConn{sc2}); err != nil {
 | 
			
		||||
	ctx, cancel := context.WithTimeout(context.Background(), defaultTestTimeout)
 | 
			
		||||
	defer cancel()
 | 
			
		||||
	if err := cc.WaitForRoundRobinPicker(ctx, sc2); err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -415,7 +423,7 @@ func (s) TestEDSPriority_HigherReadyCloseAllLower(t *testing.T) {
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	// Test pick with 0.
 | 
			
		||||
	if err := testRoundRobinPickerFromCh(cc.NewPickerCh, []balancer.SubConn{sc0}); err != nil {
 | 
			
		||||
	if err := cc.WaitForRoundRobinPicker(ctx, sc0); err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -467,7 +475,9 @@ func (s) TestEDSPriority_InitTimeout(t *testing.T) {
 | 
			
		|||
	edsb.UpdateSubConnState(sc1, balancer.SubConnState{ConnectivityState: connectivity.Ready})
 | 
			
		||||
 | 
			
		||||
	// Test pick with 1.
 | 
			
		||||
	if err := testRoundRobinPickerFromCh(cc.NewPickerCh, []balancer.SubConn{sc1}); err != nil {
 | 
			
		||||
	ctx, cancel := context.WithTimeout(context.Background(), defaultTestTimeout)
 | 
			
		||||
	defer cancel()
 | 
			
		||||
	if err := cc.WaitForRoundRobinPicker(ctx, sc1); err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -493,7 +503,9 @@ func (s) TestEDSPriority_MultipleLocalities(t *testing.T) {
 | 
			
		|||
	edsb.UpdateSubConnState(sc0, balancer.SubConnState{ConnectivityState: connectivity.Ready})
 | 
			
		||||
 | 
			
		||||
	// Test roundrobin with only p0 subconns.
 | 
			
		||||
	if err := testRoundRobinPickerFromCh(cc.NewPickerCh, []balancer.SubConn{sc0}); err != nil {
 | 
			
		||||
	ctx, cancel := context.WithTimeout(context.Background(), defaultTestTimeout)
 | 
			
		||||
	defer cancel()
 | 
			
		||||
	if err := cc.WaitForRoundRobinPicker(ctx, sc0); err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -509,7 +521,7 @@ func (s) TestEDSPriority_MultipleLocalities(t *testing.T) {
 | 
			
		|||
	edsb.UpdateSubConnState(sc1, balancer.SubConnState{ConnectivityState: connectivity.Ready})
 | 
			
		||||
 | 
			
		||||
	// Test roundrobin with only p1 subconns.
 | 
			
		||||
	if err := testRoundRobinPickerFromCh(cc.NewPickerCh, []balancer.SubConn{sc1}); err != nil {
 | 
			
		||||
	if err := cc.WaitForRoundRobinPicker(ctx, sc1); err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -522,7 +534,7 @@ func (s) TestEDSPriority_MultipleLocalities(t *testing.T) {
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	// Test roundrobin with only p0 subconns.
 | 
			
		||||
	if err := testRoundRobinPickerFromCh(cc.NewPickerCh, []balancer.SubConn{sc0}); err != nil {
 | 
			
		||||
	if err := cc.WaitForRoundRobinPicker(ctx, sc0); err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -542,7 +554,7 @@ func (s) TestEDSPriority_MultipleLocalities(t *testing.T) {
 | 
			
		|||
	edsb.UpdateSubConnState(sc2, balancer.SubConnState{ConnectivityState: connectivity.Ready})
 | 
			
		||||
 | 
			
		||||
	// Test roundrobin with only two p0 subconns.
 | 
			
		||||
	if err := testRoundRobinPickerFromCh(cc.NewPickerCh, []balancer.SubConn{sc0, sc2}); err != nil {
 | 
			
		||||
	if err := cc.WaitForRoundRobinPicker(ctx, sc0, sc2); err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -558,7 +570,7 @@ func (s) TestEDSPriority_MultipleLocalities(t *testing.T) {
 | 
			
		|||
	edsb.UpdateSubConnState(sc4, balancer.SubConnState{ConnectivityState: connectivity.Ready})
 | 
			
		||||
 | 
			
		||||
	// Test roundrobin with only p1 subconns.
 | 
			
		||||
	if err := testRoundRobinPickerFromCh(cc.NewPickerCh, []balancer.SubConn{sc3, sc4}); err != nil {
 | 
			
		||||
	if err := cc.WaitForRoundRobinPicker(ctx, sc3, sc4); err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -590,7 +602,9 @@ func (s) TestEDSPriority_RemovesAllLocalities(t *testing.T) {
 | 
			
		|||
	edsb.UpdateSubConnState(sc0, balancer.SubConnState{ConnectivityState: connectivity.Ready})
 | 
			
		||||
 | 
			
		||||
	// Test roundrobin with only p0 subconns.
 | 
			
		||||
	if err := testRoundRobinPickerFromCh(cc.NewPickerCh, []balancer.SubConn{sc0}); err != nil {
 | 
			
		||||
	ctx, cancel := context.WithTimeout(context.Background(), defaultTestTimeout)
 | 
			
		||||
	defer cancel()
 | 
			
		||||
	if err := cc.WaitForRoundRobinPicker(ctx, sc0); err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -606,7 +620,7 @@ func (s) TestEDSPriority_RemovesAllLocalities(t *testing.T) {
 | 
			
		|||
	// time.Sleep(time.Second)
 | 
			
		||||
 | 
			
		||||
	// Test pick return TransientFailure.
 | 
			
		||||
	if err := testErrPickerFromCh(cc.NewPickerCh, priority.ErrAllPrioritiesRemoved); err != nil {
 | 
			
		||||
	if err := cc.WaitForPickerWithErr(ctx, priority.ErrAllPrioritiesRemoved); err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -635,7 +649,7 @@ func (s) TestEDSPriority_RemovesAllLocalities(t *testing.T) {
 | 
			
		|||
	edsb.UpdateSubConnState(sc11, balancer.SubConnState{ConnectivityState: connectivity.Ready})
 | 
			
		||||
 | 
			
		||||
	// Test roundrobin with only p1 subconns.
 | 
			
		||||
	if err := testRoundRobinPickerFromCh(cc.NewPickerCh, []balancer.SubConn{sc11}); err != nil {
 | 
			
		||||
	if err := cc.WaitForRoundRobinPicker(ctx, sc11); err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -651,7 +665,7 @@ func (s) TestEDSPriority_RemovesAllLocalities(t *testing.T) {
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	// Test pick return TransientFailure.
 | 
			
		||||
	if err := testErrPickerFromCh(cc.NewPickerCh, balancer.ErrNoSubConnAvailable); err != nil {
 | 
			
		||||
	if err := cc.WaitForPickerWithErr(ctx, balancer.ErrNoSubConnAvailable); err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -661,7 +675,7 @@ func (s) TestEDSPriority_RemovesAllLocalities(t *testing.T) {
 | 
			
		|||
	edsb.UpdateSubConnState(sc01, balancer.SubConnState{ConnectivityState: connectivity.Ready})
 | 
			
		||||
 | 
			
		||||
	// Test roundrobin with only p0 subconns.
 | 
			
		||||
	if err := testRoundRobinPickerFromCh(cc.NewPickerCh, []balancer.SubConn{sc01}); err != nil {
 | 
			
		||||
	if err := cc.WaitForRoundRobinPicker(ctx, sc01); err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -697,7 +711,9 @@ func (s) TestEDSPriority_HighPriorityNoEndpoints(t *testing.T) {
 | 
			
		|||
	edsb.UpdateSubConnState(sc1, balancer.SubConnState{ConnectivityState: connectivity.Ready})
 | 
			
		||||
 | 
			
		||||
	// Test roundrobin with only p0 subconns.
 | 
			
		||||
	if err := testRoundRobinPickerFromCh(cc.NewPickerCh, []balancer.SubConn{sc1}); err != nil {
 | 
			
		||||
	ctx, cancel := context.WithTimeout(context.Background(), defaultTestTimeout)
 | 
			
		||||
	defer cancel()
 | 
			
		||||
	if err := cc.WaitForRoundRobinPicker(ctx, sc1); err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -722,7 +738,7 @@ func (s) TestEDSPriority_HighPriorityNoEndpoints(t *testing.T) {
 | 
			
		|||
	edsb.UpdateSubConnState(sc2, balancer.SubConnState{ConnectivityState: connectivity.Ready})
 | 
			
		||||
 | 
			
		||||
	// Test roundrobin with only p1 subconns.
 | 
			
		||||
	if err := testRoundRobinPickerFromCh(cc.NewPickerCh, []balancer.SubConn{sc2}); err != nil {
 | 
			
		||||
	if err := cc.WaitForRoundRobinPicker(ctx, sc2); err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -748,7 +764,9 @@ func (s) TestEDSPriority_HighPriorityAllUnhealthy(t *testing.T) {
 | 
			
		|||
	edsb.UpdateSubConnState(sc1, balancer.SubConnState{ConnectivityState: connectivity.Ready})
 | 
			
		||||
 | 
			
		||||
	// Test roundrobin with only p0 subconns.
 | 
			
		||||
	if err := testRoundRobinPickerFromCh(cc.NewPickerCh, []balancer.SubConn{sc1}); err != nil {
 | 
			
		||||
	ctx, cancel := context.WithTimeout(context.Background(), defaultTestTimeout)
 | 
			
		||||
	defer cancel()
 | 
			
		||||
	if err := cc.WaitForRoundRobinPicker(ctx, sc1); err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -775,7 +793,7 @@ func (s) TestEDSPriority_HighPriorityAllUnhealthy(t *testing.T) {
 | 
			
		|||
	edsb.UpdateSubConnState(sc2, balancer.SubConnState{ConnectivityState: connectivity.Ready})
 | 
			
		||||
 | 
			
		||||
	// Test roundrobin with only p1 subconns.
 | 
			
		||||
	if err := testRoundRobinPickerFromCh(cc.NewPickerCh, []balancer.SubConn{sc2}); err != nil {
 | 
			
		||||
	if err := cc.WaitForRoundRobinPicker(ctx, sc2); err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -865,7 +883,7 @@ func (s) TestFallbackToDNS(t *testing.T) {
 | 
			
		|||
	edsb.UpdateSubConnState(sc0, balancer.SubConnState{ConnectivityState: connectivity.Ready})
 | 
			
		||||
 | 
			
		||||
	// Test roundrobin with only p0 subconns.
 | 
			
		||||
	if err := testRoundRobinPickerFromCh(cc.NewPickerCh, []balancer.SubConn{sc0}); err != nil {
 | 
			
		||||
	if err := cc.WaitForRoundRobinPicker(ctx, sc0); err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -893,7 +911,7 @@ func (s) TestFallbackToDNS(t *testing.T) {
 | 
			
		|||
	edsb.UpdateSubConnState(sc1, balancer.SubConnState{ConnectivityState: connectivity.Ready})
 | 
			
		||||
 | 
			
		||||
	// Test pick with 1.
 | 
			
		||||
	if err := testRoundRobinPickerFromCh(cc.NewPickerCh, []balancer.SubConn{sc1}); err != nil {
 | 
			
		||||
	if err := cc.WaitForRoundRobinPicker(ctx, sc1); err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -19,16 +19,12 @@ package clusterresolver
 | 
			
		|||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"net"
 | 
			
		||||
	"reflect"
 | 
			
		||||
	"strconv"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	xdspb "github.com/envoyproxy/go-control-plane/envoy/api/v2"
 | 
			
		||||
	corepb "github.com/envoyproxy/go-control-plane/envoy/api/v2/core"
 | 
			
		||||
	endpointpb "github.com/envoyproxy/go-control-plane/envoy/api/v2/endpoint"
 | 
			
		||||
	typepb "github.com/envoyproxy/go-control-plane/envoy/type"
 | 
			
		||||
	"google.golang.org/grpc/balancer"
 | 
			
		||||
	"google.golang.org/grpc/internal/testutils"
 | 
			
		||||
	"google.golang.org/grpc/xds/internal"
 | 
			
		||||
	"google.golang.org/grpc/xds/internal/xdsclient/xdsresource"
 | 
			
		||||
)
 | 
			
		||||
| 
						 | 
				
			
			@ -115,70 +111,3 @@ func parseEndpoints(lbEndpoints []*endpointpb.LbEndpoint) []xdsresource.Endpoint
 | 
			
		|||
	}
 | 
			
		||||
	return endpoints
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// testPickerFromCh receives pickers from the channel, and check if their
 | 
			
		||||
// behaviors are as expected (that the given function returns nil err).
 | 
			
		||||
//
 | 
			
		||||
// It returns nil if one picker has the correct behavior.
 | 
			
		||||
//
 | 
			
		||||
// It returns error when there's no picker from channel after 1 second timeout,
 | 
			
		||||
// and the error returned is the mismatch error from the previous picker.
 | 
			
		||||
func testPickerFromCh(ch chan balancer.Picker, f func(balancer.Picker) error) error {
 | 
			
		||||
	var (
 | 
			
		||||
		p   balancer.Picker
 | 
			
		||||
		err error
 | 
			
		||||
	)
 | 
			
		||||
	for {
 | 
			
		||||
		select {
 | 
			
		||||
		case p = <-ch:
 | 
			
		||||
		case <-time.After(defaultTestTimeout):
 | 
			
		||||
			// TODO: this function should take a context, and use the context
 | 
			
		||||
			// here, instead of making a new timer.
 | 
			
		||||
			return fmt.Errorf("timeout waiting for picker with expected behavior, error from previous picker: %v", err)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		err = f(p)
 | 
			
		||||
		if err == nil {
 | 
			
		||||
			return nil
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func subConnFromPicker(p balancer.Picker) func() balancer.SubConn {
 | 
			
		||||
	return func() balancer.SubConn {
 | 
			
		||||
		scst, _ := p.Pick(balancer.PickInfo{})
 | 
			
		||||
		return scst.SubConn
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// testRoundRobinPickerFromCh receives pickers from the channel, and check if
 | 
			
		||||
// their behaviors are round-robin of want.
 | 
			
		||||
//
 | 
			
		||||
// It returns nil if one picker has the correct behavior.
 | 
			
		||||
//
 | 
			
		||||
// It returns error when there's no picker from channel after 1 second timeout,
 | 
			
		||||
// and the error returned is the mismatch error from the previous picker.
 | 
			
		||||
func testRoundRobinPickerFromCh(ch chan balancer.Picker, want []balancer.SubConn) error {
 | 
			
		||||
	return testPickerFromCh(ch, func(p balancer.Picker) error {
 | 
			
		||||
		return testutils.IsRoundRobin(want, subConnFromPicker(p))
 | 
			
		||||
	})
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// testErrPickerFromCh receives pickers from the channel, and check if they
 | 
			
		||||
// return the wanted error.
 | 
			
		||||
//
 | 
			
		||||
// It returns nil if one picker has the correct behavior.
 | 
			
		||||
//
 | 
			
		||||
// It returns error when there's no picker from channel after 1 second timeout,
 | 
			
		||||
// and the error returned is the mismatch error from the previous picker.
 | 
			
		||||
func testErrPickerFromCh(ch chan balancer.Picker, want error) error {
 | 
			
		||||
	return testPickerFromCh(ch, func(p balancer.Picker) error {
 | 
			
		||||
		for i := 0; i < 5; i++ {
 | 
			
		||||
			_, err := p.Pick(balancer.PickInfo{})
 | 
			
		||||
			if !reflect.DeepEqual(err, want) {
 | 
			
		||||
				return fmt.Errorf("picker.Pick, got err %q, want err %q", err, want)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		return nil
 | 
			
		||||
	})
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue