func TestRequestStateRetry(t *testing.T) { ctx, cancel := NewContext(time.Second) defer cancel() server := testutils.NewServer(t, nil) defer server.Close() server.Register(raw.Wrap(newTestHandler(t)), "echo") client := testutils.NewClient(t, nil) defer client.Close() counter := 0 sc := client.GetSubChannel(server.PeerInfo().ServiceName) err := client.RunWithRetry(ctx, func(ctx context.Context, rs *RequestState) error { defer func() { counter++ }() assert.Equal(t, counter, len(rs.SelectedPeers), "SelectedPeers should not be reused") if counter < 4 { client.Peers().Add(testutils.GetClosedHostPort(t)) } else { client.Peers().Add(server.PeerInfo().HostPort) } _, err := raw.CallV2(ctx, sc, raw.CArgs{ Operation: "echo", CallOptions: &CallOptions{RequestState: rs}, }) return err }) assert.NoError(t, err, "RunWithRetry should succeed") assert.Equal(t, 5, counter, "RunWithRetry should retry 5 times") }
func TestRetryNetConnect(t *testing.T) { e := getTestErrors() ch := testutils.NewClient(t, nil) defer ch.Close() ctx, cancel := NewContext(time.Second) defer cancel() closedAddr := testutils.GetClosedHostPort(t) listenC, err := net.Listen("tcp", ":0") require.NoError(t, err, "Listen failed") defer listenC.Close() counter := 0 f := func(ctx context.Context, rs *RequestState) error { counter++ if !rs.HasRetries(e.Connection) { c, err := net.Dial("tcp", listenC.Addr().String()) if err == nil { c.Close() } return err } _, err := net.Dial("tcp", closedAddr) return err } assert.NoError(t, ch.RunWithRetry(ctx, f), "RunWithRetry should succeed") assert.Equal(t, 5, counter, "RunWithRetry should have run f 5 times") }