diff --git a/core/src/test/java/google/registry/testing/AppEngineExtension.java b/core/src/test/java/google/registry/testing/AppEngineExtension.java
index aceeb0400..b86d16405 100644
--- a/core/src/test/java/google/registry/testing/AppEngineExtension.java
+++ b/core/src/test/java/google/registry/testing/AppEngineExtension.java
@@ -487,20 +487,22 @@ public final class AppEngineExtension implements BeforeEachCallback, AfterEachCa
if (replayer != null) {
replayer.replay();
}
-
- if (withCloudSql) {
- if (enableJpaEntityCoverageCheck) {
- jpaIntegrationWithCoverageExtension.afterEach(context);
- } else if (withJpaUnitTest) {
- jpaUnitTestExtension.afterEach(context);
- } else {
- jpaIntegrationTestExtension.afterEach(context);
- }
- }
- tearDown();
} finally {
- if (isWithDatastoreAndCloudSql()) {
- restoreTmAfterDualDatabaseTest(context);
+ try {
+ if (withCloudSql) {
+ if (enableJpaEntityCoverageCheck) {
+ jpaIntegrationWithCoverageExtension.afterEach(context);
+ } else if (withJpaUnitTest) {
+ jpaUnitTestExtension.afterEach(context);
+ } else {
+ jpaIntegrationTestExtension.afterEach(context);
+ }
+ }
+ tearDown();
+ } finally {
+ if (isWithDatastoreAndCloudSql()) {
+ restoreTmAfterDualDatabaseTest(context);
+ }
}
}
}
diff --git a/core/src/test/java/google/registry/testing/TestLogHandlerUtils.java b/core/src/test/java/google/registry/testing/TestLogHandlerUtils.java
index 9e541b6b2..fc384cac1 100644
--- a/core/src/test/java/google/registry/testing/TestLogHandlerUtils.java
+++ b/core/src/test/java/google/registry/testing/TestLogHandlerUtils.java
@@ -43,6 +43,15 @@ public final class TestLogHandlerUtils {
handler.getStoredLogRecords(), logRecord -> logRecord.getMessage().startsWith(prefix));
}
+ /** Assert that the specified log message is not found. */
+ public static void assertNoLogMessage(CapturingLogHandler handler, Level level, String message) {
+ for (LogRecord logRecord : handler.getRecords()) {
+ if (logRecord.getLevel().equals(level) && logRecord.getMessage().contains(message)) {
+ assertWithMessage("Log message \"%s\" found: %s", message, logRecord.getMessage()).fail();
+ }
+ }
+ }
+
public static void assertLogMessage(CapturingLogHandler handler, Level level, String message) {
for (LogRecord logRecord : handler.getRecords()) {
if (logRecord.getLevel().equals(level) && logRecord.getMessage().contains(message)) {
diff --git a/core/src/test/java/google/registry/tools/CommandTestCase.java b/core/src/test/java/google/registry/tools/CommandTestCase.java
index 556af5f60..5f404119f 100644
--- a/core/src/test/java/google/registry/tools/CommandTestCase.java
+++ b/core/src/test/java/google/registry/tools/CommandTestCase.java
@@ -42,7 +42,6 @@ import java.io.OutputStream;
import java.io.PrintStream;
import java.nio.file.Path;
import java.util.List;
-import java.util.concurrent.locks.ReentrantLock;
import org.joda.time.DateTime;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
@@ -59,10 +58,6 @@ import org.mockito.junit.jupiter.MockitoExtension;
@ExtendWith(MockitoExtension.class)
public abstract class CommandTestCase {
- // Lock for stdout/stderr. Note that this is static: since we're dealing with globals, we need
- // to lock for the entire JVM.
- private static final ReentrantLock streamsLock = new ReentrantLock();
-
private final ByteArrayOutputStream stdout = new ByteArrayOutputStream();
private final ByteArrayOutputStream stderr = new ByteArrayOutputStream();
private PrintStream oldStdout, oldStderr;
@@ -90,10 +85,7 @@ public abstract class CommandTestCase {
RegistryToolEnvironment.UNITTEST.setup(systemPropertyExtension);
command = newCommandInstance();
- // Capture standard output/error. This is problematic because gradle tests run in parallel in
- // the same JVM. So first lock out any other tests in this JVM that are trying to do this
- // trick.
- streamsLock.lock();
+ // Capture standard output/error.
oldStdout = System.out;
System.setOut(new PrintStream(new OutputSplitter(System.out, stdout)));
oldStderr = System.err;
@@ -104,7 +96,6 @@ public abstract class CommandTestCase {
public final void afterEachCommandTestCase() {
System.setOut(oldStdout);
System.setErr(oldStderr);
- streamsLock.unlock();
}
void runCommandInEnvironment(RegistryToolEnvironment env, String... args) throws Exception {
diff --git a/core/src/test/java/google/registry/tools/UpdateDomainCommandTest.java b/core/src/test/java/google/registry/tools/UpdateDomainCommandTest.java
index a8ed424c3..6d1be6d6a 100644
--- a/core/src/test/java/google/registry/tools/UpdateDomainCommandTest.java
+++ b/core/src/test/java/google/registry/tools/UpdateDomainCommandTest.java
@@ -25,12 +25,15 @@ import static google.registry.testing.DatabaseHelper.newDomainBase;
import static google.registry.testing.DatabaseHelper.persistActiveDomain;
import static google.registry.testing.DatabaseHelper.persistActiveHost;
import static google.registry.testing.DatabaseHelper.persistResource;
+import static google.registry.testing.TestLogHandlerUtils.assertLogMessage;
+import static google.registry.testing.TestLogHandlerUtils.assertNoLogMessage;
import static google.registry.util.DateTimeUtils.END_OF_TIME;
import static org.junit.jupiter.api.Assertions.assertThrows;
import com.beust.jcommander.ParameterException;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
+import com.google.common.flogger.LoggerConfig;
import google.registry.model.billing.BillingEvent;
import google.registry.model.billing.BillingEvent.Flag;
import google.registry.model.billing.BillingEvent.Reason;
@@ -46,6 +49,9 @@ import google.registry.persistence.VKey;
import google.registry.testing.DualDatabaseTest;
import google.registry.testing.InjectExtension;
import google.registry.testing.TestOfyAndSql;
+import google.registry.util.CapturingLogHandler;
+import java.util.logging.Level;
+import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.extension.RegisterExtension;
@@ -53,6 +59,8 @@ import org.junit.jupiter.api.extension.RegisterExtension;
@DualDatabaseTest
class UpdateDomainCommandTest extends EppToolCommandTestCase {
+ private final CapturingLogHandler logHandler = new CapturingLogHandler();
+
private DomainBase domain;
@RegisterExtension public final InjectExtension inject = new InjectExtension();
@@ -62,6 +70,12 @@ class UpdateDomainCommandTest extends EppToolCommandTestCase