use of io.grpc.xds.XdsClient.RdsResourceWatcher in project grpc-java by grpc.
the class ClientXdsClientTestBase method cachedRdsResource_data.
@Test
public void cachedRdsResource_data() {
DiscoveryRpcCall call = startResourceWatcher(RDS, RDS_RESOURCE, rdsResourceWatcher);
call.sendResponse(RDS, testRouteConfig, VERSION_1, "0000");
// Client sends an ACK RDS request.
call.verifyRequest(RDS, RDS_RESOURCE, VERSION_1, "0000", NODE);
RdsResourceWatcher watcher = mock(RdsResourceWatcher.class);
xdsClient.watchRdsResource(RDS_RESOURCE, watcher);
verify(watcher).onChanged(rdsUpdateCaptor.capture());
assertThat(rdsUpdateCaptor.getValue().virtualHosts).hasSize(VHOST_SIZE);
call.verifyNoMoreRequest();
verifyResourceMetadataAcked(RDS, RDS_RESOURCE, testRouteConfig, VERSION_1, TIME_INCREMENT);
verifySubscribedResourcesMetadataSizes(0, 0, 1, 0);
}
use of io.grpc.xds.XdsClient.RdsResourceWatcher in project grpc-java by grpc.
the class ClientXdsClientTestBase method multipleRdsWatchers.
@Test
public void multipleRdsWatchers() {
String rdsResourceTwo = "route-bar.googleapis.com";
RdsResourceWatcher watcher1 = mock(RdsResourceWatcher.class);
RdsResourceWatcher watcher2 = mock(RdsResourceWatcher.class);
xdsClient.watchRdsResource(RDS_RESOURCE, rdsResourceWatcher);
xdsClient.watchRdsResource(rdsResourceTwo, watcher1);
xdsClient.watchRdsResource(rdsResourceTwo, watcher2);
DiscoveryRpcCall call = resourceDiscoveryCalls.poll();
call.verifyRequest(RDS, Arrays.asList(RDS_RESOURCE, rdsResourceTwo), "", "", NODE);
// Both RDS resources were requested.
verifyResourceMetadataRequested(RDS, RDS_RESOURCE);
verifyResourceMetadataRequested(RDS, rdsResourceTwo);
verifySubscribedResourcesMetadataSizes(0, 0, 2, 0);
fakeClock.forwardTime(ClientXdsClient.INITIAL_RESOURCE_FETCH_TIMEOUT_SEC, TimeUnit.SECONDS);
verify(rdsResourceWatcher).onResourceDoesNotExist(RDS_RESOURCE);
verify(watcher1).onResourceDoesNotExist(rdsResourceTwo);
verify(watcher2).onResourceDoesNotExist(rdsResourceTwo);
verifyResourceMetadataDoesNotExist(RDS, RDS_RESOURCE);
verifyResourceMetadataDoesNotExist(RDS, rdsResourceTwo);
verifySubscribedResourcesMetadataSizes(0, 0, 2, 0);
call.sendResponse(RDS, testRouteConfig, VERSION_1, "0000");
verify(rdsResourceWatcher).onChanged(rdsUpdateCaptor.capture());
assertThat(rdsUpdateCaptor.getValue().virtualHosts).hasSize(VHOST_SIZE);
verifyNoMoreInteractions(watcher1, watcher2);
verifyResourceMetadataAcked(RDS, RDS_RESOURCE, testRouteConfig, VERSION_1, TIME_INCREMENT);
verifyResourceMetadataDoesNotExist(RDS, rdsResourceTwo);
verifySubscribedResourcesMetadataSizes(0, 0, 2, 0);
Any routeConfigTwo = Any.pack(mf.buildRouteConfiguration(rdsResourceTwo, mf.buildOpaqueVirtualHosts(4)));
call.sendResponse(RDS, routeConfigTwo, VERSION_2, "0002");
verify(watcher1).onChanged(rdsUpdateCaptor.capture());
assertThat(rdsUpdateCaptor.getValue().virtualHosts).hasSize(4);
verify(watcher2).onChanged(rdsUpdateCaptor.capture());
assertThat(rdsUpdateCaptor.getValue().virtualHosts).hasSize(4);
verifyNoMoreInteractions(rdsResourceWatcher);
verifyResourceMetadataAcked(RDS, RDS_RESOURCE, testRouteConfig, VERSION_1, TIME_INCREMENT);
verifyResourceMetadataAcked(RDS, rdsResourceTwo, routeConfigTwo, VERSION_2, TIME_INCREMENT * 2);
verifySubscribedResourcesMetadataSizes(0, 0, 2, 0);
}
use of io.grpc.xds.XdsClient.RdsResourceWatcher in project grpc-java by grpc.
the class ClientXdsClientTestBase method cachedRdsResource_absent.
@Test
public void cachedRdsResource_absent() {
DiscoveryRpcCall call = startResourceWatcher(RDS, RDS_RESOURCE, rdsResourceWatcher);
fakeClock.forwardTime(ClientXdsClient.INITIAL_RESOURCE_FETCH_TIMEOUT_SEC, TimeUnit.SECONDS);
verify(rdsResourceWatcher).onResourceDoesNotExist(RDS_RESOURCE);
// Add another watcher.
RdsResourceWatcher watcher = mock(RdsResourceWatcher.class);
xdsClient.watchRdsResource(RDS_RESOURCE, watcher);
verify(watcher).onResourceDoesNotExist(RDS_RESOURCE);
call.verifyNoMoreRequest();
verifyResourceMetadataDoesNotExist(RDS, RDS_RESOURCE);
verifySubscribedResourcesMetadataSizes(0, 0, 1, 0);
}
use of io.grpc.xds.XdsClient.RdsResourceWatcher in project grpc-java by grpc.
the class XdsServerWrapperTest method error.
@Test
public void error() throws Exception {
final SettableFuture<Server> start = SettableFuture.create();
Executors.newSingleThreadExecutor().execute(new Runnable() {
@Override
public void run() {
try {
start.set(xdsServerWrapper.start());
} catch (Exception ex) {
start.setException(ex);
}
}
});
String ldsResource = xdsClient.ldsResource.get(5, TimeUnit.SECONDS);
xdsClient.ldsWatcher.onResourceDoesNotExist(ldsResource);
try {
start.get(5000, TimeUnit.MILLISECONDS);
fail("server should not start()");
} catch (TimeoutException ex) {
// expect to block here.
assertThat(start.isDone()).isFalse();
}
verify(listener, times(1)).onNotServing(any(StatusException.class));
verify(mockBuilder, times(1)).build();
FilterChain filterChain0 = createFilterChain("filter-chain-0", createRds("rds"));
SslContextProviderSupplier sslSupplier0 = filterChain0.sslContextProviderSupplier();
xdsClient.deliverLdsUpdate(Collections.singletonList(filterChain0), null);
xdsClient.ldsWatcher.onError(Status.INTERNAL);
assertThat(selectorManager.getSelectorToUpdateSelector()).isSameInstanceAs(FilterChainSelector.NO_FILTER_CHAIN);
assertThat(xdsClient.rdsWatchers).isEmpty();
verify(mockBuilder, times(1)).build();
verify(listener, times(2)).onNotServing(any(StatusException.class));
assertThat(sslSupplier0.isShutdown()).isFalse();
when(mockServer.start()).thenThrow(new IOException("error!")).thenReturn(mockServer);
FilterChain filterChain1 = createFilterChain("filter-chain-1", createRds("rds"));
SslContextProviderSupplier sslSupplier1 = filterChain1.sslContextProviderSupplier();
xdsClient.deliverLdsUpdate(Collections.singletonList(filterChain1), null);
assertThat(sslSupplier0.isShutdown()).isTrue();
xdsClient.deliverRdsUpdate("rds", Collections.singletonList(createVirtualHost("virtual-host-1")));
try {
start.get(5000, TimeUnit.MILLISECONDS);
fail("Start should throw exception");
} catch (ExecutionException ex) {
assertThat(ex.getCause()).isInstanceOf(IOException.class);
assertThat(ex.getCause().getMessage()).isEqualTo("error!");
}
RdsResourceWatcher saveRdsWatcher = xdsClient.rdsWatchers.get("rds");
assertThat(executor.forwardNanos(RETRY_DELAY_NANOS)).isEqualTo(1);
verify(mockBuilder, times(1)).build();
verify(mockServer, times(2)).start();
verify(listener, times(1)).onServing();
assertThat(selectorManager.getSelectorToUpdateSelector().getRoutingConfigs().size()).isEqualTo(1);
ServerRoutingConfig realConfig = selectorManager.getSelectorToUpdateSelector().getRoutingConfigs().get(filterChain1).get();
assertThat(realConfig.virtualHosts()).isEqualTo(Collections.singletonList(createVirtualHost("virtual-host-1")));
assertThat(realConfig.interceptors()).isEqualTo(ImmutableMap.of());
// xds update after start
xdsClient.deliverRdsUpdate("rds", Collections.singletonList(createVirtualHost("virtual-host-2")));
assertThat(sslSupplier1.isShutdown()).isFalse();
xdsClient.ldsWatcher.onError(Status.DEADLINE_EXCEEDED);
verify(mockBuilder, times(1)).build();
verify(mockServer, times(2)).start();
verify(listener, times(2)).onNotServing(any(StatusException.class));
assertThat(selectorManager.getSelectorToUpdateSelector().getRoutingConfigs().size()).isEqualTo(1);
realConfig = selectorManager.getSelectorToUpdateSelector().getRoutingConfigs().get(filterChain1).get();
assertThat(realConfig.virtualHosts()).isEqualTo(Collections.singletonList(createVirtualHost("virtual-host-2")));
assertThat(realConfig.interceptors()).isEqualTo(ImmutableMap.of());
assertThat(sslSupplier1.isShutdown()).isFalse();
// not serving after serving
xdsClient.ldsWatcher.onResourceDoesNotExist(ldsResource);
assertThat(xdsClient.rdsWatchers).isEmpty();
verify(mockServer, times(3)).shutdown();
when(mockServer.isShutdown()).thenReturn(true);
assertThat(selectorManager.getSelectorToUpdateSelector()).isSameInstanceAs(FilterChainSelector.NO_FILTER_CHAIN);
verify(listener, times(3)).onNotServing(any(StatusException.class));
assertThat(sslSupplier1.isShutdown()).isTrue();
// no op
saveRdsWatcher.onChanged(new RdsUpdate(Collections.singletonList(createVirtualHost("virtual-host-1"))));
verify(mockBuilder, times(1)).build();
verify(mockServer, times(2)).start();
verify(listener, times(1)).onServing();
// cancel retry
when(mockServer.start()).thenThrow(new IOException("error1!")).thenThrow(new IOException("error2!")).thenReturn(mockServer);
FilterChain filterChain2 = createFilterChain("filter-chain-2", createRds("rds"));
SslContextProviderSupplier sslSupplier2 = filterChain2.sslContextProviderSupplier();
xdsClient.deliverLdsUpdate(Collections.singletonList(filterChain2), null);
xdsClient.deliverRdsUpdate("rds", Collections.singletonList(createVirtualHost("virtual-host-1")));
assertThat(sslSupplier1.isShutdown()).isTrue();
verify(mockBuilder, times(2)).build();
when(mockServer.isShutdown()).thenReturn(false);
verify(mockServer, times(3)).start();
verify(listener, times(1)).onServing();
verify(listener, times(3)).onNotServing(any(StatusException.class));
assertThat(selectorManager.getSelectorToUpdateSelector().getRoutingConfigs().size()).isEqualTo(1);
realConfig = selectorManager.getSelectorToUpdateSelector().getRoutingConfigs().get(filterChain2).get();
assertThat(realConfig.virtualHosts()).isEqualTo(Collections.singletonList(createVirtualHost("virtual-host-1")));
assertThat(realConfig.interceptors()).isEqualTo(ImmutableMap.of());
assertThat(executor.numPendingTasks()).isEqualTo(1);
xdsClient.ldsWatcher.onResourceDoesNotExist(ldsResource);
verify(mockServer, times(4)).shutdown();
verify(listener, times(4)).onNotServing(any(StatusException.class));
when(mockServer.isShutdown()).thenReturn(true);
assertThat(executor.numPendingTasks()).isEqualTo(0);
assertThat(sslSupplier2.isShutdown()).isTrue();
// serving after not serving
FilterChain filterChain3 = createFilterChain("filter-chain-2", createRds("rds"));
SslContextProviderSupplier sslSupplier3 = filterChain3.sslContextProviderSupplier();
xdsClient.deliverLdsUpdate(Collections.singletonList(filterChain3), null);
xdsClient.deliverRdsUpdate("rds", Collections.singletonList(createVirtualHost("virtual-host-1")));
verify(mockBuilder, times(3)).build();
verify(mockServer, times(4)).start();
verify(listener, times(1)).onServing();
when(mockServer.isShutdown()).thenReturn(false);
verify(listener, times(4)).onNotServing(any(StatusException.class));
assertThat(selectorManager.getSelectorToUpdateSelector().getRoutingConfigs().size()).isEqualTo(1);
realConfig = selectorManager.getSelectorToUpdateSelector().getRoutingConfigs().get(filterChain3).get();
assertThat(realConfig.virtualHosts()).isEqualTo(Collections.singletonList(createVirtualHost("virtual-host-1")));
assertThat(realConfig.interceptors()).isEqualTo(ImmutableMap.of());
xdsServerWrapper.shutdown();
verify(mockServer, times(5)).shutdown();
assertThat(sslSupplier3.isShutdown()).isTrue();
when(mockServer.awaitTermination(anyLong(), any(TimeUnit.class))).thenReturn(true);
assertThat(xdsServerWrapper.awaitTermination(5, TimeUnit.SECONDS)).isTrue();
}
Aggregations