Skip to content

Commit

Permalink
Add test for multiple xds clients used by CsdsService
Browse files Browse the repository at this point in the history
  • Loading branch information
larry-safran committed Aug 22, 2024
1 parent 3dd98ca commit 21f30f4
Showing 1 changed file with 57 additions and 7 deletions.
64 changes: 57 additions & 7 deletions xds/src/test/java/io/grpc/xds/CsdsServiceTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -54,8 +54,8 @@
import io.grpc.xds.client.XdsClient.ResourceMetadata;
import io.grpc.xds.client.XdsClient.ResourceMetadata.ResourceMetadataStatus;
import io.grpc.xds.client.XdsResourceType;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
Expand Down Expand Up @@ -269,6 +269,31 @@ public void streamClientStatus_onClientError() {
assertThat(responseObserver.getError()).isNull();
}

@Test
public void multipleXdsClients() {
FakeXdsClient xdsClient1 = new FakeXdsClient();
FakeXdsClient xdsClient2 = new FakeXdsClient();
Map<String, XdsClient> clientMap = new HashMap<>();
clientMap.put("target1", xdsClient1);
clientMap.put("target2", xdsClient2);
FakeXdsClientPoolFactory factory = new FakeXdsClientPoolFactory(clientMap);
CsdsService csdsService = new CsdsService(factory);
grpcServerRule.getServiceRegistry().addService(csdsService);

StreamRecorder<ClientStatusResponse> responseObserver = StreamRecorder.create();
StreamObserver<ClientStatusRequest> requestObserver =
csdsAsyncStub.streamClientStatus(responseObserver);

requestObserver.onNext(REQUEST);
requestObserver.onCompleted();

List<ClientStatusResponse> responses = responseObserver.getValues();
assertThat(responses).hasSize(1);
Collection<String> targets = verifyMultiResponse(responses.get(0), 2);
assertThat(targets).containsExactly("target1", "target2");
responseObserver.onCompleted();
}

private void verifyResponse(ClientStatusResponse response) {
assertThat(response.getConfigCount()).isEqualTo(1);
ClientConfig clientConfig = response.getConfig(0);
Expand All @@ -277,6 +302,20 @@ private void verifyResponse(ClientStatusResponse response) {
assertThat(clientConfig.getClientScope()).isEmpty();
}

private Collection<String> verifyMultiResponse(ClientStatusResponse response, int numExpected) {
assertThat(response.getConfigCount()).isEqualTo(numExpected);

List<String> clientScopes = new ArrayList<>();
for (int i = 0; i < numExpected; i++) {
ClientConfig clientConfig = response.getConfig(i);
verifyClientConfigNode(clientConfig);
verifyClientConfigNoResources(XDS_CLIENT_NO_RESOURCES, clientConfig);
clientScopes.add(clientConfig.getClientScope());
}

return clientScopes;
}

private void verifyRequestInvalidResponseStatus(Status status) {
assertThat(status.getCode()).isEqualTo(Code.INVALID_ARGUMENT);
assertThat(status.getDescription()).isEqualTo("node_matchers not supported");
Expand Down Expand Up @@ -471,20 +510,31 @@ public Map<String, XdsResourceType<?>> getSubscribedResourceTypesWithTypeUrl() {
}

private static class FakeXdsClientPoolFactory implements XdsClientPoolFactory {
@Nullable private final XdsClient xdsClient;
private static final List<String> TARGETS = Collections.singletonList("");
private final Map<String, XdsClient> xdsClientMap = new HashMap<>();
private boolean isOldStyle
;

private FakeXdsClientPoolFactory(@Nullable XdsClient xdsClient) {
this.xdsClient = xdsClient;
if (xdsClient != null) {
xdsClientMap.put("", xdsClient);
}
isOldStyle = true;
}

private FakeXdsClientPoolFactory(Map<String,XdsClient> xdsClientMap) {
this.xdsClientMap.putAll(xdsClientMap);
isOldStyle = false;
}

@Override
@Nullable
public ObjectPool<XdsClient> get(String notUsedTarget) {
public ObjectPool<XdsClient> get(String target) {
String targetToUse = isOldStyle ? "" : target;

return new ObjectPool<XdsClient>() {
@Override
public XdsClient getObject() {
return xdsClient;
return xdsClientMap.get(targetToUse);
}

@Override
Expand All @@ -496,7 +546,7 @@ public XdsClient returnObject(Object object) {

@Override
public List<String> getTargets() {
return TARGETS;
return new ArrayList<>(xdsClientMap.keySet());
}

@Override
Expand Down

0 comments on commit 21f30f4

Please sign in to comment.