Skip to content

Commit db05a69

Browse files
committed
Support random see for test purposes.
1 parent 789be26 commit db05a69

File tree

2 files changed

+16
-4
lines changed

2 files changed

+16
-4
lines changed

core/src/main/java/io/grpc/internal/PickFirstLoadBalancer.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import java.util.ArrayList;
3232
import java.util.Collections;
3333
import java.util.List;
34+
import java.util.Random;
3435
import java.util.concurrent.atomic.AtomicBoolean;
3536
import javax.annotation.Nullable;
3637

@@ -65,7 +66,8 @@ public boolean acceptResolvedAddresses(ResolvedAddresses resolvedAddresses) {
6566
= (PickFirstLoadBalancerConfig) resolvedAddresses.getLoadBalancingPolicyConfig();
6667
if (config.shuffleAddressList != null && config.shuffleAddressList) {
6768
servers = new ArrayList<EquivalentAddressGroup>(servers);
68-
Collections.shuffle(servers);
69+
Collections.shuffle(servers,
70+
config.randomSeed != null ? new Random(config.randomSeed) : new Random());
6971
}
7072
}
7173

@@ -219,8 +221,16 @@ public static final class PickFirstLoadBalancerConfig {
219221
@Nullable
220222
public final Boolean shuffleAddressList;
221223

224+
// For testing purposes only, not meant to be parsed from a real config.
225+
@Nullable final Long randomSeed;
226+
222227
public PickFirstLoadBalancerConfig(@Nullable Boolean shuffleAddressList) {
228+
this(shuffleAddressList, null);
229+
}
230+
231+
PickFirstLoadBalancerConfig(@Nullable Boolean shuffleAddressList, @Nullable Long randomSeed) {
223232
this.shuffleAddressList = shuffleAddressList;
233+
this.randomSeed = randomSeed;
224234
}
225235
}
226236
}

core/src/test/java/io/grpc/internal/PickFirstLoadBalancerTest.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -145,14 +145,16 @@ public void pickAfterResolved() throws Exception {
145145
public void pickAfterResolved_shuffle() throws Exception {
146146
loadBalancer.acceptResolvedAddresses(
147147
ResolvedAddresses.newBuilder().setAddresses(servers).setAttributes(affinity)
148-
.setLoadBalancingPolicyConfig(new PickFirstLoadBalancerConfig(true)).build());
148+
.setLoadBalancingPolicyConfig(new PickFirstLoadBalancerConfig(true, 123L)).build());
149149

150150
verify(mockHelper).createSubchannel(createArgsCaptor.capture());
151151
CreateSubchannelArgs args = createArgsCaptor.getValue();
152152
// We should still see the same set of addresses.
153153
assertThat(args.getAddresses()).containsExactlyElementsIn(servers);
154-
// If the two lists are equal they have maintained order, we don't want that.
155-
assertThat(args.getAddresses()).isNotEqualTo(servers);
154+
// Because we use a fixed seed, the addresses should always be shuffled in this order.
155+
assertThat(args.getAddresses().get(0)).isEqualTo(servers.get(1));
156+
assertThat(args.getAddresses().get(1)).isEqualTo(servers.get(0));
157+
assertThat(args.getAddresses().get(2)).isEqualTo(servers.get(2));
156158
verify(mockHelper).updateBalancingState(eq(CONNECTING), pickerCaptor.capture());
157159
verify(mockSubchannel).requestConnection();
158160

0 commit comments

Comments
 (0)