Ravat Tailor
Ravat Tailor

Reputation: 1263

Vertx Junit5 Concurrent timeout exception

I am getting an exception when I am running this code, I am closing the testContext in beforeEach and test Method.

The test execution timed out. Make sure your asynchronous code includes calls to either VertxTestContext#completeNow(), VertxTestContext#failNow() or Checkpoint#flag() java.util.concurrent.TimeoutException: The test execution timed out. Make sure your asynchronous code includes calls to either VertxTestContext#completeNow(), VertxTestContext#failNow() or Checkpoint#flag() at io.vertx.junit5.VertxExtension.joinActiveTestContexts(VertxExtension.java:230)

@DisplayName("Test Case Workflow")
@ExtendWith(VertxExtension.class)
public class OrchestrationDBVerticleTest {
    // tag::prepare[]
    private Vertx vertx;
    private OrchestrationDBService service;
    public static final String CONFIG_JDBC_URL = "test.jdbc.url";
    public static final String CONFIG_JDBC_DRIVER_CLASS = "test.jdbc.driver_class";
    public static final String CONFIG_JDBC_MAX_POOL_SIZE = "test.jdbc.max_pool_size";

    @BeforeEach
    public void prepare(VertxTestContext testContext) throws InterruptedException {
        vertx = Vertx.vertx();
        JsonObject config = new JsonObject()
                .put("url", vertx.getOrCreateContext().config().getString(CONFIG_JDBC_URL, "jdbc:hsqldb:mem:testdb"))
                .put("driver_class", vertx.getOrCreateContext().config().getString(CONFIG_JDBC_DRIVER_CLASS, "org.hsqldb.jdbcDriver"))
                .put("max_pool_size", vertx.getOrCreateContext().config().getInteger(CONFIG_JDBC_MAX_POOL_SIZE, 30));
        JsonObject dbConfig = new JsonObject().put("jdbcConfig", config);

        vertx.deployVerticle(new OrchestrationDBVerticle(), new DeploymentOptions().setConfig(dbConfig),
                testContext.succeeding(id -> {
                    service = OrchestrationDBService.createProxy(vertx, OrchestrationDBVerticle.CONFIG_ORCHESTRATION_DB_QUEUE);
                    testContext.completeNow();
                }));
    }
    // end::prepare[]

    // tag::finish[]
    @AfterEach
    public void finish(VertxTestContext testContext) {
        System.out.println("after");
        vertx.close();
    }
    // end::finish[]


    // tag::crud[]
    @Test
    public void crud_operations(VertxTestContext testContext) {
//        Checkpoint callProxy = testContext.checkpoint();
        JsonObject jobInput = (new JsonObject()).put("requestInput", new JsonObject().put("test", "test"))
                .put("workflow", "WorkFlowHandler");
        service.saveJobDetails(jobInput, testContext.succeeding(response -> {
            System.out.println("Service Response : " + response);
            Assertions.assertThat(response.toString().contains("IN_QUEUE"));
            testContext.completeNow();
//            callProxy.flag();
        }));
    }
    // end::crud[]
}

EDIT: - I was not completing testContext in the finish method.

@AfterEach
    public void finish(VertxTestContext testContext) {
        System.out.println("after");
        vertx.close(testContext.succeeding(response -> {
            testContext.completeNow();
        }));
    }

But Even after that my asserstion condtions are always true if I provide wrong input.

Upvotes: 1

Views: 2910

Answers (1)

Ravat Tailor
Ravat Tailor

Reputation: 1263

Solved.

I was not completing testContext in the finish method.

@AfterEach
    public void finish(VertxTestContext testContext) {
        System.out.println("after");
        vertx.close(testContext.succeeding(response -> {
            testContext.completeNow();
        }));
    }

Update:- Verifying the assertions in testContext.verify()

@Test
    @DisplayName("🚀 Return Exact request what we stored in DB")
    public void crud_operations(VertxTestContext testContext) {
        JsonObject jobInput = (new JsonObject()).put("requestInput", new JsonObject().put("test", "test"))
                .put("workflow", "CaseWorkFlowHandler");
        service.saveJobDetails(jobInput, testContext.succeeding(response -> {
            testContext.verify(() -> {
                Assertions.assertThat(response.getJsonArray("rows").getJsonObject(0).getString("REQUEST_INPUT")).isEqualTo("{\"test\":\"test\"}");
            });
            testContext.completeNow();
        }));
    }

Upvotes: 3

Related Questions