From 09b90820198faa3c087c7a0cddb2b5fdebb2cf77 Mon Sep 17 00:00:00 2001 From: "hannes.oswald" Date: Mon, 17 Nov 2025 19:30:56 +0100 Subject: [PATCH 01/15] change tests --- transact/build.gradle.kts | 1 + .../java/dev/dbos/transact/RealBaseTest.java | 34 +++++++++++++++ .../dev/dbos/transact/client/ClientTest.java | 32 +++++--------- .../dev/dbos/transact/config/ConfigTest.java | 43 +++++-------------- .../transact/database/ExternalStateTest.java | 9 +--- .../transact/database/SystemDatabaseTest.java | 22 +++------- .../transact/execution/DBOSExecutorTest.java | 14 +----- .../transact/execution/LifecycleTest.java | 14 +----- .../execution/RecoveryServiceTest.java | 15 +------ .../transact/invocation/CustomSchemaTest.java | 11 ++--- .../invocation/DirectInvocationTest.java | 15 +------ .../transact/invocation/MultiInstTest.java | 20 ++------- .../invocation/StartWorkflowTest.java | 15 +------ .../transact/migrations/BackCompatTest.java | 24 ++++------- .../migrations/MigrationManagerTest.java | 10 ++--- .../transact/notifications/EventsTest.java | 15 +------ .../NotificationServiceTest.java | 16 +------ .../dev/dbos/transact/queue/QueuesTest.java | 17 +------- .../scheduled/SchedulerServiceTest.java | 15 +------ .../dev/dbos/transact/step/StepsTest.java | 15 +------ .../transact/workflow/AsyncWorkflowTest.java | 16 +------ .../workflow/QueueChildWorkflowTest.java | 16 +------ .../transact/workflow/SyncWorkflowTest.java | 16 +------ .../dbos/transact/workflow/TimeoutTest.java | 15 +------ .../transact/workflow/UnifiedProxyTest.java | 16 +------ .../transact/workflow/WorkflowMgmtTest.java | 16 +------ 26 files changed, 114 insertions(+), 338 deletions(-) create mode 100644 transact/src/test/java/dev/dbos/transact/RealBaseTest.java diff --git a/transact/build.gradle.kts b/transact/build.gradle.kts index 311d56b4..c74cf27f 100644 --- a/transact/build.gradle.kts +++ b/transact/build.gradle.kts @@ -43,6 +43,7 @@ dependencies { testImplementation("io.rest-assured:rest-assured:5.4.0") testImplementation("io.rest-assured:json-path:5.4.0") testImplementation("io.rest-assured:xml-path:5.4.0") + testImplementation("org.testcontainers:postgresql:1.21.3") } tasks.test { diff --git a/transact/src/test/java/dev/dbos/transact/RealBaseTest.java b/transact/src/test/java/dev/dbos/transact/RealBaseTest.java new file mode 100644 index 00000000..25f1a346 --- /dev/null +++ b/transact/src/test/java/dev/dbos/transact/RealBaseTest.java @@ -0,0 +1,34 @@ +package dev.dbos.transact; + +import dev.dbos.transact.config.DBOSConfig; + +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.testcontainers.containers.PostgreSQLContainer; + +public class RealBaseTest { + + protected static final PostgreSQLContainer postgres = new PostgreSQLContainer<>("postgres:18"); + + protected static DBOSConfig dbosConfig; + + @BeforeAll + static void onetimeSetup() throws Exception { + postgres.start(); + dbosConfig = + DBOSConfig.defaults("systemdbtest") + .withDatabaseUrl(postgres.getJdbcUrl()) + .withDbUser(postgres.getUsername()) + .withDbPassword(postgres.getPassword()) + .withMaximumPoolSize(2); + } + + @AfterAll + static void afterAll() { + postgres.stop(); + } + + protected DBOSClient getDBOSClient() { + return new DBOSClient(postgres.getJdbcUrl(), postgres.getUsername(), postgres.getPassword()); + } +} diff --git a/transact/src/test/java/dev/dbos/transact/client/ClientTest.java b/transact/src/test/java/dev/dbos/transact/client/ClientTest.java index d41e277a..2fb83e1a 100644 --- a/transact/src/test/java/dev/dbos/transact/client/ClientTest.java +++ b/transact/src/test/java/dev/dbos/transact/client/ClientTest.java @@ -8,7 +8,7 @@ import dev.dbos.transact.DBOS; import dev.dbos.transact.DBOSClient; import dev.dbos.transact.DBOSTestAccess; -import dev.dbos.transact.config.DBOSConfig; +import dev.dbos.transact.RealBaseTest; import dev.dbos.transact.database.SystemDatabase; import dev.dbos.transact.exceptions.DBOSAwaitedWorkflowCancelledException; import dev.dbos.transact.utils.DBUtils; @@ -21,28 +21,14 @@ import java.util.concurrent.TimeUnit; import com.zaxxer.hikari.HikariDataSource; +import org.jetbrains.annotations.NotNull; import org.junit.jupiter.api.*; @org.junit.jupiter.api.Timeout(value = 2, unit = TimeUnit.MINUTES) -public class ClientTest { - private static DBOSConfig dbosConfig; - private static final String dbUrl = "jdbc:postgresql://localhost:5432/dbos_java_sys"; - private static final String dbUser = "postgres"; - private static final String dbPassword = System.getenv("PGPASSWORD"); - +public class ClientTest extends RealBaseTest { private ClientService service; private HikariDataSource dataSource; - @BeforeAll - static void onetimeSetup() throws Exception { - dbosConfig = - DBOSConfig.defaults("systemdbtest") - .withDatabaseUrl(dbUrl) - .withDbUser(dbUser) - .withDbPassword(dbPassword) - .withMaximumPoolSize(2); - } - @BeforeEach void beforeEachTest() throws SQLException { DBUtils.recreateDB(dbosConfig); @@ -66,7 +52,7 @@ public void clientEnqueue() throws Exception { var qs = DBOSTestAccess.getQueueService(); qs.pause(); - try (var client = new DBOSClient(dbUrl, dbUser, dbPassword)) { + try (var client = getDbosClient()) { var options = new DBOSClient.EnqueueOptions( "dev.dbos.transact.client.ClientServiceImpl", "enqueueTest", "testQueue"); @@ -95,7 +81,7 @@ public void clientEnqueueDeDupe() throws Exception { var qs = DBOSTestAccess.getQueueService(); qs.pause(); - try (var client = new DBOSClient(dbUrl, dbUser, dbPassword)) { + try (var client = getDbosClient()) { var options = new DBOSClient.EnqueueOptions( "dev.dbos.transact.client.ClientServiceImpl", "enqueueTest", "testQueue") @@ -115,7 +101,7 @@ public void clientSend() throws Exception { var idempotencyKey = UUID.randomUUID().toString(); - try (var client = new DBOSClient(dbUrl, dbUser, dbPassword)) { + try (var client = getDbosClient()) { client.send(handle.workflowId(), "test.message", "test-topic", idempotencyKey); } @@ -131,7 +117,7 @@ public void clientSend() throws Exception { @Test public void clientEnqueueTimeouts() throws Exception { - try (var client = new DBOSClient(dbUrl, dbUser, dbPassword)) { + try (var client = getDbosClient()) { var options = new DBOSClient.EnqueueOptions( "dev.dbos.transact.client.ClientServiceImpl", "sleep", "testQueue"); @@ -163,4 +149,8 @@ public void clientEnqueueTimeouts() throws Exception { stat2.orElseThrow(() -> new AssertionError("Workflow status not found")).status()); } } + + private static @NotNull DBOSClient getDbosClient() { + return new DBOSClient(postgres.getJdbcUrl(), postgres.getUsername(), postgres.getPassword()); + } } diff --git a/transact/src/test/java/dev/dbos/transact/config/ConfigTest.java b/transact/src/test/java/dev/dbos/transact/config/ConfigTest.java index eccba947..71739e6b 100644 --- a/transact/src/test/java/dev/dbos/transact/config/ConfigTest.java +++ b/transact/src/test/java/dev/dbos/transact/config/ConfigTest.java @@ -5,9 +5,9 @@ import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotNull; -import dev.dbos.transact.Constants; import dev.dbos.transact.DBOS; import dev.dbos.transact.DBOSTestAccess; +import dev.dbos.transact.RealBaseTest; import dev.dbos.transact.database.DBTestAccess; import dev.dbos.transact.invocation.HawkService; import dev.dbos.transact.invocation.HawkServiceImpl; @@ -26,19 +26,13 @@ import uk.org.webcompere.systemstubs.jupiter.SystemStubsExtension; @ExtendWith(SystemStubsExtension.class) -public class ConfigTest { +public class ConfigTest extends RealBaseTest { @SystemStub private EnvironmentVariables envVars = new EnvironmentVariables(); @Test public void setExecutorAndAppVersionViaConfig() throws Exception { - var config = - DBOSConfig.defaults("config-test") - .withDatabaseUrl("jdbc:postgresql://localhost:5432/dbos_java_sys") - .withDbUser("postgres") - .withDbPassword(System.getenv("PGPASSWORD")) - .withAppVersion("test-app-version") - .withExecutorId("test-executor-id"); + var config = dbosConfig.withAppVersion("test-app-version").withExecutorId("test-executor-id"); DBOS.reinitialize(config); try { @@ -57,13 +51,7 @@ public void setExecutorAndAppVersionViaEnv() throws Exception { envVars.set("DBOS__VMID", "test-env-executor-id"); envVars.set("DBOS__APPVERSION", "test-env-app-version"); - var config = - DBOSConfig.defaults("config-test") - .withDatabaseUrl("jdbc:postgresql://localhost:5432/dbos_java_sys") - .withDbUser("postgres") - .withDbPassword(System.getenv("PGPASSWORD")) - .withAppVersion("test-app-version") - .withExecutorId("test-executor-id"); + var config = dbosConfig.withAppVersion("test-app-version").withExecutorId("test-executor-id"); DBOS.reinitialize(config); try { @@ -78,11 +66,7 @@ public void setExecutorAndAppVersionViaEnv() throws Exception { @Test public void localExecutorId() throws Exception { - var config = - DBOSConfig.defaults("config-test") - .withDatabaseUrl("jdbc:postgresql://localhost:5432/dbos_java_sys") - .withDbUser("postgres") - .withDbPassword(System.getenv("PGPASSWORD")); + var config = dbosConfig; DBOS.reinitialize(config); try { @@ -96,10 +80,7 @@ public void localExecutorId() throws Exception { @Test public void conductorExecutorId() throws Exception { - var config = - DBOSConfig.defaultsFromEnv("config-test") - .withDatabaseUrl("jdbc:postgresql://localhost:5432/dbos_java_sys") - .withConductorKey("test-conductor-key"); + var config = dbosConfig.withConductorKey("test-conductor-key"); DBOS.reinitialize(config); try { @@ -114,11 +95,7 @@ public void conductorExecutorId() throws Exception { @Test public void calcAppVersion() throws Exception { - var config = - DBOSConfig.defaults("config-test") - .withDatabaseUrl("jdbc:postgresql://localhost:5432/dbos_java_sys") - .withDbUser("postgres") - .withDbPassword(System.getenv(Constants.POSTGRES_PASSWORD_ENV_VAR)); + var config = dbosConfig; DBOS.reinitialize(config); try { @@ -136,9 +113,9 @@ public void calcAppVersion() throws Exception { public void configDataSource() throws Exception { var poolName = "dbos-configDataSource"; - var url = "jdbc:postgresql://localhost:5432/dbos_java_sys"; - var user = "postgres"; - var password = System.getenv(Constants.POSTGRES_PASSWORD_ENV_VAR); + var url = dbosConfig.databaseUrl(); + var user = dbosConfig.dbUser(); + var password = dbosConfig.dbPassword(); DBUtils.recreateDB(url, user, password); diff --git a/transact/src/test/java/dev/dbos/transact/database/ExternalStateTest.java b/transact/src/test/java/dev/dbos/transact/database/ExternalStateTest.java index 2975642d..0f5368f4 100644 --- a/transact/src/test/java/dev/dbos/transact/database/ExternalStateTest.java +++ b/transact/src/test/java/dev/dbos/transact/database/ExternalStateTest.java @@ -4,7 +4,7 @@ import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertTrue; -import dev.dbos.transact.config.DBOSConfig; +import dev.dbos.transact.RealBaseTest; import dev.dbos.transact.migrations.MigrationManager; import dev.dbos.transact.utils.DBUtils; @@ -17,17 +17,12 @@ import org.junit.jupiter.api.Test; @org.junit.jupiter.api.Timeout(value = 2, unit = TimeUnit.MINUTES) -public class ExternalStateTest { +public class ExternalStateTest extends RealBaseTest { private static SystemDatabase systemDatabase; - private static DBOSConfig dbosConfig; @BeforeAll static void onetimeSetup() throws Exception { - dbosConfig = - DBOSConfig.defaultsFromEnv("systemdbtest") - .withDatabaseUrl("jdbc:postgresql://localhost:5432/dbos_java_sys"); - DBUtils.recreateDB(dbosConfig); MigrationManager.runMigrations(dbosConfig); systemDatabase = new SystemDatabase(dbosConfig); diff --git a/transact/src/test/java/dev/dbos/transact/database/SystemDatabaseTest.java b/transact/src/test/java/dev/dbos/transact/database/SystemDatabaseTest.java index dd71a27a..506b7c19 100644 --- a/transact/src/test/java/dev/dbos/transact/database/SystemDatabaseTest.java +++ b/transact/src/test/java/dev/dbos/transact/database/SystemDatabaseTest.java @@ -6,7 +6,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue; import dev.dbos.transact.DBOS; -import dev.dbos.transact.config.DBOSConfig; +import dev.dbos.transact.RealBaseTest; import dev.dbos.transact.exceptions.DBOSMaxRecoveryAttemptsExceededException; import dev.dbos.transact.exceptions.DBOSQueueDuplicatedException; import dev.dbos.transact.migrations.MigrationManager; @@ -20,30 +20,20 @@ import com.zaxxer.hikari.HikariDataSource; import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @org.junit.jupiter.api.Timeout(value = 2, unit = TimeUnit.MINUTES) -public class SystemDatabaseTest { - private static DBOSConfig config; +public class SystemDatabaseTest extends RealBaseTest { private SystemDatabase sysdb; private HikariDataSource dataSource; - @BeforeAll - static void onetimeSetup() throws Exception { - config = - DBOSConfig.defaultsFromEnv("systemdbtest") - .withDatabaseUrl("jdbc:postgresql://localhost:5432/dbos_java_sys") - .withMaximumPoolSize(10); - } - @BeforeEach void beforeEachTest() throws SQLException { - DBUtils.recreateDB(config); - MigrationManager.runMigrations(config); - sysdb = new SystemDatabase(config); - dataSource = SystemDatabase.createDataSource(config); + DBUtils.recreateDB(dbosConfig); + MigrationManager.runMigrations(dbosConfig); + sysdb = new SystemDatabase(dbosConfig); + dataSource = SystemDatabase.createDataSource(dbosConfig); } @AfterEach diff --git a/transact/src/test/java/dev/dbos/transact/execution/DBOSExecutorTest.java b/transact/src/test/java/dev/dbos/transact/execution/DBOSExecutorTest.java index 02af37fb..4056162c 100644 --- a/transact/src/test/java/dev/dbos/transact/execution/DBOSExecutorTest.java +++ b/transact/src/test/java/dev/dbos/transact/execution/DBOSExecutorTest.java @@ -4,7 +4,7 @@ import dev.dbos.transact.DBOS; import dev.dbos.transact.DBOSTestAccess; -import dev.dbos.transact.config.DBOSConfig; +import dev.dbos.transact.RealBaseTest; import dev.dbos.transact.context.WorkflowOptions; import dev.dbos.transact.database.SystemDatabase; import dev.dbos.transact.exceptions.DBOSNonExistentWorkflowException; @@ -20,24 +20,14 @@ import javax.sql.DataSource; import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @org.junit.jupiter.api.Timeout(value = 2, unit = TimeUnit.MINUTES) -class DBOSExecutorTest { +class DBOSExecutorTest extends RealBaseTest { - private static DBOSConfig dbosConfig; private static DataSource dataSource; - @BeforeAll - public static void onetimeBefore() { - DBOSExecutorTest.dbosConfig = - DBOSConfig.defaultsFromEnv("systemdbtest") - .withDatabaseUrl("jdbc:postgresql://localhost:5432/dbos_java_sys") - .withMaximumPoolSize(2); - } - @BeforeEach void setUp() throws SQLException { DBUtils.recreateDB(dbosConfig); diff --git a/transact/src/test/java/dev/dbos/transact/execution/LifecycleTest.java b/transact/src/test/java/dev/dbos/transact/execution/LifecycleTest.java index df1d9460..089f9f1a 100644 --- a/transact/src/test/java/dev/dbos/transact/execution/LifecycleTest.java +++ b/transact/src/test/java/dev/dbos/transact/execution/LifecycleTest.java @@ -3,29 +3,19 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import dev.dbos.transact.DBOS; -import dev.dbos.transact.config.DBOSConfig; +import dev.dbos.transact.RealBaseTest; import dev.dbos.transact.utils.DBUtils; import java.sql.SQLException; import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -public class LifecycleTest { - private static DBOSConfig dbosConfig; +public class LifecycleTest extends RealBaseTest { private static LifecycleTestWorkflowsImpl impl; private static TestLifecycleService svc; - @BeforeAll - static void onetimeSetup() throws Exception { - dbosConfig = - DBOSConfig.defaultsFromEnv("lifecycletest") - .withDatabaseUrl("jdbc:postgresql://localhost:5432/dbos_java_sys") - .withMaximumPoolSize(2); - } - @BeforeEach void beforeEachTest() throws SQLException { DBUtils.recreateDB(dbosConfig); diff --git a/transact/src/test/java/dev/dbos/transact/execution/RecoveryServiceTest.java b/transact/src/test/java/dev/dbos/transact/execution/RecoveryServiceTest.java index 8a844343..f94b167d 100644 --- a/transact/src/test/java/dev/dbos/transact/execution/RecoveryServiceTest.java +++ b/transact/src/test/java/dev/dbos/transact/execution/RecoveryServiceTest.java @@ -4,8 +4,8 @@ import dev.dbos.transact.DBOS; import dev.dbos.transact.DBOSTestAccess; +import dev.dbos.transact.RealBaseTest; import dev.dbos.transact.StartWorkflowOptions; -import dev.dbos.transact.config.DBOSConfig; import dev.dbos.transact.context.WorkflowOptions; import dev.dbos.transact.database.SystemDatabase; import dev.dbos.transact.utils.DBUtils; @@ -22,16 +22,14 @@ import javax.sql.DataSource; import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @org.junit.jupiter.api.Timeout(value = 2, unit = TimeUnit.MINUTES) -class RecoveryServiceTest { +class RecoveryServiceTest extends RealBaseTest { - private static DBOSConfig dbosConfig; private static DataSource dataSource; private Queue testQueue; private SystemDatabase systemDatabase; @@ -40,15 +38,6 @@ class RecoveryServiceTest { private ExecutingService executingService; private static final Logger logger = LoggerFactory.getLogger(RecoveryServiceTest.class); - @BeforeAll - public static void onetimeBefore() { - - RecoveryServiceTest.dbosConfig = - DBOSConfig.defaultsFromEnv("systemdbtest") - .withDatabaseUrl("jdbc:postgresql://localhost:5432/dbos_java_sys") - .withMaximumPoolSize(2); - } - @BeforeEach void setUp() throws SQLException { DBUtils.recreateDB(dbosConfig); diff --git a/transact/src/test/java/dev/dbos/transact/invocation/CustomSchemaTest.java b/transact/src/test/java/dev/dbos/transact/invocation/CustomSchemaTest.java index cfacd928..52a4563c 100644 --- a/transact/src/test/java/dev/dbos/transact/invocation/CustomSchemaTest.java +++ b/transact/src/test/java/dev/dbos/transact/invocation/CustomSchemaTest.java @@ -6,7 +6,7 @@ import static org.junit.jupiter.api.Assertions.assertNull; import dev.dbos.transact.DBOS; -import dev.dbos.transact.config.DBOSConfig; +import dev.dbos.transact.RealBaseTest; import dev.dbos.transact.database.SystemDatabase; import dev.dbos.transact.utils.DBUtils; @@ -23,8 +23,7 @@ import org.junit.jupiter.api.Test; @org.junit.jupiter.api.Timeout(value = 2, unit = TimeUnit.MINUTES) -public class CustomSchemaTest { - private static DBOSConfig dbosConfig; +public class CustomSchemaTest extends RealBaseTest { private static final String schema = "C$+0m'"; private HawkService proxy; private HikariDataSource dataSource; @@ -33,11 +32,7 @@ public class CustomSchemaTest { @BeforeAll static void onetimeSetup() throws Exception { - dbosConfig = - DBOSConfig.defaultsFromEnv("systemdbtest") - .withDatabaseUrl("jdbc:postgresql://localhost:5432/dbos_java_sys") - .withDatabaseSchema(schema) - .withMaximumPoolSize(2); + dbosConfig = dbosConfig.withDatabaseSchema(schema); } @BeforeEach diff --git a/transact/src/test/java/dev/dbos/transact/invocation/DirectInvocationTest.java b/transact/src/test/java/dev/dbos/transact/invocation/DirectInvocationTest.java index 85832933..34ab4f09 100644 --- a/transact/src/test/java/dev/dbos/transact/invocation/DirectInvocationTest.java +++ b/transact/src/test/java/dev/dbos/transact/invocation/DirectInvocationTest.java @@ -7,7 +7,7 @@ import static org.junit.jupiter.api.Assertions.assertThrows; import dev.dbos.transact.DBOS; -import dev.dbos.transact.config.DBOSConfig; +import dev.dbos.transact.RealBaseTest; import dev.dbos.transact.context.WorkflowOptions; import dev.dbos.transact.database.SystemDatabase; import dev.dbos.transact.utils.DBUtils; @@ -24,26 +24,15 @@ import com.zaxxer.hikari.HikariDataSource; import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @org.junit.jupiter.api.Timeout(value = 2, unit = TimeUnit.MINUTES) -public class DirectInvocationTest { - private static DBOSConfig dbosConfig; +public class DirectInvocationTest extends RealBaseTest { private HawkService proxy; private HikariDataSource dataSource; private String localDate = LocalDate.now().format(DateTimeFormatter.ISO_DATE); - @BeforeAll - static void onetimeSetup() throws Exception { - - dbosConfig = - DBOSConfig.defaultsFromEnv("systemdbtest") - .withDatabaseUrl("jdbc:postgresql://localhost:5432/dbos_java_sys") - .withMaximumPoolSize(2); - } - @BeforeEach void beforeEachTest() throws SQLException { DBUtils.recreateDB(dbosConfig); diff --git a/transact/src/test/java/dev/dbos/transact/invocation/MultiInstTest.java b/transact/src/test/java/dev/dbos/transact/invocation/MultiInstTest.java index 2e875a0a..a7542a07 100644 --- a/transact/src/test/java/dev/dbos/transact/invocation/MultiInstTest.java +++ b/transact/src/test/java/dev/dbos/transact/invocation/MultiInstTest.java @@ -5,7 +5,7 @@ import dev.dbos.transact.DBOS; import dev.dbos.transact.DBOSClient; import dev.dbos.transact.DBOSTestAccess; -import dev.dbos.transact.config.DBOSConfig; +import dev.dbos.transact.RealBaseTest; import dev.dbos.transact.database.SystemDatabase; import dev.dbos.transact.utils.DBUtils; import dev.dbos.transact.workflow.ListWorkflowsInput; @@ -20,13 +20,11 @@ import java.util.concurrent.TimeUnit; import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @org.junit.jupiter.api.Timeout(value = 2, unit = TimeUnit.MINUTES) -public class MultiInstTest { - private static DBOSConfig dbosConfig; +public class MultiInstTest extends RealBaseTest { HawkServiceImpl himpl; BearServiceImpl bimpla; BearServiceImpl bimpl1; @@ -35,14 +33,6 @@ public class MultiInstTest { private BearService bproxy1; private String localDate = LocalDate.now().format(DateTimeFormatter.ISO_DATE); - @BeforeAll - static void onetimeSetup() throws Exception { - dbosConfig = - DBOSConfig.defaultsFromEnv("systemdbtest") - .withDatabaseUrl("jdbc:postgresql://localhost:5432/dbos_java_sys") - .withMaximumPoolSize(2); - } - @BeforeEach void beforeEachTest() throws SQLException { DBUtils.recreateDB(dbosConfig); @@ -161,13 +151,9 @@ void startWorkflow() throws Exception { assertEquals(1, browsjust1.size()); } - private static final String dbUrl = "jdbc:postgresql://localhost:5432/dbos_java_sys"; - private static final String dbUser = "postgres"; - private static final String dbPassword = System.getenv("PGPASSWORD"); - @Test public void enqueueForSpecificInstance() throws Exception { - try (var client = new DBOSClient(dbUrl, dbUser, dbPassword)) { + try (var client = getDBOSClient()) { var options = new DBOSClient.EnqueueOptions( "dev.dbos.transact.invocation.BearServiceImpl", "stepWorkflow", "testQueue") diff --git a/transact/src/test/java/dev/dbos/transact/invocation/StartWorkflowTest.java b/transact/src/test/java/dev/dbos/transact/invocation/StartWorkflowTest.java index 540d7f5a..11bd134d 100644 --- a/transact/src/test/java/dev/dbos/transact/invocation/StartWorkflowTest.java +++ b/transact/src/test/java/dev/dbos/transact/invocation/StartWorkflowTest.java @@ -5,8 +5,8 @@ import static org.junit.jupiter.api.Assertions.assertNull; import dev.dbos.transact.DBOS; +import dev.dbos.transact.RealBaseTest; import dev.dbos.transact.StartWorkflowOptions; -import dev.dbos.transact.config.DBOSConfig; import dev.dbos.transact.database.SystemDatabase; import dev.dbos.transact.utils.DBUtils; @@ -17,26 +17,15 @@ import com.zaxxer.hikari.HikariDataSource; import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @org.junit.jupiter.api.Timeout(value = 2, unit = TimeUnit.MINUTES) -public class StartWorkflowTest { - private static DBOSConfig dbosConfig; +public class StartWorkflowTest extends RealBaseTest { private HawkService proxy; private HikariDataSource dataSource; private String localDate = LocalDate.now().format(DateTimeFormatter.ISO_DATE); - @BeforeAll - static void onetimeSetup() throws Exception { - - dbosConfig = - DBOSConfig.defaultsFromEnv("systemdbtest") - .withDatabaseUrl("jdbc:postgresql://localhost:5432/dbos_java_sys") - .withMaximumPoolSize(2); - } - @BeforeEach void beforeEachTest() throws SQLException { DBUtils.recreateDB(dbosConfig); diff --git a/transact/src/test/java/dev/dbos/transact/migrations/BackCompatTest.java b/transact/src/test/java/dev/dbos/transact/migrations/BackCompatTest.java index 94e39eea..784864cc 100644 --- a/transact/src/test/java/dev/dbos/transact/migrations/BackCompatTest.java +++ b/transact/src/test/java/dev/dbos/transact/migrations/BackCompatTest.java @@ -3,7 +3,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import dev.dbos.transact.DBOS; -import dev.dbos.transact.config.DBOSConfig; +import dev.dbos.transact.RealBaseTest; import dev.dbos.transact.database.SystemDatabase; import dev.dbos.transact.invocation.HawkService; import dev.dbos.transact.invocation.HawkServiceImpl; @@ -19,20 +19,14 @@ import org.junit.jupiter.api.Test; @org.junit.jupiter.api.Timeout(value = 2, unit = TimeUnit.MINUTES) -public class BackCompatTest { - private DBOSConfig config; +public class BackCompatTest extends RealBaseTest { @BeforeEach void onetimeSetup() throws Exception { - - config = - DBOSConfig.defaultsFromEnv("systemdbtest") - .withDatabaseUrl("jdbc:postgresql://localhost:5432/dbos_java_sys") - .withMaximumPoolSize(2); - - var pair = MigrationManager.extractDbAndPostgresUrl(config.databaseUrl()); + var pair = MigrationManager.extractDbAndPostgresUrl(dbosConfig.databaseUrl()); var dropDbSql = String.format("DROP DATABASE IF EXISTS %s WITH (FORCE)", pair.database()); - try (var conn = DriverManager.getConnection(pair.url(), config.dbUser(), config.dbPassword()); + try (var conn = + DriverManager.getConnection(pair.url(), dbosConfig.dbUser(), dbosConfig.dbPassword()); var stmt = conn.createStatement()) { stmt.execute(dropDbSql); } @@ -43,7 +37,7 @@ void testInitialRun() throws Exception { runDbos(); - var dataSource = SystemDatabase.createDataSource(config); + var dataSource = SystemDatabase.createDataSource(dbosConfig); try (Connection conn = dataSource.getConnection()) { DatabaseMetaData metaData = conn.getMetaData(); @@ -58,7 +52,7 @@ void testInitialRun() throws Exception { void testWayFutureVersion() throws Exception { testInitialRun(); - var dataSource = SystemDatabase.createDataSource(config); + var dataSource = SystemDatabase.createDataSource(dbosConfig); try (var conn = dataSource.getConnection(); var stmt = conn.createStatement()) { stmt.executeUpdate("UPDATE \"dbos\".\"dbos_migrations\" SET \"version\" = 10000;"); @@ -71,7 +65,7 @@ void testWayFutureVersion() throws Exception { void testIdempotence() throws Exception { testWayFutureVersion(); - var dataSource = SystemDatabase.createDataSource(config); + var dataSource = SystemDatabase.createDataSource(dbosConfig); try (var conn = dataSource.getConnection(); var stmt = conn.createStatement()) { stmt.executeUpdate("UPDATE \"dbos\".\"dbos_migrations\" SET \"version\" = 0;"); @@ -82,7 +76,7 @@ void testIdempotence() throws Exception { void runDbos() { try { - DBOS.reinitialize(config); + DBOS.reinitialize(dbosConfig); var impl = new HawkServiceImpl(); var proxy = DBOS.registerWorkflows(HawkService.class, impl); impl.setProxy(proxy); diff --git a/transact/src/test/java/dev/dbos/transact/migrations/MigrationManagerTest.java b/transact/src/test/java/dev/dbos/transact/migrations/MigrationManagerTest.java index a0fed868..80099ff2 100644 --- a/transact/src/test/java/dev/dbos/transact/migrations/MigrationManagerTest.java +++ b/transact/src/test/java/dev/dbos/transact/migrations/MigrationManagerTest.java @@ -6,6 +6,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue; import dev.dbos.transact.Constants; +import dev.dbos.transact.RealBaseTest; import dev.dbos.transact.config.DBOSConfig; import dev.dbos.transact.database.SystemDatabase; import dev.dbos.transact.utils.DBUtils; @@ -25,18 +26,13 @@ import org.junit.jupiter.api.Test; @org.junit.jupiter.api.Timeout(value = 2, unit = TimeUnit.MINUTES) -class MigrationManagerTest { +class MigrationManagerTest extends RealBaseTest { private DataSource testDataSource; - private DBOSConfig dbosConfig; @BeforeEach void setup() throws Exception { - - dbosConfig = - DBOSConfig.defaultsFromEnv("migrationtest") - .withDatabaseUrl("jdbc:postgresql://localhost:5432/dbos_java_sys_mm_test") - .withMaximumPoolSize(3); + dbosConfig = dbosConfig.defaultsFromEnv("migrationtest"); DBUtils.recreateDB(dbosConfig); testDataSource = SystemDatabase.createDataSource(dbosConfig); diff --git a/transact/src/test/java/dev/dbos/transact/notifications/EventsTest.java b/transact/src/test/java/dev/dbos/transact/notifications/EventsTest.java index 1ef953fa..6ce974e3 100644 --- a/transact/src/test/java/dev/dbos/transact/notifications/EventsTest.java +++ b/transact/src/test/java/dev/dbos/transact/notifications/EventsTest.java @@ -6,8 +6,8 @@ import dev.dbos.transact.DBOS; import dev.dbos.transact.DBOSTestAccess; +import dev.dbos.transact.RealBaseTest; import dev.dbos.transact.StartWorkflowOptions; -import dev.dbos.transact.config.DBOSConfig; import dev.dbos.transact.context.WorkflowOptions; import dev.dbos.transact.database.SystemDatabase; import dev.dbos.transact.utils.DBUtils; @@ -25,25 +25,14 @@ import javax.sql.DataSource; import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @org.junit.jupiter.api.Timeout(value = 2, unit = TimeUnit.MINUTES) -public class EventsTest { +public class EventsTest extends RealBaseTest { - private static DBOSConfig dbosConfig; private static DataSource dataSource; - @BeforeAll - static void onetimeSetup() throws Exception { - - EventsTest.dbosConfig = - DBOSConfig.defaultsFromEnv("systemdbtest") - .withDatabaseUrl("jdbc:postgresql://localhost:5432/dbos_java_sys") - .withMaximumPoolSize(2); - } - @BeforeEach void beforeEachTest() throws SQLException { DBUtils.recreateDB(dbosConfig); diff --git a/transact/src/test/java/dev/dbos/transact/notifications/NotificationServiceTest.java b/transact/src/test/java/dev/dbos/transact/notifications/NotificationServiceTest.java index 35b89d9c..3ae87556 100644 --- a/transact/src/test/java/dev/dbos/transact/notifications/NotificationServiceTest.java +++ b/transact/src/test/java/dev/dbos/transact/notifications/NotificationServiceTest.java @@ -3,8 +3,8 @@ import static org.junit.jupiter.api.Assertions.*; import dev.dbos.transact.DBOS; +import dev.dbos.transact.RealBaseTest; import dev.dbos.transact.StartWorkflowOptions; -import dev.dbos.transact.config.DBOSConfig; import dev.dbos.transact.context.WorkflowOptions; import dev.dbos.transact.utils.DBUtils; import dev.dbos.transact.workflow.*; @@ -19,23 +19,11 @@ import java.util.concurrent.TimeUnit; import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @org.junit.jupiter.api.Timeout(value = 2, unit = TimeUnit.MINUTES) -class NotificationServiceTest { - - private static DBOSConfig dbosConfig; - - @BeforeAll - static void onetimeSetup() throws Exception { - - NotificationServiceTest.dbosConfig = - DBOSConfig.defaultsFromEnv("systemdbtest") - .withDatabaseUrl("jdbc:postgresql://localhost:5432/dbos_java_sys") - .withMaximumPoolSize(2); - } +class NotificationServiceTest extends RealBaseTest { @BeforeEach void beforeEachTest() throws SQLException { diff --git a/transact/src/test/java/dev/dbos/transact/queue/QueuesTest.java b/transact/src/test/java/dev/dbos/transact/queue/QueuesTest.java index a0ed8a4e..58f9636e 100644 --- a/transact/src/test/java/dev/dbos/transact/queue/QueuesTest.java +++ b/transact/src/test/java/dev/dbos/transact/queue/QueuesTest.java @@ -4,11 +4,7 @@ import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; -import dev.dbos.transact.Constants; -import dev.dbos.transact.DBOS; -import dev.dbos.transact.DBOSTestAccess; -import dev.dbos.transact.StartWorkflowOptions; -import dev.dbos.transact.config.DBOSConfig; +import dev.dbos.transact.*; import dev.dbos.transact.database.SystemDatabase; import dev.dbos.transact.utils.DBUtils; import dev.dbos.transact.workflow.ListWorkflowsInput; @@ -36,21 +32,12 @@ import org.slf4j.LoggerFactory; @org.junit.jupiter.api.Timeout(value = 2, unit = TimeUnit.MINUTES) -public class QueuesTest { +public class QueuesTest extends RealBaseTest { private static final Logger logger = LoggerFactory.getLogger(QueuesTest.class); - private static DBOSConfig dbosConfig; private static DataSource dataSource; - @BeforeAll - static void onetimeSetup() throws Exception { - QueuesTest.dbosConfig = - DBOSConfig.defaultsFromEnv("systemdbtest") - .withDatabaseUrl("jdbc:postgresql://localhost:5432/dbos_java_sys") - .withMaximumPoolSize(2); - } - @BeforeEach void beforeEachTest() throws SQLException { DBUtils.recreateDB(dbosConfig); diff --git a/transact/src/test/java/dev/dbos/transact/scheduled/SchedulerServiceTest.java b/transact/src/test/java/dev/dbos/transact/scheduled/SchedulerServiceTest.java index 7b6f37e7..2f1a8228 100644 --- a/transact/src/test/java/dev/dbos/transact/scheduled/SchedulerServiceTest.java +++ b/transact/src/test/java/dev/dbos/transact/scheduled/SchedulerServiceTest.java @@ -5,7 +5,7 @@ import dev.dbos.transact.Constants; import dev.dbos.transact.DBOS; import dev.dbos.transact.DBOSTestAccess; -import dev.dbos.transact.config.DBOSConfig; +import dev.dbos.transact.RealBaseTest; import dev.dbos.transact.utils.DBUtils; import dev.dbos.transact.workflow.ListWorkflowsInput; import dev.dbos.transact.workflow.Queue; @@ -15,23 +15,12 @@ import java.util.concurrent.TimeUnit; import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junitpioneer.jupiter.RetryingTest; @org.junit.jupiter.api.Timeout(value = 2, unit = TimeUnit.MINUTES) -class SchedulerServiceTest { - - private static DBOSConfig dbosConfig; - - @BeforeAll - static void onetimeSetup() throws Exception { - SchedulerServiceTest.dbosConfig = - DBOSConfig.defaultsFromEnv("systemdbtest") - .withDatabaseUrl("jdbc:postgresql://localhost:5432/dbos_java_sys") - .withMaximumPoolSize(2); - } +class SchedulerServiceTest extends RealBaseTest { @BeforeEach void beforeEachTest() throws SQLException { diff --git a/transact/src/test/java/dev/dbos/transact/step/StepsTest.java b/transact/src/test/java/dev/dbos/transact/step/StepsTest.java index 1e73fe49..acae0499 100644 --- a/transact/src/test/java/dev/dbos/transact/step/StepsTest.java +++ b/transact/src/test/java/dev/dbos/transact/step/StepsTest.java @@ -3,7 +3,7 @@ import static org.junit.jupiter.api.Assertions.*; import dev.dbos.transact.DBOS; -import dev.dbos.transact.config.DBOSConfig; +import dev.dbos.transact.RealBaseTest; import dev.dbos.transact.context.WorkflowOptions; import dev.dbos.transact.utils.DBUtils; import dev.dbos.transact.workflow.*; @@ -15,18 +15,7 @@ import org.junit.jupiter.api.*; @org.junit.jupiter.api.Timeout(value = 2, unit = TimeUnit.MINUTES) -public class StepsTest { - - private static DBOSConfig dbosConfig; - - @BeforeAll - static void onetimeSetup() throws Exception { - - StepsTest.dbosConfig = - DBOSConfig.defaultsFromEnv("systemdbtest") - .withDatabaseUrl("jdbc:postgresql://localhost:5432/dbos_java_sys") - .withMaximumPoolSize(2); - } +public class StepsTest extends RealBaseTest { @BeforeEach void beforeEachTest() throws SQLException { diff --git a/transact/src/test/java/dev/dbos/transact/workflow/AsyncWorkflowTest.java b/transact/src/test/java/dev/dbos/transact/workflow/AsyncWorkflowTest.java index 38d7a361..946f3a31 100644 --- a/transact/src/test/java/dev/dbos/transact/workflow/AsyncWorkflowTest.java +++ b/transact/src/test/java/dev/dbos/transact/workflow/AsyncWorkflowTest.java @@ -5,8 +5,8 @@ import static org.junit.jupiter.api.Assertions.assertThrows; import dev.dbos.transact.DBOS; +import dev.dbos.transact.RealBaseTest; import dev.dbos.transact.StartWorkflowOptions; -import dev.dbos.transact.config.DBOSConfig; import dev.dbos.transact.context.WorkflowOptions; import dev.dbos.transact.utils.DBUtils; @@ -17,19 +17,7 @@ import org.junit.jupiter.api.*; @org.junit.jupiter.api.Timeout(value = 2, unit = TimeUnit.MINUTES) -public class AsyncWorkflowTest { - - private static DBOSConfig dbosConfig; - - @BeforeAll - static void onetimeSetup() throws Exception { - - AsyncWorkflowTest.dbosConfig = - DBOSConfig.defaultsFromEnv("systemdbtest") - .withDatabaseUrl("jdbc:postgresql://localhost:5432/dbos_java_sys") - .withMaximumPoolSize(2) - .withAdminServer(true); - } +public class AsyncWorkflowTest extends RealBaseTest { @BeforeEach void beforeEachTest() throws SQLException { diff --git a/transact/src/test/java/dev/dbos/transact/workflow/QueueChildWorkflowTest.java b/transact/src/test/java/dev/dbos/transact/workflow/QueueChildWorkflowTest.java index d25f1828..26e8060c 100644 --- a/transact/src/test/java/dev/dbos/transact/workflow/QueueChildWorkflowTest.java +++ b/transact/src/test/java/dev/dbos/transact/workflow/QueueChildWorkflowTest.java @@ -3,8 +3,8 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import dev.dbos.transact.DBOS; +import dev.dbos.transact.RealBaseTest; import dev.dbos.transact.StartWorkflowOptions; -import dev.dbos.transact.config.DBOSConfig; import dev.dbos.transact.utils.DBUtils; import java.sql.SQLException; @@ -12,23 +12,11 @@ import java.util.concurrent.TimeUnit; import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @org.junit.jupiter.api.Timeout(value = 2, unit = TimeUnit.MINUTES) -public class QueueChildWorkflowTest { - - private static DBOSConfig dbosConfig; - - @BeforeAll - static void onetimeSetup() throws Exception { - - QueueChildWorkflowTest.dbosConfig = - DBOSConfig.defaultsFromEnv("systemdbtest") - .withDatabaseUrl("jdbc:postgresql://localhost:5432/dbos_java_sys") - .withMaximumPoolSize(2); - } +public class QueueChildWorkflowTest extends RealBaseTest { @BeforeEach void beforeEachTest() throws SQLException { diff --git a/transact/src/test/java/dev/dbos/transact/workflow/SyncWorkflowTest.java b/transact/src/test/java/dev/dbos/transact/workflow/SyncWorkflowTest.java index 1165b7d0..a1b71bb4 100644 --- a/transact/src/test/java/dev/dbos/transact/workflow/SyncWorkflowTest.java +++ b/transact/src/test/java/dev/dbos/transact/workflow/SyncWorkflowTest.java @@ -3,7 +3,7 @@ import static org.junit.jupiter.api.Assertions.*; import dev.dbos.transact.DBOS; -import dev.dbos.transact.config.DBOSConfig; +import dev.dbos.transact.RealBaseTest; import dev.dbos.transact.context.WorkflowOptions; import dev.dbos.transact.utils.DBUtils; @@ -14,19 +14,7 @@ import org.junit.jupiter.api.*; @org.junit.jupiter.api.Timeout(value = 2, unit = TimeUnit.MINUTES) -public class SyncWorkflowTest { - - private static DBOSConfig dbosConfig; - - @BeforeAll - static void onetimeSetup() throws Exception { - - SyncWorkflowTest.dbosConfig = - DBOSConfig.defaultsFromEnv("systemdbtest") - .withDatabaseUrl("jdbc:postgresql://localhost:5432/dbos_java_sys") - .withMaximumPoolSize(2) - .withAdminServer(true); - } +public class SyncWorkflowTest extends RealBaseTest { @BeforeEach void beforeEachTest() throws SQLException { diff --git a/transact/src/test/java/dev/dbos/transact/workflow/TimeoutTest.java b/transact/src/test/java/dev/dbos/transact/workflow/TimeoutTest.java index e7566678..ad09778f 100644 --- a/transact/src/test/java/dev/dbos/transact/workflow/TimeoutTest.java +++ b/transact/src/test/java/dev/dbos/transact/workflow/TimeoutTest.java @@ -4,8 +4,8 @@ import dev.dbos.transact.DBOS; import dev.dbos.transact.DBOSTestAccess; +import dev.dbos.transact.RealBaseTest; import dev.dbos.transact.StartWorkflowOptions; -import dev.dbos.transact.config.DBOSConfig; import dev.dbos.transact.context.WorkflowOptions; import dev.dbos.transact.database.SystemDatabase; import dev.dbos.transact.exceptions.DBOSAwaitedWorkflowCancelledException; @@ -20,26 +20,15 @@ import javax.sql.DataSource; import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junitpioneer.jupiter.RetryingTest; @org.junit.jupiter.api.Timeout(value = 2, unit = TimeUnit.MINUTES) -public class TimeoutTest { +public class TimeoutTest extends RealBaseTest { - private static DBOSConfig dbosConfig; private static DataSource dataSource; - @BeforeAll - static void onetimeSetup() throws Exception { - - TimeoutTest.dbosConfig = - DBOSConfig.defaultsFromEnv("systemdbtest") - .withDatabaseUrl("jdbc:postgresql://localhost:5432/dbos_java_sys") - .withMaximumPoolSize(2); - } - @BeforeEach void beforeEachTest() throws SQLException { DBUtils.recreateDB(dbosConfig); diff --git a/transact/src/test/java/dev/dbos/transact/workflow/UnifiedProxyTest.java b/transact/src/test/java/dev/dbos/transact/workflow/UnifiedProxyTest.java index 20ff273f..71815e59 100644 --- a/transact/src/test/java/dev/dbos/transact/workflow/UnifiedProxyTest.java +++ b/transact/src/test/java/dev/dbos/transact/workflow/UnifiedProxyTest.java @@ -3,8 +3,8 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import dev.dbos.transact.DBOS; +import dev.dbos.transact.RealBaseTest; import dev.dbos.transact.StartWorkflowOptions; -import dev.dbos.transact.config.DBOSConfig; import dev.dbos.transact.context.WorkflowOptions; import dev.dbos.transact.utils.DBUtils; @@ -13,23 +13,11 @@ import java.util.concurrent.TimeUnit; import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @org.junit.jupiter.api.Timeout(value = 2, unit = TimeUnit.MINUTES) -public class UnifiedProxyTest { - - private static DBOSConfig dbosConfig; - - @BeforeAll - static void onetimeSetup() throws Exception { - - UnifiedProxyTest.dbosConfig = - DBOSConfig.defaultsFromEnv("systemdbtest") - .withDatabaseUrl("jdbc:postgresql://localhost:5432/dbos_java_sys") - .withMaximumPoolSize(2); - } +public class UnifiedProxyTest extends RealBaseTest { @BeforeEach void beforeEachTest() throws SQLException { diff --git a/transact/src/test/java/dev/dbos/transact/workflow/WorkflowMgmtTest.java b/transact/src/test/java/dev/dbos/transact/workflow/WorkflowMgmtTest.java index 4fc537a6..88edd521 100644 --- a/transact/src/test/java/dev/dbos/transact/workflow/WorkflowMgmtTest.java +++ b/transact/src/test/java/dev/dbos/transact/workflow/WorkflowMgmtTest.java @@ -4,8 +4,8 @@ import dev.dbos.transact.DBOS; import dev.dbos.transact.DBOSTestAccess; +import dev.dbos.transact.RealBaseTest; import dev.dbos.transact.StartWorkflowOptions; -import dev.dbos.transact.config.DBOSConfig; import dev.dbos.transact.context.WorkflowOptions; import dev.dbos.transact.exceptions.DBOSAwaitedWorkflowCancelledException; import dev.dbos.transact.exceptions.DBOSNonExistentWorkflowException; @@ -20,7 +20,6 @@ import java.util.concurrent.TimeUnit; import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junitpioneer.jupiter.RetryingTest; @@ -28,21 +27,10 @@ import org.slf4j.LoggerFactory; @org.junit.jupiter.api.Timeout(value = 2, unit = TimeUnit.MINUTES) -public class WorkflowMgmtTest { +public class WorkflowMgmtTest extends RealBaseTest { private static final Logger logger = LoggerFactory.getLogger(WorkflowMgmtTest.class); - private static DBOSConfig dbosConfig; - - @BeforeAll - static void onetimeSetup() throws Exception { - - WorkflowMgmtTest.dbosConfig = - DBOSConfig.defaultsFromEnv("systemdbtest") - .withDatabaseUrl("jdbc:postgresql://localhost:5432/dbos_java_sys") - .withMaximumPoolSize(2); - } - @BeforeEach void beforeEachTest() throws SQLException { DBUtils.recreateDB(dbosConfig); From 9376a1a8e8caaf6317daf5a77745f50d510580ac Mon Sep 17 00:00:00 2001 From: "hannes.oswald" Date: Wed, 19 Nov 2025 19:19:34 +0100 Subject: [PATCH 02/15] change tests --- transact/src/test/java/dev/dbos/transact/RealBaseTest.java | 2 +- .../dev/dbos/transact/migrations/MigrationManagerTest.java | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/transact/src/test/java/dev/dbos/transact/RealBaseTest.java b/transact/src/test/java/dev/dbos/transact/RealBaseTest.java index 25f1a346..fd0da01a 100644 --- a/transact/src/test/java/dev/dbos/transact/RealBaseTest.java +++ b/transact/src/test/java/dev/dbos/transact/RealBaseTest.java @@ -13,7 +13,7 @@ public class RealBaseTest { protected static DBOSConfig dbosConfig; @BeforeAll - static void onetimeSetup() throws Exception { + static void onetimeSetup() { postgres.start(); dbosConfig = DBOSConfig.defaults("systemdbtest") diff --git a/transact/src/test/java/dev/dbos/transact/migrations/MigrationManagerTest.java b/transact/src/test/java/dev/dbos/transact/migrations/MigrationManagerTest.java index 80099ff2..42cd3cea 100644 --- a/transact/src/test/java/dev/dbos/transact/migrations/MigrationManagerTest.java +++ b/transact/src/test/java/dev/dbos/transact/migrations/MigrationManagerTest.java @@ -32,7 +32,11 @@ class MigrationManagerTest extends RealBaseTest { @BeforeEach void setup() throws Exception { - dbosConfig = dbosConfig.defaultsFromEnv("migrationtest"); + dbosConfig = DBOSConfig.defaultsFromEnv("migrationtest") + .withDatabaseUrl(postgres.getJdbcUrl()) + .withDbUser(postgres.getUsername()) + .withDbPassword(postgres.getPassword()) + .withMaximumPoolSize(2); DBUtils.recreateDB(dbosConfig); testDataSource = SystemDatabase.createDataSource(dbosConfig); From 43860635dc6be57156e68ff11a20ca591ea28eda Mon Sep 17 00:00:00 2001 From: "hannes.oswald" Date: Wed, 19 Nov 2025 19:22:44 +0100 Subject: [PATCH 03/15] renaming --- .../{RealBaseTest.java => DbSetupTestBase.java} | 2 +- .../java/dev/dbos/transact/client/ClientTest.java | 4 ++-- .../java/dev/dbos/transact/config/ConfigTest.java | 4 ++-- .../dbos/transact/database/ExternalStateTest.java | 4 ++-- .../transact/database/SystemDatabaseTest.java | 4 ++-- .../dbos/transact/execution/DBOSExecutorTest.java | 4 ++-- .../dbos/transact/execution/LifecycleTest.java | 4 ++-- .../transact/execution/RecoveryServiceTest.java | 4 ++-- .../transact/invocation/CustomSchemaTest.java | 4 ++-- .../transact/invocation/DirectInvocationTest.java | 4 ++-- .../dbos/transact/invocation/MultiInstTest.java | 4 ++-- .../transact/invocation/StartWorkflowTest.java | 4 ++-- .../dbos/transact/migrations/BackCompatTest.java | 4 ++-- .../transact/migrations/MigrationManagerTest.java | 15 ++++++++------- .../dbos/transact/notifications/EventsTest.java | 4 ++-- .../notifications/NotificationServiceTest.java | 4 ++-- .../java/dev/dbos/transact/queue/QueuesTest.java | 2 +- .../transact/scheduled/SchedulerServiceTest.java | 4 ++-- .../java/dev/dbos/transact/step/StepsTest.java | 4 ++-- .../dbos/transact/workflow/AsyncWorkflowTest.java | 4 ++-- .../transact/workflow/QueueChildWorkflowTest.java | 4 ++-- .../dbos/transact/workflow/SyncWorkflowTest.java | 4 ++-- .../dev/dbos/transact/workflow/TimeoutTest.java | 4 ++-- .../dbos/transact/workflow/UnifiedProxyTest.java | 4 ++-- .../dbos/transact/workflow/WorkflowMgmtTest.java | 4 ++-- 25 files changed, 54 insertions(+), 53 deletions(-) rename transact/src/test/java/dev/dbos/transact/{RealBaseTest.java => DbSetupTestBase.java} (96%) diff --git a/transact/src/test/java/dev/dbos/transact/RealBaseTest.java b/transact/src/test/java/dev/dbos/transact/DbSetupTestBase.java similarity index 96% rename from transact/src/test/java/dev/dbos/transact/RealBaseTest.java rename to transact/src/test/java/dev/dbos/transact/DbSetupTestBase.java index fd0da01a..819fa10d 100644 --- a/transact/src/test/java/dev/dbos/transact/RealBaseTest.java +++ b/transact/src/test/java/dev/dbos/transact/DbSetupTestBase.java @@ -6,7 +6,7 @@ import org.junit.jupiter.api.BeforeAll; import org.testcontainers.containers.PostgreSQLContainer; -public class RealBaseTest { +public class DbSetupTestBase { protected static final PostgreSQLContainer postgres = new PostgreSQLContainer<>("postgres:18"); diff --git a/transact/src/test/java/dev/dbos/transact/client/ClientTest.java b/transact/src/test/java/dev/dbos/transact/client/ClientTest.java index 2fb83e1a..490e197b 100644 --- a/transact/src/test/java/dev/dbos/transact/client/ClientTest.java +++ b/transact/src/test/java/dev/dbos/transact/client/ClientTest.java @@ -8,7 +8,7 @@ import dev.dbos.transact.DBOS; import dev.dbos.transact.DBOSClient; import dev.dbos.transact.DBOSTestAccess; -import dev.dbos.transact.RealBaseTest; +import dev.dbos.transact.DbSetupTestBase; import dev.dbos.transact.database.SystemDatabase; import dev.dbos.transact.exceptions.DBOSAwaitedWorkflowCancelledException; import dev.dbos.transact.utils.DBUtils; @@ -25,7 +25,7 @@ import org.junit.jupiter.api.*; @org.junit.jupiter.api.Timeout(value = 2, unit = TimeUnit.MINUTES) -public class ClientTest extends RealBaseTest { +public class ClientTest extends DbSetupTestBase { private ClientService service; private HikariDataSource dataSource; diff --git a/transact/src/test/java/dev/dbos/transact/config/ConfigTest.java b/transact/src/test/java/dev/dbos/transact/config/ConfigTest.java index 71739e6b..88c0ea52 100644 --- a/transact/src/test/java/dev/dbos/transact/config/ConfigTest.java +++ b/transact/src/test/java/dev/dbos/transact/config/ConfigTest.java @@ -7,7 +7,7 @@ import dev.dbos.transact.DBOS; import dev.dbos.transact.DBOSTestAccess; -import dev.dbos.transact.RealBaseTest; +import dev.dbos.transact.DbSetupTestBase; import dev.dbos.transact.database.DBTestAccess; import dev.dbos.transact.invocation.HawkService; import dev.dbos.transact.invocation.HawkServiceImpl; @@ -26,7 +26,7 @@ import uk.org.webcompere.systemstubs.jupiter.SystemStubsExtension; @ExtendWith(SystemStubsExtension.class) -public class ConfigTest extends RealBaseTest { +public class ConfigTest extends DbSetupTestBase { @SystemStub private EnvironmentVariables envVars = new EnvironmentVariables(); diff --git a/transact/src/test/java/dev/dbos/transact/database/ExternalStateTest.java b/transact/src/test/java/dev/dbos/transact/database/ExternalStateTest.java index 0f5368f4..ed593767 100644 --- a/transact/src/test/java/dev/dbos/transact/database/ExternalStateTest.java +++ b/transact/src/test/java/dev/dbos/transact/database/ExternalStateTest.java @@ -4,7 +4,7 @@ import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertTrue; -import dev.dbos.transact.RealBaseTest; +import dev.dbos.transact.DbSetupTestBase; import dev.dbos.transact.migrations.MigrationManager; import dev.dbos.transact.utils.DBUtils; @@ -17,7 +17,7 @@ import org.junit.jupiter.api.Test; @org.junit.jupiter.api.Timeout(value = 2, unit = TimeUnit.MINUTES) -public class ExternalStateTest extends RealBaseTest { +public class ExternalStateTest extends DbSetupTestBase { private static SystemDatabase systemDatabase; @BeforeAll diff --git a/transact/src/test/java/dev/dbos/transact/database/SystemDatabaseTest.java b/transact/src/test/java/dev/dbos/transact/database/SystemDatabaseTest.java index 506b7c19..3fc5cff4 100644 --- a/transact/src/test/java/dev/dbos/transact/database/SystemDatabaseTest.java +++ b/transact/src/test/java/dev/dbos/transact/database/SystemDatabaseTest.java @@ -6,7 +6,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue; import dev.dbos.transact.DBOS; -import dev.dbos.transact.RealBaseTest; +import dev.dbos.transact.DbSetupTestBase; import dev.dbos.transact.exceptions.DBOSMaxRecoveryAttemptsExceededException; import dev.dbos.transact.exceptions.DBOSQueueDuplicatedException; import dev.dbos.transact.migrations.MigrationManager; @@ -24,7 +24,7 @@ import org.junit.jupiter.api.Test; @org.junit.jupiter.api.Timeout(value = 2, unit = TimeUnit.MINUTES) -public class SystemDatabaseTest extends RealBaseTest { +public class SystemDatabaseTest extends DbSetupTestBase { private SystemDatabase sysdb; private HikariDataSource dataSource; diff --git a/transact/src/test/java/dev/dbos/transact/execution/DBOSExecutorTest.java b/transact/src/test/java/dev/dbos/transact/execution/DBOSExecutorTest.java index 4056162c..791d1505 100644 --- a/transact/src/test/java/dev/dbos/transact/execution/DBOSExecutorTest.java +++ b/transact/src/test/java/dev/dbos/transact/execution/DBOSExecutorTest.java @@ -4,7 +4,7 @@ import dev.dbos.transact.DBOS; import dev.dbos.transact.DBOSTestAccess; -import dev.dbos.transact.RealBaseTest; +import dev.dbos.transact.DbSetupTestBase; import dev.dbos.transact.context.WorkflowOptions; import dev.dbos.transact.database.SystemDatabase; import dev.dbos.transact.exceptions.DBOSNonExistentWorkflowException; @@ -24,7 +24,7 @@ import org.junit.jupiter.api.Test; @org.junit.jupiter.api.Timeout(value = 2, unit = TimeUnit.MINUTES) -class DBOSExecutorTest extends RealBaseTest { +class DBOSExecutorTest extends DbSetupTestBase { private static DataSource dataSource; diff --git a/transact/src/test/java/dev/dbos/transact/execution/LifecycleTest.java b/transact/src/test/java/dev/dbos/transact/execution/LifecycleTest.java index 089f9f1a..5ca925ad 100644 --- a/transact/src/test/java/dev/dbos/transact/execution/LifecycleTest.java +++ b/transact/src/test/java/dev/dbos/transact/execution/LifecycleTest.java @@ -3,7 +3,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import dev.dbos.transact.DBOS; -import dev.dbos.transact.RealBaseTest; +import dev.dbos.transact.DbSetupTestBase; import dev.dbos.transact.utils.DBUtils; import java.sql.SQLException; @@ -12,7 +12,7 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -public class LifecycleTest extends RealBaseTest { +public class LifecycleTest extends DbSetupTestBase { private static LifecycleTestWorkflowsImpl impl; private static TestLifecycleService svc; diff --git a/transact/src/test/java/dev/dbos/transact/execution/RecoveryServiceTest.java b/transact/src/test/java/dev/dbos/transact/execution/RecoveryServiceTest.java index f94b167d..90096053 100644 --- a/transact/src/test/java/dev/dbos/transact/execution/RecoveryServiceTest.java +++ b/transact/src/test/java/dev/dbos/transact/execution/RecoveryServiceTest.java @@ -4,7 +4,7 @@ import dev.dbos.transact.DBOS; import dev.dbos.transact.DBOSTestAccess; -import dev.dbos.transact.RealBaseTest; +import dev.dbos.transact.DbSetupTestBase; import dev.dbos.transact.StartWorkflowOptions; import dev.dbos.transact.context.WorkflowOptions; import dev.dbos.transact.database.SystemDatabase; @@ -28,7 +28,7 @@ import org.slf4j.LoggerFactory; @org.junit.jupiter.api.Timeout(value = 2, unit = TimeUnit.MINUTES) -class RecoveryServiceTest extends RealBaseTest { +class RecoveryServiceTest extends DbSetupTestBase { private static DataSource dataSource; private Queue testQueue; diff --git a/transact/src/test/java/dev/dbos/transact/invocation/CustomSchemaTest.java b/transact/src/test/java/dev/dbos/transact/invocation/CustomSchemaTest.java index 52a4563c..b93d265a 100644 --- a/transact/src/test/java/dev/dbos/transact/invocation/CustomSchemaTest.java +++ b/transact/src/test/java/dev/dbos/transact/invocation/CustomSchemaTest.java @@ -6,7 +6,7 @@ import static org.junit.jupiter.api.Assertions.assertNull; import dev.dbos.transact.DBOS; -import dev.dbos.transact.RealBaseTest; +import dev.dbos.transact.DbSetupTestBase; import dev.dbos.transact.database.SystemDatabase; import dev.dbos.transact.utils.DBUtils; @@ -23,7 +23,7 @@ import org.junit.jupiter.api.Test; @org.junit.jupiter.api.Timeout(value = 2, unit = TimeUnit.MINUTES) -public class CustomSchemaTest extends RealBaseTest { +public class CustomSchemaTest extends DbSetupTestBase { private static final String schema = "C$+0m'"; private HawkService proxy; private HikariDataSource dataSource; diff --git a/transact/src/test/java/dev/dbos/transact/invocation/DirectInvocationTest.java b/transact/src/test/java/dev/dbos/transact/invocation/DirectInvocationTest.java index 34ab4f09..09f119dd 100644 --- a/transact/src/test/java/dev/dbos/transact/invocation/DirectInvocationTest.java +++ b/transact/src/test/java/dev/dbos/transact/invocation/DirectInvocationTest.java @@ -7,7 +7,7 @@ import static org.junit.jupiter.api.Assertions.assertThrows; import dev.dbos.transact.DBOS; -import dev.dbos.transact.RealBaseTest; +import dev.dbos.transact.DbSetupTestBase; import dev.dbos.transact.context.WorkflowOptions; import dev.dbos.transact.database.SystemDatabase; import dev.dbos.transact.utils.DBUtils; @@ -28,7 +28,7 @@ import org.junit.jupiter.api.Test; @org.junit.jupiter.api.Timeout(value = 2, unit = TimeUnit.MINUTES) -public class DirectInvocationTest extends RealBaseTest { +public class DirectInvocationTest extends DbSetupTestBase { private HawkService proxy; private HikariDataSource dataSource; private String localDate = LocalDate.now().format(DateTimeFormatter.ISO_DATE); diff --git a/transact/src/test/java/dev/dbos/transact/invocation/MultiInstTest.java b/transact/src/test/java/dev/dbos/transact/invocation/MultiInstTest.java index a7542a07..bf350d5c 100644 --- a/transact/src/test/java/dev/dbos/transact/invocation/MultiInstTest.java +++ b/transact/src/test/java/dev/dbos/transact/invocation/MultiInstTest.java @@ -5,7 +5,7 @@ import dev.dbos.transact.DBOS; import dev.dbos.transact.DBOSClient; import dev.dbos.transact.DBOSTestAccess; -import dev.dbos.transact.RealBaseTest; +import dev.dbos.transact.DbSetupTestBase; import dev.dbos.transact.database.SystemDatabase; import dev.dbos.transact.utils.DBUtils; import dev.dbos.transact.workflow.ListWorkflowsInput; @@ -24,7 +24,7 @@ import org.junit.jupiter.api.Test; @org.junit.jupiter.api.Timeout(value = 2, unit = TimeUnit.MINUTES) -public class MultiInstTest extends RealBaseTest { +public class MultiInstTest extends DbSetupTestBase { HawkServiceImpl himpl; BearServiceImpl bimpla; BearServiceImpl bimpl1; diff --git a/transact/src/test/java/dev/dbos/transact/invocation/StartWorkflowTest.java b/transact/src/test/java/dev/dbos/transact/invocation/StartWorkflowTest.java index 11bd134d..2bb6ae79 100644 --- a/transact/src/test/java/dev/dbos/transact/invocation/StartWorkflowTest.java +++ b/transact/src/test/java/dev/dbos/transact/invocation/StartWorkflowTest.java @@ -5,7 +5,7 @@ import static org.junit.jupiter.api.Assertions.assertNull; import dev.dbos.transact.DBOS; -import dev.dbos.transact.RealBaseTest; +import dev.dbos.transact.DbSetupTestBase; import dev.dbos.transact.StartWorkflowOptions; import dev.dbos.transact.database.SystemDatabase; import dev.dbos.transact.utils.DBUtils; @@ -21,7 +21,7 @@ import org.junit.jupiter.api.Test; @org.junit.jupiter.api.Timeout(value = 2, unit = TimeUnit.MINUTES) -public class StartWorkflowTest extends RealBaseTest { +public class StartWorkflowTest extends DbSetupTestBase { private HawkService proxy; private HikariDataSource dataSource; private String localDate = LocalDate.now().format(DateTimeFormatter.ISO_DATE); diff --git a/transact/src/test/java/dev/dbos/transact/migrations/BackCompatTest.java b/transact/src/test/java/dev/dbos/transact/migrations/BackCompatTest.java index 784864cc..81c58f95 100644 --- a/transact/src/test/java/dev/dbos/transact/migrations/BackCompatTest.java +++ b/transact/src/test/java/dev/dbos/transact/migrations/BackCompatTest.java @@ -3,7 +3,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import dev.dbos.transact.DBOS; -import dev.dbos.transact.RealBaseTest; +import dev.dbos.transact.DbSetupTestBase; import dev.dbos.transact.database.SystemDatabase; import dev.dbos.transact.invocation.HawkService; import dev.dbos.transact.invocation.HawkServiceImpl; @@ -19,7 +19,7 @@ import org.junit.jupiter.api.Test; @org.junit.jupiter.api.Timeout(value = 2, unit = TimeUnit.MINUTES) -public class BackCompatTest extends RealBaseTest { +public class BackCompatTest extends DbSetupTestBase { @BeforeEach void onetimeSetup() throws Exception { diff --git a/transact/src/test/java/dev/dbos/transact/migrations/MigrationManagerTest.java b/transact/src/test/java/dev/dbos/transact/migrations/MigrationManagerTest.java index 42cd3cea..7c39f150 100644 --- a/transact/src/test/java/dev/dbos/transact/migrations/MigrationManagerTest.java +++ b/transact/src/test/java/dev/dbos/transact/migrations/MigrationManagerTest.java @@ -6,7 +6,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue; import dev.dbos.transact.Constants; -import dev.dbos.transact.RealBaseTest; +import dev.dbos.transact.DbSetupTestBase; import dev.dbos.transact.config.DBOSConfig; import dev.dbos.transact.database.SystemDatabase; import dev.dbos.transact.utils.DBUtils; @@ -26,17 +26,18 @@ import org.junit.jupiter.api.Test; @org.junit.jupiter.api.Timeout(value = 2, unit = TimeUnit.MINUTES) -class MigrationManagerTest extends RealBaseTest { +class MigrationManagerTest extends DbSetupTestBase { private DataSource testDataSource; @BeforeEach void setup() throws Exception { - dbosConfig = DBOSConfig.defaultsFromEnv("migrationtest") - .withDatabaseUrl(postgres.getJdbcUrl()) - .withDbUser(postgres.getUsername()) - .withDbPassword(postgres.getPassword()) - .withMaximumPoolSize(2); + dbosConfig = + DBOSConfig.defaultsFromEnv("migrationtest") + .withDatabaseUrl(postgres.getJdbcUrl()) + .withDbUser(postgres.getUsername()) + .withDbPassword(postgres.getPassword()) + .withMaximumPoolSize(2); DBUtils.recreateDB(dbosConfig); testDataSource = SystemDatabase.createDataSource(dbosConfig); diff --git a/transact/src/test/java/dev/dbos/transact/notifications/EventsTest.java b/transact/src/test/java/dev/dbos/transact/notifications/EventsTest.java index 6ce974e3..f9ba397b 100644 --- a/transact/src/test/java/dev/dbos/transact/notifications/EventsTest.java +++ b/transact/src/test/java/dev/dbos/transact/notifications/EventsTest.java @@ -6,7 +6,7 @@ import dev.dbos.transact.DBOS; import dev.dbos.transact.DBOSTestAccess; -import dev.dbos.transact.RealBaseTest; +import dev.dbos.transact.DbSetupTestBase; import dev.dbos.transact.StartWorkflowOptions; import dev.dbos.transact.context.WorkflowOptions; import dev.dbos.transact.database.SystemDatabase; @@ -29,7 +29,7 @@ import org.junit.jupiter.api.Test; @org.junit.jupiter.api.Timeout(value = 2, unit = TimeUnit.MINUTES) -public class EventsTest extends RealBaseTest { +public class EventsTest extends DbSetupTestBase { private static DataSource dataSource; diff --git a/transact/src/test/java/dev/dbos/transact/notifications/NotificationServiceTest.java b/transact/src/test/java/dev/dbos/transact/notifications/NotificationServiceTest.java index 3ae87556..77f10b46 100644 --- a/transact/src/test/java/dev/dbos/transact/notifications/NotificationServiceTest.java +++ b/transact/src/test/java/dev/dbos/transact/notifications/NotificationServiceTest.java @@ -3,7 +3,7 @@ import static org.junit.jupiter.api.Assertions.*; import dev.dbos.transact.DBOS; -import dev.dbos.transact.RealBaseTest; +import dev.dbos.transact.DbSetupTestBase; import dev.dbos.transact.StartWorkflowOptions; import dev.dbos.transact.context.WorkflowOptions; import dev.dbos.transact.utils.DBUtils; @@ -23,7 +23,7 @@ import org.junit.jupiter.api.Test; @org.junit.jupiter.api.Timeout(value = 2, unit = TimeUnit.MINUTES) -class NotificationServiceTest extends RealBaseTest { +class NotificationServiceTest extends DbSetupTestBase { @BeforeEach void beforeEachTest() throws SQLException { diff --git a/transact/src/test/java/dev/dbos/transact/queue/QueuesTest.java b/transact/src/test/java/dev/dbos/transact/queue/QueuesTest.java index 58f9636e..6557d86b 100644 --- a/transact/src/test/java/dev/dbos/transact/queue/QueuesTest.java +++ b/transact/src/test/java/dev/dbos/transact/queue/QueuesTest.java @@ -32,7 +32,7 @@ import org.slf4j.LoggerFactory; @org.junit.jupiter.api.Timeout(value = 2, unit = TimeUnit.MINUTES) -public class QueuesTest extends RealBaseTest { +public class QueuesTest extends DbSetupTestBase { private static final Logger logger = LoggerFactory.getLogger(QueuesTest.class); diff --git a/transact/src/test/java/dev/dbos/transact/scheduled/SchedulerServiceTest.java b/transact/src/test/java/dev/dbos/transact/scheduled/SchedulerServiceTest.java index 2f1a8228..be3942cb 100644 --- a/transact/src/test/java/dev/dbos/transact/scheduled/SchedulerServiceTest.java +++ b/transact/src/test/java/dev/dbos/transact/scheduled/SchedulerServiceTest.java @@ -5,7 +5,7 @@ import dev.dbos.transact.Constants; import dev.dbos.transact.DBOS; import dev.dbos.transact.DBOSTestAccess; -import dev.dbos.transact.RealBaseTest; +import dev.dbos.transact.DbSetupTestBase; import dev.dbos.transact.utils.DBUtils; import dev.dbos.transact.workflow.ListWorkflowsInput; import dev.dbos.transact.workflow.Queue; @@ -20,7 +20,7 @@ import org.junitpioneer.jupiter.RetryingTest; @org.junit.jupiter.api.Timeout(value = 2, unit = TimeUnit.MINUTES) -class SchedulerServiceTest extends RealBaseTest { +class SchedulerServiceTest extends DbSetupTestBase { @BeforeEach void beforeEachTest() throws SQLException { diff --git a/transact/src/test/java/dev/dbos/transact/step/StepsTest.java b/transact/src/test/java/dev/dbos/transact/step/StepsTest.java index acae0499..ad610c2c 100644 --- a/transact/src/test/java/dev/dbos/transact/step/StepsTest.java +++ b/transact/src/test/java/dev/dbos/transact/step/StepsTest.java @@ -3,7 +3,7 @@ import static org.junit.jupiter.api.Assertions.*; import dev.dbos.transact.DBOS; -import dev.dbos.transact.RealBaseTest; +import dev.dbos.transact.DbSetupTestBase; import dev.dbos.transact.context.WorkflowOptions; import dev.dbos.transact.utils.DBUtils; import dev.dbos.transact.workflow.*; @@ -15,7 +15,7 @@ import org.junit.jupiter.api.*; @org.junit.jupiter.api.Timeout(value = 2, unit = TimeUnit.MINUTES) -public class StepsTest extends RealBaseTest { +public class StepsTest extends DbSetupTestBase { @BeforeEach void beforeEachTest() throws SQLException { diff --git a/transact/src/test/java/dev/dbos/transact/workflow/AsyncWorkflowTest.java b/transact/src/test/java/dev/dbos/transact/workflow/AsyncWorkflowTest.java index 946f3a31..5b790744 100644 --- a/transact/src/test/java/dev/dbos/transact/workflow/AsyncWorkflowTest.java +++ b/transact/src/test/java/dev/dbos/transact/workflow/AsyncWorkflowTest.java @@ -5,7 +5,7 @@ import static org.junit.jupiter.api.Assertions.assertThrows; import dev.dbos.transact.DBOS; -import dev.dbos.transact.RealBaseTest; +import dev.dbos.transact.DbSetupTestBase; import dev.dbos.transact.StartWorkflowOptions; import dev.dbos.transact.context.WorkflowOptions; import dev.dbos.transact.utils.DBUtils; @@ -17,7 +17,7 @@ import org.junit.jupiter.api.*; @org.junit.jupiter.api.Timeout(value = 2, unit = TimeUnit.MINUTES) -public class AsyncWorkflowTest extends RealBaseTest { +public class AsyncWorkflowTest extends DbSetupTestBase { @BeforeEach void beforeEachTest() throws SQLException { diff --git a/transact/src/test/java/dev/dbos/transact/workflow/QueueChildWorkflowTest.java b/transact/src/test/java/dev/dbos/transact/workflow/QueueChildWorkflowTest.java index 26e8060c..ea0f41a6 100644 --- a/transact/src/test/java/dev/dbos/transact/workflow/QueueChildWorkflowTest.java +++ b/transact/src/test/java/dev/dbos/transact/workflow/QueueChildWorkflowTest.java @@ -3,7 +3,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import dev.dbos.transact.DBOS; -import dev.dbos.transact.RealBaseTest; +import dev.dbos.transact.DbSetupTestBase; import dev.dbos.transact.StartWorkflowOptions; import dev.dbos.transact.utils.DBUtils; @@ -16,7 +16,7 @@ import org.junit.jupiter.api.Test; @org.junit.jupiter.api.Timeout(value = 2, unit = TimeUnit.MINUTES) -public class QueueChildWorkflowTest extends RealBaseTest { +public class QueueChildWorkflowTest extends DbSetupTestBase { @BeforeEach void beforeEachTest() throws SQLException { diff --git a/transact/src/test/java/dev/dbos/transact/workflow/SyncWorkflowTest.java b/transact/src/test/java/dev/dbos/transact/workflow/SyncWorkflowTest.java index a1b71bb4..25218877 100644 --- a/transact/src/test/java/dev/dbos/transact/workflow/SyncWorkflowTest.java +++ b/transact/src/test/java/dev/dbos/transact/workflow/SyncWorkflowTest.java @@ -3,7 +3,7 @@ import static org.junit.jupiter.api.Assertions.*; import dev.dbos.transact.DBOS; -import dev.dbos.transact.RealBaseTest; +import dev.dbos.transact.DbSetupTestBase; import dev.dbos.transact.context.WorkflowOptions; import dev.dbos.transact.utils.DBUtils; @@ -14,7 +14,7 @@ import org.junit.jupiter.api.*; @org.junit.jupiter.api.Timeout(value = 2, unit = TimeUnit.MINUTES) -public class SyncWorkflowTest extends RealBaseTest { +public class SyncWorkflowTest extends DbSetupTestBase { @BeforeEach void beforeEachTest() throws SQLException { diff --git a/transact/src/test/java/dev/dbos/transact/workflow/TimeoutTest.java b/transact/src/test/java/dev/dbos/transact/workflow/TimeoutTest.java index ad09778f..c7ad946e 100644 --- a/transact/src/test/java/dev/dbos/transact/workflow/TimeoutTest.java +++ b/transact/src/test/java/dev/dbos/transact/workflow/TimeoutTest.java @@ -4,7 +4,7 @@ import dev.dbos.transact.DBOS; import dev.dbos.transact.DBOSTestAccess; -import dev.dbos.transact.RealBaseTest; +import dev.dbos.transact.DbSetupTestBase; import dev.dbos.transact.StartWorkflowOptions; import dev.dbos.transact.context.WorkflowOptions; import dev.dbos.transact.database.SystemDatabase; @@ -25,7 +25,7 @@ import org.junitpioneer.jupiter.RetryingTest; @org.junit.jupiter.api.Timeout(value = 2, unit = TimeUnit.MINUTES) -public class TimeoutTest extends RealBaseTest { +public class TimeoutTest extends DbSetupTestBase { private static DataSource dataSource; diff --git a/transact/src/test/java/dev/dbos/transact/workflow/UnifiedProxyTest.java b/transact/src/test/java/dev/dbos/transact/workflow/UnifiedProxyTest.java index 71815e59..66c92025 100644 --- a/transact/src/test/java/dev/dbos/transact/workflow/UnifiedProxyTest.java +++ b/transact/src/test/java/dev/dbos/transact/workflow/UnifiedProxyTest.java @@ -3,7 +3,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import dev.dbos.transact.DBOS; -import dev.dbos.transact.RealBaseTest; +import dev.dbos.transact.DbSetupTestBase; import dev.dbos.transact.StartWorkflowOptions; import dev.dbos.transact.context.WorkflowOptions; import dev.dbos.transact.utils.DBUtils; @@ -17,7 +17,7 @@ import org.junit.jupiter.api.Test; @org.junit.jupiter.api.Timeout(value = 2, unit = TimeUnit.MINUTES) -public class UnifiedProxyTest extends RealBaseTest { +public class UnifiedProxyTest extends DbSetupTestBase { @BeforeEach void beforeEachTest() throws SQLException { diff --git a/transact/src/test/java/dev/dbos/transact/workflow/WorkflowMgmtTest.java b/transact/src/test/java/dev/dbos/transact/workflow/WorkflowMgmtTest.java index 88edd521..c970ee70 100644 --- a/transact/src/test/java/dev/dbos/transact/workflow/WorkflowMgmtTest.java +++ b/transact/src/test/java/dev/dbos/transact/workflow/WorkflowMgmtTest.java @@ -4,7 +4,7 @@ import dev.dbos.transact.DBOS; import dev.dbos.transact.DBOSTestAccess; -import dev.dbos.transact.RealBaseTest; +import dev.dbos.transact.DbSetupTestBase; import dev.dbos.transact.StartWorkflowOptions; import dev.dbos.transact.context.WorkflowOptions; import dev.dbos.transact.exceptions.DBOSAwaitedWorkflowCancelledException; @@ -27,7 +27,7 @@ import org.slf4j.LoggerFactory; @org.junit.jupiter.api.Timeout(value = 2, unit = TimeUnit.MINUTES) -public class WorkflowMgmtTest extends RealBaseTest { +public class WorkflowMgmtTest extends DbSetupTestBase { private static final Logger logger = LoggerFactory.getLogger(WorkflowMgmtTest.class); From 32e7902dbb47d575cc22305b049be9c4c8932430 Mon Sep 17 00:00:00 2001 From: "hannes.oswald" Date: Wed, 19 Nov 2025 19:24:59 +0100 Subject: [PATCH 04/15] use inherited method --- .../java/dev/dbos/transact/client/ClientTest.java | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/transact/src/test/java/dev/dbos/transact/client/ClientTest.java b/transact/src/test/java/dev/dbos/transact/client/ClientTest.java index 490e197b..cd125d61 100644 --- a/transact/src/test/java/dev/dbos/transact/client/ClientTest.java +++ b/transact/src/test/java/dev/dbos/transact/client/ClientTest.java @@ -21,7 +21,6 @@ import java.util.concurrent.TimeUnit; import com.zaxxer.hikari.HikariDataSource; -import org.jetbrains.annotations.NotNull; import org.junit.jupiter.api.*; @org.junit.jupiter.api.Timeout(value = 2, unit = TimeUnit.MINUTES) @@ -52,7 +51,7 @@ public void clientEnqueue() throws Exception { var qs = DBOSTestAccess.getQueueService(); qs.pause(); - try (var client = getDbosClient()) { + try (var client = getDBOSClient()) { var options = new DBOSClient.EnqueueOptions( "dev.dbos.transact.client.ClientServiceImpl", "enqueueTest", "testQueue"); @@ -81,7 +80,7 @@ public void clientEnqueueDeDupe() throws Exception { var qs = DBOSTestAccess.getQueueService(); qs.pause(); - try (var client = getDbosClient()) { + try (var client = getDBOSClient()) { var options = new DBOSClient.EnqueueOptions( "dev.dbos.transact.client.ClientServiceImpl", "enqueueTest", "testQueue") @@ -101,7 +100,7 @@ public void clientSend() throws Exception { var idempotencyKey = UUID.randomUUID().toString(); - try (var client = getDbosClient()) { + try (var client = getDBOSClient()) { client.send(handle.workflowId(), "test.message", "test-topic", idempotencyKey); } @@ -117,7 +116,7 @@ public void clientSend() throws Exception { @Test public void clientEnqueueTimeouts() throws Exception { - try (var client = getDbosClient()) { + try (var client = getDBOSClient()) { var options = new DBOSClient.EnqueueOptions( "dev.dbos.transact.client.ClientServiceImpl", "sleep", "testQueue"); @@ -149,8 +148,4 @@ public void clientEnqueueTimeouts() throws Exception { stat2.orElseThrow(() -> new AssertionError("Workflow status not found")).status()); } } - - private static @NotNull DBOSClient getDbosClient() { - return new DBOSClient(postgres.getJdbcUrl(), postgres.getUsername(), postgres.getPassword()); - } } From 4d8d7e5a43d1e34d8e57b32717a10d68caa31f10 Mon Sep 17 00:00:00 2001 From: "hannes.oswald" Date: Wed, 19 Nov 2025 19:30:30 +0100 Subject: [PATCH 05/15] fix after sync with upstream --- .../java/dev/dbos/transact/issues/Issue218.java | 14 ++------------ .../dbos/transact/workflow/WorkflowMgmtTest.java | 15 ++------------- 2 files changed, 4 insertions(+), 25 deletions(-) diff --git a/transact/src/test/java/dev/dbos/transact/issues/Issue218.java b/transact/src/test/java/dev/dbos/transact/issues/Issue218.java index 4d60d690..7ffa2c0f 100644 --- a/transact/src/test/java/dev/dbos/transact/issues/Issue218.java +++ b/transact/src/test/java/dev/dbos/transact/issues/Issue218.java @@ -7,8 +7,8 @@ import static org.junit.jupiter.api.Assertions.assertTrue; import dev.dbos.transact.DBOS; +import dev.dbos.transact.DbSetupTestBase; import dev.dbos.transact.StartWorkflowOptions; -import dev.dbos.transact.config.DBOSConfig; import dev.dbos.transact.database.SystemDatabase; import dev.dbos.transact.utils.DBUtils; import dev.dbos.transact.workflow.Queue; @@ -21,7 +21,6 @@ import com.zaxxer.hikari.HikariDataSource; import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -78,18 +77,9 @@ public void parentParallel() throws Exception { } // @org.junit.jupiter.api.Timeout(value = 2, unit = TimeUnit.MINUTES) -public class Issue218 { - private static DBOSConfig dbosConfig; +public class Issue218 extends DbSetupTestBase { private HikariDataSource dataSource; - @BeforeAll - static void onetimeSetup() throws Exception { - dbosConfig = - DBOSConfig.defaultsFromEnv("systemdbtest") - .withDatabaseUrl("jdbc:postgresql://localhost:5432/dbos_java_sys") - .withMaximumPoolSize(2); - } - @BeforeEach void beforeEachTest() throws SQLException { DBUtils.recreateDB(dbosConfig); diff --git a/transact/src/test/java/dev/dbos/transact/workflow/WorkflowMgmtTest.java b/transact/src/test/java/dev/dbos/transact/workflow/WorkflowMgmtTest.java index 01eda0d5..87728812 100644 --- a/transact/src/test/java/dev/dbos/transact/workflow/WorkflowMgmtTest.java +++ b/transact/src/test/java/dev/dbos/transact/workflow/WorkflowMgmtTest.java @@ -4,8 +4,8 @@ import dev.dbos.transact.DBOS; import dev.dbos.transact.DBOSTestAccess; +import dev.dbos.transact.DbSetupTestBase; import dev.dbos.transact.StartWorkflowOptions; -import dev.dbos.transact.config.DBOSConfig; import dev.dbos.transact.context.WorkflowOptions; import dev.dbos.transact.database.SystemDatabase; import dev.dbos.transact.exceptions.DBOSAwaitedWorkflowCancelledException; @@ -23,7 +23,6 @@ import javax.sql.DataSource; import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junitpioneer.jupiter.RetryingTest; @@ -31,22 +30,12 @@ import org.slf4j.LoggerFactory; @org.junit.jupiter.api.Timeout(value = 2, unit = TimeUnit.MINUTES) -public class WorkflowMgmtTest { +public class WorkflowMgmtTest extends DbSetupTestBase { private static final Logger logger = LoggerFactory.getLogger(WorkflowMgmtTest.class); - private static DBOSConfig dbosConfig; private static DataSource dataSource; - @BeforeAll - static void onetimeSetup() throws Exception { - - WorkflowMgmtTest.dbosConfig = - DBOSConfig.defaultsFromEnv("systemdbtest") - .withDatabaseUrl("jdbc:postgresql://localhost:5432/dbos_java_sys") - .withMaximumPoolSize(2); - } - @BeforeEach void beforeEachTest() throws SQLException { DBUtils.recreateDB(dbosConfig); From 89df37ea677099b5ad8c25a8b26ce46230ed0fe0 Mon Sep 17 00:00:00 2001 From: Harry Pierson Date: Mon, 1 Dec 2025 15:44:29 -0800 Subject: [PATCH 06/15] remove pg container from GH action --- .github/workflows/test.yml | 40 +++++++++++++++++++------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 9debdf8a..4df2c830 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -22,18 +22,18 @@ jobs: - jdk-distro: graalvm jdk-version: 17.0.12 - services: - postgres: - image: sibedge/postgres-plv8:16.3-3.2.2 - env: - POSTGRES_PASSWORD: dbos - options: >- - --health-cmd pg_isready - --health-interval 10s - --health-timeout 5s - --health-retries 5 - ports: - - 5432:5432 + # services: + # postgres: + # image: sibedge/postgres-plv8:16.3-3.2.2 + # env: + # POSTGRES_PASSWORD: dbos + # options: >- + # --health-cmd pg_isready + # --health-interval 10s + # --health-timeout 5s + # --health-retries 5 + # ports: + # - 5432:5432 steps: - name: Checkout code @@ -48,14 +48,14 @@ jobs: - name: Setup Gradle uses: gradle/actions/setup-gradle@v4 - - name: Wait for PostgreSQL - run: | - until pg_isready -h localhost -p 5432 -U postgres; do - echo "Waiting for PostgreSQL..." - sleep 2 - done - env: - PGPASSWORD: dbos + # - name: Wait for PostgreSQL + # run: | + # until pg_isready -h localhost -p 5432 -U postgres; do + # echo "Waiting for PostgreSQL..." + # sleep 2 + # done + # env: + # PGPASSWORD: dbos - name: Run tests run: ./gradlew clean build From 4dfc711dceecd8575371b8298c294a44b97e93d5 Mon Sep 17 00:00:00 2001 From: "hannes.oswald" Date: Mon, 12 Jan 2026 20:55:25 +0100 Subject: [PATCH 07/15] revert changes in test.yml --- .github/workflows/test.yml | 40 +++++++++++++++++++------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 050c18ac..69fdd2fb 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -22,18 +22,18 @@ jobs: - jdk-distro: graalvm jdk-version: 17.0.12 - # services: - # postgres: - # image: sibedge/postgres-plv8:16.3-3.2.2 - # env: - # POSTGRES_PASSWORD: dbos - # options: >- - # --health-cmd pg_isready - # --health-interval 10s - # --health-timeout 5s - # --health-retries 5 - # ports: - # - 5432:5432 + services: + postgres: + image: sibedge/postgres-plv8:16.3-3.2.2 + env: + POSTGRES_PASSWORD: dbos + options: >- + --health-cmd pg_isready + --health-interval 10s + --health-timeout 5s + --health-retries 5 + ports: + - 5432:5432 steps: - name: Checkout code @@ -50,14 +50,14 @@ jobs: - name: Setup Gradle uses: gradle/actions/setup-gradle@v4 - # - name: Wait for PostgreSQL - # run: | - # until pg_isready -h localhost -p 5432 -U postgres; do - # echo "Waiting for PostgreSQL..." - # sleep 2 - # done - # env: - # PGPASSWORD: dbos + - name: Wait for PostgreSQL + run: | + until pg_isready -h localhost -p 5432 -U postgres; do + echo "Waiting for PostgreSQL..." + sleep 2 + done + env: + PGPASSWORD: dbos - name: Run tests run: ./gradlew clean build From 69e4c8ca54c9d76ef49d4e0b72094394c1895ecd Mon Sep 17 00:00:00 2001 From: "hannes.oswald" Date: Mon, 12 Jan 2026 20:57:38 +0100 Subject: [PATCH 08/15] update testcontainers dependency --- transact/build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/transact/build.gradle.kts b/transact/build.gradle.kts index 55d81c0e..780f459e 100644 --- a/transact/build.gradle.kts +++ b/transact/build.gradle.kts @@ -45,7 +45,7 @@ dependencies { testImplementation("io.rest-assured:rest-assured:5.4.0") testImplementation("io.rest-assured:json-path:5.4.0") testImplementation("io.rest-assured:xml-path:5.4.0") - testImplementation("org.testcontainers:postgresql:1.21.3") + testImplementation("org.testcontainers:testcontainers-postgresql:2.0.3") testImplementation("org.apache.maven:maven-artifact:3.9.11") } From f925c390fbbbfd15e07e67311822f10a6246e858 Mon Sep 17 00:00:00 2001 From: "hannes.oswald" Date: Mon, 12 Jan 2026 21:01:04 +0100 Subject: [PATCH 09/15] update testcontainers --- transact/src/test/java/dev/dbos/transact/DbSetupTestBase.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/transact/src/test/java/dev/dbos/transact/DbSetupTestBase.java b/transact/src/test/java/dev/dbos/transact/DbSetupTestBase.java index 38103b30..2889ec72 100644 --- a/transact/src/test/java/dev/dbos/transact/DbSetupTestBase.java +++ b/transact/src/test/java/dev/dbos/transact/DbSetupTestBase.java @@ -6,11 +6,11 @@ import com.zaxxer.hikari.HikariDataSource; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; -import org.testcontainers.containers.PostgreSQLContainer; +import org.testcontainers.postgresql.PostgreSQLContainer; public class DbSetupTestBase { - protected static final PostgreSQLContainer postgres = new PostgreSQLContainer<>("postgres:18"); + protected static final PostgreSQLContainer postgres = new PostgreSQLContainer("postgres:18"); protected static DBOSConfig dbosConfig; protected static HikariDataSource dataSource; From b8d91564b9984fdfee7bb9d4bb577a3d5e21d765 Mon Sep 17 00:00:00 2001 From: "hannes.oswald" Date: Mon, 12 Jan 2026 21:04:52 +0100 Subject: [PATCH 10/15] fix formatting --- .../src/test/java/dev/dbos/transact/config/ConfigTest.java | 4 +--- .../test/java/dev/dbos/transact/database/MetricsTest.java | 1 - .../dev/dbos/transact/execution/SingleExecutionTest.java | 2 -- .../java/dev/dbos/transact/notifications/EventsTest.java | 2 +- .../dev/dbos/transact/queue/PartitionedQueuesTest.java | 7 ++----- .../src/test/java/dev/dbos/transact/workflow/ForkTest.java | 3 --- .../dev/dbos/transact/workflow/GarbageCollectionTest.java | 1 - .../java/dev/dbos/transact/workflow/WorkflowMgmtTest.java | 1 - 8 files changed, 4 insertions(+), 17 deletions(-) diff --git a/transact/src/test/java/dev/dbos/transact/config/ConfigTest.java b/transact/src/test/java/dev/dbos/transact/config/ConfigTest.java index 3ce66293..09ec7689 100644 --- a/transact/src/test/java/dev/dbos/transact/config/ConfigTest.java +++ b/transact/src/test/java/dev/dbos/transact/config/ConfigTest.java @@ -136,9 +136,7 @@ public void conductorExecutorId() throws Exception { @Test public void cantSetExecutorIdWhenUsingConductor() throws Exception { var config = - dbosConfig - .withConductorKey("test-conductor-key") - .withExecutorId("test-executor-id"); + dbosConfig.withConductorKey("test-conductor-key").withExecutorId("test-executor-id"); DBOS.reinitialize(config); try { diff --git a/transact/src/test/java/dev/dbos/transact/database/MetricsTest.java b/transact/src/test/java/dev/dbos/transact/database/MetricsTest.java index cfc77617..79175f8c 100644 --- a/transact/src/test/java/dev/dbos/transact/database/MetricsTest.java +++ b/transact/src/test/java/dev/dbos/transact/database/MetricsTest.java @@ -13,7 +13,6 @@ import java.util.stream.Collectors; import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; diff --git a/transact/src/test/java/dev/dbos/transact/execution/SingleExecutionTest.java b/transact/src/test/java/dev/dbos/transact/execution/SingleExecutionTest.java index d388edba..3f2d58b5 100644 --- a/transact/src/test/java/dev/dbos/transact/execution/SingleExecutionTest.java +++ b/transact/src/test/java/dev/dbos/transact/execution/SingleExecutionTest.java @@ -18,9 +18,7 @@ import java.sql.SQLTransientException; import java.util.UUID; -import com.zaxxer.hikari.HikariDataSource; import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; diff --git a/transact/src/test/java/dev/dbos/transact/notifications/EventsTest.java b/transact/src/test/java/dev/dbos/transact/notifications/EventsTest.java index 0860725c..3e0c92e5 100644 --- a/transact/src/test/java/dev/dbos/transact/notifications/EventsTest.java +++ b/transact/src/test/java/dev/dbos/transact/notifications/EventsTest.java @@ -10,7 +10,6 @@ import dev.dbos.transact.DbSetupTestBase; import dev.dbos.transact.StartWorkflowOptions; import dev.dbos.transact.context.WorkflowOptions; -import dev.dbos.transact.database.SystemDatabase; import dev.dbos.transact.utils.DBUtils; import dev.dbos.transact.workflow.StepInfo; import dev.dbos.transact.workflow.Workflow; @@ -160,6 +159,7 @@ public class EventsTest extends DbSetupTestBase { private EventsService proxy; private EventsServiceImpl impl; + @BeforeEach void beforeEachTest() throws SQLException { DBUtils.recreateDB(dbosConfig); diff --git a/transact/src/test/java/dev/dbos/transact/queue/PartitionedQueuesTest.java b/transact/src/test/java/dev/dbos/transact/queue/PartitionedQueuesTest.java index fb7fcfc3..a1fc890d 100644 --- a/transact/src/test/java/dev/dbos/transact/queue/PartitionedQueuesTest.java +++ b/transact/src/test/java/dev/dbos/transact/queue/PartitionedQueuesTest.java @@ -9,7 +9,6 @@ import dev.dbos.transact.DBOSClient; import dev.dbos.transact.DbSetupTestBase; import dev.dbos.transact.StartWorkflowOptions; -import dev.dbos.transact.database.SystemDatabase; import dev.dbos.transact.utils.DBUtils; import dev.dbos.transact.workflow.Queue; import dev.dbos.transact.workflow.Workflow; @@ -19,10 +18,7 @@ import java.util.UUID; import java.util.concurrent.CountDownLatch; -import javax.sql.DataSource; - import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -170,7 +166,8 @@ public void testQueuePartitions() throws Exception { assertEquals(blockedBlockedHandle.workflowId(), blockedBlockedHandle.getResult()); assertEquals(blockedNormalHandle.workflowId(), blockedNormalHandle.getResult()); - try (var client = new DBOSClient(postgres.getJdbcUrl(), postgres.getUsername(), postgres.getPassword())) { + try (var client = + new DBOSClient(postgres.getJdbcUrl(), postgres.getUsername(), postgres.getPassword())) { var className = "dev.dbos.transact.queue.PartitionsTestServiceImpl"; var wfName = "normalWorkflow"; var nqOptions = diff --git a/transact/src/test/java/dev/dbos/transact/workflow/ForkTest.java b/transact/src/test/java/dev/dbos/transact/workflow/ForkTest.java index 3d26111e..919412f3 100644 --- a/transact/src/test/java/dev/dbos/transact/workflow/ForkTest.java +++ b/transact/src/test/java/dev/dbos/transact/workflow/ForkTest.java @@ -21,10 +21,7 @@ import java.util.UUID; import java.util.concurrent.TimeUnit; -import javax.sql.DataSource; - import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.slf4j.Logger; diff --git a/transact/src/test/java/dev/dbos/transact/workflow/GarbageCollectionTest.java b/transact/src/test/java/dev/dbos/transact/workflow/GarbageCollectionTest.java index bf211e11..57399b5d 100644 --- a/transact/src/test/java/dev/dbos/transact/workflow/GarbageCollectionTest.java +++ b/transact/src/test/java/dev/dbos/transact/workflow/GarbageCollectionTest.java @@ -14,7 +14,6 @@ import java.util.concurrent.CountDownLatch; import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; diff --git a/transact/src/test/java/dev/dbos/transact/workflow/WorkflowMgmtTest.java b/transact/src/test/java/dev/dbos/transact/workflow/WorkflowMgmtTest.java index 618c5b11..5e808c7c 100644 --- a/transact/src/test/java/dev/dbos/transact/workflow/WorkflowMgmtTest.java +++ b/transact/src/test/java/dev/dbos/transact/workflow/WorkflowMgmtTest.java @@ -3,7 +3,6 @@ import static org.junit.jupiter.api.Assertions.*; import dev.dbos.transact.DBOS; -import dev.dbos.transact.DBOSTestAccess; import dev.dbos.transact.DbSetupTestBase; import dev.dbos.transact.StartWorkflowOptions; import dev.dbos.transact.context.WorkflowOptions; From cecaccc127e76b4a4737aee9f62e064f9455ec53 Mon Sep 17 00:00:00 2001 From: "hannes.oswald" Date: Mon, 12 Jan 2026 21:27:48 +0100 Subject: [PATCH 11/15] fix EventsTest --- .../test/java/dev/dbos/transact/notifications/EventsTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/transact/src/test/java/dev/dbos/transact/notifications/EventsTest.java b/transact/src/test/java/dev/dbos/transact/notifications/EventsTest.java index 3e0c92e5..1794487b 100644 --- a/transact/src/test/java/dev/dbos/transact/notifications/EventsTest.java +++ b/transact/src/test/java/dev/dbos/transact/notifications/EventsTest.java @@ -162,6 +162,7 @@ public class EventsTest extends DbSetupTestBase { @BeforeEach void beforeEachTest() throws SQLException { + dataSource = DbSetupTestBase.dataSource; DBUtils.recreateDB(dbosConfig); DBOS.reinitialize(dbosConfig); impl = new EventsServiceImpl(); From cc97cf93561db6113644b045772ad194b9c24007 Mon Sep 17 00:00:00 2001 From: "hannes.oswald" Date: Mon, 12 Jan 2026 21:28:34 +0100 Subject: [PATCH 12/15] fix PatchTest --- .../src/test/java/dev/dbos/transact/invocation/PatchTest.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/transact/src/test/java/dev/dbos/transact/invocation/PatchTest.java b/transact/src/test/java/dev/dbos/transact/invocation/PatchTest.java index cb3b8565..8cc8dc01 100644 --- a/transact/src/test/java/dev/dbos/transact/invocation/PatchTest.java +++ b/transact/src/test/java/dev/dbos/transact/invocation/PatchTest.java @@ -5,7 +5,6 @@ import dev.dbos.transact.DBOS; import dev.dbos.transact.DBOSTestAccess; -import dev.dbos.transact.DbSetupTestBase; import dev.dbos.transact.config.DBOSConfig; import dev.dbos.transact.database.SystemDatabase; import dev.dbos.transact.exceptions.DBOSUnexpectedStepException; @@ -84,7 +83,7 @@ public int workflow() { } @org.junit.jupiter.api.Timeout(value = 2, unit = java.util.concurrent.TimeUnit.MINUTES) -public class PatchTest extends DbSetupTestBase { +public class PatchTest { private static final Logger logger = LoggerFactory.getLogger(PatchTest.class); From ae2ec8914b768072abb6ac667b5c66eda483a2fa Mon Sep 17 00:00:00 2001 From: "hannes.oswald" Date: Fri, 6 Mar 2026 20:32:08 +0100 Subject: [PATCH 13/15] update testcontainers version --- transact/build.gradle.kts | 1 + 1 file changed, 1 insertion(+) diff --git a/transact/build.gradle.kts b/transact/build.gradle.kts index e4a2a07f..0412715d 100644 --- a/transact/build.gradle.kts +++ b/transact/build.gradle.kts @@ -52,6 +52,7 @@ dependencies { testImplementation("io.rest-assured:json-path:6.0.0") testImplementation("io.rest-assured:xml-path:6.0.0") testImplementation("org.apache.maven:maven-artifact:3.9.12") + testImplementation("org.testcontainers:testcontainers-postgresql:2.0.3") } val projectVersion = project.version.toString() From b9894bc50fd054033a0a5c18c1fb6fffac45673e Mon Sep 17 00:00:00 2001 From: "hannes.oswald" Date: Fri, 6 Mar 2026 20:44:26 +0100 Subject: [PATCH 14/15] fix some things --- .../dev/dbos/transact/DBOSTestAccess.java | 2 +- .../dev/dbos/transact/DbSetupTestBase.java | 3 +- .../dev/dbos/transact/client/ClientTest.java | 33 ++++++++++--------- .../dev/dbos/transact/config/ConfigTest.java | 18 +++++----- .../dbos/transact/database/MetricsTest.java | 2 +- .../transact/execution/DBOSExecutorTest.java | 2 +- .../transact/execution/LifecycleTest.java | 2 +- .../execution/RecoveryServiceTest.java | 4 +-- .../execution/SingleExecutionTest.java | 2 +- .../transact/invocation/CustomSchemaTest.java | 3 +- .../invocation/DirectInvocationTest.java | 3 +- .../invocation/MultiClassInstanceTest.java | 4 +-- .../invocation/StartWorkflowTest.java | 3 +- .../dev/dbos/transact/issues/Issue218.java | 3 +- .../migrations/MigrationManagerTest.java | 3 +- .../transact/notifications/EventsTest.java | 2 +- .../NotificationServiceTest.java | 3 +- .../transact/queue/PartitionedQueuesTest.java | 7 ++-- .../dev/dbos/transact/queue/QueuesTest.java | 4 +-- .../scheduled/SchedulerServiceTest.java | 2 +- .../dev/dbos/transact/step/StepsTest.java | 3 +- .../transact/workflow/AsyncWorkflowTest.java | 3 +- .../dev/dbos/transact/workflow/ForkTest.java | 2 +- .../workflow/GarbageCollectionTest.java | 2 +- .../workflow/QueueChildWorkflowTest.java | 3 +- .../transact/workflow/SyncWorkflowTest.java | 3 +- .../dbos/transact/workflow/TimeoutTest.java | 2 +- .../transact/workflow/UnifiedProxyTest.java | 3 +- .../transact/workflow/WorkflowMgmtTest.java | 3 +- 29 files changed, 68 insertions(+), 61 deletions(-) diff --git a/transact/src/test/java/dev/dbos/transact/DBOSTestAccess.java b/transact/src/test/java/dev/dbos/transact/DBOSTestAccess.java index 7106948a..5a489a43 100644 --- a/transact/src/test/java/dev/dbos/transact/DBOSTestAccess.java +++ b/transact/src/test/java/dev/dbos/transact/DBOSTestAccess.java @@ -19,7 +19,7 @@ public static DBOSExecutor getDbosExecutor() { } public static void reinitialize(DBOSConfig config) { - DBOS.reinitialize(config); + DBOSTestAccess.reinitialize(config); } // public static void clearRegistry() { diff --git a/transact/src/test/java/dev/dbos/transact/DbSetupTestBase.java b/transact/src/test/java/dev/dbos/transact/DbSetupTestBase.java index 2889ec72..98f052e3 100644 --- a/transact/src/test/java/dev/dbos/transact/DbSetupTestBase.java +++ b/transact/src/test/java/dev/dbos/transact/DbSetupTestBase.java @@ -22,8 +22,7 @@ static void onetimeSetup() { DBOSConfig.defaults("systemdbtest") .withDatabaseUrl(postgres.getJdbcUrl()) .withDbUser(postgres.getUsername()) - .withDbPassword(postgres.getPassword()) - .withMaximumPoolSize(2); + .withDbPassword(postgres.getPassword()); dataSource = SystemDatabase.createDataSource(dbosConfig); } diff --git a/transact/src/test/java/dev/dbos/transact/client/ClientTest.java b/transact/src/test/java/dev/dbos/transact/client/ClientTest.java index bdf4cf81..dc58776b 100644 --- a/transact/src/test/java/dev/dbos/transact/client/ClientTest.java +++ b/transact/src/test/java/dev/dbos/transact/client/ClientTest.java @@ -30,7 +30,7 @@ public class ClientTest extends DbSetupTestBase { @BeforeEach void beforeEachTest() throws SQLException { DBUtils.recreateDB(dbosConfig); - DBOS.reinitialize(dbosConfig); + DBOSTestAccess.reinitialize(dbosConfig); DBOS.registerQueue(new Queue("testQueue")); service = DBOS.registerWorkflows(ClientService.class, new ClientServiceImpl()); DBOS.launch(); @@ -92,9 +92,7 @@ public void clientEnqueue() throws Exception { qs.pause(); try (var client = getDBOSClient()) { - var options = - new DBOSClient.EnqueueOptions( - "dev.dbos.transact.client.ClientServiceImpl", "enqueueTest", "testQueue"); + var options = new DBOSClient.EnqueueOptions("ClientServiceImpl", "enqueueTest", "testQueue"); var handle = client.enqueueWorkflow(options, new Object[] {42, "spam"}); var rows = DBUtils.getWorkflowRows(dataSource); assertEquals(1, rows.size()); @@ -122,8 +120,7 @@ public void clientEnqueueDeDupe() throws Exception { try (var client = getDBOSClient()) { var options = - new DBOSClient.EnqueueOptions( - "dev.dbos.transact.client.ClientServiceImpl", "enqueueTest", "testQueue") + new DBOSClient.EnqueueOptions("ClientServiceImpl", "enqueueTest", "testQueue") .withDeduplicationId("plugh!"); var handle = client.enqueueWorkflow(options, new Object[] {42, "spam"}); assertNotNull(handle); @@ -144,22 +141,13 @@ public void clientSend() throws Exception { client.send(handle.workflowId(), "test.message", "test-topic", idempotencyKey); } - var workflowId = "%s-%s".formatted(handle.workflowId(), idempotencyKey); - var sendHandle = DBOS.retrieveWorkflow(workflowId); - assertNotNull(sendHandle); - var status = sendHandle.getStatus(); - assertNotNull(status); - assertEquals("SUCCESS", status.status()); - assertEquals("42-test.message", handle.getResult()); } @Test public void clientEnqueueTimeouts() throws Exception { try (var client = getDBOSClient()) { - var options = - new DBOSClient.EnqueueOptions( - "dev.dbos.transact.client.ClientServiceImpl", "sleep", "testQueue"); + var options = new DBOSClient.EnqueueOptions("ClientServiceImpl", "sleep", "testQueue"); var handle1 = client.enqueueWorkflow(options.withTimeout(Duration.ofSeconds(1)), new Object[] {10000}); @@ -188,4 +176,17 @@ public void clientEnqueueTimeouts() throws Exception { stat2.orElseThrow(() -> new AssertionError("Workflow status not found")).status()); } } + + @Test + public void invalidSend() throws Exception { + var invalidWorkflowId = UUID.randomUUID().toString(); + + try (var client = new DBOSClient(dbUrl, dbUser, dbPassword)) { + var ex = + assertThrows( + DBOSNonExistentWorkflowException.class, + () -> client.send(invalidWorkflowId, "test.message", null, null)); + assertTrue(ex.getMessage().contains(invalidWorkflowId)); + } + } } diff --git a/transact/src/test/java/dev/dbos/transact/config/ConfigTest.java b/transact/src/test/java/dev/dbos/transact/config/ConfigTest.java index 09ec7689..f55cc5c4 100644 --- a/transact/src/test/java/dev/dbos/transact/config/ConfigTest.java +++ b/transact/src/test/java/dev/dbos/transact/config/ConfigTest.java @@ -47,7 +47,7 @@ public void configOverridesEnvAppVerAndExecutor() throws Exception { var config = dbosConfig.withAppVersion("test-app-version").withExecutorId("test-executor-id"); - DBOS.reinitialize(config); + DBOSTestAccess.reinitialize(config); try { DBOS.launch(); var dbosExecutor = DBOSTestAccess.getDbosExecutor(); @@ -68,7 +68,7 @@ public void envAppVerAndExecutor() throws Exception { var config = dbosConfig; - DBOS.reinitialize(config); + DBOSTestAccess.reinitialize(config); try { DBOS.launch(); var dbosExecutor = DBOSTestAccess.getDbosExecutor(); @@ -90,7 +90,7 @@ public void dbosCloudEnvOverridesConfigAppVerAndExecutor() throws Exception { var config = dbosConfig.withAppVersion("test-app-version").withExecutorId("test-executor-id"); - DBOS.reinitialize(config); + DBOSTestAccess.reinitialize(config); try { DBOS.launch(); var dbosExecutor = DBOSTestAccess.getDbosExecutor(); @@ -106,7 +106,7 @@ public void dbosCloudEnvOverridesConfigAppVerAndExecutor() throws Exception { public void localExecutorId() throws Exception { var config = dbosConfig; - DBOS.reinitialize(config); + DBOSTestAccess.reinitialize(config); try { DBOS.launch(); var dbosExecutor = DBOSTestAccess.getDbosExecutor(); @@ -121,7 +121,7 @@ public void localExecutorId() throws Exception { public void conductorExecutorId() throws Exception { var config = dbosConfig.withConductorKey("test-conductor-key"); - DBOS.reinitialize(config); + DBOSTestAccess.reinitialize(config); try { DBOS.launch(); var dbosExecutor = DBOSTestAccess.getDbosExecutor(); @@ -138,7 +138,7 @@ public void cantSetExecutorIdWhenUsingConductor() throws Exception { var config = dbosConfig.withConductorKey("test-conductor-key").withExecutorId("test-executor-id"); - DBOS.reinitialize(config); + DBOSTestAccess.reinitialize(config); try { assertThrows(IllegalArgumentException.class, () -> DBOS.launch()); } finally { @@ -169,7 +169,7 @@ public void cantSetEmptyConfigFields() throws Exception { public void calcAppVersion() throws Exception { var config = dbosConfig; - DBOS.reinitialize(config); + DBOSTestAccess.reinitialize(config); try { DBOS.launch(); var dbosExecutor = DBOSTestAccess.getDbosExecutor(); @@ -209,7 +209,7 @@ public void configDataSource() throws Exception { .withDbUser("invalid-user") .withDbPassword("invalid-password"); - DBOS.reinitialize(config); + DBOSTestAccess.reinitialize(config); assertFalse(dataSource.isClosed()); var impl = new HawkServiceImpl(); @@ -248,7 +248,7 @@ public void appVersion() throws Exception { envVars.set("DBOS__APPID", "test-env-app-id"); var config = dbosConfig; DBUtils.recreateDB(config); - DBOS.reinitialize(config); + DBOSTestAccess.reinitialize(config); var proxy = DBOS.registerWorkflows(ExecutorTestService.class, new ExecutorTestServiceImpl()); DBOS.launch(); diff --git a/transact/src/test/java/dev/dbos/transact/database/MetricsTest.java b/transact/src/test/java/dev/dbos/transact/database/MetricsTest.java index 79175f8c..868c11e6 100644 --- a/transact/src/test/java/dev/dbos/transact/database/MetricsTest.java +++ b/transact/src/test/java/dev/dbos/transact/database/MetricsTest.java @@ -47,7 +47,7 @@ public class MetricsTest extends DbSetupTestBase { @BeforeEach void beforeEachTest() throws SQLException { DBUtils.recreateDB(dbosConfig); - DBOS.reinitialize(dbosConfig); + DBOSTestAccess.reinitialize(dbosConfig); proxy = DBOS.registerWorkflows(MetricsService.class, new MetricsServiceImpl()); DBOS.launch(); } diff --git a/transact/src/test/java/dev/dbos/transact/execution/DBOSExecutorTest.java b/transact/src/test/java/dev/dbos/transact/execution/DBOSExecutorTest.java index 76ba43ba..96655f90 100644 --- a/transact/src/test/java/dev/dbos/transact/execution/DBOSExecutorTest.java +++ b/transact/src/test/java/dev/dbos/transact/execution/DBOSExecutorTest.java @@ -32,7 +32,7 @@ void setUp() throws SQLException { DBUtils.recreateDB(dbosConfig); DBOSExecutorTest.dataSource = SystemDatabase.createDataSource(dbosConfig); - DBOS.reinitialize(dbosConfig); + DBOSTestAccess.reinitialize(dbosConfig); } @AfterEach diff --git a/transact/src/test/java/dev/dbos/transact/execution/LifecycleTest.java b/transact/src/test/java/dev/dbos/transact/execution/LifecycleTest.java index 6013ef6a..76e8d033 100644 --- a/transact/src/test/java/dev/dbos/transact/execution/LifecycleTest.java +++ b/transact/src/test/java/dev/dbos/transact/execution/LifecycleTest.java @@ -21,7 +21,7 @@ public class LifecycleTest extends DbSetupTestBase { @BeforeEach void beforeEachTest() throws SQLException { DBUtils.recreateDB(dbosConfig); - DBOS.reinitialize(dbosConfig); + DBOSTestAccess.reinitialize(dbosConfig); impl = new LifecycleTestWorkflowsImpl(); DBOS.registerWorkflows(LifecycleTestWorkflows.class, impl, "inst1"); diff --git a/transact/src/test/java/dev/dbos/transact/execution/RecoveryServiceTest.java b/transact/src/test/java/dev/dbos/transact/execution/RecoveryServiceTest.java index 02f08559..7ddc3263 100644 --- a/transact/src/test/java/dev/dbos/transact/execution/RecoveryServiceTest.java +++ b/transact/src/test/java/dev/dbos/transact/execution/RecoveryServiceTest.java @@ -42,7 +42,7 @@ void setUp() throws SQLException { DBUtils.recreateDB(dbosConfig); RecoveryServiceTest.dataSource = SystemDatabase.createDataSource(dbosConfig); - DBOS.reinitialize(dbosConfig); + DBOSTestAccess.reinitialize(dbosConfig); executingService = DBOS.registerWorkflows( ExecutingService.class, executingServiceImpl = new ExecutingServiceImpl()); @@ -154,7 +154,7 @@ public void recoveryThreadTest() throws Exception { DBOS.shutdown(); - DBOS.reinitialize(dbosConfig); + DBOSTestAccess.reinitialize(dbosConfig); // dbos = DBOS.getInstance(); // need to register again diff --git a/transact/src/test/java/dev/dbos/transact/execution/SingleExecutionTest.java b/transact/src/test/java/dev/dbos/transact/execution/SingleExecutionTest.java index 3f2d58b5..ec03d6ae 100644 --- a/transact/src/test/java/dev/dbos/transact/execution/SingleExecutionTest.java +++ b/transact/src/test/java/dev/dbos/transact/execution/SingleExecutionTest.java @@ -260,7 +260,7 @@ public void testConcWorkflow() throws InterruptedException { @BeforeEach void beforeEachTest() throws SQLException { DBUtils.recreateDB(dbosConfig); - DBOS.reinitialize(dbosConfig); + DBOSTestAccess.reinitialize(dbosConfig); execImpl = new TryConcExec(); execIfc = DBOS.registerWorkflows(TryConcExecIfc.class, execImpl); diff --git a/transact/src/test/java/dev/dbos/transact/invocation/CustomSchemaTest.java b/transact/src/test/java/dev/dbos/transact/invocation/CustomSchemaTest.java index eaae29a1..cf1e55c3 100644 --- a/transact/src/test/java/dev/dbos/transact/invocation/CustomSchemaTest.java +++ b/transact/src/test/java/dev/dbos/transact/invocation/CustomSchemaTest.java @@ -6,6 +6,7 @@ import static org.junit.jupiter.api.Assertions.assertNull; import dev.dbos.transact.DBOS; +import dev.dbos.transact.DBOSTestAccess; import dev.dbos.transact.DbSetupTestBase; import dev.dbos.transact.database.SystemDatabase; import dev.dbos.transact.utils.DBUtils; @@ -37,7 +38,7 @@ static void onetimeSetup() throws Exception { @BeforeEach void beforeEachTest() throws SQLException { DBUtils.recreateDB(dbosConfig); - DBOS.reinitialize(dbosConfig); + DBOSTestAccess.reinitialize(dbosConfig); var impl = new HawkServiceImpl(); proxy = DBOS.registerWorkflows(HawkService.class, impl); impl.setProxy(proxy); diff --git a/transact/src/test/java/dev/dbos/transact/invocation/DirectInvocationTest.java b/transact/src/test/java/dev/dbos/transact/invocation/DirectInvocationTest.java index f6e38453..78811cce 100644 --- a/transact/src/test/java/dev/dbos/transact/invocation/DirectInvocationTest.java +++ b/transact/src/test/java/dev/dbos/transact/invocation/DirectInvocationTest.java @@ -7,6 +7,7 @@ import static org.junit.jupiter.api.Assertions.assertThrows; import dev.dbos.transact.DBOS; +import dev.dbos.transact.DBOSTestAccess; import dev.dbos.transact.DbSetupTestBase; import dev.dbos.transact.context.WorkflowOptions; import dev.dbos.transact.database.SystemDatabase; @@ -35,7 +36,7 @@ public class DirectInvocationTest extends DbSetupTestBase { @BeforeEach void beforeEachTest() throws SQLException { DBUtils.recreateDB(dbosConfig); - DBOS.reinitialize(dbosConfig); + DBOSTestAccess.reinitialize(dbosConfig); var impl = new HawkServiceImpl(); proxy = DBOS.registerWorkflows(HawkService.class, impl); impl.setProxy(proxy); diff --git a/transact/src/test/java/dev/dbos/transact/invocation/MultiClassInstanceTest.java b/transact/src/test/java/dev/dbos/transact/invocation/MultiClassInstanceTest.java index 8b471918..a8947bc5 100644 --- a/transact/src/test/java/dev/dbos/transact/invocation/MultiClassInstanceTest.java +++ b/transact/src/test/java/dev/dbos/transact/invocation/MultiClassInstanceTest.java @@ -23,7 +23,7 @@ import org.junit.jupiter.api.Test; @org.junit.jupiter.api.Timeout(value = 2, unit = java.util.concurrent.TimeUnit.MINUTES) -public class MultiInstTest extends DbSetupTestBase { +public class MultiClassInstanceTest extends DbSetupTestBase { HawkServiceImpl himpl; BearServiceImpl bimpla; BearServiceImpl bimpl1; @@ -35,7 +35,7 @@ public class MultiInstTest extends DbSetupTestBase { @BeforeEach void beforeEachTest() throws SQLException { DBUtils.recreateDB(dbosConfig); - DBOS.reinitialize(dbosConfig); + DBOSTestAccess.reinitialize(dbosConfig); himpl = new HawkServiceImpl(); bimpla = new BearServiceImpl(); bimpl1 = new BearServiceImpl(); diff --git a/transact/src/test/java/dev/dbos/transact/invocation/StartWorkflowTest.java b/transact/src/test/java/dev/dbos/transact/invocation/StartWorkflowTest.java index 54887c97..9e355860 100644 --- a/transact/src/test/java/dev/dbos/transact/invocation/StartWorkflowTest.java +++ b/transact/src/test/java/dev/dbos/transact/invocation/StartWorkflowTest.java @@ -6,6 +6,7 @@ import static org.junit.jupiter.api.Assertions.assertThrows; import dev.dbos.transact.DBOS; +import dev.dbos.transact.DBOSTestAccess; import dev.dbos.transact.DbSetupTestBase; import dev.dbos.transact.StartWorkflowOptions; import dev.dbos.transact.database.SystemDatabase; @@ -33,7 +34,7 @@ public class StartWorkflowTest extends DbSetupTestBase { @BeforeEach void beforeEachTest() throws SQLException { DBUtils.recreateDB(dbosConfig); - DBOS.reinitialize(dbosConfig); + DBOSTestAccess.reinitialize(dbosConfig); var impl = new HawkServiceImpl(); proxy = DBOS.registerWorkflows(HawkService.class, impl); impl.setProxy(proxy); diff --git a/transact/src/test/java/dev/dbos/transact/issues/Issue218.java b/transact/src/test/java/dev/dbos/transact/issues/Issue218.java index 202e52ef..f45fcd3e 100644 --- a/transact/src/test/java/dev/dbos/transact/issues/Issue218.java +++ b/transact/src/test/java/dev/dbos/transact/issues/Issue218.java @@ -7,6 +7,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue; import dev.dbos.transact.DBOS; +import dev.dbos.transact.DBOSTestAccess; import dev.dbos.transact.DbSetupTestBase; import dev.dbos.transact.StartWorkflowOptions; import dev.dbos.transact.database.SystemDatabase; @@ -83,7 +84,7 @@ public class Issue218 extends DbSetupTestBase { @BeforeEach void beforeEachTest() throws SQLException { DBUtils.recreateDB(dbosConfig); - DBOS.reinitialize(dbosConfig); + DBOSTestAccess.reinitialize(dbosConfig); dataSource = SystemDatabase.createDataSource(dbosConfig); } diff --git a/transact/src/test/java/dev/dbos/transact/migrations/MigrationManagerTest.java b/transact/src/test/java/dev/dbos/transact/migrations/MigrationManagerTest.java index 573e202c..d5efe86b 100644 --- a/transact/src/test/java/dev/dbos/transact/migrations/MigrationManagerTest.java +++ b/transact/src/test/java/dev/dbos/transact/migrations/MigrationManagerTest.java @@ -35,8 +35,7 @@ void setup() throws Exception { DBOSConfig.defaultsFromEnv("migrationtest") .withDatabaseUrl(postgres.getJdbcUrl()) .withDbUser(postgres.getUsername()) - .withDbPassword(postgres.getPassword()) - .withMaximumPoolSize(2); + .withDbPassword(postgres.getPassword()); DBUtils.recreateDB(dbosConfig); testDataSource = SystemDatabase.createDataSource(dbosConfig); diff --git a/transact/src/test/java/dev/dbos/transact/notifications/EventsTest.java b/transact/src/test/java/dev/dbos/transact/notifications/EventsTest.java index 1794487b..e28f2f88 100644 --- a/transact/src/test/java/dev/dbos/transact/notifications/EventsTest.java +++ b/transact/src/test/java/dev/dbos/transact/notifications/EventsTest.java @@ -164,7 +164,7 @@ public class EventsTest extends DbSetupTestBase { void beforeEachTest() throws SQLException { dataSource = DbSetupTestBase.dataSource; DBUtils.recreateDB(dbosConfig); - DBOS.reinitialize(dbosConfig); + DBOSTestAccess.reinitialize(dbosConfig); impl = new EventsServiceImpl(); proxy = DBOS.registerWorkflows(EventsService.class, impl); DBOS.launch(); diff --git a/transact/src/test/java/dev/dbos/transact/notifications/NotificationServiceTest.java b/transact/src/test/java/dev/dbos/transact/notifications/NotificationServiceTest.java index 7906cdb6..77180ef3 100644 --- a/transact/src/test/java/dev/dbos/transact/notifications/NotificationServiceTest.java +++ b/transact/src/test/java/dev/dbos/transact/notifications/NotificationServiceTest.java @@ -3,6 +3,7 @@ import static org.junit.jupiter.api.Assertions.*; import dev.dbos.transact.DBOS; +import dev.dbos.transact.DBOSTestAccess; import dev.dbos.transact.DbSetupTestBase; import dev.dbos.transact.StartWorkflowOptions; import dev.dbos.transact.context.WorkflowOptions; @@ -28,7 +29,7 @@ class NotificationServiceTest extends DbSetupTestBase { @BeforeEach void beforeEachTest() throws SQLException { DBUtils.recreateDB(dbosConfig); - DBOS.reinitialize(dbosConfig); + DBOSTestAccess.reinitialize(dbosConfig); } @AfterEach diff --git a/transact/src/test/java/dev/dbos/transact/queue/PartitionedQueuesTest.java b/transact/src/test/java/dev/dbos/transact/queue/PartitionedQueuesTest.java index a1fc890d..cf4f8809 100644 --- a/transact/src/test/java/dev/dbos/transact/queue/PartitionedQueuesTest.java +++ b/transact/src/test/java/dev/dbos/transact/queue/PartitionedQueuesTest.java @@ -5,10 +5,7 @@ import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; -import dev.dbos.transact.DBOS; -import dev.dbos.transact.DBOSClient; -import dev.dbos.transact.DbSetupTestBase; -import dev.dbos.transact.StartWorkflowOptions; +import dev.dbos.transact.*; import dev.dbos.transact.utils.DBUtils; import dev.dbos.transact.workflow.Queue; import dev.dbos.transact.workflow.Workflow; @@ -81,7 +78,7 @@ public class PartitionedQueuesTest extends DbSetupTestBase { @BeforeEach void beforeEachTest() throws SQLException { DBUtils.recreateDB(dbosConfig); - DBOS.reinitialize(dbosConfig); + DBOSTestAccess.reinitialize(dbosConfig); } @AfterEach diff --git a/transact/src/test/java/dev/dbos/transact/queue/QueuesTest.java b/transact/src/test/java/dev/dbos/transact/queue/QueuesTest.java index 8da81799..35a9c104 100644 --- a/transact/src/test/java/dev/dbos/transact/queue/QueuesTest.java +++ b/transact/src/test/java/dev/dbos/transact/queue/QueuesTest.java @@ -43,7 +43,7 @@ void beforeEachTest() throws SQLException { DBUtils.recreateDB(dbosConfig); dataSource = SystemDatabase.createDataSource(dbosConfig); - DBOS.reinitialize(dbosConfig); + DBOSTestAccess.reinitialize(dbosConfig); } @AfterEach @@ -650,7 +650,7 @@ public void testQueueConcurrencyUnderRecovery() throws Exception { @Test public void testListenQueue() throws Exception { var config = dbosConfig.withListenQueue("queueOne"); - DBOS.reinitialize(config); + DBOSTestAccess.reinitialize(config); Queue queueOne = new Queue("queueOne"); Queue queueTwo = new Queue("queueTwo"); diff --git a/transact/src/test/java/dev/dbos/transact/scheduled/SchedulerServiceTest.java b/transact/src/test/java/dev/dbos/transact/scheduled/SchedulerServiceTest.java index 100b4d67..05563f4f 100644 --- a/transact/src/test/java/dev/dbos/transact/scheduled/SchedulerServiceTest.java +++ b/transact/src/test/java/dev/dbos/transact/scheduled/SchedulerServiceTest.java @@ -24,7 +24,7 @@ class SchedulerServiceTest extends DbSetupTestBase { @BeforeEach void beforeEachTest() throws SQLException { DBUtils.recreateDB(dbosConfig); - DBOS.reinitialize(dbosConfig); + DBOSTestAccess.reinitialize(dbosConfig); } @AfterEach diff --git a/transact/src/test/java/dev/dbos/transact/step/StepsTest.java b/transact/src/test/java/dev/dbos/transact/step/StepsTest.java index 159ed476..85e799f0 100644 --- a/transact/src/test/java/dev/dbos/transact/step/StepsTest.java +++ b/transact/src/test/java/dev/dbos/transact/step/StepsTest.java @@ -3,6 +3,7 @@ import static org.junit.jupiter.api.Assertions.*; import dev.dbos.transact.DBOS; +import dev.dbos.transact.DBOSTestAccess; import dev.dbos.transact.DbSetupTestBase; import dev.dbos.transact.context.WorkflowOptions; import dev.dbos.transact.utils.DBUtils; @@ -20,7 +21,7 @@ public class StepsTest extends DbSetupTestBase { void beforeEachTest() throws SQLException { DBUtils.recreateDB(dbosConfig); - DBOS.reinitialize(dbosConfig); + DBOSTestAccess.reinitialize(dbosConfig); } @AfterEach diff --git a/transact/src/test/java/dev/dbos/transact/workflow/AsyncWorkflowTest.java b/transact/src/test/java/dev/dbos/transact/workflow/AsyncWorkflowTest.java index 62cf5681..d1a90f7b 100644 --- a/transact/src/test/java/dev/dbos/transact/workflow/AsyncWorkflowTest.java +++ b/transact/src/test/java/dev/dbos/transact/workflow/AsyncWorkflowTest.java @@ -5,6 +5,7 @@ import static org.junit.jupiter.api.Assertions.assertThrows; import dev.dbos.transact.DBOS; +import dev.dbos.transact.DBOSTestAccess; import dev.dbos.transact.DbSetupTestBase; import dev.dbos.transact.StartWorkflowOptions; import dev.dbos.transact.context.WorkflowOptions; @@ -22,7 +23,7 @@ public class AsyncWorkflowTest extends DbSetupTestBase { void beforeEachTest() throws SQLException { DBUtils.recreateDB(dbosConfig); - DBOS.reinitialize(dbosConfig); + DBOSTestAccess.reinitialize(dbosConfig); } @AfterEach diff --git a/transact/src/test/java/dev/dbos/transact/workflow/ForkTest.java b/transact/src/test/java/dev/dbos/transact/workflow/ForkTest.java index 919412f3..e44bb2a4 100644 --- a/transact/src/test/java/dev/dbos/transact/workflow/ForkTest.java +++ b/transact/src/test/java/dev/dbos/transact/workflow/ForkTest.java @@ -174,7 +174,7 @@ public class ForkTest extends DbSetupTestBase { @BeforeEach void beforeEachTest() throws SQLException { DBUtils.recreateDB(dbosConfig); - DBOS.reinitialize(dbosConfig); + DBOSTestAccess.reinitialize(dbosConfig); impl = new ForkTestServiceImpl(); proxy = DBOS.registerWorkflows(ForkTestService.class, impl); diff --git a/transact/src/test/java/dev/dbos/transact/workflow/GarbageCollectionTest.java b/transact/src/test/java/dev/dbos/transact/workflow/GarbageCollectionTest.java index 57399b5d..c47314f7 100644 --- a/transact/src/test/java/dev/dbos/transact/workflow/GarbageCollectionTest.java +++ b/transact/src/test/java/dev/dbos/transact/workflow/GarbageCollectionTest.java @@ -64,7 +64,7 @@ public class GarbageCollectionTest extends DbSetupTestBase { @BeforeEach void beforeEachTest() throws SQLException { DBUtils.recreateDB(dbosConfig); - DBOS.reinitialize(dbosConfig); + DBOSTestAccess.reinitialize(dbosConfig); impl = new GCTestServiceImpl(); proxy = DBOS.registerWorkflows(GCTestService.class, impl); diff --git a/transact/src/test/java/dev/dbos/transact/workflow/QueueChildWorkflowTest.java b/transact/src/test/java/dev/dbos/transact/workflow/QueueChildWorkflowTest.java index 4473250b..8e70fd60 100644 --- a/transact/src/test/java/dev/dbos/transact/workflow/QueueChildWorkflowTest.java +++ b/transact/src/test/java/dev/dbos/transact/workflow/QueueChildWorkflowTest.java @@ -3,6 +3,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import dev.dbos.transact.DBOS; +import dev.dbos.transact.DBOSTestAccess; import dev.dbos.transact.DbSetupTestBase; import dev.dbos.transact.StartWorkflowOptions; import dev.dbos.transact.utils.DBUtils; @@ -21,7 +22,7 @@ public class QueueChildWorkflowTest extends DbSetupTestBase { void beforeEachTest() throws SQLException { DBUtils.recreateDB(dbosConfig); - DBOS.reinitialize(dbosConfig); + DBOSTestAccess.reinitialize(dbosConfig); } @AfterEach diff --git a/transact/src/test/java/dev/dbos/transact/workflow/SyncWorkflowTest.java b/transact/src/test/java/dev/dbos/transact/workflow/SyncWorkflowTest.java index c42f347a..a24e45ad 100644 --- a/transact/src/test/java/dev/dbos/transact/workflow/SyncWorkflowTest.java +++ b/transact/src/test/java/dev/dbos/transact/workflow/SyncWorkflowTest.java @@ -3,6 +3,7 @@ import static org.junit.jupiter.api.Assertions.*; import dev.dbos.transact.DBOS; +import dev.dbos.transact.DBOSTestAccess; import dev.dbos.transact.DbSetupTestBase; import dev.dbos.transact.context.WorkflowOptions; import dev.dbos.transact.utils.DBUtils; @@ -19,7 +20,7 @@ public class SyncWorkflowTest extends DbSetupTestBase { void beforeEachTest() throws SQLException { DBUtils.recreateDB(dbosConfig); - DBOS.reinitialize(dbosConfig); + DBOSTestAccess.reinitialize(dbosConfig); } @AfterEach diff --git a/transact/src/test/java/dev/dbos/transact/workflow/TimeoutTest.java b/transact/src/test/java/dev/dbos/transact/workflow/TimeoutTest.java index ddd47d9e..16b6817c 100644 --- a/transact/src/test/java/dev/dbos/transact/workflow/TimeoutTest.java +++ b/transact/src/test/java/dev/dbos/transact/workflow/TimeoutTest.java @@ -32,7 +32,7 @@ void beforeEachTest() throws SQLException { DBUtils.recreateDB(dbosConfig); TimeoutTest.dataSource = SystemDatabase.createDataSource(dbosConfig); - DBOS.reinitialize(dbosConfig); + DBOSTestAccess.reinitialize(dbosConfig); } @AfterEach diff --git a/transact/src/test/java/dev/dbos/transact/workflow/UnifiedProxyTest.java b/transact/src/test/java/dev/dbos/transact/workflow/UnifiedProxyTest.java index ef26dd30..230a1521 100644 --- a/transact/src/test/java/dev/dbos/transact/workflow/UnifiedProxyTest.java +++ b/transact/src/test/java/dev/dbos/transact/workflow/UnifiedProxyTest.java @@ -3,6 +3,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import dev.dbos.transact.DBOS; +import dev.dbos.transact.DBOSTestAccess; import dev.dbos.transact.DbSetupTestBase; import dev.dbos.transact.StartWorkflowOptions; import dev.dbos.transact.context.WorkflowOptions; @@ -22,7 +23,7 @@ public class UnifiedProxyTest extends DbSetupTestBase { void beforeEachTest() throws SQLException { DBUtils.recreateDB(dbosConfig); - DBOS.reinitialize(dbosConfig); + DBOSTestAccess.reinitialize(dbosConfig); } @AfterEach diff --git a/transact/src/test/java/dev/dbos/transact/workflow/WorkflowMgmtTest.java b/transact/src/test/java/dev/dbos/transact/workflow/WorkflowMgmtTest.java index 5e808c7c..ab885160 100644 --- a/transact/src/test/java/dev/dbos/transact/workflow/WorkflowMgmtTest.java +++ b/transact/src/test/java/dev/dbos/transact/workflow/WorkflowMgmtTest.java @@ -3,6 +3,7 @@ import static org.junit.jupiter.api.Assertions.*; import dev.dbos.transact.DBOS; +import dev.dbos.transact.DBOSTestAccess; import dev.dbos.transact.DbSetupTestBase; import dev.dbos.transact.StartWorkflowOptions; import dev.dbos.transact.context.WorkflowOptions; @@ -73,7 +74,7 @@ public class WorkflowMgmtTest extends DbSetupTestBase { @BeforeEach void beforeEachTest() throws SQLException { DBUtils.recreateDB(dbosConfig); - DBOS.reinitialize(dbosConfig); + DBOSTestAccess.reinitialize(dbosConfig); impl = new MgmtServiceImpl(); proxy = DBOS.registerWorkflows(MgmtService.class, impl); From 74bbfd2edfd6ef1313de37c5d217761b068fd0ea Mon Sep 17 00:00:00 2001 From: "hannes.oswald" Date: Fri, 6 Mar 2026 21:14:41 +0100 Subject: [PATCH 15/15] revert unwanted changes --- .../dev/dbos/transact/DBOSTestAccess.java | 2 +- .../dev/dbos/transact/DbSetupTestBase.java | 22 +- .../dev/dbos/transact/client/ClientTest.java | 3 +- .../dbos/transact/client/PgSqlClientTest.java | 23 +- .../dev/dbos/transact/config/ConfigTest.java | 120 +++++-- .../transact/database/ExternalStateTest.java | 3 +- .../transact/database/SystemDatabaseTest.java | 63 +++- .../transact/execution/DBOSExecutorTest.java | 55 +++- .../transact/execution/LifecycleTest.java | 109 ++++++- .../execution/RecoveryServiceTest.java | 7 +- .../dbos/transact/execution/ScaleTest.java | 14 +- .../execution/SingleExecutionTest.java | 6 + .../transact/invocation/CustomSchemaTest.java | 16 +- .../invocation/DirectInvocationTest.java | 3 + .../transact/invocation/InstanceTest.java | 14 +- .../invocation/MultiClassInstanceTest.java | 5 +- .../invocation/MultiDbosInstanceTest.java | 20 +- .../dbos/transact/invocation/PatchTest.java | 24 +- .../invocation/StartWorkflowTest.java | 10 +- .../dev/dbos/transact/issues/Issue218.java | 1 + .../dev/dbos/transact/json/InteropTest.java | 20 +- .../json/PortableSerializationTest.java | 21 +- .../migrations/MigrationManagerTest.java | 295 ++++++++++++++++-- .../transact/notifications/EventsTest.java | 17 +- .../NotificationServiceTest.java | 213 ++++++++++++- .../transact/queue/PartitionedQueuesTest.java | 18 +- .../dev/dbos/transact/queue/QueuesTest.java | 40 ++- .../scheduled/SchedulerServiceTest.java | 7 +- .../transact/workflow/AsyncWorkflowTest.java | 6 +- .../workflow/GarbageCollectionTest.java | 1 - .../transact/workflow/ListWorkflowsTest.java | 11 +- .../transact/workflow/SyncWorkflowTest.java | 6 +- .../dbos/transact/workflow/TimeoutTest.java | 36 ++- .../transact/workflow/WorkflowMgmtTest.java | 45 +++ 34 files changed, 987 insertions(+), 269 deletions(-) diff --git a/transact/src/test/java/dev/dbos/transact/DBOSTestAccess.java b/transact/src/test/java/dev/dbos/transact/DBOSTestAccess.java index 5a489a43..7106948a 100644 --- a/transact/src/test/java/dev/dbos/transact/DBOSTestAccess.java +++ b/transact/src/test/java/dev/dbos/transact/DBOSTestAccess.java @@ -19,7 +19,7 @@ public static DBOSExecutor getDbosExecutor() { } public static void reinitialize(DBOSConfig config) { - DBOSTestAccess.reinitialize(config); + DBOS.reinitialize(config); } // public static void clearRegistry() { diff --git a/transact/src/test/java/dev/dbos/transact/DbSetupTestBase.java b/transact/src/test/java/dev/dbos/transact/DbSetupTestBase.java index 98f052e3..ea0629f7 100644 --- a/transact/src/test/java/dev/dbos/transact/DbSetupTestBase.java +++ b/transact/src/test/java/dev/dbos/transact/DbSetupTestBase.java @@ -16,7 +16,7 @@ public class DbSetupTestBase { protected static HikariDataSource dataSource; @BeforeAll - static void onetimeSetup() { + protected static void onetimeSetup() throws Exception { postgres.start(); dbosConfig = DBOSConfig.defaults("systemdbtest") @@ -27,11 +27,29 @@ static void onetimeSetup() { } @AfterAll - static void afterAll() { + protected static void afterAll() throws Exception { postgres.stop(); } protected DBOSClient getDBOSClient() { return new DBOSClient(postgres.getJdbcUrl(), postgres.getUsername(), postgres.getPassword()); } + + protected static DBOSConfig createConfig(String appName) { + return DBOSConfig.defaults(appName) + .withDatabaseUrl(postgres.getJdbcUrl()) + .withDbUser(postgres.getUsername()) + .withDbPassword(postgres.getPassword()); + } + + protected static DBOSConfig createConfigFromEnv(String appName) { + return DBOSConfig.defaultsFromEnv(appName) + .withDatabaseUrl(postgres.getJdbcUrl()) + .withDbUser(postgres.getUsername()) + .withDbPassword(postgres.getPassword()); + } + + protected static String getJdbcUrl(String databaseName) { + return postgres.getJdbcUrl().replaceFirst("/[^/?]+(\\?.*)?$", "/" + databaseName + "$1"); + } } diff --git a/transact/src/test/java/dev/dbos/transact/client/ClientTest.java b/transact/src/test/java/dev/dbos/transact/client/ClientTest.java index dc58776b..84011e16 100644 --- a/transact/src/test/java/dev/dbos/transact/client/ClientTest.java +++ b/transact/src/test/java/dev/dbos/transact/client/ClientTest.java @@ -11,6 +11,7 @@ import dev.dbos.transact.DbSetupTestBase; import dev.dbos.transact.database.SystemDatabase; import dev.dbos.transact.exceptions.DBOSAwaitedWorkflowCancelledException; +import dev.dbos.transact.exceptions.DBOSNonExistentWorkflowException; import dev.dbos.transact.utils.DBUtils; import dev.dbos.transact.workflow.Queue; @@ -181,7 +182,7 @@ public void clientEnqueueTimeouts() throws Exception { public void invalidSend() throws Exception { var invalidWorkflowId = UUID.randomUUID().toString(); - try (var client = new DBOSClient(dbUrl, dbUser, dbPassword)) { + try (var client = getDBOSClient()) { var ex = assertThrows( DBOSNonExistentWorkflowException.class, diff --git a/transact/src/test/java/dev/dbos/transact/client/PgSqlClientTest.java b/transact/src/test/java/dev/dbos/transact/client/PgSqlClientTest.java index 6a3358bd..a914fd25 100644 --- a/transact/src/test/java/dev/dbos/transact/client/PgSqlClientTest.java +++ b/transact/src/test/java/dev/dbos/transact/client/PgSqlClientTest.java @@ -8,7 +8,7 @@ import dev.dbos.transact.DBOS; import dev.dbos.transact.DBOSTestAccess; -import dev.dbos.transact.config.DBOSConfig; +import dev.dbos.transact.DbSetupTestBase; import dev.dbos.transact.database.SystemDatabase; import dev.dbos.transact.exceptions.DBOSAwaitedWorkflowCancelledException; import dev.dbos.transact.execution.ThrowingRunnable; @@ -25,31 +25,16 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.zaxxer.hikari.HikariDataSource; import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.postgresql.util.PSQLException; @org.junit.jupiter.api.Timeout(value = 2, unit = java.util.concurrent.TimeUnit.MINUTES) -public class PgSqlClientTest { - private static DBOSConfig dbosConfig; - private static final String dbUrl = "jdbc:postgresql://localhost:5432/dbos_java_sys"; - private static final String dbUser = "postgres"; - private static final String dbPassword = System.getenv("PGPASSWORD"); - +public class PgSqlClientTest extends DbSetupTestBase { private ClientService service; private HikariDataSource dataSource; - @BeforeAll - static void onetimeSetup() throws Exception { - dbosConfig = - DBOSConfig.defaults("systemdbtest") - .withDatabaseUrl(dbUrl) - .withDbUser(dbUser) - .withDbPassword(dbPassword); - } - @BeforeEach void beforeEachTest() throws SQLException { DBUtils.recreateDB(dbosConfig); @@ -58,9 +43,7 @@ void beforeEachTest() throws SQLException { service = DBOS.registerWorkflows(ClientService.class, new ClientServiceImpl()); DBOS.launch(); - dataSource = - SystemDatabase.createDataSource( - dbosConfig.databaseUrl(), dbosConfig.dbUser(), dbosConfig.dbPassword()); + dataSource = SystemDatabase.createDataSource(dbosConfig); } @AfterEach diff --git a/transact/src/test/java/dev/dbos/transact/config/ConfigTest.java b/transact/src/test/java/dev/dbos/transact/config/ConfigTest.java index f55cc5c4..d2369f4e 100644 --- a/transact/src/test/java/dev/dbos/transact/config/ConfigTest.java +++ b/transact/src/test/java/dev/dbos/transact/config/ConfigTest.java @@ -10,6 +10,7 @@ import dev.dbos.transact.DBOS; import dev.dbos.transact.DBOSTestAccess; import dev.dbos.transact.DbSetupTestBase; +import dev.dbos.transact.StartWorkflowOptions; import dev.dbos.transact.database.DBTestAccess; import dev.dbos.transact.internal.AppVersionComputer; import dev.dbos.transact.invocation.HawkService; @@ -27,8 +28,10 @@ import com.zaxxer.hikari.HikariConfig; import com.zaxxer.hikari.HikariDataSource; import org.apache.maven.artifact.versioning.ComparableVersion; +import org.junit.jupiter.api.Assumptions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.postgresql.ds.PGSimpleDataSource; import uk.org.webcompere.systemstubs.environment.EnvironmentVariables; import uk.org.webcompere.systemstubs.jupiter.SystemStub; import uk.org.webcompere.systemstubs.jupiter.SystemStubsExtension; @@ -45,7 +48,10 @@ public void configOverridesEnvAppVerAndExecutor() throws Exception { envVars.set("DBOS__APPVERSION", "test-env-app-version"); envVars.set("DBOS__APPID", "test-env-app-id"); - var config = dbosConfig.withAppVersion("test-app-version").withExecutorId("test-executor-id"); + var config = + createConfig("config-test") + .withAppVersion("test-app-version") + .withExecutorId("test-executor-id"); DBOSTestAccess.reinitialize(config); try { @@ -66,7 +72,7 @@ public void envAppVerAndExecutor() throws Exception { envVars.set("DBOS__APPVERSION", "test-env-app-version"); envVars.set("DBOS__APPID", "test-env-app-id"); - var config = dbosConfig; + var config = createConfig("config-test"); DBOSTestAccess.reinitialize(config); try { @@ -88,7 +94,10 @@ public void dbosCloudEnvOverridesConfigAppVerAndExecutor() throws Exception { envVars.set("DBOS__APPVERSION", "test-env-app-version"); envVars.set("DBOS__APPID", "test-env-app-id"); - var config = dbosConfig.withAppVersion("test-app-version").withExecutorId("test-executor-id"); + var config = + createConfig("config-test") + .withAppVersion("test-app-version") + .withExecutorId("test-executor-id"); DBOSTestAccess.reinitialize(config); try { @@ -104,7 +113,7 @@ public void dbosCloudEnvOverridesConfigAppVerAndExecutor() throws Exception { @Test public void localExecutorId() throws Exception { - var config = dbosConfig; + var config = createConfig("config-test"); DBOSTestAccess.reinitialize(config); try { @@ -119,7 +128,7 @@ public void localExecutorId() throws Exception { @Test public void conductorExecutorId() throws Exception { - var config = dbosConfig.withConductorKey("test-conductor-key"); + var config = createConfigFromEnv("config-test").withConductorKey("test-conductor-key"); DBOSTestAccess.reinitialize(config); try { @@ -136,7 +145,9 @@ public void conductorExecutorId() throws Exception { @Test public void cantSetExecutorIdWhenUsingConductor() throws Exception { var config = - dbosConfig.withConductorKey("test-conductor-key").withExecutorId("test-executor-id"); + createConfigFromEnv("config-test") + .withConductorKey("test-conductor-key") + .withExecutorId("test-executor-id"); DBOSTestAccess.reinitialize(config); try { @@ -167,7 +178,7 @@ public void cantSetEmptyConfigFields() throws Exception { @Test public void calcAppVersion() throws Exception { - var config = dbosConfig; + var config = createConfig("config-test"); DBOSTestAccess.reinitialize(config); try { @@ -185,32 +196,29 @@ public void calcAppVersion() throws Exception { } @Test - public void configDataSource() throws Exception { - - var poolName = "dbos-configDataSource"; + public void configPGSimpleDataSource() throws Exception { var url = dbosConfig.databaseUrl(); var user = dbosConfig.dbUser(); var password = dbosConfig.dbPassword(); - DBUtils.recreateDB(url, user, password); - HikariConfig hikariConfig = new HikariConfig(); - hikariConfig.setJdbcUrl(url); - hikariConfig.setUsername(user); - hikariConfig.setPassword(password); - hikariConfig.setPoolName(poolName); + PGSimpleDataSource ds = new PGSimpleDataSource(); + ds.setServerNames(new String[] {postgres.getHost()}); + ds.setDatabaseName(postgres.getDatabaseName()); + ds.setUser(user); + ds.setPassword(password); + ds.setPortNumbers(new int[] {postgres.getFirstMappedPort()}); - var dataSource = new HikariDataSource(hikariConfig); - assertFalse(dataSource.isClosed()); var config = DBOSConfig.defaults("config-test") - .withDataSource(dataSource) + .withDataSource(ds) + // Intentionally set an invalid URL and credentials to verify that when a DataSource + // is provided, these values are ignored and do not affect connectivity. .withDatabaseUrl("completely-invalid-url") .withDbUser("invalid-user") .withDbPassword("invalid-password"); DBOSTestAccess.reinitialize(config); - assertFalse(dataSource.isClosed()); var impl = new HawkServiceImpl(); var proxy = DBOS.registerWorkflows(HawkService.class, impl); @@ -219,20 +227,74 @@ public void configDataSource() throws Exception { try { DBOS.launch(); - var sysdb = DBOSTestAccess.getSystemDatabase(); - var dbConfig = DBTestAccess.getHikariConfig(sysdb); - assertEquals(poolName, dbConfig.getPoolName()); - - var result = proxy.simpleWorkflow(); + var options = new StartWorkflowOptions("dswfid"); + var handle = DBOS.startWorkflow(() -> proxy.simpleWorkflow(), options); + var result = handle.getResult(); assertEquals(LocalDate.now().format(DateTimeFormatter.ISO_DATE), result); - + assertEquals("SUCCESS", handle.getStatus().status()); } finally { DBOS.shutdown(); } } + @Test + public void configHikariDataSource() throws Exception { + + var poolName = "dbos-configDataSource"; + var url = dbosConfig.databaseUrl(); + var user = dbosConfig.dbUser(); + var password = dbosConfig.dbPassword(); + + DBUtils.recreateDB(url, user, password); + + HikariConfig hikariConfig = new HikariConfig(); + hikariConfig.setJdbcUrl(url); + hikariConfig.setUsername(user); + hikariConfig.setPassword(password); + hikariConfig.setPoolName(poolName); + + try (var dataSource = new HikariDataSource(hikariConfig)) { + assertFalse(dataSource.isClosed()); + var config = + DBOSConfig.defaults("config-test") + .withDataSource(dataSource) + // Intentionally set an invalid URL and credentials to verify that when a DataSource + // is provided, these values are ignored and do not affect connectivity. + .withDatabaseUrl("completely-invalid-url") + .withDbUser("invalid-user") + .withDbPassword("invalid-password"); + + DBOSTestAccess.reinitialize(config); + assertFalse(dataSource.isClosed()); + + var impl = new HawkServiceImpl(); + var proxy = DBOS.registerWorkflows(HawkService.class, impl); + impl.setProxy(proxy); + + try { + DBOS.launch(); + + var sysdb = DBOSTestAccess.getSystemDatabase(); + var dbConfig = DBTestAccess.getHikariConfig(sysdb); + assertTrue(dbConfig.isPresent()); + assertEquals(poolName, dbConfig.get().getPoolName()); + + var options = new StartWorkflowOptions("dswfid"); + var handle = DBOS.startWorkflow(() -> proxy.simpleWorkflow(), options); + var result = handle.getResult(); + assertEquals(LocalDate.now().format(DateTimeFormatter.ISO_DATE), result); + assertEquals("SUCCESS", handle.getStatus().status()); + } finally { + DBOS.shutdown(); + } + } + } + @Test public void dbosVersion() throws Exception { + Assumptions.assumeFalse( + DBOS.version().equals("${projectVersion}"), "skipping, DBOS version not set"); + assertNotNull(DBOS.version()); assertFalse(DBOS.version().contains("unknown")); var version = assertDoesNotThrow(() -> new ComparableVersion(DBOS.version())); @@ -246,9 +308,9 @@ public void dbosVersion() throws Exception { public void appVersion() throws Exception { try { envVars.set("DBOS__APPID", "test-env-app-id"); - var config = dbosConfig; - DBUtils.recreateDB(config); - DBOSTestAccess.reinitialize(config); + var dbosConfig = createConfigFromEnv("systemdbtest"); + DBUtils.recreateDB(dbosConfig); + DBOSTestAccess.reinitialize(dbosConfig); var proxy = DBOS.registerWorkflows(ExecutorTestService.class, new ExecutorTestServiceImpl()); DBOS.launch(); diff --git a/transact/src/test/java/dev/dbos/transact/database/ExternalStateTest.java b/transact/src/test/java/dev/dbos/transact/database/ExternalStateTest.java index 7ba9db85..e134ce55 100644 --- a/transact/src/test/java/dev/dbos/transact/database/ExternalStateTest.java +++ b/transact/src/test/java/dev/dbos/transact/database/ExternalStateTest.java @@ -20,8 +20,7 @@ public class ExternalStateTest extends DbSetupTestBase { private static SystemDatabase systemDatabase; @BeforeAll - static void onetimeSetup() throws Exception { - + protected static void onetimeSetup() throws Exception { DBUtils.recreateDB(dbosConfig); MigrationManager.runMigrations(dbosConfig); systemDatabase = SystemDatabase.create(dbosConfig); diff --git a/transact/src/test/java/dev/dbos/transact/database/SystemDatabaseTest.java b/transact/src/test/java/dev/dbos/transact/database/SystemDatabaseTest.java index 85c96a63..208ed649 100644 --- a/transact/src/test/java/dev/dbos/transact/database/SystemDatabaseTest.java +++ b/transact/src/test/java/dev/dbos/transact/database/SystemDatabaseTest.java @@ -32,7 +32,7 @@ public class SystemDatabaseTest extends DbSetupTestBase { void beforeEachTest() throws SQLException { DBUtils.recreateDB(dbosConfig); MigrationManager.runMigrations(dbosConfig); - sysdb = new SystemDatabase(dbosConfig); + sysdb = SystemDatabase.create(dbosConfig); dataSource = SystemDatabase.createDataSource(dbosConfig); } @@ -42,6 +42,67 @@ void afterEachTest() throws Exception { sysdb.close(); } + @Test + public void testDeleteWorkflows() throws Exception { + for (var i = 0; i < 5; i++) { + var wfid = "wfid-%d".formatted(i); + var status = WorkflowStatusInternal.builder(wfid, WorkflowState.PENDING).build(); + sysdb.initWorkflowStatus(status, 5, false, false); + } + + var rows = DBUtils.getWorkflowRows(dataSource); + assertEquals(5, rows.size()); + + sysdb.deleteWorkflows("wfid-1", "wfid-3"); + + rows = DBUtils.getWorkflowRows(dataSource); + assertEquals(3, rows.size()); + + assertTrue(rows.stream().noneMatch(r -> r.workflowId().equals("wfid-1"))); + assertTrue(rows.stream().noneMatch(r -> r.workflowId().equals("wfid-3"))); + + assertTrue(rows.stream().anyMatch(r -> r.workflowId().equals("wfid-0"))); + assertTrue(rows.stream().anyMatch(r -> r.workflowId().equals("wfid-2"))); + assertTrue(rows.stream().anyMatch(r -> r.workflowId().equals("wfid-4"))); + } + + @Test + public void testGetChildWorkflows() throws Exception { + for (var i = 0; i < 5; i++) { + var wfid = "wfid-%d".formatted(i); + var status = WorkflowStatusInternal.builder(wfid, WorkflowState.PENDING).build(); + sysdb.initWorkflowStatus(status, 5, false, false); + } + + for (var i = 0; i < 5; i++) { + var parentWfId = "wfid-2"; + var wfid = "childwfid-%d".formatted(i); + var status = WorkflowStatusInternal.builder(wfid, WorkflowState.PENDING).build(); + sysdb.initWorkflowStatus(status, 5, false, false); + sysdb.recordChildWorkflow( + parentWfId, wfid, i, "step-%d".formatted(i), System.currentTimeMillis()); + } + + for (var i = 0; i < 5; i++) { + var parentWfId = "childwfid-%d".formatted(i); + var wfid = "grandchildwfid-%d".formatted(i); + var status = WorkflowStatusInternal.builder(wfid, WorkflowState.PENDING).build(); + sysdb.initWorkflowStatus(status, 5, false, false); + sysdb.recordChildWorkflow( + parentWfId, wfid, i, "step-%d".formatted(i), System.currentTimeMillis()); + } + + var children = sysdb.getWorkflowChildrenInternal("wfid-2"); + assertEquals(10, children.size()); + + for (var i = 0; i < 5; i++) { + var child = "childwfid-%d".formatted(i); + var grandchild = "grandchildwfid-%d".formatted(i); + assertTrue(children.stream().anyMatch(r -> r.equals(child))); + assertTrue(children.stream().anyMatch(r -> r.equals(grandchild))); + } + } + @Test public void testRetries() throws Exception { var wfid = "wfid-1"; diff --git a/transact/src/test/java/dev/dbos/transact/execution/DBOSExecutorTest.java b/transact/src/test/java/dev/dbos/transact/execution/DBOSExecutorTest.java index 96655f90..dac69759 100644 --- a/transact/src/test/java/dev/dbos/transact/execution/DBOSExecutorTest.java +++ b/transact/src/test/java/dev/dbos/transact/execution/DBOSExecutorTest.java @@ -9,37 +9,72 @@ import dev.dbos.transact.database.SystemDatabase; import dev.dbos.transact.exceptions.DBOSNonExistentWorkflowException; import dev.dbos.transact.exceptions.DBOSWorkflowFunctionNotFoundException; -import dev.dbos.transact.json.JSONUtil; +import dev.dbos.transact.json.SerializationUtil; import dev.dbos.transact.utils.DBUtils; import dev.dbos.transact.workflow.*; import java.sql.SQLException; import java.util.List; -import javax.sql.DataSource; - +import com.zaxxer.hikari.HikariDataSource; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.condition.DisabledForJreRange; +import org.junit.jupiter.api.condition.EnabledForJreRange; +import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.junit.jupiter.api.condition.JRE; @org.junit.jupiter.api.Timeout(value = 2, unit = java.util.concurrent.TimeUnit.MINUTES) class DBOSExecutorTest extends DbSetupTestBase { - - private static DataSource dataSource; + private HikariDataSource dataSource; @BeforeEach void setUp() throws SQLException { DBUtils.recreateDB(dbosConfig); - DBOSExecutorTest.dataSource = SystemDatabase.createDataSource(dbosConfig); + dataSource = SystemDatabase.createDataSource(dbosConfig); DBOSTestAccess.reinitialize(dbosConfig); } @AfterEach void afterEachTest() throws Exception { + dataSource.close(); DBOS.shutdown(); } + @Test + @EnabledForJreRange(min = JRE.JAVA_21) + public void virtualThreadPoolJava21() throws Exception { + DBOS.launch(); + + assertFalse(DBOSTestAccess.getDbosExecutor().usingThreadPoolExecutor()); + } + + @Test + @EnabledIfEnvironmentVariable(named = "JDKVERSION", matches = "21|25") + public void virtualThreadPoolJDK21And25() throws Exception { + DBOS.launch(); + + assertFalse(DBOSTestAccess.getDbosExecutor().usingThreadPoolExecutor()); + } + + @Test + @DisabledForJreRange(min = JRE.JAVA_21) + public void threadPoolJava17() throws Exception { + DBOS.launch(); + + assertTrue(DBOSTestAccess.getDbosExecutor().usingThreadPoolExecutor()); + } + + @Test + @EnabledIfEnvironmentVariable(named = "JDKVERSION", matches = "17|17\\..*") + public void threadPoolJDK17() throws Exception { + DBOS.launch(); + + assertTrue(DBOSTestAccess.getDbosExecutor().usingThreadPoolExecutor()); + } + @Test void executeWorkflowById() throws Exception { @@ -109,7 +144,6 @@ void executeWorkflowByIdNonExistent() throws Exception { @Test void workflowFunctionNotfound() throws Exception { - ExecutingService executingService = DBOS.registerWorkflows(ExecutingService.class, new ExecutingServiceImpl()); DBOS.launch(); @@ -127,8 +161,8 @@ void workflowFunctionNotfound() throws Exception { assertEquals(wfs.get(0).status(), WorkflowState.SUCCESS.name()); DBOS.shutdown(); - DBOSTestAccess.clearRegistry(); // clear out the registry - DBOS.launch(); // restart dbos + DBOSTestAccess.reinitialize(dbosConfig); // reinitialize to clear out the registry + DBOS.launch(); var dbosExecutor = DBOSTestAccess.getDbosExecutor(); boolean error = false; @@ -285,7 +319,8 @@ public void sleepRecovery() throws Exception { long currenttime = System.currentTimeMillis(); long newEndtime = (currenttime + 2000); - String endTimeAsJson = JSONUtil.serialize(newEndtime); + String endTimeAsJson = + SerializationUtil.serializeValue(newEndtime, null, null).serializedValue(); DBUtils.updateStepEndTime(dataSource, wfid, steps.get(0).functionId(), endTimeAsJson); diff --git a/transact/src/test/java/dev/dbos/transact/execution/LifecycleTest.java b/transact/src/test/java/dev/dbos/transact/execution/LifecycleTest.java index 76e8d033..782e142d 100644 --- a/transact/src/test/java/dev/dbos/transact/execution/LifecycleTest.java +++ b/transact/src/test/java/dev/dbos/transact/execution/LifecycleTest.java @@ -5,14 +5,114 @@ import dev.dbos.transact.DBOS; import dev.dbos.transact.DBOSTestAccess; import dev.dbos.transact.DbSetupTestBase; +import dev.dbos.transact.StartWorkflowOptions; import dev.dbos.transact.utils.DBUtils; +import dev.dbos.transact.workflow.Workflow; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.UUID; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.METHOD) +@interface TestLifecycleAnnotation { + int count() default 4; +} + +interface LifecycleTestWorkflows { + public int runWf1(int nClasses, int nWfs); + + public int runWf2(int nClasses, int nWfs); + + public int doNotRunWF(int nClasses, int nWfs); +} + +class LifecycleTestWorkflowsImpl implements LifecycleTestWorkflows { + int nWfs = 0, nInstances = 0; + + @Workflow() + @TestLifecycleAnnotation(count = 3) + public int runWf1(int nInstances, int nWfs) { + this.nInstances = nInstances; + this.nWfs = nWfs; + return 8; + } + + @Workflow() + @TestLifecycleAnnotation(count = 4) + public int runWf2(int nInstances, int nWfs) { + return 7; + } + + @Workflow() + public int doNotRunWF(int nInstances, int nWfs) { + throw new IllegalStateException(); + } +} + +class TestLifecycleService implements DBOSLifecycleListener { + private DBOS.Instance dbos; + public int launchCount = 0; + public int shutdownCount = 0; + public int nInstances = 0; + public int nWfs = 0; + public int annotationCount = 0; + + public ArrayList wfs = new ArrayList<>(); + + @Override + public void dbosLaunched(DBOS.Instance dbos) { + this.dbos = dbos; + var expectedParams = new Class[] {int.class, int.class}; + + ++launchCount; + + nInstances = dbos.getRegisteredWorkflowInstances().size(); + var wfs = dbos.getRegisteredWorkflows(); + for (var wf : wfs) { + var method = wf.workflowMethod(); + var tag = method.getAnnotation(TestLifecycleAnnotation.class); + if (tag == null) { + continue; + } + + ++nWfs; + annotationCount += tag.count(); + + var paramTypes = method.getParameterTypes(); + if (!Arrays.equals(paramTypes, expectedParams)) { + continue; + } + + this.wfs.add(wf); + } + } + + @Override + public void dbosShutDown() { + ++shutdownCount; + } + + public int runThemAll() throws Exception { + int total = 0; + for (var wf : wfs) { + Object[] args = {nInstances, nWfs}; + var h = dbos.startWorkflow(wf, args, new StartWorkflowOptions(UUID.randomUUID().toString())); + total += (Integer) h.getResult(); + } + return total; + } +} + @org.junit.jupiter.api.Timeout(value = 2, unit = java.util.concurrent.TimeUnit.MINUTES) public class LifecycleTest extends DbSetupTestBase { private static LifecycleTestWorkflowsImpl impl; @@ -20,8 +120,9 @@ public class LifecycleTest extends DbSetupTestBase { @BeforeEach void beforeEachTest() throws SQLException { - DBUtils.recreateDB(dbosConfig); - DBOSTestAccess.reinitialize(dbosConfig); + var config = createConfigFromEnv("lifecycletest"); + DBUtils.recreateDB(config); + DBOSTestAccess.reinitialize(config); impl = new LifecycleTestWorkflowsImpl(); DBOS.registerWorkflows(LifecycleTestWorkflows.class, impl, "inst1"); @@ -43,7 +144,7 @@ void afterEachTest() throws Exception { void checkThatItAllHappened() throws Exception { // Pretend this is an external event var total = svc.runThemAll(); - assertEquals(3, impl.nInstances); // One of these is internal... for better or worse + assertEquals(2, impl.nInstances); assertEquals(4, impl.nWfs); assertEquals(14, svc.annotationCount); assertEquals(30, total); @@ -57,7 +158,7 @@ void checkThatItAllHappened() throws Exception { void deactivateLifecycleListeners() throws Exception { // Pretend this is an external event var total = svc.runThemAll(); - assertEquals(3, impl.nInstances); // One of these is internal... for better or worse + assertEquals(2, impl.nInstances); assertEquals(4, impl.nWfs); assertEquals(14, svc.annotationCount); assertEquals(30, total); diff --git a/transact/src/test/java/dev/dbos/transact/execution/RecoveryServiceTest.java b/transact/src/test/java/dev/dbos/transact/execution/RecoveryServiceTest.java index 7ddc3263..572e25c1 100644 --- a/transact/src/test/java/dev/dbos/transact/execution/RecoveryServiceTest.java +++ b/transact/src/test/java/dev/dbos/transact/execution/RecoveryServiceTest.java @@ -20,6 +20,7 @@ import javax.sql.DataSource; +import com.zaxxer.hikari.HikariDataSource; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -28,8 +29,7 @@ @org.junit.jupiter.api.Timeout(value = 2, unit = java.util.concurrent.TimeUnit.MINUTES) class RecoveryServiceTest extends DbSetupTestBase { - - private static DataSource dataSource; + private HikariDataSource dataSource; private Queue testQueue; private SystemDatabase systemDatabase; private DBOSExecutor dbosExecutor; @@ -40,7 +40,7 @@ class RecoveryServiceTest extends DbSetupTestBase { @BeforeEach void setUp() throws SQLException { DBUtils.recreateDB(dbosConfig); - RecoveryServiceTest.dataSource = SystemDatabase.createDataSource(dbosConfig); + dataSource = SystemDatabase.createDataSource(dbosConfig); DBOSTestAccess.reinitialize(dbosConfig); executingService = @@ -58,6 +58,7 @@ void setUp() throws SQLException { @AfterEach void afterEachTest() throws Exception { + dataSource.close(); DBOS.shutdown(); } diff --git a/transact/src/test/java/dev/dbos/transact/execution/ScaleTest.java b/transact/src/test/java/dev/dbos/transact/execution/ScaleTest.java index 79e3a0ec..cd9b7fd6 100644 --- a/transact/src/test/java/dev/dbos/transact/execution/ScaleTest.java +++ b/transact/src/test/java/dev/dbos/transact/execution/ScaleTest.java @@ -4,7 +4,7 @@ import dev.dbos.transact.DBOS; import dev.dbos.transact.DBOSTestAccess; -import dev.dbos.transact.config.DBOSConfig; +import dev.dbos.transact.DbSetupTestBase; import dev.dbos.transact.utils.DBUtils; import dev.dbos.transact.workflow.Workflow; import dev.dbos.transact.workflow.WorkflowHandle; @@ -14,7 +14,6 @@ import java.util.ArrayList; import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; @@ -40,18 +39,9 @@ public String workflow(String input) { } @org.junit.jupiter.api.Timeout(value = 5, unit = java.util.concurrent.TimeUnit.MINUTES) -public class ScaleTest { +public class ScaleTest extends DbSetupTestBase { private static final Logger logger = LoggerFactory.getLogger(ScaleTest.class); - private static DBOSConfig dbosConfig; - - @BeforeAll - public static void onetimeBefore() { - dbosConfig = - DBOSConfig.defaultsFromEnv("systemdbtest") - .withDatabaseUrl("jdbc:postgresql://localhost:5432/dbos_java_sys"); - } - @BeforeEach void setUp() throws SQLException { DBUtils.recreateDB(dbosConfig); diff --git a/transact/src/test/java/dev/dbos/transact/execution/SingleExecutionTest.java b/transact/src/test/java/dev/dbos/transact/execution/SingleExecutionTest.java index ec03d6ae..3fa98e64 100644 --- a/transact/src/test/java/dev/dbos/transact/execution/SingleExecutionTest.java +++ b/transact/src/test/java/dev/dbos/transact/execution/SingleExecutionTest.java @@ -7,6 +7,7 @@ import dev.dbos.transact.DBOSTestAccess; import dev.dbos.transact.DbSetupTestBase; import dev.dbos.transact.StartWorkflowOptions; +import dev.dbos.transact.database.SystemDatabase; import dev.dbos.transact.internal.DebugTriggers; import dev.dbos.transact.utils.DBUtils; import dev.dbos.transact.workflow.Step; @@ -18,6 +19,7 @@ import java.sql.SQLTransientException; import java.util.UUID; +import com.zaxxer.hikari.HikariDataSource; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -257,9 +259,12 @@ public void testConcWorkflow() throws InterruptedException { private static TryConcExec2 concImpl; private static TryConcExec2Ifc concIfc; + private static HikariDataSource dataSource; + @BeforeEach void beforeEachTest() throws SQLException { DBUtils.recreateDB(dbosConfig); + dataSource = SystemDatabase.createDataSource(dbosConfig); DBOSTestAccess.reinitialize(dbosConfig); execImpl = new TryConcExec(); @@ -283,6 +288,7 @@ void beforeEachTest() throws SQLException { @AfterEach void afterEachTest() throws Exception { + dataSource.close(); DBOS.shutdown(); } diff --git a/transact/src/test/java/dev/dbos/transact/invocation/CustomSchemaTest.java b/transact/src/test/java/dev/dbos/transact/invocation/CustomSchemaTest.java index cf1e55c3..6bb00f45 100644 --- a/transact/src/test/java/dev/dbos/transact/invocation/CustomSchemaTest.java +++ b/transact/src/test/java/dev/dbos/transact/invocation/CustomSchemaTest.java @@ -18,34 +18,28 @@ import com.zaxxer.hikari.HikariDataSource; import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @org.junit.jupiter.api.Timeout(value = 2, unit = java.util.concurrent.TimeUnit.MINUTES) public class CustomSchemaTest extends DbSetupTestBase { - private static final String schema = "C$+0m'"; + private static final String schema = "F8nny_sCHem@-n@m3"; private HawkService proxy; private HikariDataSource dataSource; private String localDate = LocalDate.now().format(DateTimeFormatter.ISO_DATE); - @BeforeAll - static void onetimeSetup() throws Exception { - - dbosConfig = dbosConfig.withDatabaseSchema(schema); - } - @BeforeEach void beforeEachTest() throws SQLException { - DBUtils.recreateDB(dbosConfig); - DBOSTestAccess.reinitialize(dbosConfig); + var config = dbosConfig.withDatabaseSchema(schema); + DBUtils.recreateDB(config); + DBOSTestAccess.reinitialize(config); var impl = new HawkServiceImpl(); proxy = DBOS.registerWorkflows(HawkService.class, impl); impl.setProxy(proxy); DBOS.launch(); - dataSource = SystemDatabase.createDataSource(dbosConfig); + dataSource = SystemDatabase.createDataSource(config); } @AfterEach diff --git a/transact/src/test/java/dev/dbos/transact/invocation/DirectInvocationTest.java b/transact/src/test/java/dev/dbos/transact/invocation/DirectInvocationTest.java index 78811cce..952b836e 100644 --- a/transact/src/test/java/dev/dbos/transact/invocation/DirectInvocationTest.java +++ b/transact/src/test/java/dev/dbos/transact/invocation/DirectInvocationTest.java @@ -208,6 +208,8 @@ void directInvokeParent() throws Exception { assertNull(row1.timeoutMs()); assertNull(row0.deadlineEpochMs()); assertNull(row1.deadlineEpochMs()); + assertNull(row0.parentWorkflowId()); + assertEquals(row0.workflowId(), row1.parentWorkflowId()); var steps = DBUtils.getStepRows(dataSource, row0.workflowId()); assertEquals(1, steps.size()); @@ -269,6 +271,7 @@ void directInvokeParentSetWorkflowId() throws Exception { var row1 = rows.get(1); assertEquals(workflowId, row0.workflowId()); assertEquals(workflowId + "-0", row1.workflowId()); + assertEquals(workflowId, row1.parentWorkflowId()); } @Test diff --git a/transact/src/test/java/dev/dbos/transact/invocation/InstanceTest.java b/transact/src/test/java/dev/dbos/transact/invocation/InstanceTest.java index 9bbb3941..0ac1736f 100644 --- a/transact/src/test/java/dev/dbos/transact/invocation/InstanceTest.java +++ b/transact/src/test/java/dev/dbos/transact/invocation/InstanceTest.java @@ -7,7 +7,7 @@ import static org.junit.jupiter.api.Assertions.assertThrows; import dev.dbos.transact.DBOS; -import dev.dbos.transact.config.DBOSConfig; +import dev.dbos.transact.DbSetupTestBase; import dev.dbos.transact.context.WorkflowOptions; import dev.dbos.transact.database.SystemDatabase; import dev.dbos.transact.exceptions.DBOSAwaitedWorkflowCancelledException; @@ -25,7 +25,6 @@ import com.zaxxer.hikari.HikariDataSource; import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -112,21 +111,12 @@ public String illegalWorkflow() { } @org.junit.jupiter.api.Timeout(value = 2, unit = java.util.concurrent.TimeUnit.MINUTES) -public class InstanceTest { - private static DBOSConfig dbosConfig; +public class InstanceTest extends DbSetupTestBase { private DBOS.Instance dbos; private HawkService proxy; private HikariDataSource dataSource; private String localDate = LocalDate.now().format(DateTimeFormatter.ISO_DATE); - @BeforeAll - static void onetimeSetup() throws Exception { - - dbosConfig = - DBOSConfig.defaultsFromEnv("systemdbtest") - .withDatabaseUrl("jdbc:postgresql://localhost:5432/dbos_java_sys"); - } - @BeforeEach void beforeEachTest() throws SQLException { DBUtils.recreateDB(dbosConfig); diff --git a/transact/src/test/java/dev/dbos/transact/invocation/MultiClassInstanceTest.java b/transact/src/test/java/dev/dbos/transact/invocation/MultiClassInstanceTest.java index a8947bc5..1c5573dc 100644 --- a/transact/src/test/java/dev/dbos/transact/invocation/MultiClassInstanceTest.java +++ b/transact/src/test/java/dev/dbos/transact/invocation/MultiClassInstanceTest.java @@ -175,8 +175,9 @@ public void enqueueForSpecificInstance() throws Exception { "SUCCESS", stat.orElseThrow(() -> new AssertionError("Workflow status not found")).status()); - var dataSource = SystemDatabase.createDataSource(dbosConfig); - DBUtils.setWorkflowState(dataSource, handle.workflowId(), WorkflowState.PENDING.name()); + try (var dataSource = SystemDatabase.createDataSource(dbosConfig)) { + DBUtils.setWorkflowState(dataSource, handle.workflowId(), WorkflowState.PENDING.name()); + } stat = client.getWorkflowStatus(handle.workflowId()); assertEquals( "PENDING", diff --git a/transact/src/test/java/dev/dbos/transact/invocation/MultiDbosInstanceTest.java b/transact/src/test/java/dev/dbos/transact/invocation/MultiDbosInstanceTest.java index f1cdfacd..6a0bebed 100644 --- a/transact/src/test/java/dev/dbos/transact/invocation/MultiDbosInstanceTest.java +++ b/transact/src/test/java/dev/dbos/transact/invocation/MultiDbosInstanceTest.java @@ -4,6 +4,7 @@ import static org.junit.jupiter.api.Assertions.assertThrows; import dev.dbos.transact.DBOS; +import dev.dbos.transact.DbSetupTestBase; import dev.dbos.transact.StartWorkflowOptions; import dev.dbos.transact.config.DBOSConfig; import dev.dbos.transact.context.WorkflowOptions; @@ -16,7 +17,6 @@ import java.util.UUID; import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -39,7 +39,7 @@ public String testWorkflow(String name) { } @org.junit.jupiter.api.Timeout(value = 2, unit = java.util.concurrent.TimeUnit.MINUTES) -public class MultiDbosInstanceTest { +public class MultiDbosInstanceTest extends DbSetupTestBase { private static DBOSConfig dbosConfigA; private DBOS.Instance dbosA; @@ -53,18 +53,14 @@ public class MultiDbosInstanceTest { private TestService proxyB; private Queue queueB; - @BeforeAll - static void onetimeSetup() throws Exception { - dbosConfigA = - DBOSConfig.defaultsFromEnv("MultiDbosInstanceTestA") - .withDatabaseUrl("jdbc:postgresql://localhost:5432/dbos_java_multi_a"); - dbosConfigB = - DBOSConfig.defaultsFromEnv("MultiDbosInstanceTestB") - .withDatabaseUrl("jdbc:postgresql://localhost:5432/dbos_java_multi_b"); - } - @BeforeEach void beforeEachTest() throws Exception { + dbosConfigA = + createConfigFromEnv("MultiDbosInstanceTestA") + .withDatabaseUrl(getJdbcUrl("dbos_java_multi_a")); + dbosConfigB = + createConfigFromEnv("MultiDbosInstanceTestB") + .withDatabaseUrl(getJdbcUrl("dbos_java_multi_b")); DBUtils.recreateDB(dbosConfigA); dbosA = new DBOS.Instance(dbosConfigA); implA = new TestServiceImpl(dbosA); diff --git a/transact/src/test/java/dev/dbos/transact/invocation/PatchTest.java b/transact/src/test/java/dev/dbos/transact/invocation/PatchTest.java index dabd470d..3d94fec1 100644 --- a/transact/src/test/java/dev/dbos/transact/invocation/PatchTest.java +++ b/transact/src/test/java/dev/dbos/transact/invocation/PatchTest.java @@ -5,8 +5,8 @@ import dev.dbos.transact.DBOS; import dev.dbos.transact.DBOSTestAccess; +import dev.dbos.transact.DbSetupTestBase; import dev.dbos.transact.StartWorkflowOptions; -import dev.dbos.transact.config.DBOSConfig; import dev.dbos.transact.database.SystemDatabase; import dev.dbos.transact.exceptions.DBOSUnexpectedStepException; import dev.dbos.transact.utils.DBUtils; @@ -99,7 +99,7 @@ public int workflowB() { } @org.junit.jupiter.api.Timeout(value = 2, unit = java.util.concurrent.TimeUnit.MINUTES) -public class PatchTest { +public class PatchTest extends DbSetupTestBase { @AfterEach void afterEachTest() throws Exception { @@ -117,10 +117,7 @@ public void testPatch() throws Exception { // have the same workflow name across deployed versions. var dbosConfig = - DBOSConfig.defaultsFromEnv("systemdbtest") - .withDatabaseUrl("jdbc:postgresql://localhost:5432/dbos_java_sys") - .withEnablePatching() - .withAppVersion("test-version"); + createConfigFromEnv("systemdbtest").withEnablePatching().withAppVersion("test-version"); try (var dataSource = SystemDatabase.createDataSource(dbosConfig)) { @@ -258,10 +255,7 @@ public void testPatch() throws Exception { @Test public void patchThrowsNotConfigured() throws Exception { - var dbosConfig = - DBOSConfig.defaultsFromEnv("systemdbtest") - .withDatabaseUrl("jdbc:postgresql://localhost:5432/dbos_java_sys") - .withAppVersion("test-version"); + var dbosConfig = createConfigFromEnv("systemdbtest").withAppVersion("test-version"); DBUtils.recreateDB(dbosConfig); DBOSTestAccess.reinitialize(dbosConfig); @@ -274,10 +268,7 @@ public void patchThrowsNotConfigured() throws Exception { @Test public void deprecatePatchThrowsNotConfigured() throws Exception { - var dbosConfig = - DBOSConfig.defaultsFromEnv("systemdbtest") - .withDatabaseUrl("jdbc:postgresql://localhost:5432/dbos_java_sys") - .withAppVersion("test-version"); + var dbosConfig = createConfigFromEnv("systemdbtest").withAppVersion("test-version"); DBUtils.recreateDB(dbosConfig); DBOSTestAccess.reinitialize(dbosConfig); @@ -290,10 +281,7 @@ public void deprecatePatchThrowsNotConfigured() throws Exception { @Test public void mulipleDefinitions() throws Exception { - var dbosConfig = - DBOSConfig.defaultsFromEnv("systemdbtest") - .withDatabaseUrl("jdbc:postgresql://localhost:5432/dbos_java_sys") - .withAppVersion("test-version"); + var dbosConfig = createConfigFromEnv("systemdbtest").withAppVersion("test-version"); DBUtils.recreateDB(dbosConfig); DBOSTestAccess.reinitialize(dbosConfig); diff --git a/transact/src/test/java/dev/dbos/transact/invocation/StartWorkflowTest.java b/transact/src/test/java/dev/dbos/transact/invocation/StartWorkflowTest.java index 9e355860..6cd91cc3 100644 --- a/transact/src/test/java/dev/dbos/transact/invocation/StartWorkflowTest.java +++ b/transact/src/test/java/dev/dbos/transact/invocation/StartWorkflowTest.java @@ -9,7 +9,6 @@ import dev.dbos.transact.DBOSTestAccess; import dev.dbos.transact.DbSetupTestBase; import dev.dbos.transact.StartWorkflowOptions; -import dev.dbos.transact.database.SystemDatabase; import dev.dbos.transact.utils.DBUtils; import dev.dbos.transact.workflow.Queue; @@ -20,7 +19,6 @@ import java.time.format.DateTimeFormatter; import java.util.concurrent.TimeUnit; -import com.zaxxer.hikari.HikariDataSource; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -28,7 +26,6 @@ @org.junit.jupiter.api.Timeout(value = 2, unit = java.util.concurrent.TimeUnit.MINUTES) public class StartWorkflowTest extends DbSetupTestBase { private HawkService proxy; - private HikariDataSource dataSource; private String localDate = LocalDate.now().format(DateTimeFormatter.ISO_DATE); @BeforeEach @@ -39,17 +36,14 @@ void beforeEachTest() throws SQLException { proxy = DBOS.registerWorkflows(HawkService.class, impl); impl.setProxy(proxy); - DBOS.registerQueue(new Queue("queue")); - DBOS.registerQueue(new Queue("partitioned-queue").withPartitionedEnabled(true)); + DBOS.registerQueues( + new Queue("queue"), new Queue("partitioned-queue").withPartitionedEnabled(true)); DBOS.launch(); - - dataSource = SystemDatabase.createDataSource(dbosConfig); } @AfterEach void afterEachTest() throws Exception { - dataSource.close(); DBOS.shutdown(); } diff --git a/transact/src/test/java/dev/dbos/transact/issues/Issue218.java b/transact/src/test/java/dev/dbos/transact/issues/Issue218.java index f45fcd3e..80a2b1c6 100644 --- a/transact/src/test/java/dev/dbos/transact/issues/Issue218.java +++ b/transact/src/test/java/dev/dbos/transact/issues/Issue218.java @@ -90,6 +90,7 @@ void beforeEachTest() throws SQLException { @AfterEach void afterEachTest() throws Exception { + dataSource.close(); DBOS.shutdown(); } diff --git a/transact/src/test/java/dev/dbos/transact/json/InteropTest.java b/transact/src/test/java/dev/dbos/transact/json/InteropTest.java index cad83203..91a56a86 100644 --- a/transact/src/test/java/dev/dbos/transact/json/InteropTest.java +++ b/transact/src/test/java/dev/dbos/transact/json/InteropTest.java @@ -5,7 +5,7 @@ import dev.dbos.transact.DBOS; import dev.dbos.transact.DBOSClient; import dev.dbos.transact.DBOSTestAccess; -import dev.dbos.transact.config.DBOSConfig; +import dev.dbos.transact.DbSetupTestBase; import dev.dbos.transact.database.SystemDatabase; import dev.dbos.transact.utils.DBUtils; import dev.dbos.transact.workflow.Queue; @@ -22,7 +22,6 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.zaxxer.hikari.HikariDataSource; import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -45,11 +44,10 @@ * */ @org.junit.jupiter.api.Timeout(value = 2, unit = java.util.concurrent.TimeUnit.MINUTES) -public class InteropTest { +public class InteropTest extends DbSetupTestBase { private static final ObjectMapper mapper = new ObjectMapper(); - private static DBOSConfig dbosConfig; private HikariDataSource dataSource; // ============================================================================ @@ -100,18 +98,12 @@ public class InteropTest { // Golden event value JSON static final String GOLDEN_EVENT_JSON = "{\"flag\":true,\"num\":42,\"text\":\"hello-interop\"}"; - @BeforeAll - static void onetimeSetup() throws Exception { - InteropTest.dbosConfig = - DBOSConfig.defaultsFromEnv("interoptest") - .withDatabaseUrl("jdbc:postgresql://localhost:5432/dbos_java_sys"); - } - @BeforeEach void beforeEachTest() throws Exception { - DBUtils.recreateDB(dbosConfig); - dataSource = SystemDatabase.createDataSource(dbosConfig); - DBOSTestAccess.reinitialize(dbosConfig); + var config = createConfigFromEnv("interoptest"); + DBUtils.recreateDB(config); + dataSource = SystemDatabase.createDataSource(config); + DBOSTestAccess.reinitialize(config); } @AfterEach diff --git a/transact/src/test/java/dev/dbos/transact/json/PortableSerializationTest.java b/transact/src/test/java/dev/dbos/transact/json/PortableSerializationTest.java index cec13a17..aa795033 100644 --- a/transact/src/test/java/dev/dbos/transact/json/PortableSerializationTest.java +++ b/transact/src/test/java/dev/dbos/transact/json/PortableSerializationTest.java @@ -5,8 +5,8 @@ import dev.dbos.transact.DBOS; import dev.dbos.transact.DBOSClient; import dev.dbos.transact.DBOSTestAccess; +import dev.dbos.transact.DbSetupTestBase; import dev.dbos.transact.StartWorkflowOptions; -import dev.dbos.transact.config.DBOSConfig; import dev.dbos.transact.database.SystemDatabase; import dev.dbos.transact.utils.DBUtils; import dev.dbos.transact.utils.WorkflowStatusRow; @@ -31,7 +31,6 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.zaxxer.hikari.HikariDataSource; import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -41,23 +40,15 @@ * initiation. */ @org.junit.jupiter.api.Timeout(value = 2, unit = java.util.concurrent.TimeUnit.MINUTES) -public class PortableSerializationTest { - - private static DBOSConfig dbosConfig; +public class PortableSerializationTest extends DbSetupTestBase { private HikariDataSource dataSource; - @BeforeAll - static void onetimeSetup() throws Exception { - PortableSerializationTest.dbosConfig = - DBOSConfig.defaultsFromEnv("portablesertest") - .withDatabaseUrl("jdbc:postgresql://localhost:5432/dbos_java_sys"); - } - @BeforeEach void beforeEachTest() throws SQLException { - DBUtils.recreateDB(dbosConfig); - dataSource = SystemDatabase.createDataSource(dbosConfig); - DBOSTestAccess.reinitialize(dbosConfig); + var config = createConfigFromEnv("portablesertest"); + DBUtils.recreateDB(config); + dataSource = SystemDatabase.createDataSource(config); + DBOSTestAccess.reinitialize(config); } @AfterEach diff --git a/transact/src/test/java/dev/dbos/transact/migrations/MigrationManagerTest.java b/transact/src/test/java/dev/dbos/transact/migrations/MigrationManagerTest.java index d5efe86b..8f8ec08a 100644 --- a/transact/src/test/java/dev/dbos/transact/migrations/MigrationManagerTest.java +++ b/transact/src/test/java/dev/dbos/transact/migrations/MigrationManagerTest.java @@ -3,6 +3,7 @@ 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.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; import dev.dbos.transact.Constants; @@ -16,34 +17,51 @@ import java.sql.ResultSet; import java.util.ArrayList; -import javax.sql.DataSource; - import com.zaxxer.hikari.HikariDataSource; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; @org.junit.jupiter.api.Timeout(value = 2, unit = java.util.concurrent.TimeUnit.MINUTES) class MigrationManagerTest extends DbSetupTestBase { - private DataSource testDataSource; + // Expected tables after migrations + static final String[] EXPECTED_TABLES = { + "application_versions", + "event_dispatch_kv", + "notifications", + "operation_outputs", + "streams", + "workflow_events_history", + "workflow_events", + "workflow_schedules", + "workflow_status" + }; + + // Expected functions after migrations + static final String[] EXPECTED_FUNCTIONS = { + "notifications_function", "workflow_events_function", "enqueue_workflow", "send_message" + }; + + private HikariDataSource dataSource; + private DBOSConfig dbosConfig; @BeforeEach void setup() throws Exception { + dbosConfig = - DBOSConfig.defaultsFromEnv("migrationtest") - .withDatabaseUrl(postgres.getJdbcUrl()) - .withDbUser(postgres.getUsername()) - .withDbPassword(postgres.getPassword()); + createConfigFromEnv("migrationtest").withDatabaseUrl(getJdbcUrl("dbos_java_sys_mm_test")); DBUtils.recreateDB(dbosConfig); - testDataSource = SystemDatabase.createDataSource(dbosConfig); + dataSource = SystemDatabase.createDataSource(dbosConfig); } @AfterEach void cleanup() throws Exception { - ((HikariDataSource) testDataSource).close(); + dataSource.close(); } @Test @@ -52,14 +70,17 @@ void testRunMigrations_CreatesTables() throws Exception { MigrationManager.runMigrations(dbosConfig); // Assert - try (Connection conn = testDataSource.getConnection()) { + try (Connection conn = dataSource.getConnection()) { DatabaseMetaData metaData = conn.getMetaData(); // Verify all expected tables exist in the dbos schema - assertTableExists(metaData, "operation_outputs"); - assertTableExists(metaData, "workflow_status"); - assertTableExists(metaData, "notifications"); - assertTableExists(metaData, "workflow_events"); + for (String table : EXPECTED_TABLES) { + assertTableExists(metaData, table); + } + + for (String function : EXPECTED_FUNCTIONS) { + assertFunctionExists(metaData, function); + } var migrations = new ArrayList<>(MigrationManager.getMigrations(Constants.DB_SCHEMA)); var version = getVersion(conn); @@ -74,18 +95,33 @@ public static void assertTableExists(DatabaseMetaData metaData, String tableName public static void assertTableExists( DatabaseMetaData metaData, String tableName, String schemaName) throws Exception { + schemaName = SystemDatabase.sanitizeSchema(schemaName); try (ResultSet rs = metaData.getTables(null, schemaName, tableName, null)) { assertTrue(rs.next(), "Table %s should exist in schema %s".formatted(tableName, schemaName)); } } + public static void assertFunctionExists(DatabaseMetaData metaData, String functionName) + throws Exception { + assertFunctionExists(metaData, functionName, Constants.DB_SCHEMA); + } + + public static void assertFunctionExists( + DatabaseMetaData metaData, String functionName, String schemaName) throws Exception { + schemaName = SystemDatabase.sanitizeSchema(schemaName); + try (ResultSet rs = metaData.getFunctions(null, schemaName, functionName)) { + assertTrue( + rs.next(), "Function %s should exist in schema %s".formatted(functionName, schemaName)); + } + } + public static int getVersion(Connection conn) throws Exception { return getVersion(conn, Constants.DB_SCHEMA); } public static int getVersion(Connection conn, String schema) throws Exception { schema = SystemDatabase.sanitizeSchema(schema); - String sql = "SELECT version FROM %s.dbos_migrations".formatted(schema); + String sql = "SELECT version FROM \"%s\".dbos_migrations".formatted(schema); try (var stmt = conn.createStatement(); var rs = stmt.executeQuery(sql)) { assertTrue(rs.next()); @@ -95,22 +131,31 @@ public static int getVersion(Connection conn, String schema) throws Exception { } } - @Test - void testRunMigrations_customSchema() throws Exception { + @ParameterizedTest + @ValueSource(strings = {"invalid\"schema", "invalid'schema"}) + void testRunMigrations_fails_invalid_schema(String invalidSchema) throws Exception { + dbosConfig = dbosConfig.withDatabaseSchema(invalidSchema); + assertThrows(IllegalArgumentException.class, () -> MigrationManager.runMigrations(dbosConfig)); + } - String schema = "C\"$+0m'"; + @ParameterizedTest + @ValueSource(strings = {"F8nny_sCHem@-n@m3", "embedded\0null"}) + void testRunMigrations_customSchema(String schema) throws Exception { dbosConfig = dbosConfig.withDatabaseSchema(schema); MigrationManager.runMigrations(dbosConfig); // Assert - try (Connection conn = testDataSource.getConnection()) { + try (Connection conn = dataSource.getConnection()) { DatabaseMetaData metaData = conn.getMetaData(); - // Verify all expected tables exist in the dbos schema - assertTableExists(metaData, "operation_outputs", schema); - assertTableExists(metaData, "workflow_status", schema); - assertTableExists(metaData, "notifications", schema); - assertTableExists(metaData, "workflow_events", schema); + // Verify all expected tables exist in the custom schema + for (String table : EXPECTED_TABLES) { + assertTableExists(metaData, table, schema); + } + + for (String function : EXPECTED_FUNCTIONS) { + assertFunctionExists(metaData, function, schema); + } var migrations = new ArrayList<>(MigrationManager.getMigrations(schema)); var version = getVersion(conn, schema); @@ -138,23 +183,217 @@ void testAddingNewMigration() throws Exception { var migrations = new ArrayList<>(MigrationManager.getMigrations(Constants.DB_SCHEMA)); migrations.add("CREATE TABLE dummy_table(id SERIAL PRIMARY KEY);"); - try (var conn = testDataSource.getConnection()) { + try (var conn = dataSource.getConnection()) { MigrationManager.runDbosMigrations(conn, Constants.DB_SCHEMA, migrations); } // Validate the dummy_table was created - try (Connection conn = testDataSource.getConnection(); + try (Connection conn = dataSource.getConnection(); ResultSet rs = conn.getMetaData().getTables(null, null, "dummy_table", null)) { Assertions.assertTrue(rs.next(), "Expected 'dummy_table' to exist after new migration."); } } + @Test + void testWayFutureVersion() throws Exception { + testRunMigrations_CreatesTables(); + + try (var conn = dataSource.getConnection(); + var stmt = conn.createStatement()) { + stmt.executeUpdate("UPDATE \"dbos\".\"dbos_migrations\" SET \"version\" = 10000;"); + } + + assertDoesNotThrow( + () -> { + MigrationManager.runMigrations(dbosConfig); + }, + "Migrations should run successfully multiple times"); + } + @Test public void extractDbAndPostgresUrl() { - var originalUrl = "jdbc:postgresql://localhost:5432/dbos_java_sys?user=alice&ssl=true"; + var originalUrl = getJdbcUrl("dbos_java_sys") + "?user=alice&ssl=true"; var pair = MigrationManager.extractDbAndPostgresUrl(originalUrl); assertEquals("dbos_java_sys", pair.database()); - assertEquals("jdbc:postgresql://localhost:5432/postgres?user=alice&ssl=true", pair.url()); + assertEquals(getJdbcUrl("postgres") + "?user=alice&ssl=true", pair.url()); + } + + @Test + void testOriginalMigration1ThenAllMigrations_NotificationsPrimaryKey() throws Exception { + try (Connection conn = dataSource.getConnection()) { + // Ensure schema and migration table exist + MigrationManager.ensureDbosSchema(conn, Constants.DB_SCHEMA); + MigrationManager.ensureMigrationTable(conn, Constants.DB_SCHEMA); + + // Run only the original migration1 (before primary key was added) to populate database with + // initial structure + var originalMigration1 = getOriginalMigration1().formatted(Constants.DB_SCHEMA); + try (var stmt = conn.createStatement()) { + stmt.execute(originalMigration1); + } + + // Update migration version to 1 + var insertSql = + "INSERT INTO \"%s\".dbos_migrations (version) VALUES (1)".formatted(Constants.DB_SCHEMA); + try (var stmt = conn.prepareStatement(insertSql)) { + stmt.executeUpdate(); + } + + // Verify notifications table was created + DatabaseMetaData metaData = conn.getMetaData(); + assertTableExists(metaData, "notifications"); + + // Now run all current migrations (including migration10 which ensures primary key) + var allMigrations = MigrationManager.getMigrations(Constants.DB_SCHEMA); + MigrationManager.runDbosMigrations(conn, Constants.DB_SCHEMA, allMigrations); + + // Verify that the notifications table has a primary key + assertNotificationTableHasPrimaryKey(metaData, "notifications", Constants.DB_SCHEMA); + + // Verify all migrations were applied + var finalVersion = getVersion(conn); + assertEquals(allMigrations.size(), finalVersion); + } + } + + private static void assertNotificationTableHasPrimaryKey( + DatabaseMetaData metaData, String tableName, String schemaName) throws Exception { + try (ResultSet rs = metaData.getPrimaryKeys(null, schemaName, tableName)) { + assertTrue( + rs.next(), + "Table %s should have a primary key in schema %s".formatted(tableName, schemaName)); + assertEquals( + "message_uuid", + rs.getString("COLUMN_NAME"), + "Primary key should be on message_uuid column"); + } + } + + /** + * Returns the original migration1 before primary key was added to notifications table. This + * represents the state before migration10 was introduced to defensively add the primary key. + */ + private static String getOriginalMigration1() { + return """ + CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; + + CREATE TABLE "%1$s".workflow_status ( + workflow_uuid TEXT PRIMARY KEY, + status TEXT, + name TEXT, + authenticated_user TEXT, + assumed_role TEXT, + authenticated_roles TEXT, + request TEXT, + output TEXT, + error TEXT, + executor_id TEXT, + created_at BIGINT NOT NULL DEFAULT (EXTRACT(epoch FROM now()) * 1000::numeric)::bigint, + updated_at BIGINT NOT NULL DEFAULT (EXTRACT(epoch FROM now()) * 1000::numeric)::bigint, + application_version TEXT, + application_id TEXT, + class_name VARCHAR(255) DEFAULT NULL, + config_name VARCHAR(255) DEFAULT NULL, + recovery_attempts BIGINT DEFAULT 0, + queue_name TEXT, + workflow_timeout_ms BIGINT, + workflow_deadline_epoch_ms BIGINT, + inputs TEXT, + started_at_epoch_ms BIGINT, + deduplication_id TEXT, + priority INT4 NOT NULL DEFAULT 0 + ); + + CREATE INDEX workflow_status_created_at_index ON "%1$s".workflow_status (created_at); + CREATE INDEX workflow_status_executor_id_index ON "%1$s".workflow_status (executor_id); + CREATE INDEX workflow_status_status_index ON "%1$s".workflow_status (status); + + ALTER TABLE "%1$s".workflow_status + ADD CONSTRAINT uq_workflow_status_queue_name_dedup_id + UNIQUE (queue_name, deduplication_id); + + CREATE TABLE "%1$s".operation_outputs ( + workflow_uuid TEXT NOT NULL, + function_id INT4 NOT NULL, + function_name TEXT NOT NULL DEFAULT '', + output TEXT, + error TEXT, + child_workflow_id TEXT, + PRIMARY KEY (workflow_uuid, function_id), + FOREIGN KEY (workflow_uuid) REFERENCES "%1$s".workflow_status(workflow_uuid) + ON UPDATE CASCADE ON DELETE CASCADE + ); + + CREATE TABLE "%1$s".notifications ( + message_uuid TEXT NOT NULL DEFAULT gen_random_uuid(), + destination_uuid TEXT NOT NULL, + topic TEXT, + message TEXT NOT NULL, + created_at_epoch_ms BIGINT NOT NULL DEFAULT (EXTRACT(epoch FROM now()) * 1000::numeric)::bigint, + FOREIGN KEY (destination_uuid) REFERENCES "%1$s".workflow_status(workflow_uuid) + ON UPDATE CASCADE ON DELETE CASCADE + ); + CREATE INDEX idx_workflow_topic ON "%1$s".notifications (destination_uuid, topic); + + -- Create notification function + CREATE OR REPLACE FUNCTION "%1$s".notifications_function() RETURNS TRIGGER AS $$ + DECLARE + payload text := NEW.destination_uuid || '::' || NEW.topic; + BEGIN + PERFORM pg_notify('dbos_notifications_channel', payload); + RETURN NEW; + END; + $$ LANGUAGE plpgsql; + + -- Create notification trigger + CREATE TRIGGER dbos_notifications_trigger + AFTER INSERT ON "%1$s".notifications + FOR EACH ROW EXECUTE FUNCTION "%1$s".notifications_function(); + + CREATE TABLE "%1$s".workflow_events ( + workflow_uuid TEXT NOT NULL, + key TEXT NOT NULL, + value TEXT NOT NULL, + PRIMARY KEY (workflow_uuid, key), + FOREIGN KEY (workflow_uuid) REFERENCES "%1$s".workflow_status(workflow_uuid) + ON UPDATE CASCADE ON DELETE CASCADE + ); + + -- Create events function + CREATE OR REPLACE FUNCTION "%1$s".workflow_events_function() RETURNS TRIGGER AS $$ + DECLARE + payload text := NEW.workflow_uuid || '::' || NEW.key; + BEGIN + PERFORM pg_notify('dbos_workflow_events_channel', payload); + RETURN NEW; + END; + $$ LANGUAGE plpgsql; + + -- Create events trigger + CREATE TRIGGER dbos_workflow_events_trigger + AFTER INSERT ON "%1$s".workflow_events + FOR EACH ROW EXECUTE FUNCTION "%1$s".workflow_events_function(); + + CREATE TABLE "%1$s".streams ( + workflow_uuid TEXT NOT NULL, + key TEXT NOT NULL, + value TEXT NOT NULL, + "offset" INT4 NOT NULL, + PRIMARY KEY (workflow_uuid, key, "offset"), + FOREIGN KEY (workflow_uuid) REFERENCES "%1$s".workflow_status(workflow_uuid) + ON UPDATE CASCADE ON DELETE CASCADE + ); + + CREATE TABLE "%1$s".event_dispatch_kv ( + service_name TEXT NOT NULL, + workflow_fn_name TEXT NOT NULL, + key TEXT NOT NULL, + value TEXT, + update_seq NUMERIC(38,0), + update_time NUMERIC(38,15), + PRIMARY KEY (service_name, workflow_fn_name, key) + ); + """; } } diff --git a/transact/src/test/java/dev/dbos/transact/notifications/EventsTest.java b/transact/src/test/java/dev/dbos/transact/notifications/EventsTest.java index e28f2f88..6307ba89 100644 --- a/transact/src/test/java/dev/dbos/transact/notifications/EventsTest.java +++ b/transact/src/test/java/dev/dbos/transact/notifications/EventsTest.java @@ -25,9 +25,9 @@ import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; -import javax.sql.DataSource; - +import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -155,14 +155,21 @@ public void resetLatches() { @org.junit.jupiter.api.Timeout(value = 2, unit = java.util.concurrent.TimeUnit.MINUTES) public class EventsTest extends DbSetupTestBase { - private static DataSource dataSource; - private EventsService proxy; private EventsServiceImpl impl; + @BeforeAll + protected static void onetimeSetup() throws Exception { + dataSource = DbSetupTestBase.dataSource; + } + + @AfterAll + static void oneTimeShutdown() throws Exception { + dataSource.close(); + } + @BeforeEach void beforeEachTest() throws SQLException { - dataSource = DbSetupTestBase.dataSource; DBUtils.recreateDB(dbosConfig); DBOSTestAccess.reinitialize(dbosConfig); impl = new EventsServiceImpl(); diff --git a/transact/src/test/java/dev/dbos/transact/notifications/NotificationServiceTest.java b/transact/src/test/java/dev/dbos/transact/notifications/NotificationServiceTest.java index 77180ef3..a5648a5b 100644 --- a/transact/src/test/java/dev/dbos/transact/notifications/NotificationServiceTest.java +++ b/transact/src/test/java/dev/dbos/transact/notifications/NotificationServiceTest.java @@ -14,6 +14,7 @@ import java.time.Duration; import java.util.List; import java.util.UUID; +import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; @@ -23,6 +24,118 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +interface NotService { + + void sendWorkflow(String target, String topic, String msg); + + String recvWorkflow(String topic, Duration timeout); + + String recvMultiple(String topic); + + int recvCount(String topic); + + String concWorkflow(String topic); + + String disallowedRecvInStep(); + + String recvOneMessage(); + + String recvTwoMessages(); + + void sendFromWF(String destination, String msg, String idempotencyKey); + + void sendFromStep(String destination, String msg, String idempotencyKey); +} + +class NotServiceImpl implements NotService { + + final CountDownLatch recvReadyLatch = new CountDownLatch(1); + final CountDownLatch recvTwoLatch = new CountDownLatch(1); + + @Workflow + public void sendWorkflow(String target, String topic, String msg) { + try { + // Wait for recv to signal that it's ready + recvReadyLatch.await(); + // Now proceed with sending + DBOS.send(target, msg, topic); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + throw new RuntimeException("Interrupted while waiting for recv signal", e); + } + // DBOS.send(target, msg, topic); + } + + @Workflow + public String recvWorkflow(String topic, Duration timeout) { + recvReadyLatch.countDown(); + String msg = (String) DBOS.recv(topic, timeout); + return msg; + } + + @Workflow + public String recvMultiple(String topic) { + recvReadyLatch.countDown(); + String msg1 = (String) DBOS.recv(topic, Duration.ofSeconds(5)); + String msg2 = (String) DBOS.recv(topic, Duration.ofSeconds(5)); + String msg3 = (String) DBOS.recv(topic, Duration.ofSeconds(5)); + return msg1 + msg2 + msg3; + } + + @Workflow + public int recvCount(String topic) { + try { + recvReadyLatch.await(); + } catch (InterruptedException e) { + } + String msg1 = (String) DBOS.recv(topic, Duration.ofSeconds(0)); + String msg2 = (String) DBOS.recv(topic, Duration.ofSeconds(0)); + String msg3 = (String) DBOS.recv(topic, Duration.ofSeconds(0)); + int rc = 0; + if (msg1 != null) ++rc; + if (msg2 != null) ++rc; + if (msg3 != null) ++rc; + return rc; + } + + @Workflow + public String concWorkflow(String topic) { + recvReadyLatch.countDown(); + String message = (String) DBOS.recv(topic, Duration.ofSeconds(5)); + return message; + } + + @Workflow + public String disallowedRecvInStep() { + DBOS.runStep(() -> DBOS.recv("a", Duration.ofSeconds(0)), "recv"); + return "Done"; + } + + @Workflow + public String recvTwoMessages() { + String msg1 = (String) DBOS.recv(null, Duration.ofSeconds(10)); + recvTwoLatch.countDown(); + String msg2 = (String) DBOS.recv(null, Duration.ofSeconds(2)); + return "%s-%s".formatted(msg1, msg2); + } + + @Workflow + public String recvOneMessage() { + String msg1 = (String) DBOS.recv(null, Duration.ofSeconds(10)); + return msg1; + } + + @Workflow + public void sendFromWF(String destination, String msg, String idempotencyKey) { + DBOS.send(destination, msg, null, idempotencyKey); + } + + @Workflow + public void sendFromStep(String destination, String msg, String idempotencyKey) { + DBOS.runStep(() -> DBOS.send(destination, msg, null, idempotencyKey), "send"); + } +} + @org.junit.jupiter.api.Timeout(value = 2, unit = java.util.concurrent.TimeUnit.MINUTES) class NotificationServiceTest extends DbSetupTestBase { @@ -166,13 +279,6 @@ public void noWorkflowRecv() { notService.disallowedRecvInStep(); }); assertEquals("DBOS.recv() must not be called from within a step.", e2.getMessage()); - var e3 = - assertThrows( - IllegalStateException.class, - () -> { - notService.disallowedSendInStep(); - }); - assertEquals("DBOS.send() must not be called from within a step.", e3.getMessage()); } @Test @@ -277,7 +383,7 @@ private String testThread(NotService service, String id, String topic) { } @Test - public void recv_sleep() throws Exception { + public void recvSleep() throws Exception { NotService notService = DBOS.registerWorkflows(NotService.class, new NotServiceImpl()); DBOS.launch(); @@ -337,6 +443,95 @@ public void sendOutsideWFTest() throws Exception { assertEquals(WorkflowState.SUCCESS.name(), handle.getStatus().status()); List wfs = DBOS.listWorkflows(null); - assertEquals(2, wfs.size()); + assertEquals(1, wfs.size()); + } + + @Test + public void sendSameIdempotencyKeyTest() throws Exception { + // Sending with the same idempotency key twice delivers only one message. + + var impl = new NotServiceImpl(); + NotService notService = DBOS.registerWorkflows(NotService.class, impl); + DBOS.launch(); + + var handle = DBOS.startWorkflow(() -> notService.recvTwoMessages()); + + String idempotencyKey = UUID.randomUUID().toString(); + + DBOS.send(handle.workflowId(), "hello", null, idempotencyKey); + impl.recvTwoLatch.await(); + // reusing the same idempotency key should not result in a duplicate message + DBOS.send(handle.workflowId(), "hello again", null, idempotencyKey); + + // The second recv times out (returns null), proving only one message was delivered. + assertEquals("hello-null", handle.getResult()); + } + + @Test + public void sendDifferentIdempotencyKeyTest() throws Exception { + // Different idempotency keys deliver separate messages. + + var impl = new NotServiceImpl(); + NotService notService = DBOS.registerWorkflows(NotService.class, impl); + DBOS.launch(); + + var handle = DBOS.startWorkflow(() -> notService.recvTwoMessages()); + + DBOS.send(handle.workflowId(), "a", null, UUID.randomUUID().toString()); + impl.recvTwoLatch.await(); + DBOS.send(handle.workflowId(), "b", null, UUID.randomUUID().toString()); + + assertEquals("a-b", handle.getResult()); + } + + @Test + public void sendSameIdempotencyKeyFromWorkflowTest() throws Exception { + // Send from a workflow with same idempotency key twice delivers only one message. + + var impl = new NotServiceImpl(); + NotService notService = DBOS.registerWorkflows(NotService.class, impl); + DBOS.launch(); + + var handle = DBOS.startWorkflow(() -> notService.recvTwoMessages()); + + String idempotencyKey = UUID.randomUUID().toString(); + notService.sendFromWF(handle.workflowId(), "hello", idempotencyKey); + impl.recvTwoLatch.await(); + notService.sendFromWF(handle.workflowId(), "hello again", idempotencyKey); + + // The second recv times out (returns null), proving only one message was delivered. + assertEquals("hello-null", handle.getResult()); + } + + @Test + public void sendFromStep() throws Exception { + // Send from a step (without idempotency key). + + var impl = new NotServiceImpl(); + NotService notService = DBOS.registerWorkflows(NotService.class, impl); + DBOS.launch(); + + var handle = DBOS.startWorkflow(() -> notService.recvOneMessage()); + notService.sendFromStep(handle.workflowId(), "hello", null); + + assertEquals("hello", handle.getResult()); + } + + @Test + public void sendFromStepWithIdempotencyKey() throws Exception { + // Send from a step with same idempotency key twice delivers only one message. + + var impl = new NotServiceImpl(); + NotService notService = DBOS.registerWorkflows(NotService.class, impl); + DBOS.launch(); + + var handle = DBOS.startWorkflow(() -> notService.recvTwoMessages()); + + String idempotencyKey = UUID.randomUUID().toString(); + notService.sendFromStep(handle.workflowId(), "hello", idempotencyKey); + impl.recvTwoLatch.await(); + notService.sendFromStep(handle.workflowId(), "hello again", idempotencyKey); + + assertEquals("hello-null", handle.getResult()); } } diff --git a/transact/src/test/java/dev/dbos/transact/queue/PartitionedQueuesTest.java b/transact/src/test/java/dev/dbos/transact/queue/PartitionedQueuesTest.java index cf4f8809..44f126d5 100644 --- a/transact/src/test/java/dev/dbos/transact/queue/PartitionedQueuesTest.java +++ b/transact/src/test/java/dev/dbos/transact/queue/PartitionedQueuesTest.java @@ -5,7 +5,12 @@ import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; -import dev.dbos.transact.*; +import dev.dbos.transact.DBOS; +import dev.dbos.transact.DBOSClient; +import dev.dbos.transact.DBOSTestAccess; +import dev.dbos.transact.DbSetupTestBase; +import dev.dbos.transact.StartWorkflowOptions; +import dev.dbos.transact.database.SystemDatabase; import dev.dbos.transact.utils.DBUtils; import dev.dbos.transact.workflow.Queue; import dev.dbos.transact.workflow.Workflow; @@ -15,6 +20,8 @@ import java.util.UUID; import java.util.concurrent.CountDownLatch; +import javax.sql.DataSource; + import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -74,10 +81,13 @@ public String normalWorkflow() { @org.junit.jupiter.api.Timeout(value = 2, unit = java.util.concurrent.TimeUnit.MINUTES) public class PartitionedQueuesTest extends DbSetupTestBase { + private static DataSource dataSource; @BeforeEach void beforeEachTest() throws SQLException { DBUtils.recreateDB(dbosConfig); + dataSource = SystemDatabase.createDataSource(dbosConfig); + DBOSTestAccess.reinitialize(dbosConfig); } @@ -127,9 +137,8 @@ public void testResumingQueuedPartitionedWorkflows() throws Exception { @Test public void testQueuePartitions() throws Exception { Queue queue = new Queue("testQueue").withWorkerConcurrency(1).withPartitionedEnabled(true); - DBOS.registerQueue(queue); Queue partitionlessQueue = new Queue("partitionless-queue"); - DBOS.registerQueue(partitionlessQueue); + DBOS.registerQueues(queue, partitionlessQueue); var impl = new PartitionsTestServiceImpl(); var proxy = DBOS.registerWorkflows(PartitionsTestService.class, impl); @@ -163,8 +172,7 @@ public void testQueuePartitions() throws Exception { assertEquals(blockedBlockedHandle.workflowId(), blockedBlockedHandle.getResult()); assertEquals(blockedNormalHandle.workflowId(), blockedNormalHandle.getResult()); - try (var client = - new DBOSClient(postgres.getJdbcUrl(), postgres.getUsername(), postgres.getPassword())) { + try (var client = getDBOSClient()) { var className = "dev.dbos.transact.queue.PartitionsTestServiceImpl"; var wfName = "normalWorkflow"; var nqOptions = diff --git a/transact/src/test/java/dev/dbos/transact/queue/QueuesTest.java b/transact/src/test/java/dev/dbos/transact/queue/QueuesTest.java index 35a9c104..550df6e1 100644 --- a/transact/src/test/java/dev/dbos/transact/queue/QueuesTest.java +++ b/transact/src/test/java/dev/dbos/transact/queue/QueuesTest.java @@ -5,7 +5,11 @@ import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; -import dev.dbos.transact.*; +import dev.dbos.transact.Constants; +import dev.dbos.transact.DBOS; +import dev.dbos.transact.DBOSTestAccess; +import dev.dbos.transact.DbSetupTestBase; +import dev.dbos.transact.StartWorkflowOptions; import dev.dbos.transact.database.SystemDatabase; import dev.dbos.transact.utils.DBUtils; import dev.dbos.transact.workflow.ListWorkflowsInput; @@ -22,12 +26,9 @@ import java.time.temporal.ChronoUnit; import java.util.ArrayList; import java.util.List; -import java.util.concurrent.Semaphore; - -import javax.sql.DataSource; +import com.zaxxer.hikari.HikariDataSource; import org.junit.jupiter.api.*; -import org.junitpioneer.jupiter.RetryingTest; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -36,7 +37,7 @@ public class QueuesTest extends DbSetupTestBase { private static final Logger logger = LoggerFactory.getLogger(QueuesTest.class); - private static DataSource dataSource; + private HikariDataSource dataSource; @BeforeEach void beforeEachTest() throws SQLException { @@ -48,6 +49,7 @@ void beforeEachTest() throws SQLException { @AfterEach void afterEachTest() throws Exception { + dataSource.close(); DBOS.shutdown(); } @@ -136,7 +138,7 @@ public void testDedupeId() throws Exception { } } - @RetryingTest(3) + @Test public void testPriority() throws Exception { Queue firstQ = @@ -218,7 +220,7 @@ public void testQueuedMultipleWorkflows() throws Exception { } } - @RetryingTest(3) + @Test void testListQueuedWorkflow() throws Exception { Queue firstQ = new Queue("firstQueue").withConcurrency(1).withWorkerConcurrency(1); @@ -277,11 +279,9 @@ void testListQueuedWorkflow() throws Exception { public void multipleQueues() throws Exception { Queue firstQ = new Queue("firstQueue").withConcurrency(1).withWorkerConcurrency(1); - DBOS.registerQueue(firstQ); - ServiceQ serviceQ1 = DBOS.registerWorkflows(ServiceQ.class, new ServiceQImpl()); - Queue secondQ = new Queue("secondQueue").withConcurrency(1).withWorkerConcurrency(1); - DBOS.registerQueue(secondQ); + DBOS.registerQueues(firstQ, secondQ); + ServiceQ serviceQ1 = DBOS.registerWorkflows(ServiceQ.class, new ServiceQImpl()); ServiceI serviceI = DBOS.registerWorkflows(ServiceI.class, new ServiceIImpl()); DBOS.launch(); @@ -572,7 +572,7 @@ public void testenQueueWF() throws Exception { assertEquals("inputqinputq", result); } - @RetryingTest(3) + @Test public void testQueueConcurrencyUnderRecovery() throws Exception { Queue queue = new Queue("test_queue").withConcurrency(2); DBOS.registerQueue(queue); @@ -591,12 +591,11 @@ public void testQueueConcurrencyUnderRecovery() throws Exception { var opt3 = new StartWorkflowOptions("wf3").withQueue(queue); var handle3 = DBOS.startWorkflow(() -> service.noopWorkflow(2), opt3); - for (Semaphore e : impl.wfSemaphores) { - e.acquire(); - e.drainPermits(); - } + // each call to blockedWorkflow releases the semaphore once, + // so block waiting on both calls to release + impl.wfSemaphore.acquire(2); - assertEquals(2, impl.counter); + assertEquals(2, impl.counter.get()); assertEquals(WorkflowState.PENDING.toString(), handle1.getStatus().status()); assertEquals(WorkflowState.PENDING.toString(), handle2.getStatus().status()); assertEquals(WorkflowState.ENQUEUED.toString(), handle3.getStatus().status()); @@ -631,7 +630,7 @@ public void testQueueConcurrencyUnderRecovery() throws Exception { assertTrue(expectedWorkflowIds.contains(localHandles.get(0).workflowId())); assertTrue(expectedWorkflowIds.contains(localHandles.get(1).workflowId())); - assertEquals(2, impl.counter); + assertEquals(2, impl.counter.get()); // Recovery sets back to enqueued. // The enqueued run will get skipped (first run is still blocked) assertEquals(WorkflowState.ENQUEUED.toString(), handle1.getStatus().status()); @@ -654,8 +653,7 @@ public void testListenQueue() throws Exception { Queue queueOne = new Queue("queueOne"); Queue queueTwo = new Queue("queueTwo"); - DBOS.registerQueue(queueOne); - DBOS.registerQueue(queueTwo); + DBOS.registerQueues(queueOne, queueTwo); ServiceQ serviceQ = DBOS.registerWorkflows(ServiceQ.class, new ServiceQImpl()); DBOS.launch(); diff --git a/transact/src/test/java/dev/dbos/transact/scheduled/SchedulerServiceTest.java b/transact/src/test/java/dev/dbos/transact/scheduled/SchedulerServiceTest.java index 05563f4f..ae44c899 100644 --- a/transact/src/test/java/dev/dbos/transact/scheduled/SchedulerServiceTest.java +++ b/transact/src/test/java/dev/dbos/transact/scheduled/SchedulerServiceTest.java @@ -16,7 +16,6 @@ import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.junitpioneer.jupiter.RetryingTest; @org.junit.jupiter.api.Timeout(value = 2, unit = java.util.concurrent.TimeUnit.MINUTES) class SchedulerServiceTest extends DbSetupTestBase { @@ -34,7 +33,7 @@ void afterEachTest() throws Exception { DBOS.shutdown(); } - @RetryingTest(3) + @Test public void simpleScheduledWorkflow() throws Exception { var impl = new SkedServiceImpl(); @@ -88,10 +87,12 @@ public void simpleScheduledWorkflow() throws Exception { assertTrue(q2workflows.size() >= 1); assertEquals("q2", q2workflows.get(0).queueName()); + DBOS.shutdown(); + // See about makeup work (ignore missed) var timeToSleep = 5000 - (System.currentTimeMillis() - timeAsOfShutdown); Thread.sleep(timeToSleep < 0 ? 0 : timeToSleep); - schedulerService.dbosLaunched(); + DBOS.launch(); Thread.sleep(2000); int count1imb = impl.everySecondCounterIgnoreMissed; diff --git a/transact/src/test/java/dev/dbos/transact/workflow/AsyncWorkflowTest.java b/transact/src/test/java/dev/dbos/transact/workflow/AsyncWorkflowTest.java index d1a90f7b..f89c0acb 100644 --- a/transact/src/test/java/dev/dbos/transact/workflow/AsyncWorkflowTest.java +++ b/transact/src/test/java/dev/dbos/transact/workflow/AsyncWorkflowTest.java @@ -21,9 +21,9 @@ public class AsyncWorkflowTest extends DbSetupTestBase { @BeforeEach void beforeEachTest() throws SQLException { - DBUtils.recreateDB(dbosConfig); - - DBOSTestAccess.reinitialize(dbosConfig); + var config = dbosConfig.withAdminServer(true); + DBUtils.recreateDB(config); + DBOSTestAccess.reinitialize(config); } @AfterEach diff --git a/transact/src/test/java/dev/dbos/transact/workflow/GarbageCollectionTest.java b/transact/src/test/java/dev/dbos/transact/workflow/GarbageCollectionTest.java index c47314f7..4e85ad77 100644 --- a/transact/src/test/java/dev/dbos/transact/workflow/GarbageCollectionTest.java +++ b/transact/src/test/java/dev/dbos/transact/workflow/GarbageCollectionTest.java @@ -57,7 +57,6 @@ public String timeoutBlockedWorkflow() { @org.junit.jupiter.api.Timeout(value = 2, unit = java.util.concurrent.TimeUnit.MINUTES) public class GarbageCollectionTest extends DbSetupTestBase { - private GCTestServiceImpl impl; private GCTestService proxy; diff --git a/transact/src/test/java/dev/dbos/transact/workflow/ListWorkflowsTest.java b/transact/src/test/java/dev/dbos/transact/workflow/ListWorkflowsTest.java index 61af0f88..afb2a919 100644 --- a/transact/src/test/java/dev/dbos/transact/workflow/ListWorkflowsTest.java +++ b/transact/src/test/java/dev/dbos/transact/workflow/ListWorkflowsTest.java @@ -4,7 +4,7 @@ import dev.dbos.transact.DBOS; import dev.dbos.transact.DBOSTestAccess; -import dev.dbos.transact.config.DBOSConfig; +import dev.dbos.transact.DbSetupTestBase; import dev.dbos.transact.utils.DBUtils; import java.sql.Connection; @@ -42,9 +42,7 @@ * Status totals: SUCCESS=7, ERROR=2, CANCELLED=1 */ @org.junit.jupiter.api.Timeout(value = 2, unit = java.util.concurrent.TimeUnit.MINUTES) -public class ListWorkflowsTest { - - private static DBOSConfig dbosConfig; +public class ListWorkflowsTest extends DbSetupTestBase { /** * Fixed base epoch-ms. All {@code created_at} values are {@code baseTime + offset}, guaranteeing @@ -53,10 +51,7 @@ public class ListWorkflowsTest { private static long baseTime; @BeforeAll - static void onetimeSetup() throws Exception { - ListWorkflowsTest.dbosConfig = - DBOSConfig.defaultsFromEnv("systemdbtest") - .withDatabaseUrl("jdbc:postgresql://localhost:5432/dbos_java_sys"); + protected static void onetimeSetup() throws Exception { DBUtils.recreateDB(dbosConfig); DBOSTestAccess.reinitialize(dbosConfig); DBOS.launch(); diff --git a/transact/src/test/java/dev/dbos/transact/workflow/SyncWorkflowTest.java b/transact/src/test/java/dev/dbos/transact/workflow/SyncWorkflowTest.java index a24e45ad..ce0d7e2a 100644 --- a/transact/src/test/java/dev/dbos/transact/workflow/SyncWorkflowTest.java +++ b/transact/src/test/java/dev/dbos/transact/workflow/SyncWorkflowTest.java @@ -18,9 +18,9 @@ public class SyncWorkflowTest extends DbSetupTestBase { @BeforeEach void beforeEachTest() throws SQLException { - DBUtils.recreateDB(dbosConfig); - - DBOSTestAccess.reinitialize(dbosConfig); + var config = dbosConfig.withAdminServer(true); + DBUtils.recreateDB(config); + DBOSTestAccess.reinitialize(config); } @AfterEach diff --git a/transact/src/test/java/dev/dbos/transact/workflow/TimeoutTest.java b/transact/src/test/java/dev/dbos/transact/workflow/TimeoutTest.java index 16b6817c..8559309f 100644 --- a/transact/src/test/java/dev/dbos/transact/workflow/TimeoutTest.java +++ b/transact/src/test/java/dev/dbos/transact/workflow/TimeoutTest.java @@ -18,25 +18,29 @@ import javax.sql.DataSource; +import com.zaxxer.hikari.HikariDataSource; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; @org.junit.jupiter.api.Timeout(value = 2, unit = java.util.concurrent.TimeUnit.MINUTES) public class TimeoutTest extends DbSetupTestBase { - private static DataSource dataSource; + private HikariDataSource dataSource; @BeforeEach void beforeEachTest() throws SQLException { DBUtils.recreateDB(dbosConfig); - TimeoutTest.dataSource = SystemDatabase.createDataSource(dbosConfig); + dataSource = SystemDatabase.createDataSource(dbosConfig); DBOSTestAccess.reinitialize(dbosConfig); } @AfterEach void afterEachTest() throws SQLException, Exception { + dataSource.close(); DBOS.shutdown(); } @@ -321,6 +325,8 @@ public void parentChildTimeOut() throws Exception { assertEquals(WorkflowState.CANCELLED.name(), childStatus); } + private static final Logger logger = LoggerFactory.getLogger(TimeoutTest.class); + @Test public void parentTimeoutInheritedByChild() throws Exception { @@ -340,11 +346,29 @@ public void parentTimeoutInheritedByChild() throws Exception { } }); - String parentStatus = DBOS.retrieveWorkflow(wfid1).getStatus().status(); - assertEquals(WorkflowState.CANCELLED.name(), parentStatus); + try { + String parentStatus = DBOS.retrieveWorkflow(wfid1).getStatus().status(); + assertEquals(WorkflowState.CANCELLED.name(), parentStatus); + } finally { + var row = DBUtils.getWorkflowRow(dataSource, wfid1); + if (!row.status().equals("CANCELLED")) { + logger.warn("{}: {}", wfid1, row); + } + } - String childStatus = DBOS.retrieveWorkflow("childwf").getStatus().status(); - assertEquals(WorkflowState.CANCELLED.name(), childStatus); + var childWfId = "childwf"; + var handle = DBOS.retrieveWorkflow(childWfId); + assertThrows(Exception.class, () -> handle.getResult()); + + try { + String childStatus = DBOS.retrieveWorkflow(childWfId).getStatus().status(); + assertEquals(WorkflowState.CANCELLED.name(), childStatus); + } finally { + var row = DBUtils.getWorkflowRow(dataSource, childWfId); + if (!row.status().equals("CANCELLED")) { + logger.warn("{}: {}", childWfId, row); + } + } } @Test diff --git a/transact/src/test/java/dev/dbos/transact/workflow/WorkflowMgmtTest.java b/transact/src/test/java/dev/dbos/transact/workflow/WorkflowMgmtTest.java index ab885160..3ee6345f 100644 --- a/transact/src/test/java/dev/dbos/transact/workflow/WorkflowMgmtTest.java +++ b/transact/src/test/java/dev/dbos/transact/workflow/WorkflowMgmtTest.java @@ -26,6 +26,8 @@ interface MgmtService { int simpleWorkflow(int input) throws InterruptedException; void stepTimingWorkflow() throws InterruptedException; + + String helloWorkflow(String name); } class MgmtServiceImpl implements MgmtService { @@ -60,6 +62,11 @@ public void stepTimingWorkflow() throws InterruptedException { DBOS.listWorkflows(new ListWorkflowsInput()); DBOS.recv(null, Duration.ofSeconds(1)); } + + @Workflow + public String helloWorkflow(String name) { + return "Hello, %s!".formatted(name); + } } @org.junit.jupiter.api.Timeout(value = 2, unit = java.util.concurrent.TimeUnit.MINUTES) @@ -215,4 +222,42 @@ public void queuedCancelResumeTest() throws Exception { assertEquals(WorkflowState.SUCCESS.name(), origHandle.getStatus().status()); } + + @Test + public void testListWorkflowsDontLoadInputOutput() throws Exception { + var handle = DBOS.startWorkflow(() -> proxy.helloWorkflow("Chuck")); + assertEquals("Hello, Chuck!", handle.getResult()); + + var input = + new ListWorkflowsInput() + .withWorkflowId(handle.workflowId()) + .withLoadInput(false) + .withLoadOutput(false); + var workflows = DBOS.listWorkflows(input); + assertEquals(1, workflows.size()); + var workflow = workflows.get(0); + assertEquals(handle.workflowId(), workflow.workflowId()); + assertNull(workflow.input()); + assertNull(workflow.output()); + assertNull(workflow.error()); + assertNull(workflow.serialization()); + } + + @Test + public void testListWorkflowsLoadInputOutput() throws Exception { + var handle = DBOS.startWorkflow(() -> proxy.helloWorkflow("Chuck")); + assertEquals("Hello, Chuck!", handle.getResult()); + + // loadInput/loadOutput default to true + var input = new ListWorkflowsInput().withWorkflowId(handle.workflowId()); + var workflows = DBOS.listWorkflows(input); + assertEquals(1, workflows.size()); + var workflow = workflows.get(0); + assertEquals(handle.workflowId(), workflow.workflowId()); + assertEquals(1, workflow.input().length); + assertEquals("Chuck", workflow.input()[0]); + assertEquals("Hello, Chuck!", workflow.output()); + assertNull(workflow.error()); + assertEquals("java_jackson", workflow.serialization()); + } }