diff --git a/src/main/java/org/xbill/DNS/ResolverConfig.java b/src/main/java/org/xbill/DNS/ResolverConfig.java index f53890f8..28ae07b7 100644 --- a/src/main/java/org/xbill/DNS/ResolverConfig.java +++ b/src/main/java/org/xbill/DNS/ResolverConfig.java @@ -55,20 +55,7 @@ public final class ResolverConfig { private static List configProviders; private static void checkInitialized() { - if (configProviders == null) { - configProviders = new ArrayList<>(8); - if (!Boolean.getBoolean(CONFIGPROVIDER_SKIP_INIT)) { - configProviders.add(new PropertyResolverConfigProvider()); - configProviders.add(new ResolvConfResolverConfigProvider()); - configProviders.add(new WindowsResolverConfigProvider()); - configProviders.add(new AndroidResolverConfigProvider()); - configProviders.add(new JndiContextResolverConfigProvider()); - configProviders.add(new SunJvmResolverConfigProvider()); - configProviders.add(new FallbackPropertyResolverConfigProvider()); - } - } - - if (currentConfig == null) { + if (currentConfig == null || configProviders == null) { refresh(); } } @@ -103,6 +90,21 @@ public static void refresh() { } public ResolverConfig() { + synchronized (ResolverConfig.class) { + if (configProviders == null) { + configProviders = new ArrayList<>(8); + if (!Boolean.getBoolean(CONFIGPROVIDER_SKIP_INIT)) { + configProviders.add(new PropertyResolverConfigProvider()); + configProviders.add(new ResolvConfResolverConfigProvider()); + configProviders.add(new WindowsResolverConfigProvider()); + configProviders.add(new AndroidResolverConfigProvider()); + configProviders.add(new JndiContextResolverConfigProvider()); + configProviders.add(new SunJvmResolverConfigProvider()); + configProviders.add(new FallbackPropertyResolverConfigProvider()); + } + } + } + for (ResolverConfigProvider provider : configProviders) { if (provider.isEnabled()) { try { diff --git a/src/test/java/org/xbill/DNS/ResolverConfigTest.java b/src/test/java/org/xbill/DNS/ResolverConfigTest.java index 834b3fa5..cdebe6ce 100644 --- a/src/test/java/org/xbill/DNS/ResolverConfigTest.java +++ b/src/test/java/org/xbill/DNS/ResolverConfigTest.java @@ -1,6 +1,7 @@ // SPDX-License-Identifier: BSD-2-Clause package org.xbill.DNS; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -13,6 +14,7 @@ import java.lang.reflect.Field; import java.net.InetSocketAddress; import java.util.Arrays; +import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.DisabledOnOs; import org.junit.jupiter.api.condition.EnabledOnOs; @@ -25,17 +27,24 @@ import org.xbill.DNS.config.WindowsResolverConfigProvider; class ResolverConfigTest { - @Test - void testSkipInit() throws Exception { + @AfterEach + void afterEach() throws Exception { + // make sure the ResolverConfig providers are not staying initialized after a test Field configProvidersField = ResolverConfig.class.getDeclaredField("configProviders"); configProvidersField.setAccessible(true); configProvidersField.set(null, null); + Field currentConfigField = ResolverConfig.class.getDeclaredField("currentConfig"); + currentConfigField.setAccessible(true); + currentConfigField.set(null, null); + } + + @Test + void testSkipInit() { try { System.setProperty(ResolverConfig.CONFIGPROVIDER_SKIP_INIT, Boolean.TRUE.toString()); assertTrue(ResolverConfig.getConfigProviders().isEmpty()); } finally { System.setProperty(ResolverConfig.CONFIGPROVIDER_SKIP_INIT, Boolean.FALSE.toString()); - configProvidersField.set(null, null); } } @@ -199,4 +208,9 @@ void windowsServersContainedInJndi() throws InitializationException { winServer + " not found in JNDI, " + win.servers() + "; " + jndi.servers()); } } + + @Test + void refreshAsFirstCall() { + assertDoesNotThrow(ResolverConfig::refresh); + } }