Skip to content

DBOS Instance#309

Open
devhawk wants to merge 30 commits intomainfrom
devhawk/instance-tests
Open

DBOS Instance#309
devhawk wants to merge 30 commits intomainfrom
devhawk/instance-tests

Conversation

@devhawk
Copy link
Collaborator

@devhawk devhawk commented Mar 11, 2026

This PR is a major breaking change to the DBOS public API surface area. We are removing the global singleton and most of the static methods on DBOS in favor of using DBOS as an instance. We had already done the work to ensure that everything worked with DBOS.Instance directly. However, the combination of static and instance APIs made for a poor developer experience, so we've decided to remove the static API entirely.

Mostly, this PR is test work since nearly all the tests used the static API. Updating all the tests allowed us to make a couple other changes - in particular, using @AutoClose to simplify test cleanup and using TestContainers for database isolation. The combination of DBOS Instance and TestContainers enables us to run tests in parallel, bringing a test run down to 6 minutes from 15.

Major thanks to @hannosgit who did the original TestContainers work!

In addition to the Java work, this PR updates the Kotlin DBOSExtension class. The previous DBOSExtension primarily provided top level Kotlin functions for DBOS static methods. Now, the DBOSExtension simply wraps DBOS.startWorkflow and DBOS.runStep to support Kotlin trailing lambdas syntax. We also added a Kotlin test!

fixes #306

@devhawk devhawk mentioned this pull request Mar 12, 2026
@devhawk devhawk marked this pull request as ready for review March 12, 2026 00:30
@devhawk devhawk requested a review from Copilot March 12, 2026 15:43
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR refactors the test suite to use per-test DBOS instances backed by Testcontainers PostgreSQL (PgContainer), adds Kotlin ergonomic extensions for trailing-lambda workflow/step calls, and updates CI/workflows to reflect the new test strategy.

Changes:

  • Introduce PgContainer Testcontainers helper(s) and migrate tests away from static DBOS.* usage to instance-based new DBOS(config) patterns.
  • Add Kotlin DBOS extension overloads to support trailing-lambda syntax for startWorkflow / runStep, plus new Kotlin tests.
  • Enable/annotate concurrent JUnit execution broadly and adjust GitHub Actions workflows accordingly.

Reviewed changes

Copilot reviewed 78 out of 78 changed files in this pull request and generated no comments.

Show a summary per file
File Description
transact/src/test/resources/junit-platform.properties Enables JUnit parallel execution configuration for the test suite.
transact/src/test/kotlin/dev/dbos/transact/KotlinExtensionsTest.kt Adds Kotlin tests validating trailing-lambda extensions for workflows/steps.
transact/src/test/java/dev/dbos/transact/workflow/WorkflowMgmtTest.java Refactors to instance-based DBOS + Testcontainers PgContainer.
transact/src/test/java/dev/dbos/transact/workflow/UnifiedProxyTest.java Refactors to instance-based DBOS + Testcontainers PgContainer.
transact/src/test/java/dev/dbos/transact/workflow/TimeoutTest.java Refactors to instance-based DBOS + Testcontainers PgContainer.
transact/src/test/java/dev/dbos/transact/workflow/SyncWorkflowTest.java Refactors to instance-based DBOS + Testcontainers PgContainer.
transact/src/test/java/dev/dbos/transact/workflow/SimpleServiceImpl.java Removes standalone test impl file (impl moved/co-located).
transact/src/test/java/dev/dbos/transact/workflow/SimpleService.java Co-locates SimpleServiceImpl with interface; updates to instance-based DBOS.
transact/src/test/java/dev/dbos/transact/workflow/QueueChildWorkflowTest.java Refactors to instance-based DBOS + Testcontainers PgContainer.
transact/src/test/java/dev/dbos/transact/workflow/MgmtService.java Extracts mgmt service interface/impl into a shared file and injects DBOS instance.
transact/src/test/java/dev/dbos/transact/workflow/GarbageCollectionTest.java Refactors to instance-based DBOS + Testcontainers PgContainer.
transact/src/test/java/dev/dbos/transact/workflow/GCTestService.java Extracts GC service interface/impl into a shared file and injects DBOS instance.
transact/src/test/java/dev/dbos/transact/workflow/ForkTestService.java Adds fork test service interface/impl with DBOS instance injection.
transact/src/test/java/dev/dbos/transact/workflow/AsyncWorkflowTest.java Refactors to instance-based DBOS + Testcontainers PgContainer.
transact/src/test/java/dev/dbos/transact/utils/PgContainer.java Adds Testcontainers-based Postgres helper for transact tests.
transact/src/test/java/dev/dbos/transact/utils/DBUtils.java Renames event record types returned by DB inspection helpers.
transact/src/test/java/dev/dbos/transact/step/ServiceWFAndStepImpl.java Removes standalone step/workflow impl file (migrated elsewhere).
transact/src/test/java/dev/dbos/transact/step/ServiceWFAndStep.java Removes standalone step/workflow interface file (migrated elsewhere).
transact/src/test/java/dev/dbos/transact/step/ServiceBImpl.java Removes standalone step service impl file (migrated elsewhere).
transact/src/test/java/dev/dbos/transact/step/ServiceB.java Removes standalone step service interface file (migrated elsewhere).
transact/src/test/java/dev/dbos/transact/step/ServiceAImpl.java Removes standalone workflow service impl file (migrated elsewhere).
transact/src/test/java/dev/dbos/transact/step/ServiceA.java Removes standalone workflow service interface file (migrated elsewhere).
transact/src/test/java/dev/dbos/transact/scheduled/SkedService.java Injects DBOS instance into scheduled service impl and updates calls.
transact/src/test/java/dev/dbos/transact/scheduled/SchedulerServiceTest.java Refactors to instance-based DBOS + Testcontainers PgContainer.
transact/src/test/java/dev/dbos/transact/queue/PartitionedQueuesTest.java Refactors to instance-based DBOS + Testcontainers PgContainer; updates context calls.
transact/src/test/java/dev/dbos/transact/migrations/MigrationManagerTest.java Refactors migrations tests to Testcontainers PgContainer.
transact/src/test/java/dev/dbos/transact/json/InteropTest.java Refactors interop tests to instance-based DBOS + Testcontainers PgContainer.
transact/src/test/java/dev/dbos/transact/issues/Issue218.java Refactors restart/recovery test to try-with-resources DBOS instances + PgContainer.
transact/src/test/java/dev/dbos/transact/invocation/StartWorkflowTest.java Refactors to instance-based DBOS + Testcontainers PgContainer.
transact/src/test/java/dev/dbos/transact/invocation/MultiDbosInstanceTest.java Refactors multi-instance test to multiple DBOS instances + distinct containers.
transact/src/test/java/dev/dbos/transact/invocation/MultiClassInstanceTest.java Refactors to instance-based DBOS + Testcontainers PgContainer.
transact/src/test/java/dev/dbos/transact/invocation/MockDbosInstanceTest.java Updates mocking to mock DBOS (not DBOS.Instance).
transact/src/test/java/dev/dbos/transact/invocation/InstanceTest.java Refactors to instance-based DBOS + Testcontainers PgContainer.
transact/src/test/java/dev/dbos/transact/invocation/HawkServiceImpl.java Injects DBOS instance and replaces static calls in workflows.
transact/src/test/java/dev/dbos/transact/invocation/DirectInvocationTest.java Refactors to instance-based DBOS + Testcontainers PgContainer.
transact/src/test/java/dev/dbos/transact/invocation/CustomSchemaTest.java Refactors to instance-based DBOS + Testcontainers PgContainer with custom schema.
transact/src/test/java/dev/dbos/transact/invocation/BearServiceImpl.java Injects DBOS instance and replaces static calls.
transact/src/test/java/dev/dbos/transact/execution/ScaleTest.java Refactors scale test to use a scoped DBOS instance and Testcontainers config.
transact/src/test/java/dev/dbos/transact/execution/RecoveryServiceTest.java Refactors recovery tests to use try-with-resources DBOS instances + PgContainer.
transact/src/test/java/dev/dbos/transact/execution/LifecycleTest.java Refactors lifecycle tests to instance-based registration + PgContainer.
transact/src/test/java/dev/dbos/transact/execution/ExecutingServiceImpl.java Removes standalone executing service impl file (impl moved/co-located).
transact/src/test/java/dev/dbos/transact/execution/ExecutingService.java Co-locates ExecutingServiceImpl with interface; injects DBOS instance.
transact/src/test/java/dev/dbos/transact/database/SystemDatabaseTest.java Refactors system DB tests to Testcontainers PgContainer.
transact/src/test/java/dev/dbos/transact/database/MetricsTest.java Refactors metrics tests to scoped DBOS instance + PgContainer.
transact/src/test/java/dev/dbos/transact/database/ExternalStateTest.java Refactors external state tests to Testcontainers PgContainer.
transact/src/test/java/dev/dbos/transact/database/DisruptiveServiceImpl.java Removes old disruptive/chaos impl file (replaced by new chaos test/service).
transact/src/test/java/dev/dbos/transact/database/DisruptiveService.java Removes old disruptive/chaos interface file (replaced by new chaos test/service).
transact/src/test/java/dev/dbos/transact/database/ChaosTest.java Adds new chaos test/service implementation (currently disabled).
transact/src/test/java/dev/dbos/transact/conductor/ConductorTest.java Marks conductor test class as concurrent execution.
transact/src/test/java/dev/dbos/transact/client/PgSqlClientTest.java Refactors SQL client tests to instance-based DBOS + PgContainer; adds helper methods.
transact/src/test/java/dev/dbos/transact/client/EnqueueOptionsTest.java Adds isolated validation tests for DBOSClient.EnqueueOptions.
transact/src/test/java/dev/dbos/transact/client/ClientTest.java Refactors to instance-based DBOS + PgContainer; removes inline options validation (moved).
transact/src/test/java/dev/dbos/transact/client/ClientServiceImpl.java Removes standalone client service impl file (impl moved/co-located).
transact/src/test/java/dev/dbos/transact/client/ClientService.java Co-locates ClientServiceImpl with interface; injects DBOS instance.
transact/src/test/java/dev/dbos/transact/admin/AdminServerTest.java Marks admin server test class as concurrent execution.
transact/src/test/java/dev/dbos/transact/DBOSTestAccess.java Updates test-access helpers to accept a DBOS instance (non-static executor/service access).
transact/src/main/kotlin/dev/dbos/transact/DBOSExtensions.kt Adds Kotlin extension overloads enabling trailing-lambda ergonomics for startWorkflow/runStep.
transact/src/main/java/dev/dbos/transact/execution/SchedulerService.java Updates lifecycle listener usage to pass DBOS instance (not DBOS.Instance).
transact/src/main/java/dev/dbos/transact/execution/DBOSLifecycleListener.java Updates lifecycle listener API to accept DBOS instance.
transact/src/main/java/dev/dbos/transact/execution/DBOSExecutor.java Updates executor start signature to accept DBOS instance.
transact-cli/src/test/java/dev/dbos/transact/cli/ResetCommandTest.java Refactors CLI reset test to use Testcontainers PgContainer.
transact-cli/src/test/java/dev/dbos/transact/cli/PgContainer.java Adds Testcontainers-based Postgres helper for CLI tests.
transact-cli/src/test/java/dev/dbos/transact/cli/MigrateCommandTest.java Refactors CLI migrate tests to use Testcontainers PgContainer.
TEST_REFACTOR_PLAN.md Adds a test refactor plan document for migrating tests to instance-based patterns.
.github/workflows/test.yml Updates CI matrix and workflow steps; removes explicit Postgres service usage.
.github/workflows/publish.yml Updates workflow action versions for publishing pipeline.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Remove DBOS static API in favor of instance based API

2 participants