diff --git a/api/src/main/java/io/grpc/ConfiguratorRegistry.java b/api/src/main/java/io/grpc/ConfiguratorRegistry.java index a0a91609dd..19d6703d30 100644 --- a/api/src/main/java/io/grpc/ConfiguratorRegistry.java +++ b/api/src/main/java/io/grpc/ConfiguratorRegistry.java @@ -33,9 +33,9 @@ final class ConfiguratorRegistry { @GuardedBy("this") private boolean wasConfiguratorsSet; @GuardedBy("this") - private boolean configFrozen; - @GuardedBy("this") private List configurators = Collections.emptyList(); + @GuardedBy("this") + private int configuratorsCallCountBeforeSet = 0; ConfiguratorRegistry() {} @@ -56,11 +56,10 @@ final class ConfiguratorRegistry { * @throws IllegalStateException if this method is called more than once */ public synchronized void setConfigurators(List configurators) { - if (configFrozen) { + if (wasConfiguratorsSet) { throw new IllegalStateException("Configurators are already set"); } this.configurators = Collections.unmodifiableList(new ArrayList<>(configurators)); - configFrozen = true; wasConfiguratorsSet = true; } @@ -68,10 +67,20 @@ final class ConfiguratorRegistry { * Returns a list of the configurators in this registry. */ public synchronized List getConfigurators() { - configFrozen = true; + if (!wasConfiguratorsSet) { + configuratorsCallCountBeforeSet++; + } return configurators; } + /** + * Returns the number of times getConfigurators() was called before + * setConfigurators() was successfully invoked. + */ + public synchronized int getConfiguratorsCallCountBeforeSet() { + return configuratorsCallCountBeforeSet; + } + public synchronized boolean wasSetConfiguratorsCalled() { return wasConfiguratorsSet; } diff --git a/api/src/main/java/io/grpc/InternalConfiguratorRegistry.java b/api/src/main/java/io/grpc/InternalConfiguratorRegistry.java index b495800ff1..f567dab74c 100644 --- a/api/src/main/java/io/grpc/InternalConfiguratorRegistry.java +++ b/api/src/main/java/io/grpc/InternalConfiguratorRegistry.java @@ -48,4 +48,8 @@ public final class InternalConfiguratorRegistry { public static boolean wasSetConfiguratorsCalled() { return ConfiguratorRegistry.getDefaultRegistry().wasSetConfiguratorsCalled(); } + + public static int getConfiguratorsCallCountBeforeSet() { + return ConfiguratorRegistry.getDefaultRegistry().getConfiguratorsCallCountBeforeSet(); + } } diff --git a/api/src/test/java/io/grpc/ConfiguratorRegistryTest.java b/api/src/test/java/io/grpc/ConfiguratorRegistryTest.java index e231d13503..457d5a36e7 100644 --- a/api/src/test/java/io/grpc/ConfiguratorRegistryTest.java +++ b/api/src/test/java/io/grpc/ConfiguratorRegistryTest.java @@ -85,14 +85,12 @@ public class ConfiguratorRegistryTest { @Override public void run() { assertThat(ConfiguratorRegistry.getDefaultRegistry().getConfigurators()).isEmpty(); - - try { - ConfiguratorRegistry.getDefaultRegistry() - .setConfigurators(Arrays.asList(new NoopConfigurator())); - fail("should have failed for invoking set call after get is already called"); - } catch (IllegalStateException e) { - assertThat(e).hasMessageThat().isEqualTo("Configurators are already set"); - } + NoopConfigurator noopConfigurator = new NoopConfigurator(); + ConfiguratorRegistry.getDefaultRegistry() + .setConfigurators(Arrays.asList(noopConfigurator)); + assertThat(ConfiguratorRegistry.getDefaultRegistry().getConfigurators()) + .containsExactly(noopConfigurator); + assertThat(InternalConfiguratorRegistry.getConfiguratorsCallCountBeforeSet()).isEqualTo(1); } } diff --git a/core/src/test/java/io/grpc/internal/ManagedChannelImplBuilderTest.java b/core/src/test/java/io/grpc/internal/ManagedChannelImplBuilderTest.java index 861412653f..a054e65a6e 100644 --- a/core/src/test/java/io/grpc/internal/ManagedChannelImplBuilderTest.java +++ b/core/src/test/java/io/grpc/internal/ManagedChannelImplBuilderTest.java @@ -529,12 +529,9 @@ public class ManagedChannelImplBuilderTest { List effectiveInterceptors = builder.getEffectiveInterceptors("unused:///"); assertThat(effectiveInterceptors).hasSize(2); - try { - InternalConfiguratorRegistry.setConfigurators(Collections.emptyList()); - fail("exception expected"); - } catch (IllegalStateException e) { - assertThat(e).hasMessageThat().contains("Configurators are already set"); - } + InternalConfiguratorRegistry.setConfigurators(Collections.emptyList()); + assertThat(InternalConfiguratorRegistry.getConfigurators()).isEmpty(); + assertThat(InternalConfiguratorRegistry.getConfiguratorsCallCountBeforeSet()).isEqualTo(1); } } diff --git a/core/src/test/java/io/grpc/internal/ServerImplBuilderTest.java b/core/src/test/java/io/grpc/internal/ServerImplBuilderTest.java index 107591038d..7ad7f15f35 100644 --- a/core/src/test/java/io/grpc/internal/ServerImplBuilderTest.java +++ b/core/src/test/java/io/grpc/internal/ServerImplBuilderTest.java @@ -18,7 +18,6 @@ package io.grpc.internal; import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.fail; import io.grpc.InternalConfigurator; import io.grpc.InternalConfiguratorRegistry; @@ -145,12 +144,9 @@ public class ServerImplBuilderTest { }); assertThat(builder.getTracerFactories()).hasSize(2); assertThat(builder.interceptors).hasSize(0); - try { - InternalConfiguratorRegistry.setConfigurators(Collections.emptyList()); - fail("exception expected"); - } catch (IllegalStateException e) { - assertThat(e).hasMessageThat().contains("Configurators are already set"); - } + InternalConfiguratorRegistry.setConfigurators(Collections.emptyList()); + assertThat(InternalConfiguratorRegistry.getConfigurators()).isEmpty(); + assertThat(InternalConfiguratorRegistry.getConfiguratorsCallCountBeforeSet()).isEqualTo(1); } }