From be462612e41e42f35f05db1af87a6aedf0a4f7b5 Mon Sep 17 00:00:00 2001 From: Mitch Gaffigan Date: Mon, 26 Oct 2026 15:25:58 -0500 Subject: [PATCH] Remove Guice and restore mocked singletons after tests Several tests replaced server singletons with mocks through Guice's requestStaticInjection and never put the originals back, so tests that ran later in the same JVM could see those mocks and pass or fail depending on the order they ran in. Those static injections were the only use of Guice in the code base. Replace them with StaticOverride, a test helper that sets a static field by reflection, as Guice did, until its handle is closed, and restore each override in @After or @AfterClass. Closing a handle a second time does nothing, and the tests null-check the handle so a setup failure is not hidden by a NullPointerException in teardown. Production code only loses its @Inject annotations and gets no new methods for tests to call. StaticOverride lives in a donkey test-fixtures source set that the server tests depend on, so nothing from it ships. The fixtures plugin gives donkey's test source set its main classes through a dependency on the project, which the non-transitive test classpaths drop, so donkey adds them back directly until transitive resolution is enabled. On the server side, non-transitive resolution brings in only the fixtures jar. Guice is removed from the dependency catalog, the vendored layout, the verification metadata and the third-party notices, so guice-4.1.0.jar is no longer in the server lib. A plugin that relied on finding Guice on the server classpath has to bundle it. Not fixed here: JavaScriptBuilder copies its controllers into static fields when it is first loaded, so JavaScriptUtilTest and MirthContextFactoryTest still leave their mocks there. DatabaseConnectionPoolTests and DatabaseReceiverInvalidColumnNameTests are not run by the build, which only includes *Test classes. Run directly, DatabaseConnectionPoolTests still fails because it cannot find SqlMapConfig.xml, and DatabaseReceiverInvalidColumnNameTests needs a Postgres server. Before this change, running the receiver test after DatabaseConnectionPoolTests also failed its setup with an UnfinishedStubbingException, caused by the overrides the pool tests left behind; those are now restored. Co-authored-by: Tony Germano Assisted-by: Claude:claude-opus-5-5 Signed-off-by: Mitch Gaffigan Signed-off-by: Tony Germano --- donkey/build.gradle | 11 ++ .../mirth/connect/donkey/server/Donkey.java | 2 - .../donkey/server/DonkeyConnectionPools.java | 2 - .../server/controllers/ChannelController.java | 2 - .../server/controllers/MessageController.java | 2 - .../donkey/server/channel/ChannelTest.java | 23 ++-- .../donkey/testing/StaticOverrideTest.java | 122 ++++++++++++++++++ .../donkey/testing/StaticOverride.java | 93 +++++++++++++ gradle/libs.versions.toml | 3 - gradle/vendored-layout.json | 2 - gradle/verification-metadata.xml | 13 -- server/build.gradle | 1 + server/docs/thirdparty/THIRD-PARTY-README.txt | 1 - .../mirth/connect/server/ExtensionLoader.java | 2 - .../server/controllers/ControllerFactory.java | 2 - .../mirth/connect/server/util/SqlConfig.java | 2 - .../connectors/file/FileReceiverTest.java | 23 ++-- .../http/DefaultHttpConfigurationTest.java | 23 ++-- .../HttpReceiverRequestHeaderSizeTest.java | 23 ++-- ...atabaseReceiverInvalidColumnNameTests.java | 24 ++-- .../connectors/tcp/TcpDispatcherTest.java | 23 ++-- .../connectors/tcp/TcpReceiverTest.java | 24 ++-- .../model/PublicServerSettingsTest.java | 23 ++-- .../connect/model/ServerSettingsTest.java | 23 ++-- .../server/DatabaseConnectionPoolTests.java | 61 +++------ .../api/servlets/ChannelServletTest.java | 23 ++-- .../DefaultConfigurationControllerTest.java | 23 ++-- .../DefaultEventControllerTest.java | 24 ++-- ...efaultUserControllerAuthorizeUserTest.java | 29 +++-- .../server/migration/Migrate3_8_0Test.java | 23 ++-- .../util/javascript/JavaScriptUtilTest.java | 25 ++-- .../javascript/MirthContextFactoryTest.java | 25 ++-- 32 files changed, 448 insertions(+), 254 deletions(-) create mode 100644 donkey/src/test/java/com/mirth/connect/donkey/testing/StaticOverrideTest.java create mode 100644 donkey/src/testFixtures/java/com/mirth/connect/donkey/testing/StaticOverride.java diff --git a/donkey/build.gradle b/donkey/build.gradle index dfe4615c42..58fc4d81f0 100644 --- a/donkey/build.gradle +++ b/donkey/build.gradle @@ -1,6 +1,17 @@ // Donkey: the message engine. Produces donkey-model.jar and // donkey-server.jar in donkey/setup (mirrors donkey/build.xml). +apply plugin: 'java-test-fixtures' + +// The test-fixtures plugin gives the test source set the main classes through +// a dependency on this project, which the non-transitive test classpaths +// drop, so add them back directly. Remove this when transitive resolution +// is enabled. +sourceSets.test { + compileClasspath += sourceSets.main.output + runtimeClasspath += sourceSets.main.output +} + dependencies { implementation libs.bundles.donkey.main testImplementation libs.bundles.donkey.test diff --git a/donkey/src/main/java/com/mirth/connect/donkey/server/Donkey.java b/donkey/src/main/java/com/mirth/connect/donkey/server/Donkey.java index 8ee0e1ff1a..b19631f4eb 100644 --- a/donkey/src/main/java/com/mirth/connect/donkey/server/Donkey.java +++ b/donkey/src/main/java/com/mirth/connect/donkey/server/Donkey.java @@ -23,7 +23,6 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import com.google.inject.Inject; import com.mirth.connect.donkey.model.DatabaseConstants; import com.mirth.connect.donkey.server.channel.Channel; import com.mirth.connect.donkey.server.controllers.ChannelController; @@ -39,7 +38,6 @@ import com.mirth.connect.donkey.util.xstream.XStreamSerializer; public class Donkey { - @Inject private static Donkey instance; public static Donkey getInstance() { diff --git a/donkey/src/main/java/com/mirth/connect/donkey/server/DonkeyConnectionPools.java b/donkey/src/main/java/com/mirth/connect/donkey/server/DonkeyConnectionPools.java index 2a84e6a012..1743218864 100644 --- a/donkey/src/main/java/com/mirth/connect/donkey/server/DonkeyConnectionPools.java +++ b/donkey/src/main/java/com/mirth/connect/donkey/server/DonkeyConnectionPools.java @@ -15,7 +15,6 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import com.google.inject.Inject; import com.mirth.connect.donkey.model.DatabaseConstants; import com.mirth.connect.donkey.server.data.jdbc.ConnectionPool; import com.mirth.connect.donkey.server.data.jdbc.HikariConnectionPool; @@ -24,7 +23,6 @@ public class DonkeyConnectionPools { private static final Logger logger = LogManager.getLogger(DonkeyConnectionPools.class); - @Inject private static volatile DonkeyConnectionPools instance = null; private ConnectionPool connectionPool; diff --git a/donkey/src/main/java/com/mirth/connect/donkey/server/controllers/ChannelController.java b/donkey/src/main/java/com/mirth/connect/donkey/server/controllers/ChannelController.java index c3b219087a..fb2e888cff 100644 --- a/donkey/src/main/java/com/mirth/connect/donkey/server/controllers/ChannelController.java +++ b/donkey/src/main/java/com/mirth/connect/donkey/server/controllers/ChannelController.java @@ -17,7 +17,6 @@ import org.apache.commons.lang3.StringUtils; -import com.google.inject.Inject; import com.mirth.connect.donkey.model.channel.Ports; import com.mirth.connect.donkey.model.message.Status; import com.mirth.connect.donkey.server.Donkey; @@ -27,7 +26,6 @@ import com.mirth.connect.donkey.server.data.DonkeyDaoFactory; public class ChannelController { - @Inject private static ChannelController instance; public static ChannelController getInstance() { diff --git a/donkey/src/main/java/com/mirth/connect/donkey/server/controllers/MessageController.java b/donkey/src/main/java/com/mirth/connect/donkey/server/controllers/MessageController.java index d4de59bbcb..d6c0b0e44b 100644 --- a/donkey/src/main/java/com/mirth/connect/donkey/server/controllers/MessageController.java +++ b/donkey/src/main/java/com/mirth/connect/donkey/server/controllers/MessageController.java @@ -18,7 +18,6 @@ import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.MapUtils; -import com.google.inject.Inject; import com.mirth.connect.donkey.model.message.ConnectorMessage; import com.mirth.connect.donkey.model.message.Message; import com.mirth.connect.donkey.model.message.Status; @@ -30,7 +29,6 @@ import com.mirth.connect.donkey.util.StringUtil; public class MessageController { - @Inject private static MessageController instance; public static MessageController getInstance() { diff --git a/donkey/src/test/java/com/mirth/connect/donkey/server/channel/ChannelTest.java b/donkey/src/test/java/com/mirth/connect/donkey/server/channel/ChannelTest.java index 1791797796..b80534e2c9 100644 --- a/donkey/src/test/java/com/mirth/connect/donkey/server/channel/ChannelTest.java +++ b/donkey/src/test/java/com/mirth/connect/donkey/server/channel/ChannelTest.java @@ -25,14 +25,12 @@ import java.util.UUID; import java.util.concurrent.atomic.AtomicLong; +import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; -import com.google.inject.AbstractModule; -import com.google.inject.Guice; -import com.google.inject.Injector; import com.mirth.connect.donkey.model.channel.ConnectorProperties; import com.mirth.connect.donkey.model.channel.SourceConnectorProperties; import com.mirth.connect.donkey.model.channel.SourceConnectorPropertiesInterface; @@ -44,28 +42,31 @@ import com.mirth.connect.donkey.server.event.EventDispatcher; import com.mirth.connect.donkey.server.message.DataType; import com.mirth.connect.donkey.server.queue.SourceQueue; +import com.mirth.connect.donkey.testing.StaticOverride; import com.mirth.connect.donkey.util.SerializerProvider; public class ChannelTest { + private static StaticOverride donkeyOverride; + @BeforeClass public static void setupControllers() throws Exception { Donkey donkey = mock(Donkey.class); when(donkey.getEventDispatcher()).thenReturn(mock(EventDispatcher.class)); - Injector injector = Guice.createInjector(new AbstractModule() { - @Override - protected void configure() { - requestStaticInjection(Donkey.class); - bind(Donkey.class).toInstance(donkey); - } - }); - injector.getInstance(Donkey.class); + donkeyOverride = StaticOverride.install(Donkey.class, "instance", donkey); // Make sure injection succeeded assertTrue(donkey == Donkey.getInstance()); } + @AfterClass + public static void restoreDonkey() { + if (donkeyOverride != null) { + donkeyOverride.close(); + } + } + @Test public void testRawMessageWithAttachments() throws Exception { Channel channel = createChannel(); diff --git a/donkey/src/test/java/com/mirth/connect/donkey/testing/StaticOverrideTest.java b/donkey/src/test/java/com/mirth/connect/donkey/testing/StaticOverrideTest.java new file mode 100644 index 0000000000..d5be3e3bbf --- /dev/null +++ b/donkey/src/test/java/com/mirth/connect/donkey/testing/StaticOverrideTest.java @@ -0,0 +1,122 @@ +// SPDX-License-Identifier: MPL-2.0 +// SPDX-FileCopyrightText: 2026 Tony Germano + +package com.mirth.connect.donkey.testing; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertSame; +import static org.junit.Assert.assertThrows; +import static org.junit.Assert.assertTrue; + +import org.junit.After; +import org.junit.Test; + +public class StaticOverrideTest { + + private static class Holder { + private static String instance; + private static volatile String volatileInstance; + private static final String CONSTANT = "constant"; + private String nonStatic; + } + + @After + public void reset() { + Holder.instance = null; + Holder.volatileInstance = null; + } + + @Test + public void installsAndRestoresPreviousValue() throws Exception { + Holder.instance = "original"; + + AutoCloseable handle = StaticOverride.install(Holder.class, "instance", "replacement"); + assertEquals("replacement", Holder.instance); + + handle.close(); + assertEquals("original", Holder.instance); + } + + @Test + public void restoresNull() throws Exception { + AutoCloseable handle = StaticOverride.install(Holder.class, "instance", "replacement"); + handle.close(); + + assertNull(Holder.instance); + } + + @Test + public void worksOnVolatileField() throws Exception { + try (AutoCloseable handle = StaticOverride.install(Holder.class, "volatileInstance", "replacement")) { + assertEquals("replacement", Holder.volatileInstance); + } + + assertNull(Holder.volatileInstance); + } + + @Test + public void nestedOverridesRestoreInOrder() throws Exception { + Holder.instance = "original"; + + AutoCloseable outer = StaticOverride.install(Holder.class, "instance", "outer"); + AutoCloseable inner = StaticOverride.install(Holder.class, "instance", "inner"); + + inner.close(); + assertEquals("outer", Holder.instance); + outer.close(); + assertEquals("original", Holder.instance); + } + + @Test + public void secondCloseDoesNothing() throws Exception { + Holder.instance = "original"; + AutoCloseable handle = StaticOverride.install(Holder.class, "instance", "replacement"); + handle.close(); + + Holder.instance = "set later"; + handle.close(); + + assertEquals("set later", Holder.instance); + } + + @Test + public void closeFailsWhenValueWasReplaced() throws Exception { + AutoCloseable handle = StaticOverride.install(Holder.class, "instance", "replacement"); + Holder.instance = "someone else"; + + assertThrows(IllegalStateException.class, handle::close); + assertEquals("someone else", Holder.instance); + } + + @Test + public void closingOutOfOrderFails() throws Exception { + AutoCloseable outer = StaticOverride.install(Holder.class, "instance", "outer"); + StaticOverride.install(Holder.class, "instance", "inner"); + + assertThrows(IllegalStateException.class, outer::close); + } + + @Test + public void rejectsFinalField() { + assertThrows(IllegalArgumentException.class, () -> StaticOverride.install(Holder.class, "CONSTANT", "x")); + assertSame("constant", Holder.CONSTANT); + } + + @Test + public void rejectsNonStaticField() { + assertThrows(IllegalArgumentException.class, () -> StaticOverride.install(Holder.class, "nonStatic", "x")); + } + + @Test + public void rejectsMissingField() { + IllegalArgumentException e = assertThrows(IllegalArgumentException.class, () -> StaticOverride.install(Holder.class, "missing", "x")); + assertTrue(e.getCause() instanceof NoSuchFieldException); + } + + @Test + public void rejectsWrongType() { + assertThrows(IllegalArgumentException.class, () -> StaticOverride.install(Holder.class, "instance", 42)); + assertNull(Holder.instance); + } +} diff --git a/donkey/src/testFixtures/java/com/mirth/connect/donkey/testing/StaticOverride.java b/donkey/src/testFixtures/java/com/mirth/connect/donkey/testing/StaticOverride.java new file mode 100644 index 0000000000..a080bc9b79 --- /dev/null +++ b/donkey/src/testFixtures/java/com/mirth/connect/donkey/testing/StaticOverride.java @@ -0,0 +1,93 @@ +// SPDX-License-Identifier: MPL-2.0 +// SPDX-FileCopyrightText: 2026 Tony Germano + +package com.mirth.connect.donkey.testing; + +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; +import java.util.concurrent.atomic.AtomicBoolean; + +/** + * Temporarily replaces the value of a static field, such as a singleton instance, for the duration + * of a test. + */ +public final class StaticOverride implements AutoCloseable { + private final Class owner; + private final Field field; + private final Object value; + private final Object previous; + private final AtomicBoolean closed = new AtomicBoolean(); + + private StaticOverride(Class owner, Field field, Object value, Object previous) { + this.owner = owner; + this.field = field; + this.value = value; + this.previous = previous; + } + + /** + * Sets a static field to {@code value} until the returned handle is closed, then puts the + * previous value back. Closing more than once does nothing. + * + * @throws IllegalArgumentException + * if the field does not exist, is not a non-final static field, or cannot hold + * {@code value} + */ + public static StaticOverride install(Class owner, String fieldName, Object value) { + Field field; + try { + field = owner.getDeclaredField(fieldName); + } catch (NoSuchFieldException e) { + throw new IllegalArgumentException(owner.getName() + " has no field named " + fieldName, e); + } + + int modifiers = field.getModifiers(); + if (!Modifier.isStatic(modifiers) || Modifier.isFinal(modifiers)) { + throw new IllegalArgumentException(owner.getName() + "." + fieldName + " is not a non-final static field"); + } + field.setAccessible(true); + + synchronized (owner) { + Object previous = get(field); + set(field, value); + return new StaticOverride(owner, field, value, previous); + } + } + + /** + * Puts back the value the field had before this override was installed. + * + * @throws IllegalStateException + * if something else replaced the field's value after this override was installed + */ + @Override + public void close() { + if (!closed.compareAndSet(false, true)) { + return; + } + + synchronized (owner) { + Object current = get(field); + if (current != value) { + throw new IllegalStateException(owner.getName() + "." + field.getName() + " was replaced by " + current + " while " + value + " was installed"); + } + set(field, previous); + } + } + + private static Object get(Field field) { + try { + return field.get(null); + } catch (IllegalAccessException e) { + throw new IllegalStateException(e); + } + } + + private static void set(Field field, Object value) { + try { + field.set(null, value); + } catch (IllegalAccessException e) { + throw new IllegalStateException(e); + } + } +} diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 39c64a0434..bb6dc1f291 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -123,7 +123,6 @@ glassfish-ha-api = { module = "org.glassfish.ha:ha-api", version = "3.1.9" } glassfish-management-api = { module = "org.glassfish.external:management-api", version = "3.2.1-b001" } gmbal-api-only = { module = "org.glassfish.gmbal:gmbal-api-only", version = "3.1.0-b001" } guava = { module = "com.google.guava:guava", version = "32.0.1-jre" } -guice = { module = "com.google.inject:guice", version = "4.1.0" } hamcrest = { module = "org.hamcrest:hamcrest", version = "2.2" } hapi-structures-v27 = { module = "ca.uhn.hapi:hapi-structures-v27", version.ref = "hapi" } hapi-structures-v28 = { module = "ca.uhn.hapi:hapi-structures-v28", version.ref = "hapi" } @@ -413,7 +412,6 @@ donkey-main = [ "error-prone-annotations", "failureaccess", "guava", - "guice", "hikaricp", "j2objc-annotations", "javassist", @@ -542,7 +540,6 @@ server-main = [ "glassfish-ha-api", "glassfish-management-api", "gmbal-api-only", - "guice", "hapi-structures-v27", "hapi-structures-v28", "hapi-structures-v281", diff --git a/gradle/vendored-layout.json b/gradle/vendored-layout.json index 7b864d392d..8e7659e7af 100644 --- a/gradle/vendored-layout.json +++ b/gradle/vendored-layout.json @@ -130,7 +130,6 @@ "com.google.guava:failureaccess": "guava", "com.google.guava:guava": "guava", "com.google.guava:listenablefuture": "guava", - "com.google.inject:guice": "", "com.google.j2objc:j2objc-annotations": "guava", "com.microsoft.sqlserver:mssql-jdbc": "database", "com.mysql:mysql-connector-j": "database", @@ -183,7 +182,6 @@ "com.github.mwiede:jsch": "", "com.github.oshi:oshi-core": "", "com.github.zafarkhaja:java-semver": "", - "com.google.inject:guice": "", "com.microsoft.sqlserver:mssql-jdbc": "database", "com.mysql:mysql-connector-j": "database", "com.oracle.database.jdbc:ojdbc8": "database", diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml index 4bdb88c6f7..9895ca7af9 100644 --- a/gradle/verification-metadata.xml +++ b/gradle/verification-metadata.xml @@ -403,19 +403,6 @@ - - - - - - - - - - - - - diff --git a/server/build.gradle b/server/build.gradle index d928023bb5..71fda05588 100644 --- a/server/build.gradle +++ b/server/build.gradle @@ -13,6 +13,7 @@ dependencies { // classifier is selected here implementation(variantOf(libs.netty.transport.native.epoll) { classifier('linux-x86_64') }) testImplementation libs.bundles.server.test + testImplementation testFixtures(project(':donkey')) } // --------------------------------------------------------------------- diff --git a/server/docs/thirdparty/THIRD-PARTY-README.txt b/server/docs/thirdparty/THIRD-PARTY-README.txt index d0db9c2127..0486a1e16f 100644 --- a/server/docs/thirdparty/THIRD-PARTY-README.txt +++ b/server/docs/thirdparty/THIRD-PARTY-README.txt @@ -26,7 +26,6 @@ The following are distributed under the terms of the Apache License version 2.0 Google Code libphonenumber (https://github.com/google/libphonenumber) Google Code Prettify (https://github.com/google/code-prettify) Guava 32.0.1 [incl. CLI] (https://github.com/google/guava) - Guice 4.1 (https://github.com/google/guice) HikariCP 2.5.1 J2ObjC Annotations 1.3 (https://github.com/google/j2objc/) Jackson Project [incl. CLI] (https://github.com/FasterXML/jackson) diff --git a/server/src/main/java/com/mirth/connect/server/ExtensionLoader.java b/server/src/main/java/com/mirth/connect/server/ExtensionLoader.java index 9af71f74d7..824cc9f589 100644 --- a/server/src/main/java/com/mirth/connect/server/ExtensionLoader.java +++ b/server/src/main/java/com/mirth/connect/server/ExtensionLoader.java @@ -30,7 +30,6 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import com.google.inject.Inject; import com.mirth.connect.client.core.PropertiesConfigurationUtil; import com.mirth.connect.model.ConnectorMetaData; import com.mirth.connect.model.MetaData; @@ -43,7 +42,6 @@ import com.mirth.connect.server.util.ResourceUtil; public class ExtensionLoader { - @Inject private static ExtensionLoader instance = new ExtensionLoader(); public static ExtensionLoader getInstance() { diff --git a/server/src/main/java/com/mirth/connect/server/controllers/ControllerFactory.java b/server/src/main/java/com/mirth/connect/server/controllers/ControllerFactory.java index 536cf1b48d..ad67f28bb9 100644 --- a/server/src/main/java/com/mirth/connect/server/controllers/ControllerFactory.java +++ b/server/src/main/java/com/mirth/connect/server/controllers/ControllerFactory.java @@ -9,10 +9,8 @@ package com.mirth.connect.server.controllers; -import com.google.inject.Inject; public abstract class ControllerFactory { - @Inject private static ControllerFactory factory; public static ControllerFactory getFactory() { diff --git a/server/src/main/java/com/mirth/connect/server/util/SqlConfig.java b/server/src/main/java/com/mirth/connect/server/util/SqlConfig.java index ccb56d2b78..42e58520e0 100644 --- a/server/src/main/java/com/mirth/connect/server/util/SqlConfig.java +++ b/server/src/main/java/com/mirth/connect/server/util/SqlConfig.java @@ -29,7 +29,6 @@ import org.w3c.dom.Element; import org.xml.sax.InputSource; -import com.google.inject.Inject; import com.mirth.connect.donkey.model.DatabaseConstants; import com.mirth.connect.donkey.util.DonkeyElement; import com.mirth.connect.model.DatabaseSettings; @@ -40,7 +39,6 @@ public class SqlConfig { - @Inject private static volatile SqlConfig instance = null; private boolean splitReadWrite = false; diff --git a/server/src/test/java/com/mirth/connect/connectors/file/FileReceiverTest.java b/server/src/test/java/com/mirth/connect/connectors/file/FileReceiverTest.java index 9ef2f3a2bb..5807a360a8 100644 --- a/server/src/test/java/com/mirth/connect/connectors/file/FileReceiverTest.java +++ b/server/src/test/java/com/mirth/connect/connectors/file/FileReceiverTest.java @@ -36,12 +36,10 @@ import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.core.config.Configurator; import org.apache.velocity.runtime.RuntimeConstants; +import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; -import com.google.inject.AbstractModule; -import com.google.inject.Guice; -import com.google.inject.Injector; import com.mirth.connect.connectors.file.filesystems.FileSystemConnectionFactory; import com.mirth.connect.donkey.model.message.Message; import com.mirth.connect.donkey.model.message.RawMessage; @@ -52,6 +50,7 @@ import com.mirth.connect.donkey.server.channel.DispatchResult; import com.mirth.connect.donkey.server.event.EventDispatcher; import com.mirth.connect.donkey.server.message.batch.BatchAdaptorFactory; +import com.mirth.connect.donkey.testing.StaticOverride; import com.mirth.connect.model.datatype.SerializerProperties; import com.mirth.connect.plugins.datatypes.hl7v2.ER7BatchAdaptorFactory; import com.mirth.connect.plugins.datatypes.hl7v2.HL7v2BatchProperties; @@ -64,6 +63,8 @@ public class FileReceiverTest { + private static StaticOverride factoryOverride; + private static final String POLL_ID = "pollId"; private static final String POLL_SEQUENCE_ID = "pollSequenceId"; private static final String POLL_COMPLETE = "pollComplete"; @@ -82,19 +83,19 @@ public static void setUpBeforeClass() throws Exception { ExtensionController extensionController = mock(ExtensionController.class); when(controllerFactory.createExtensionController()).thenReturn(extensionController); - Injector injector = Guice.createInjector(new AbstractModule() { - @Override - protected void configure() { - requestStaticInjection(ControllerFactory.class); - bind(ControllerFactory.class).toInstance(controllerFactory); - } - }); - injector.getInstance(ControllerFactory.class); + factoryOverride = StaticOverride.install(ControllerFactory.class, "factory", controllerFactory); Logger logger = LogManager.getLogger(RuntimeConstants.DEFAULT_RUNTIME_LOG_NAME); Configurator.setLevel(logger.getName(), Level.OFF); } + @AfterClass + public static void restoreControllerFactory() { + if (factoryOverride != null) { + factoryOverride.close(); + } + } + /* * No batch messages, no directory recursion */ diff --git a/server/src/test/java/com/mirth/connect/connectors/http/DefaultHttpConfigurationTest.java b/server/src/test/java/com/mirth/connect/connectors/http/DefaultHttpConfigurationTest.java index 41b3e8d610..51dbae5e3b 100644 --- a/server/src/test/java/com/mirth/connect/connectors/http/DefaultHttpConfigurationTest.java +++ b/server/src/test/java/com/mirth/connect/connectors/http/DefaultHttpConfigurationTest.java @@ -24,12 +24,11 @@ import org.eclipse.jetty.server.ServerConnector; import org.eclipse.jetty.server.handler.AbstractHandler; import org.junit.After; +import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; -import com.google.inject.AbstractModule; -import com.google.inject.Guice; -import com.google.inject.Injector; +import com.mirth.connect.donkey.testing.StaticOverride; import com.mirth.connect.server.controllers.ConfigurationController; import com.mirth.connect.server.controllers.ControllerFactory; @@ -39,6 +38,8 @@ */ public class DefaultHttpConfigurationTest { + private static StaticOverride factoryOverride; + private static final int LARGE_HEADER_BYTES = 16384; private Server server; @@ -48,14 +49,14 @@ public static void setupBeforeClass() { ControllerFactory controllerFactory = mock(ControllerFactory.class); when(controllerFactory.createConfigurationController()).thenReturn(mock(ConfigurationController.class)); - Injector injector = Guice.createInjector(new AbstractModule() { - @Override - protected void configure() { - requestStaticInjection(ControllerFactory.class); - bind(ControllerFactory.class).toInstance(controllerFactory); - } - }); - injector.getInstance(ControllerFactory.class); + factoryOverride = StaticOverride.install(ControllerFactory.class, "factory", controllerFactory); + } + + @AfterClass + public static void restoreControllerFactory() { + if (factoryOverride != null) { + factoryOverride.close(); + } } @After diff --git a/server/src/test/java/com/mirth/connect/connectors/http/HttpReceiverRequestHeaderSizeTest.java b/server/src/test/java/com/mirth/connect/connectors/http/HttpReceiverRequestHeaderSizeTest.java index 8d373cf315..703dabe0a0 100644 --- a/server/src/test/java/com/mirth/connect/connectors/http/HttpReceiverRequestHeaderSizeTest.java +++ b/server/src/test/java/com/mirth/connect/connectors/http/HttpReceiverRequestHeaderSizeTest.java @@ -12,15 +12,14 @@ import java.util.UUID; import org.junit.After; +import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; -import com.google.inject.AbstractModule; -import com.google.inject.Guice; -import com.google.inject.Injector; import com.mirth.connect.donkey.server.ConnectorTaskException; import com.mirth.connect.donkey.server.channel.Channel; import com.mirth.connect.donkey.server.event.EventDispatcher; +import com.mirth.connect.donkey.testing.StaticOverride; import com.mirth.connect.server.controllers.ConfigurationController; import com.mirth.connect.server.controllers.ControllerFactory; import com.mirth.connect.server.controllers.EventController; @@ -32,6 +31,8 @@ */ public class HttpReceiverRequestHeaderSizeTest { + private static StaticOverride factoryOverride; + private static final String TEST_CHANNEL_ID = UUID.randomUUID().toString(); private static final String TEST_CHANNEL_NAME = "Test HTTP Listener Channel"; @@ -43,14 +44,14 @@ public static void setupBeforeClass() { when(controllerFactory.createConfigurationController()).thenReturn(mock(ConfigurationController.class)); when(controllerFactory.createEventController()).thenReturn(mock(EventController.class)); - Injector injector = Guice.createInjector(new AbstractModule() { - @Override - protected void configure() { - requestStaticInjection(ControllerFactory.class); - bind(ControllerFactory.class).toInstance(controllerFactory); - } - }); - injector.getInstance(ControllerFactory.class); + factoryOverride = StaticOverride.install(ControllerFactory.class, "factory", controllerFactory); + } + + @AfterClass + public static void restoreControllerFactory() { + if (factoryOverride != null) { + factoryOverride.close(); + } } @After diff --git a/server/src/test/java/com/mirth/connect/connectors/jdbc/DatabaseReceiverInvalidColumnNameTests.java b/server/src/test/java/com/mirth/connect/connectors/jdbc/DatabaseReceiverInvalidColumnNameTests.java index 21d226df33..4a2d466044 100644 --- a/server/src/test/java/com/mirth/connect/connectors/jdbc/DatabaseReceiverInvalidColumnNameTests.java +++ b/server/src/test/java/com/mirth/connect/connectors/jdbc/DatabaseReceiverInvalidColumnNameTests.java @@ -17,17 +17,16 @@ import java.util.ArrayList; import java.util.List; +import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; -import com.google.inject.AbstractModule; -import com.google.inject.Guice; -import com.google.inject.Injector; import com.mirth.connect.donkey.model.message.RawMessage; import com.mirth.connect.donkey.server.channel.ChannelException; import com.mirth.connect.donkey.server.channel.DispatchResult; import com.mirth.connect.donkey.server.channel.FilterTransformerExecutor; import com.mirth.connect.donkey.server.event.EventDispatcher; +import com.mirth.connect.donkey.testing.StaticOverride; import com.mirth.connect.server.TestUtils.DummyChannel; import com.mirth.connect.server.channel.MirthMetaDataReplacer; import com.mirth.connect.server.controllers.ConfigurationController; @@ -39,6 +38,8 @@ public class DatabaseReceiverInvalidColumnNameTests { + private static StaticOverride factoryOverride; + private final static String DB_DRIVER = "org.postgresql.Driver"; private final static String DB_URL = "jdbc:postgresql://localhost:5432/test"; private final static String DB_USERNAME = ""; @@ -63,14 +64,14 @@ public static void setupControllers() throws Exception { when(contextFactoryController.getContextFactory(any())).thenReturn(new MirthContextFactory(null, null, false)); when(controllerFactory.createContextFactoryController()).thenReturn(contextFactoryController); - Injector injector = Guice.createInjector(new AbstractModule() { - @Override - protected void configure() { - requestStaticInjection(ControllerFactory.class); - bind(ControllerFactory.class).toInstance(controllerFactory); - } - }); - injector.getInstance(ControllerFactory.class); + factoryOverride = StaticOverride.install(ControllerFactory.class, "factory", controllerFactory); + } + + @AfterClass + public static void restoreControllerFactory() { + if (factoryOverride != null) { + factoryOverride.close(); + } } @Test @@ -132,4 +133,5 @@ protected DispatchResult dispatchRawMessage(RawMessage rawMessage, boolean batch return null; } } + } diff --git a/server/src/test/java/com/mirth/connect/connectors/tcp/TcpDispatcherTest.java b/server/src/test/java/com/mirth/connect/connectors/tcp/TcpDispatcherTest.java index 8d94f83d04..5633138e5c 100644 --- a/server/src/test/java/com/mirth/connect/connectors/tcp/TcpDispatcherTest.java +++ b/server/src/test/java/com/mirth/connect/connectors/tcp/TcpDispatcherTest.java @@ -20,12 +20,10 @@ import java.util.concurrent.atomic.AtomicInteger; import org.junit.After; +import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; -import com.google.inject.AbstractModule; -import com.google.inject.Guice; -import com.google.inject.Injector; import com.mirth.connect.donkey.model.message.ConnectorMessage; import com.mirth.connect.donkey.model.message.Response; import com.mirth.connect.donkey.model.message.Status; @@ -34,6 +32,7 @@ import com.mirth.connect.donkey.server.data.passthru.PassthruDaoFactory; import com.mirth.connect.donkey.server.event.EventDispatcher; import com.mirth.connect.donkey.server.queue.ConnectorMessageQueueDataSource; +import com.mirth.connect.donkey.testing.StaticOverride; import com.mirth.connect.model.transmission.batch.DefaultBatchStreamReader; import com.mirth.connect.model.transmission.framemode.FrameModeProperties; import com.mirth.connect.model.transmission.framemode.FrameStreamHandler; @@ -45,6 +44,8 @@ import com.mirth.connect.server.controllers.ExtensionController; public class TcpDispatcherTest { + + private static StaticOverride factoryOverride; private static final String TEST_CHANNEL_ID = UUID.randomUUID().toString(); private static final String TEST_SERVER_ID = UUID.randomUUID().toString(); private static final String TEST_CHANNEL_NAME = "Test TCP Sender Channel"; @@ -83,14 +84,14 @@ public static void setupBeforeClass() throws Exception { when(extensionController.getTransmissionModeProviders()).thenReturn(transmissionModeProviders); when(controllerFactory.createExtensionController()).thenReturn(extensionController); - Injector injector = Guice.createInjector(new AbstractModule() { - @Override - protected void configure() { - requestStaticInjection(ControllerFactory.class); - bind(ControllerFactory.class).toInstance(controllerFactory); - } - }); - injector.getInstance(ControllerFactory.class); + factoryOverride = StaticOverride.install(ControllerFactory.class, "factory", controllerFactory); + } + + @AfterClass + public static void restoreControllerFactory() { + if (factoryOverride != null) { + factoryOverride.close(); + } } @After diff --git a/server/src/test/java/com/mirth/connect/connectors/tcp/TcpReceiverTest.java b/server/src/test/java/com/mirth/connect/connectors/tcp/TcpReceiverTest.java index 04ef0c505f..35c0632484 100644 --- a/server/src/test/java/com/mirth/connect/connectors/tcp/TcpReceiverTest.java +++ b/server/src/test/java/com/mirth/connect/connectors/tcp/TcpReceiverTest.java @@ -12,16 +12,15 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.junit.After; +import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; -import com.google.inject.AbstractModule; -import com.google.inject.Guice; -import com.google.inject.Injector; import com.mirth.connect.donkey.server.ConnectorTaskException; import com.mirth.connect.donkey.server.channel.Channel; import com.mirth.connect.donkey.server.event.EventDispatcher; import com.mirth.connect.donkey.server.message.DataType; +import com.mirth.connect.donkey.testing.StaticOverride; import com.mirth.connect.plugins.DataTypeServerPlugin; import com.mirth.connect.plugins.TransmissionModeProvider; import com.mirth.connect.plugins.datatypes.hl7v2.HL7v2DataTypeServerPlugin; @@ -32,6 +31,8 @@ import com.mirth.connect.server.controllers.ExtensionController; public class TcpReceiverTest { + + private static StaticOverride factoryOverride; private static final String TEST_CHANNEL_ID = UUID.randomUUID().toString(); private static final String TEST_SERVER_ID = UUID.randomUUID().toString(); @@ -62,14 +63,14 @@ public static void setupBeforeClass() throws Exception { when(extensionController.getDataTypePlugins()).thenReturn(dataTypePlugins); when(controllerFactory.createExtensionController()).thenReturn(extensionController); - Injector injector = Guice.createInjector(new AbstractModule() { - @Override - protected void configure() { - requestStaticInjection(ControllerFactory.class); - bind(ControllerFactory.class).toInstance(controllerFactory); - } - }); - injector.getInstance(ControllerFactory.class); + factoryOverride = StaticOverride.install(ControllerFactory.class, "factory", controllerFactory); + } + + @AfterClass + public static void restoreControllerFactory() { + if (factoryOverride != null) { + factoryOverride.close(); + } } @After @@ -184,4 +185,5 @@ protected EventDispatcher getEventDispatcher() { return mock(EventDispatcher.class); } } + } diff --git a/server/src/test/java/com/mirth/connect/model/PublicServerSettingsTest.java b/server/src/test/java/com/mirth/connect/model/PublicServerSettingsTest.java index 64a85b170f..eaec708057 100644 --- a/server/src/test/java/com/mirth/connect/model/PublicServerSettingsTest.java +++ b/server/src/test/java/com/mirth/connect/model/PublicServerSettingsTest.java @@ -8,19 +8,20 @@ import java.util.ArrayList; import java.util.List; +import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; -import com.google.inject.AbstractModule; -import com.google.inject.Guice; -import com.google.inject.Injector; import com.mirth.connect.donkey.model.channel.MetaDataColumn; import com.mirth.connect.donkey.model.channel.MetaDataColumnType; +import com.mirth.connect.donkey.testing.StaticOverride; import com.mirth.connect.server.controllers.ControllerFactory; import com.mirth.connect.server.controllers.ScriptController; public class PublicServerSettingsTest { + private static StaticOverride factoryOverride; + public static ServerSettings serverSettings = new ServerSettings(); public static List COLUMNS; @@ -31,14 +32,7 @@ public static void setup() throws Exception { ScriptController scriptController = mock(ScriptController.class); when(controllerFactory.createScriptController()).thenReturn(scriptController); - Injector injector = Guice.createInjector(new AbstractModule() { - @Override - protected void configure() { - requestStaticInjection(ControllerFactory.class); - bind(ControllerFactory.class).toInstance(controllerFactory); - } - }); - injector.getInstance(ControllerFactory.class); + factoryOverride = StaticOverride.install(ControllerFactory.class, "factory", controllerFactory); serverSettings.setEnvironmentName("envName"); serverSettings.setServerName("serverName"); serverSettings.setDefaultMetaDataColumns(null); @@ -48,6 +42,13 @@ protected void configure() { COLUMNS.add(new MetaDataColumn("TYPE", MetaDataColumnType.STRING, "mirth_type")); } + + @AfterClass + public static void restoreControllerFactory() { + if (factoryOverride != null) { + factoryOverride.close(); + } + } @Test public void defaultMetaDataColumnsTest() { diff --git a/server/src/test/java/com/mirth/connect/model/ServerSettingsTest.java b/server/src/test/java/com/mirth/connect/model/ServerSettingsTest.java index 0731905fb5..dc257a252f 100644 --- a/server/src/test/java/com/mirth/connect/model/ServerSettingsTest.java +++ b/server/src/test/java/com/mirth/connect/model/ServerSettingsTest.java @@ -5,20 +5,21 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; +import org.junit.AfterClass; import org.junit.BeforeClass; import static org.junit.Assert.assertEquals; import org.junit.Test; -import com.google.inject.AbstractModule; -import com.google.inject.Guice; -import com.google.inject.Injector; +import com.mirth.connect.donkey.testing.StaticOverride; import com.mirth.connect.server.controllers.ControllerFactory; import com.mirth.connect.server.controllers.ScriptController; public class ServerSettingsTest { + private static StaticOverride factoryOverride; + public static ServerSettings serverSettings = new ServerSettings(); @BeforeClass @@ -28,20 +29,20 @@ public static void setup() throws Exception { ScriptController scriptController = mock(ScriptController.class); when(controllerFactory.createScriptController()).thenReturn(scriptController); - Injector injector = Guice.createInjector(new AbstractModule() { - @Override - protected void configure() { - requestStaticInjection(ControllerFactory.class); - bind(ControllerFactory.class).toInstance(controllerFactory); - } - }); - injector.getInstance(ControllerFactory.class); + factoryOverride = StaticOverride.install(ControllerFactory.class, "factory", controllerFactory); serverSettings.setEnvironmentName("envName"); serverSettings.setServerName("serverName"); serverSettings.setDefaultMetaDataColumns(null); serverSettings.setQueueBufferSize(1000); } + + @AfterClass + public static void restoreControllerFactory() { + if (factoryOverride != null) { + factoryOverride.close(); + } + } @Test public void envornmentNameTest() { diff --git a/server/src/test/java/com/mirth/connect/server/DatabaseConnectionPoolTests.java b/server/src/test/java/com/mirth/connect/server/DatabaseConnectionPoolTests.java index ac39ab140c..ff4a8a5480 100644 --- a/server/src/test/java/com/mirth/connect/server/DatabaseConnectionPoolTests.java +++ b/server/src/test/java/com/mirth/connect/server/DatabaseConnectionPoolTests.java @@ -28,26 +28,27 @@ import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.ResultSet; +import java.util.ArrayDeque; import java.util.Arrays; +import java.util.Deque; import java.util.HashMap; import javax.sql.DataSource; import org.apache.commons.lang3.StringUtils; import org.apache.ibatis.io.Resources; +import org.junit.After; import org.junit.Test; import org.mockito.Mockito; import org.mockito.invocation.Invocation; -import com.google.inject.AbstractModule; -import com.google.inject.Guice; -import com.google.inject.Injector; import com.mirth.commons.encryption.Digester; import com.mirth.connect.donkey.server.Donkey; import com.mirth.connect.donkey.server.DonkeyConfiguration; import com.mirth.connect.donkey.server.DonkeyConnectionPools; import com.mirth.connect.donkey.server.data.ChannelDoesNotExistException; import com.mirth.connect.donkey.server.data.jdbc.ConnectionPool; +import com.mirth.connect.donkey.testing.StaticOverride; import com.mirth.connect.model.Channel; import com.mirth.connect.model.ChannelGroup; import com.mirth.connect.model.ChannelHeader; @@ -106,6 +107,15 @@ public class DatabaseConnectionPoolTests { private Connection connection; private Connection readOnlyConnection; + private final Deque overrides = new ArrayDeque<>(); + + @After + public void restoreOverrides() { + while (!overrides.isEmpty()) { + overrides.pop().close(); + } + } + @Test public void testCachesReadPool() throws Exception { setup(true, false); @@ -234,14 +244,7 @@ public void testMessageController() throws Exception { if (!USE_REAL_DATABASE_CONNECTIONS) { com.mirth.connect.donkey.server.controllers.ChannelController channelController = spy(com.mirth.connect.donkey.server.controllers.ChannelController.class); doReturn(1L).when(channelController).getLocalChannelId(eq("test"), anyBoolean()); - Injector injector = Guice.createInjector(new AbstractModule() { - @Override - protected void configure() { - requestStaticInjection(com.mirth.connect.donkey.server.controllers.ChannelController.class); - bind(com.mirth.connect.donkey.server.controllers.ChannelController.class).toInstance(channelController); - } - }); - injector.getInstance(com.mirth.connect.donkey.server.controllers.ChannelController.class); + overrides.push(StaticOverride.install(com.mirth.connect.donkey.server.controllers.ChannelController.class, "instance", channelController)); } MessageController messageController = DonkeyMessageController.create(); @@ -335,27 +338,13 @@ private void setup(boolean splitReadWrite, boolean writePoolCache) throws Except doReturn(createPool(readOnlyConnection)).when(donkeyCP).createConnectionPool(anyString(), anyString(), anyString(), anyString(), anyString(), anyBoolean(), anyString(), anyInt(), eq(true)); } - Injector donkeyConnectionPoolsInjector = Guice.createInjector(new AbstractModule() { - @Override - protected void configure() { - requestStaticInjection(DonkeyConnectionPools.class); - bind(DonkeyConnectionPools.class).toInstance(donkeyCP); - } - }); - donkeyConnectionPoolsInjector.getInstance(DonkeyConnectionPools.class); + overrides.push(StaticOverride.install(DonkeyConnectionPools.class, "instance", donkeyCP)); DonkeyConnectionPools.getInstance().init(databaseSettings.getProperties()); donkey = spy(Donkey.class); - Injector donkeyInjector = Guice.createInjector(new AbstractModule() { - @Override - protected void configure() { - requestStaticInjection(Donkey.class); - bind(Donkey.class).toInstance(donkey); - } - }); - donkeyInjector.getInstance(Donkey.class); + overrides.push(StaticOverride.install(Donkey.class, "instance", donkey)); ControllerFactory controllerFactory = spy(new DefaultControllerFactory()); @@ -370,25 +359,11 @@ protected void configure() { ExtensionController extensionController = mock(ExtensionController.class); doReturn(extensionController).when(controllerFactory).createExtensionController(); - Injector controllerFactoryInjector = Guice.createInjector(new AbstractModule() { - @Override - protected void configure() { - requestStaticInjection(ControllerFactory.class); - bind(ControllerFactory.class).toInstance(controllerFactory); - } - }); - controllerFactoryInjector.getInstance(ControllerFactory.class); + overrides.push(StaticOverride.install(ControllerFactory.class, "factory", controllerFactory)); sqlConfig = spy(new SqlConfig()); - Injector sqlConfigInjector = Guice.createInjector(new AbstractModule() { - @Override - protected void configure() { - requestStaticInjection(SqlConfig.class); - bind(SqlConfig.class).toInstance(sqlConfig); - } - }); - sqlConfigInjector.getInstance(SqlConfig.class); + overrides.push(StaticOverride.install(SqlConfig.class, "instance", sqlConfig)); donkey.startEngine(new DonkeyConfiguration("appdata", databaseSettings.getProperties(), null, null, "testserverid")); diff --git a/server/src/test/java/com/mirth/connect/server/api/servlets/ChannelServletTest.java b/server/src/test/java/com/mirth/connect/server/api/servlets/ChannelServletTest.java index cb264b600f..c006be3aa1 100644 --- a/server/src/test/java/com/mirth/connect/server/api/servlets/ChannelServletTest.java +++ b/server/src/test/java/com/mirth/connect/server/api/servlets/ChannelServletTest.java @@ -21,12 +21,11 @@ import javax.ws.rs.core.SecurityContext; import org.junit.Before; +import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; -import com.google.inject.AbstractModule; -import com.google.inject.Guice; -import com.google.inject.Injector; +import com.mirth.connect.donkey.testing.StaticOverride; import com.mirth.connect.model.Channel; import com.mirth.connect.model.ChannelDependency; import com.mirth.connect.model.ChannelExportData; @@ -43,6 +42,8 @@ public class ChannelServletTest extends ServletTestBase { + private static StaticOverride factoryOverride; + private static final String CHANNEL_ID_1 = "channelId1"; private static final String CHANNEL_ID_2 = "channelId2"; private static final String CHANNEL_ID_3 = "channelId3"; @@ -106,14 +107,14 @@ public static void beforeClass() throws Exception { when(codeTemplateController.getLibraries(isNull(), anyBoolean())).thenReturn(codeTemplateLibraries); - Injector injector = Guice.createInjector(new AbstractModule() { - @Override - protected void configure() { - requestStaticInjection(ControllerFactory.class); - bind(ControllerFactory.class).toInstance(controllerFactory); - } - }); - injector.getInstance(ControllerFactory.class); + factoryOverride = StaticOverride.install(ControllerFactory.class, "factory", controllerFactory); + } + + @AfterClass + public static void restoreControllerFactory() { + if (factoryOverride != null) { + factoryOverride.close(); + } } private static Channel createChannel(String id) { diff --git a/server/src/test/java/com/mirth/connect/server/controllers/DefaultConfigurationControllerTest.java b/server/src/test/java/com/mirth/connect/server/controllers/DefaultConfigurationControllerTest.java index 93072d30b0..759a0bb618 100644 --- a/server/src/test/java/com/mirth/connect/server/controllers/DefaultConfigurationControllerTest.java +++ b/server/src/test/java/com/mirth/connect/server/controllers/DefaultConfigurationControllerTest.java @@ -36,19 +36,20 @@ import javax.xml.transform.stream.StreamSource; import org.apache.commons.io.FileUtils; +import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; import org.mockito.invocation.Invocation; import org.xml.sax.SAXParseException; -import com.google.inject.AbstractModule; -import com.google.inject.Guice; -import com.google.inject.Injector; import com.mirth.connect.client.core.ControllerException; +import com.mirth.connect.donkey.testing.StaticOverride; import com.mirth.connect.model.DriverInfo; public class DefaultConfigurationControllerTest { + private static StaticOverride factoryOverride; + @BeforeClass public static void setup() throws Exception { ControllerFactory controllerFactory = mock(ControllerFactory.class); @@ -56,14 +57,14 @@ public static void setup() throws Exception { ScriptController scriptController = mock(ScriptController.class); when(controllerFactory.createScriptController()).thenReturn(scriptController); - Injector injector = Guice.createInjector(new AbstractModule() { - @Override - protected void configure() { - requestStaticInjection(ControllerFactory.class); - bind(ControllerFactory.class).toInstance(controllerFactory); - } - }); - injector.getInstance(ControllerFactory.class); + factoryOverride = StaticOverride.install(ControllerFactory.class, "factory", controllerFactory); + } + + @AfterClass + public static void restoreControllerFactory() { + if (factoryOverride != null) { + factoryOverride.close(); + } } @Test diff --git a/server/src/test/java/com/mirth/connect/server/controllers/DefaultEventControllerTest.java b/server/src/test/java/com/mirth/connect/server/controllers/DefaultEventControllerTest.java index c8859af254..c9f56526da 100644 --- a/server/src/test/java/com/mirth/connect/server/controllers/DefaultEventControllerTest.java +++ b/server/src/test/java/com/mirth/connect/server/controllers/DefaultEventControllerTest.java @@ -27,16 +27,17 @@ import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.core.config.Configurator; import org.apache.velocity.runtime.RuntimeConstants; +import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; -import com.google.inject.AbstractModule; -import com.google.inject.Guice; -import com.google.inject.Injector; import com.mirth.connect.client.core.ControllerException; +import com.mirth.connect.donkey.testing.StaticOverride; import com.mirth.connect.model.ServerEvent; import com.mirth.connect.model.filters.EventFilter; public class DefaultEventControllerTest { + + private StaticOverride factoryOverride; private EventController eventController; private final String SERVER_ID = "0000-0000-0000"; private final String CHANNEL_ID = "d243960c-7de3-4059-b60c-399991df1cdc"; @@ -52,18 +53,19 @@ public void setup() { ControllerFactory controllerFactory = mock(ControllerFactory.class); ConfigurationController configurationController = mock(ConfigurationController.class); when(controllerFactory.createConfigurationController()).thenReturn(configurationController); - Injector injector = Guice.createInjector(new AbstractModule() { - @Override - protected void configure() { - requestStaticInjection(ControllerFactory.class); - bind(ControllerFactory.class).toInstance(controllerFactory); - } - }); - injector.getInstance(ControllerFactory.class); + factoryOverride = StaticOverride.install(ControllerFactory.class, "factory", controllerFactory); Logger logger = LogManager.getLogger(RuntimeConstants.DEFAULT_RUNTIME_LOG_NAME); Configurator.setLevel(logger.getName(), Level.OFF); eventController = new TestDefaultEventController(); } + + @After + public void restoreControllerFactory() { + if (factoryOverride != null) { + factoryOverride.close(); + } + } + @SuppressWarnings("deprecation") @Test public void testExportAllEvents() throws Exception { diff --git a/server/src/test/java/com/mirth/connect/server/controllers/DefaultUserControllerAuthorizeUserTest.java b/server/src/test/java/com/mirth/connect/server/controllers/DefaultUserControllerAuthorizeUserTest.java index b175fce703..097611ed33 100644 --- a/server/src/test/java/com/mirth/connect/server/controllers/DefaultUserControllerAuthorizeUserTest.java +++ b/server/src/test/java/com/mirth/connect/server/controllers/DefaultUserControllerAuthorizeUserTest.java @@ -23,17 +23,16 @@ import org.apache.commons.lang3.ArrayUtils; import org.apache.ibatis.session.Configuration; import org.apache.ibatis.session.SqlSessionManager; +import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import org.mockito.ArgumentCaptor; import org.mockito.ArgumentMatchers; -import com.google.inject.AbstractModule; -import com.google.inject.Guice; -import com.google.inject.Injector; import com.mirth.commons.encryption.Digester; import com.mirth.connect.donkey.model.event.Event; +import com.mirth.connect.donkey.testing.StaticOverride; import com.mirth.connect.model.Credentials; import com.mirth.connect.model.LoginStatus; import com.mirth.connect.model.LoginStrike; @@ -71,6 +70,8 @@ public class DefaultUserControllerAuthorizeUserTest { private static UserController userController; private static EventController eventController; private static SqlSessionManager readOnlySqlSessionManager; + private static StaticOverride factoryOverride; + private static StaticOverride sqlConfigOverride; private PasswordRequirements passwordRequirements; private Digester digester; @@ -106,16 +107,18 @@ public static void setupBeforeClass() { readOnlySqlSessionManager = mock(SqlSessionManager.class); when(sqlConfig.getReadOnlySqlSessionManager()).thenReturn(readOnlySqlSessionManager); - Injector injector = Guice.createInjector(new AbstractModule() { - @Override - protected void configure() { - requestStaticInjection(ControllerFactory.class); - requestStaticInjection(SqlConfig.class); - bind(ControllerFactory.class).toInstance(controllerFactory); - bind(SqlConfig.class).toInstance(sqlConfig); - } - }); - injector.getInstance(ControllerFactory.class); + factoryOverride = StaticOverride.install(ControllerFactory.class, "factory", controllerFactory); + sqlConfigOverride = StaticOverride.install(SqlConfig.class, "instance", sqlConfig); + } + + @AfterClass + public static void restoreOverrides() { + if (sqlConfigOverride != null) { + sqlConfigOverride.close(); + } + if (factoryOverride != null) { + factoryOverride.close(); + } } @Before diff --git a/server/src/test/java/com/mirth/connect/server/migration/Migrate3_8_0Test.java b/server/src/test/java/com/mirth/connect/server/migration/Migrate3_8_0Test.java index 51f65927fb..0d841a47b0 100644 --- a/server/src/test/java/com/mirth/connect/server/migration/Migrate3_8_0Test.java +++ b/server/src/test/java/com/mirth/connect/server/migration/Migrate3_8_0Test.java @@ -19,19 +19,20 @@ import java.util.Arrays; import java.util.List; +import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; import org.mockito.invocation.Invocation; -import com.google.inject.AbstractModule; -import com.google.inject.Guice; -import com.google.inject.Injector; +import com.mirth.connect.donkey.testing.StaticOverride; import com.mirth.connect.model.DriverInfo; import com.mirth.connect.server.controllers.ConfigurationController; import com.mirth.connect.server.controllers.ControllerFactory; public class Migrate3_8_0Test { + private static StaticOverride factoryOverride; + private static ControllerFactory controllerFactory; private static ConfigurationController configurationController; @@ -42,14 +43,14 @@ public static void setup() throws Exception { configurationController = mock(ConfigurationController.class); when(controllerFactory.createConfigurationController()).thenReturn(configurationController); - Injector injector = Guice.createInjector(new AbstractModule() { - @Override - protected void configure() { - requestStaticInjection(ControllerFactory.class); - bind(ControllerFactory.class).toInstance(controllerFactory); - } - }); - injector.getInstance(ControllerFactory.class); + factoryOverride = StaticOverride.install(ControllerFactory.class, "factory", controllerFactory); + } + + @AfterClass + public static void restoreControllerFactory() { + if (factoryOverride != null) { + factoryOverride.close(); + } } @Test diff --git a/server/src/test/java/com/mirth/connect/server/util/javascript/JavaScriptUtilTest.java b/server/src/test/java/com/mirth/connect/server/util/javascript/JavaScriptUtilTest.java index 90221a55f8..47238667a1 100644 --- a/server/src/test/java/com/mirth/connect/server/util/javascript/JavaScriptUtilTest.java +++ b/server/src/test/java/com/mirth/connect/server/util/javascript/JavaScriptUtilTest.java @@ -22,14 +22,13 @@ import java.util.HashSet; import org.junit.After; +import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; -import com.google.inject.AbstractModule; -import com.google.inject.Guice; -import com.google.inject.Injector; import com.mirth.connect.donkey.model.message.ConnectorMessage; import com.mirth.connect.donkey.model.message.MessageContent; +import com.mirth.connect.donkey.testing.StaticOverride; import com.mirth.connect.model.codetemplates.ContextType; import com.mirth.connect.server.builders.JavaScriptBuilder; import com.mirth.connect.server.controllers.CodeTemplateController; @@ -42,6 +41,8 @@ public class JavaScriptUtilTest { + private static StaticOverride factoryOverride; + private static final String SCRIPT_ID = "JavaScriptUtilTest-script"; @BeforeClass @@ -62,14 +63,7 @@ public static void setUpBeforeClass() { CodeTemplateController codeTemplateController = mock(CodeTemplateController.class); when(controllerFactory.createCodeTemplateController()).thenReturn(codeTemplateController); - Injector injector = Guice.createInjector(new AbstractModule() { - @Override - protected void configure() { - requestStaticInjection(ControllerFactory.class); - bind(ControllerFactory.class).toInstance(controllerFactory); - } - }); - injector.getInstance(ControllerFactory.class); + factoryOverride = StaticOverride.install(ControllerFactory.class, "factory", controllerFactory); /* * JavaScriptBuilder captures its controllers in static fields at class-load time. If an @@ -79,6 +73,15 @@ protected void configure() { JavaScriptBuilder.setControllersForTesting(extensionController, codeTemplateController); } + @AfterClass + public static void restoreControllerFactory() { + if (factoryOverride != null) { + factoryOverride.close(); + } + // JavaScriptBuilder's cached controllers are left alone: reading them back to restore + // them would initialize it against the real factory, which rewrites mirth.properties. + } + private MirthContextFactory contextFactory() { return new MirthContextFactory(new URL[0], new HashSet<>(), false); } diff --git a/server/src/test/java/com/mirth/connect/server/util/javascript/MirthContextFactoryTest.java b/server/src/test/java/com/mirth/connect/server/util/javascript/MirthContextFactoryTest.java index b34ee8627d..f4e8a13534 100644 --- a/server/src/test/java/com/mirth/connect/server/util/javascript/MirthContextFactoryTest.java +++ b/server/src/test/java/com/mirth/connect/server/util/javascript/MirthContextFactoryTest.java @@ -13,12 +13,11 @@ import java.net.URL; import java.util.HashSet; +import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; -import com.google.inject.AbstractModule; -import com.google.inject.Guice; -import com.google.inject.Injector; +import com.mirth.connect.donkey.testing.StaticOverride; import com.mirth.connect.server.builders.JavaScriptBuilder; import com.mirth.connect.server.controllers.CodeTemplateController; import com.mirth.connect.server.controllers.ConfigurationController; @@ -28,6 +27,8 @@ public class MirthContextFactoryTest { + private static StaticOverride factoryOverride; + @BeforeClass public static void setUpBeforeClass() { // Same mocked ControllerFactory pattern as JavaScriptUtilTest, so this class is @@ -46,18 +47,20 @@ public static void setUpBeforeClass() { CodeTemplateController codeTemplateController = mock(CodeTemplateController.class); when(controllerFactory.createCodeTemplateController()).thenReturn(codeTemplateController); - Injector injector = Guice.createInjector(new AbstractModule() { - @Override - protected void configure() { - requestStaticInjection(ControllerFactory.class); - bind(ControllerFactory.class).toInstance(controllerFactory); - } - }); - injector.getInstance(ControllerFactory.class); + factoryOverride = StaticOverride.install(ControllerFactory.class, "factory", controllerFactory); JavaScriptBuilder.setControllersForTesting(extensionController, codeTemplateController); } + @AfterClass + public static void restoreControllerFactory() { + if (factoryOverride != null) { + factoryOverride.close(); + } + // JavaScriptBuilder's cached controllers are left alone: reading them back to restore + // them would initialize it against the real factory, which rewrites mirth.properties. + } + /* * Regression test for #338: with a null parent, the isolated classloader cannot see java.sql * on Java 9+, so custom driver resources failed to deploy. The parent must be the platform