diff --git a/maven/core-unittests/src/test/java/com/codename1/io/MultipartRequestTest.java b/maven/core-unittests/src/test/java/com/codename1/io/MultipartRequestTest.java index 78714df3b8..a72ebf42c4 100644 --- a/maven/core-unittests/src/test/java/com/codename1/io/MultipartRequestTest.java +++ b/maven/core-unittests/src/test/java/com/codename1/io/MultipartRequestTest.java @@ -4,6 +4,7 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; import java.nio.charset.StandardCharsets; +import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -15,6 +16,11 @@ void resetImplementation() { TestImplementationProvider.installImplementation(true); } + @AfterEach + void tearDown() { + TestImplementationProvider.resetImplementation(); + } + @Test void buildRequestBodyIncludesArgumentsAndBinaryData() throws IOException { MultipartRequest request = new MultipartRequest(); diff --git a/maven/core-unittests/src/test/java/com/codename1/io/NetworkManagerTest.java b/maven/core-unittests/src/test/java/com/codename1/io/NetworkManagerTest.java index 12f96d4124..e58adf4f5d 100644 --- a/maven/core-unittests/src/test/java/com/codename1/io/NetworkManagerTest.java +++ b/maven/core-unittests/src/test/java/com/codename1/io/NetworkManagerTest.java @@ -8,6 +8,7 @@ import java.util.Enumeration; import java.util.Vector; import java.util.concurrent.atomic.AtomicInteger; +import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -28,6 +29,17 @@ void setUp() throws Exception { bootstrapDisplayThread(); } + @AfterEach + void tearDown() throws Exception { + Field edtField = Display.class.getDeclaredField("edt"); + edtField.setAccessible(true); + edtField.set(Display.getInstance(), null); + Field runningField = Display.class.getDeclaredField("codenameOneRunning"); + runningField.setAccessible(true); + runningField.set(Display.getInstance(), Boolean.FALSE); + TestImplementationProvider.resetImplementation(); + } + @Test void autoDetectUrlMutators() { NetworkManager.setAutoDetectURL("https://example.com/ping"); diff --git a/maven/core-unittests/src/test/java/com/codename1/io/PreferencesTest.java b/maven/core-unittests/src/test/java/com/codename1/io/PreferencesTest.java index ea87f49de4..f723bab4e6 100644 --- a/maven/core-unittests/src/test/java/com/codename1/io/PreferencesTest.java +++ b/maven/core-unittests/src/test/java/com/codename1/io/PreferencesTest.java @@ -1,6 +1,5 @@ package com.codename1.io; -import java.lang.reflect.Field; import java.util.HashMap; import java.util.Map; import java.util.concurrent.atomic.AtomicReference; @@ -13,14 +12,14 @@ class PreferencesTest { @BeforeEach - void setUp() throws Exception { + void setUp() { + TestImplementationProvider.resetImplementation(); TestImplementationProvider.installImplementation(true); - resetPreferencesState(); } @AfterEach - void tearDown() throws Exception { - resetPreferencesState(); + void tearDown() { + TestImplementationProvider.resetImplementation(); } @Test @@ -99,20 +98,4 @@ void preferenceLocationIsolation() { assertEquals("original", Preferences.get("shared", "")); } - @SuppressWarnings("unchecked") - private void resetPreferencesState() throws Exception { - Field pField = Preferences.class.getDeclaredField("p"); - pField.setAccessible(true); - pField.set(null, null); - - Field listenerField = Preferences.class.getDeclaredField("listenerMap"); - listenerField.setAccessible(true); - ((Map) listenerField.get(null)).clear(); - - Field locationField = Preferences.class.getDeclaredField("preferencesLocation"); - locationField.setAccessible(true); - locationField.set(null, "CN1Preferences"); - - Storage.setStorageInstance(null); - } } diff --git a/maven/core-unittests/src/test/java/com/codename1/io/SocketTest.java b/maven/core-unittests/src/test/java/com/codename1/io/SocketTest.java index 727ba2933f..abd6f78413 100644 --- a/maven/core-unittests/src/test/java/com/codename1/io/SocketTest.java +++ b/maven/core-unittests/src/test/java/com/codename1/io/SocketTest.java @@ -2,6 +2,7 @@ import com.codename1.impl.CodenameOneImplementation; import com.codename1.ui.Display; +import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -34,6 +35,11 @@ void setUp() { Display.getInstance(); } + @AfterEach + void tearDown() { + TestImplementationProvider.resetImplementation(); + } + @Test void supportedFlagsDelegateToImplementation() { when(implementation.isSocketAvailable()).thenReturn(true); diff --git a/maven/core-unittests/src/test/java/com/codename1/io/StorageTest.java b/maven/core-unittests/src/test/java/com/codename1/io/StorageTest.java index f2f7569701..d9e4a0ff9b 100644 --- a/maven/core-unittests/src/test/java/com/codename1/io/StorageTest.java +++ b/maven/core-unittests/src/test/java/com/codename1/io/StorageTest.java @@ -1,6 +1,7 @@ package com.codename1.io; import com.codename1.impl.CodenameOneImplementation; +import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -25,6 +26,11 @@ void setUp() { storage.setNormalizeNames(true); } + @AfterEach + void tearDown() { + TestImplementationProvider.resetImplementation(); + } + @Test void writeObjectCachesAndPersistsEntries() { Vector payload = new Vector(); diff --git a/maven/core-unittests/src/test/java/com/codename1/io/TestImplementationProvider.java b/maven/core-unittests/src/test/java/com/codename1/io/TestImplementationProvider.java index 24b804b74f..46f479bc24 100644 --- a/maven/core-unittests/src/test/java/com/codename1/io/TestImplementationProvider.java +++ b/maven/core-unittests/src/test/java/com/codename1/io/TestImplementationProvider.java @@ -1,11 +1,15 @@ package com.codename1.io; import com.codename1.impl.CodenameOneImplementation; +import com.codename1.io.Preferences; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStream; +import java.lang.reflect.Field; +import java.util.Hashtable; import java.util.Map; +import java.util.Vector; import java.util.concurrent.ConcurrentHashMap; import static org.mockito.ArgumentMatchers.any; @@ -23,6 +27,9 @@ public final class TestImplementationProvider { private TestImplementationProvider() { } + private static final String DEFAULT_AUTO_DETECT_URL = NetworkManager.getAutoDetectURL(); + private static final String DEFAULT_PREFERENCES_LOCATION = Preferences.getPreferencesLocation(); + public static CodenameOneImplementation installImplementation(boolean timeoutSupported) { Storage.setStorageInstance(null); Map storage = new ConcurrentHashMap<>(); @@ -102,4 +109,82 @@ public void close() throws IOException { Util.setImplementation(impl); return impl; } + + public static void resetImplementation() { + Util.setImplementation(null); + Storage.setStorageInstance(null); + resetNetworkManager(); + resetPreferences(); + } + + @SuppressWarnings("unchecked") + private static void resetNetworkManager() { + NetworkManager manager = NetworkManager.getInstance(); + try { + Field runningField = NetworkManager.class.getDeclaredField("running"); + runningField.setAccessible(true); + runningField.setBoolean(manager, false); + + Field threadCountField = NetworkManager.class.getDeclaredField("threadCount"); + threadCountField.setAccessible(true); + threadCountField.setInt(manager, 1); + + Field networkThreadsField = NetworkManager.class.getDeclaredField("networkThreads"); + networkThreadsField.setAccessible(true); + networkThreadsField.set(manager, null); + + Field errorField = NetworkManager.class.getDeclaredField("errorListeners"); + errorField.setAccessible(true); + errorField.set(manager, null); + + Field progressField = NetworkManager.class.getDeclaredField("progressListeners"); + progressField.setAccessible(true); + progressField.set(manager, null); + + Field pendingField = NetworkManager.class.getDeclaredField("pending"); + pendingField.setAccessible(true); + ((Vector) pendingField.get(manager)).clear(); + + Field threadAssignmentsField = NetworkManager.class.getDeclaredField("threadAssignements"); + threadAssignmentsField.setAccessible(true); + ((Hashtable) threadAssignmentsField.get(manager)).clear(); + + Field userHeadersField = NetworkManager.class.getDeclaredField("userHeaders"); + userHeadersField.setAccessible(true); + userHeadersField.set(manager, null); + + Field timeoutField = NetworkManager.class.getDeclaredField("timeout"); + timeoutField.setAccessible(true); + timeoutField.setInt(manager, 300000); + + Field autoDetectedField = NetworkManager.class.getDeclaredField("autoDetected"); + autoDetectedField.setAccessible(true); + autoDetectedField.setBoolean(manager, false); + + Field nextConnectionIdField = NetworkManager.class.getDeclaredField("nextConnectionId"); + nextConnectionIdField.setAccessible(true); + nextConnectionIdField.setInt(manager, 1); + } catch (ReflectiveOperationException e) { + throw new AssertionError("Unable to reset NetworkManager state", e); + } + + NetworkManager.setAutoDetectURL(DEFAULT_AUTO_DETECT_URL); + } + + @SuppressWarnings("unchecked") + private static void resetPreferences() { + try { + Field pField = Preferences.class.getDeclaredField("p"); + pField.setAccessible(true); + pField.set(null, null); + + Field listenerField = Preferences.class.getDeclaredField("listenerMap"); + listenerField.setAccessible(true); + ((Map) listenerField.get(null)).clear(); + } catch (ReflectiveOperationException e) { + throw new AssertionError("Unable to reset Preferences state", e); + } + + Preferences.setPreferencesLocation(DEFAULT_PREFERENCES_LOCATION); + } } diff --git a/maven/core-unittests/src/test/java/com/codename1/io/URLTest.java b/maven/core-unittests/src/test/java/com/codename1/io/URLTest.java index a890535622..40cb5312b3 100644 --- a/maven/core-unittests/src/test/java/com/codename1/io/URLTest.java +++ b/maven/core-unittests/src/test/java/com/codename1/io/URLTest.java @@ -1,6 +1,7 @@ package com.codename1.io; import com.codename1.impl.CodenameOneImplementation; +import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -65,6 +66,11 @@ public void close() throws IOException { } } + @AfterEach + void tearDown() { + TestImplementationProvider.resetImplementation(); + } + @Test void parsesUrlComponents() throws URISyntaxException { URL url = new URL("https://user:secret@example.com:8443/path/resource?x=1"); diff --git a/maven/core-unittests/src/test/java/com/codename1/io/UtilTest.java b/maven/core-unittests/src/test/java/com/codename1/io/UtilTest.java index 406df089aa..c5790f7e7c 100644 --- a/maven/core-unittests/src/test/java/com/codename1/io/UtilTest.java +++ b/maven/core-unittests/src/test/java/com/codename1/io/UtilTest.java @@ -1,6 +1,7 @@ package com.codename1.io; import com.codename1.impl.CodenameOneImplementation; +import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -27,6 +28,11 @@ void setUp() { implementation = TestImplementationProvider.installImplementation(true); } + @AfterEach + void tearDown() { + TestImplementationProvider.resetImplementation(); + } + @Test void copyClosesStreamsAndInvokesCleanup() throws IOException { byte[] source = "payload".getBytes(StandardCharsets.UTF_8); diff --git a/maven/core-unittests/src/test/java/com/codename1/io/rest/RequestBuilderTest.java b/maven/core-unittests/src/test/java/com/codename1/io/rest/RequestBuilderTest.java index 9847d61ca8..fae941a5ec 100644 --- a/maven/core-unittests/src/test/java/com/codename1/io/rest/RequestBuilderTest.java +++ b/maven/core-unittests/src/test/java/com/codename1/io/rest/RequestBuilderTest.java @@ -11,6 +11,7 @@ import java.util.LinkedHashMap; import java.util.Map; import java.util.concurrent.atomic.AtomicReference; +import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -22,6 +23,11 @@ void setUp() { TestImplementationProvider.installImplementation(true); } + @AfterEach + void tearDown() { + TestImplementationProvider.resetImplementation(); + } + @Test void createRequestPopulatesConnection() throws Exception { RequestBuilder builder = new RequestBuilder("POST", "https://example.com/items/{id}"); diff --git a/maven/core-unittests/src/test/java/com/codename1/properties/PropertiesPackageTest.java b/maven/core-unittests/src/test/java/com/codename1/properties/PropertiesPackageTest.java index 1f500e1752..e31822c255 100644 --- a/maven/core-unittests/src/test/java/com/codename1/properties/PropertiesPackageTest.java +++ b/maven/core-unittests/src/test/java/com/codename1/properties/PropertiesPackageTest.java @@ -1,7 +1,6 @@ package com.codename1.properties; import com.codename1.io.Preferences; -import com.codename1.io.Storage; import com.codename1.io.TestImplementationProvider; import com.codename1.xml.Element; import org.junit.jupiter.api.AfterEach; @@ -20,10 +19,9 @@ class PropertiesPackageTest { - private String originalPreferencesLocation; - @BeforeEach void setup() throws Exception { + TestImplementationProvider.resetImplementation(); TestImplementationProvider.installImplementation(true); resetPreferencesState(); resetMetadata(); @@ -35,11 +33,7 @@ void setup() throws Exception { void tearDown() throws Exception { PropertyBase.bindGlobalGetListener(null); PropertyBase.bindGlobalSetListener(null); - resetPreferencesState(); - if (originalPreferencesLocation != null) { - Preferences.setPreferencesLocation(originalPreferencesLocation); - } - Storage.setStorageInstance(null); + TestImplementationProvider.resetImplementation(); resetMetadata(); } @@ -246,14 +240,8 @@ void preferencesObjectSynchronizesValues() { assertEquals(7, Preferences.get("prefs.total", 0)); } - private void resetPreferencesState() throws Exception { - FieldAccessor.resetStaticField(Preferences.class, "p", null); - FieldAccessor.resetStaticMap(Preferences.class, "listenerMap"); - if (originalPreferencesLocation == null) { - originalPreferencesLocation = Preferences.getPreferencesLocation(); - } + private void resetPreferencesState() { Preferences.setPreferencesLocation("PropertiesTest-" + System.nanoTime()); - Storage.setStorageInstance(null); } private void resetMetadata() throws Exception { @@ -264,12 +252,6 @@ private static class FieldAccessor { private FieldAccessor() { } - static void resetStaticField(Class type, String name, Object value) throws Exception { - java.lang.reflect.Field field = type.getDeclaredField(name); - field.setAccessible(true); - field.set(null, value); - } - @SuppressWarnings("unchecked") static void resetStaticMap(Class type, String name) throws Exception { java.lang.reflect.Field field = type.getDeclaredField(name);