diff --git a/xds/src/main/java/io/grpc/xds/XdsServerBuilder.java b/xds/src/main/java/io/grpc/xds/XdsServerBuilder.java index c95c1e6d48f..d4df317a7e9 100644 --- a/xds/src/main/java/io/grpc/xds/XdsServerBuilder.java +++ b/xds/src/main/java/io/grpc/xds/XdsServerBuilder.java @@ -37,6 +37,7 @@ import io.grpc.netty.NettyServerBuilder; import io.grpc.xds.FilterChainMatchingProtocolNegotiators.FilterChainMatchingNegotiatorServerFactory; import io.grpc.xds.XdsNameResolverProvider.XdsClientPoolFactory; +import java.util.Map; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; import java.util.logging.Logger; @@ -136,6 +137,18 @@ XdsServerBuilder xdsClientPoolFactory(XdsClientPoolFactory xdsClientPoolFactory) return this; } + /** + * Allows providing bootstrap override, useful for testing. + */ + public XdsServerBuilder overrideBootstrapForTest(Map bootstrapOverride) { + checkNotNull(bootstrapOverride, "bootstrapOverride"); + if (this.xdsClientPoolFactory == SharedXdsClientPoolProvider.getDefaultProvider()) { + this.xdsClientPoolFactory = new SharedXdsClientPoolProvider(); + } + this.xdsClientPoolFactory.setBootstrapOverride(bootstrapOverride); + return this; + } + /** * Returns the delegate {@link NettyServerBuilder} to allow experimental level * transport-specific configuration. Note this API will always be experimental. diff --git a/xds/src/test/java/io/grpc/xds/XdsServerBuilderTest.java b/xds/src/test/java/io/grpc/xds/XdsServerBuilderTest.java index 0d15c1f660e..d67ed9d09fc 100644 --- a/xds/src/test/java/io/grpc/xds/XdsServerBuilderTest.java +++ b/xds/src/test/java/io/grpc/xds/XdsServerBuilderTest.java @@ -40,7 +40,9 @@ import java.net.InetSocketAddress; import java.net.ServerSocket; import java.net.SocketAddress; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.concurrent.ExecutionException; import java.util.concurrent.Executors; import java.util.concurrent.Future; @@ -65,6 +67,7 @@ public class XdsServerBuilderTest { private int port; private TlsContextManager tlsContextManager; private FakeXdsClient xdsClient = new FakeXdsClient(); + private FakeXdsClientPoolFactory xdsClientPoolFactory = new FakeXdsClientPoolFactory(xdsClient); private void buildServer(XdsServerBuilder.XdsServingStatusListener xdsServingStatusListener) throws IOException { @@ -77,7 +80,7 @@ private void buildBuilder(XdsServerBuilder.XdsServingStatusListener xdsServingSt builder = XdsServerBuilder.forPort( port, XdsServerCredentials.create(InsecureServerCredentials.create())); - builder.xdsClientPoolFactory(new FakeXdsClientPoolFactory(xdsClient)); + builder.xdsClientPoolFactory(xdsClientPoolFactory); if (xdsServingStatusListener != null) { builder.xdsServingStatusListener(xdsServingStatusListener); } @@ -292,4 +295,12 @@ public void drainGraceTime_negativeThrows() throws IOException { assertThat(expected).hasMessageThat().contains("drain grace time"); } } + + @Test + public void testOverrideBootstrap() throws Exception { + Map b = new HashMap<>(); + buildBuilder(null); + builder.overrideBootstrapForTest(b); + assertThat(xdsClientPoolFactory.savedBootstrap).isEqualTo(b); + } } diff --git a/xds/src/test/java/io/grpc/xds/XdsServerTestHelper.java b/xds/src/test/java/io/grpc/xds/XdsServerTestHelper.java index f289c4726fb..ffe4a72f522 100644 --- a/xds/src/test/java/io/grpc/xds/XdsServerTestHelper.java +++ b/xds/src/test/java/io/grpc/xds/XdsServerTestHelper.java @@ -113,6 +113,7 @@ static final class FakeXdsClientPoolFactory implements XdsNameResolverProvider.XdsClientPoolFactory { private XdsClient xdsClient; + Map savedBootstrap; FakeXdsClientPoolFactory(XdsClient xdsClient) { this.xdsClient = xdsClient; @@ -120,7 +121,7 @@ static final class FakeXdsClientPoolFactory @Override public void setBootstrapOverride(Map bootstrap) { - throw new UnsupportedOperationException("Should not be called"); + this.savedBootstrap = bootstrap; } @Override