Skip to content

Commit 10e81c0

Browse files
committed
Add some tests for various Hibernate Search shutdown scenarios
1 parent 7491001 commit 10e81c0

File tree

6 files changed

+299
-0
lines changed

6 files changed

+299
-0
lines changed

integration-tests/hibernate-search-orm-elasticsearch-outbox-polling/pom.xml

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,11 @@
5050
<artifactId>quarkus-junit5</artifactId>
5151
<scope>test</scope>
5252
</dependency>
53+
<dependency>
54+
<groupId>io.quarkus</groupId>
55+
<artifactId>quarkus-junit5-internal</artifactId>
56+
<scope>test</scope>
57+
</dependency>
5358
<dependency>
5459
<groupId>io.quarkus</groupId>
5560
<artifactId>quarkus-test-h2</artifactId>
@@ -171,6 +176,32 @@
171176
<configuration>
172177
<skip>false</skip>
173178
</configuration>
179+
<executions>
180+
<execution>
181+
<id>default-test</id>
182+
<goals>
183+
<goal>test</goal>
184+
</goals>
185+
<configuration>
186+
<!-- These tests seem to leak metaspace memory
187+
so we run them in a separate, short-lived JVM -->
188+
<excludedGroups>devmode</excludedGroups>
189+
</configuration>
190+
</execution>
191+
<execution>
192+
<id>devmode-test</id>
193+
<goals>
194+
<goal>test</goal>
195+
</goals>
196+
<configuration>
197+
<!-- These tests seem to leak metaspace memory
198+
so we run them in a separate, short-lived JVM -->
199+
<groups>devmode</groups>
200+
<!-- We could consider setting reuseForks=false if we
201+
really need to run every single test in its own JVM -->
202+
</configuration>
203+
</execution>
204+
</executions>
174205
</plugin>
175206
<plugin>
176207
<artifactId>maven-failsafe-plugin</artifactId>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
package io.quarkus.it.hibernate.search.orm.elasticsearch.coordination.outboxpolling;
2+
3+
import static org.assertj.core.api.Assertions.assertThat;
4+
5+
import java.nio.file.Files;
6+
import java.nio.file.Paths;
7+
8+
import org.junit.jupiter.api.BeforeAll;
9+
import org.junit.jupiter.api.Tag;
10+
import org.junit.jupiter.api.Test;
11+
import org.junit.jupiter.api.extension.RegisterExtension;
12+
13+
import io.quarkus.test.QuarkusDevModeTest;
14+
import io.restassured.RestAssured;
15+
16+
@Tag("devmode")
17+
public class HibernateSearchDevModeFailingOrmTest {
18+
19+
@RegisterExtension
20+
static final QuarkusDevModeTest config = new QuarkusDevModeTest()
21+
.withApplicationRoot((jar) -> jar
22+
.addClasses(HibernateSearchOutboxPollingTestResource.class, Person.class, OutboxPollingTestUtils.class)
23+
.addAsResource("application-dev-mode.properties", "application.properties"))
24+
.setLogRecordPredicate(r -> true);
25+
26+
static String APPLICATION_PROPERTIES;
27+
28+
@BeforeAll
29+
static void beforeAll() throws Exception {
30+
APPLICATION_PROPERTIES = Files
31+
.readString(
32+
Paths.get(HibernateSearchDevModeFailingOrmTest.class.getResource("/application-dev-mode.properties")
33+
.toURI()));
34+
}
35+
36+
@Test
37+
public void smoke() {
38+
RestAssured.when().put("/test/hibernate-search-outbox-polling/check-agents-running").then()
39+
.statusCode(200);
40+
41+
// now add a property that will fail the datasource:
42+
config.modifyResourceFile(
43+
"application.properties",
44+
s -> APPLICATION_PROPERTIES + """
45+
quarkus.datasource.jdbc.min-size=20
46+
""");
47+
RestAssured.when().put("/test/hibernate-search-outbox-polling/check-agents-running").then()
48+
.statusCode(500);
49+
50+
// add any change to get the shutdown of a failed app completed:
51+
config.modifyResourceFile("application.properties", s -> APPLICATION_PROPERTIES);
52+
53+
RestAssured.when().put("/test/hibernate-search-outbox-polling/check-agents-running").then()
54+
.statusCode(200);
55+
56+
// At this point we've tried starting the app 3 times: one initial, one failing, one successful live-reloads
57+
// Hence we expect the following things logged:
58+
// initial run:
59+
// - profile activated (after a successful startup)
60+
// - ORM message after a successful shutdown caused by a following live-reload (closing a PU)
61+
// first reload:
62+
// - ORM message telling us that the PU closing won't happen as the PU failed to start
63+
// second reload:
64+
// - profile activated (after a successful startup)
65+
// - no ORM shutdown message, as that will happen after the test body finishes.
66+
assertThat(config.getLogRecords()).satisfiesOnlyOnce(
67+
r -> {
68+
assertThat(r.getMessage()).contains("Closing Hibernate ORM persistence unit");
69+
assertThat(r.getParameters()).containsExactly("<default>");
70+
});
71+
assertThat(config.getLogRecords()).satisfiesOnlyOnce(
72+
r -> {
73+
assertThat(r.getMessage()).contains("Skipping Hibernate ORM persistence unit, that failed to start");
74+
assertThat(r.getParameters()).containsExactly("<default>");
75+
});
76+
assertThat(config.getLogRecords().stream()
77+
.filter(r -> r.getMessage().contains("Profile%s %s activated. %s")))
78+
.hasSize(2);
79+
}
80+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
package io.quarkus.it.hibernate.search.orm.elasticsearch.coordination.outboxpolling;
2+
3+
import static org.assertj.core.api.Assertions.assertThat;
4+
5+
import java.nio.file.Files;
6+
import java.nio.file.Paths;
7+
8+
import org.junit.jupiter.api.BeforeAll;
9+
import org.junit.jupiter.api.Tag;
10+
import org.junit.jupiter.api.Test;
11+
import org.junit.jupiter.api.extension.RegisterExtension;
12+
13+
import io.quarkus.test.QuarkusDevModeTest;
14+
import io.restassured.RestAssured;
15+
16+
@Tag("devmode")
17+
public class HibernateSearchDevModeFailingSearchTest {
18+
19+
@RegisterExtension
20+
static final QuarkusDevModeTest config = new QuarkusDevModeTest()
21+
.withApplicationRoot((jar) -> jar
22+
.addClasses(HibernateSearchOutboxPollingTestResource.class, Person.class, OutboxPollingTestUtils.class)
23+
.addAsResource("application-dev-mode.properties", "application.properties"))
24+
.setLogRecordPredicate(r -> true);
25+
26+
static String APPLICATION_PROPERTIES;
27+
28+
@BeforeAll
29+
static void beforeAll() throws Exception {
30+
APPLICATION_PROPERTIES = Files
31+
.readString(Paths
32+
.get(HibernateSearchDevModeFailingSearchTest.class.getResource("/application-dev-mode.properties")
33+
.toURI()));
34+
}
35+
36+
@Test
37+
public void smoke() {
38+
RestAssured.when().put("/test/hibernate-search-outbox-polling/check-agents-running").then()
39+
.statusCode(200);
40+
41+
// now add a property that will fail the search, but since search is started through ORM integrator.. we are actually failing ORM startup:
42+
config.modifyResourceFile(
43+
"application.properties",
44+
s -> APPLICATION_PROPERTIES.replace(
45+
"quarkus.hibernate-search-orm.elasticsearch.hosts=${elasticsearch.hosts:localhost:9200}",
46+
"quarkus.hibernate-search-orm.elasticsearch.hosts=not-a-localhost:9211"));
47+
RestAssured.when().put("/test/hibernate-search-outbox-polling/check-agents-running").then()
48+
.statusCode(500);
49+
50+
// and any change to get the shutdown of a failed app completed:
51+
config.modifyResourceFile("application.properties", s -> APPLICATION_PROPERTIES);
52+
53+
RestAssured.when().put("/test/hibernate-search-outbox-polling/check-agents-running").then()
54+
.statusCode(200);
55+
56+
// At this point we've tried starting the app 3 times: one initial, one failing, one successful live-reloads
57+
// Hence we expect the following things logged:
58+
// initial run:
59+
// - profile activated (after a successful startup)
60+
// - ORM message after a successful shutdown caused by a following live-reload (closing a PU)
61+
// first reload:
62+
// - ORM message telling us that the PU closing won't happen as the PU failed to start
63+
// second reload:
64+
// - profile activated (after a successful startup)
65+
// - no ORM shutdown message, as that will happen after the test body finishes.
66+
assertThat(config.getLogRecords()).satisfiesOnlyOnce(
67+
r -> {
68+
assertThat(r.getMessage()).contains("Closing Hibernate ORM persistence unit");
69+
assertThat(r.getParameters()).containsExactly("<default>");
70+
});
71+
assertThat(config.getLogRecords()).satisfiesOnlyOnce(
72+
r -> {
73+
assertThat(r.getMessage()).contains("Skipping Hibernate ORM persistence unit, that failed to start");
74+
assertThat(r.getParameters()).containsExactly("<default>");
75+
});
76+
assertThat(config.getLogRecords().stream()
77+
.filter(r -> r.getMessage().contains("Profile%s %s activated. %s")))
78+
.hasSize(2);
79+
}
80+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package io.quarkus.it.hibernate.search.orm.elasticsearch.coordination.outboxpolling;
2+
3+
import static org.assertj.core.api.Assertions.assertThat;
4+
import static org.hamcrest.Matchers.is;
5+
6+
import org.junit.jupiter.api.Tag;
7+
import org.junit.jupiter.api.Test;
8+
import org.junit.jupiter.api.extension.RegisterExtension;
9+
10+
import io.quarkus.test.QuarkusDevModeTest;
11+
import io.restassured.RestAssured;
12+
13+
@Tag("devmode")
14+
public class HibernateSearchDevModeTest {
15+
16+
@RegisterExtension
17+
static final QuarkusDevModeTest config = new QuarkusDevModeTest()
18+
.withApplicationRoot((jar) -> jar
19+
.addClasses(HibernateSearchOutboxPollingTestResource.class, Person.class, OutboxPollingTestUtils.class)
20+
.addAsResource("application.properties", "application.properties"))
21+
.setLogRecordPredicate(r -> true);
22+
23+
@Test
24+
public void smoke() {
25+
String[] schemaManagementStrategies = { "drop-and-create-and-drop", "drop-and-create" };
26+
27+
RestAssured.when().put("/test/hibernate-search-outbox-polling/check-agents-running").then()
28+
.statusCode(200)
29+
.body(is("OK"));
30+
31+
for (int i = 0; i < 3; i++) {
32+
int current = i;
33+
config.modifyResourceFile(
34+
"application.properties",
35+
s -> s.replace(
36+
"quarkus.hibernate-search-orm.schema-management.strategy="
37+
+ schemaManagementStrategies[current % 2],
38+
"quarkus.hibernate-search-orm.schema-management.strategy="
39+
+ schemaManagementStrategies[(current + 1) % 2]));
40+
41+
RestAssured.when().put("/test/hibernate-search-outbox-polling/check-agents-running").then()
42+
.statusCode(200)
43+
.body(is("OK"));
44+
}
45+
46+
assertThat(config.getLogRecords()).noneSatisfy(
47+
r -> assertThat(r.getMessage()).contains("Unable to shut down Hibernate Search"));
48+
}
49+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
quarkus.ssl.native = false
2+
3+
quarkus.datasource.db-kind=h2
4+
quarkus.datasource.jdbc.url=jdbc:h2:tcp://localhost/mem:test
5+
quarkus.datasource.jdbc.max-size=8
6+
7+
quarkus.hibernate-orm.database.generation=drop-and-create
8+
9+
quarkus.hibernate-search-orm.elasticsearch.version=8
10+
quarkus.hibernate-search-orm.elasticsearch.hosts=${elasticsearch.hosts:localhost:9200}
11+
quarkus.hibernate-search-orm.elasticsearch.protocol=${elasticsearch.protocol:http}
12+
quarkus.hibernate-search-orm.schema-management.strategy=drop-and-create-and-drop
13+
quarkus.hibernate-search-orm.coordination.strategy=outbox-polling
14+
15+
quarkus.log.category."io.quarkus.hibernate.orm.runtime".min-level=TRACE
16+
quarkus.log.category."io.quarkus.hibernate.orm.runtime".level=TRACE
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package io.quarkus.it.jpa.postgresql;
2+
3+
import java.util.Map;
4+
5+
import org.junit.jupiter.api.Test;
6+
7+
import io.quarkus.test.LogCollectingTestResource;
8+
import io.quarkus.test.common.QuarkusTestResource;
9+
import io.quarkus.test.common.ResourceArg;
10+
import io.quarkus.test.junit.QuarkusTest;
11+
import io.quarkus.test.junit.QuarkusTestProfile;
12+
import io.quarkus.test.junit.TestProfile;
13+
14+
@QuarkusTest
15+
@TestProfile(HibernateOrmDatasourceFailingToStartTest.Profile.class)
16+
@QuarkusTestResource(value = LogCollectingTestResource.class, restrictToAnnotatedClass = true, initArgs = {
17+
@ResourceArg(name = LogCollectingTestResource.LEVEL, value = "WARNING"),
18+
@ResourceArg(name = LogCollectingTestResource.INCLUDE, value = "org\\.hibernate\\..*")
19+
})
20+
public class HibernateOrmDatasourceFailingToStartTest {
21+
22+
public static class Profile implements QuarkusTestProfile {
23+
@Override
24+
public Map<String, String> getConfigOverrides() {
25+
return Map.of(
26+
"quarkus.log.category.\"io.quarkus.hibernate.orm.runtime\".level", "TRACE",
27+
"quarkus.datasource.db-kind", "postgresql", "quarkus.datasource.jdbc.driver", "org.postgresql.Driver",
28+
"quarkus.datasource.jdbc.min-size", "20",
29+
"quarkus.datasource.jdbc.max-size", "10");
30+
}
31+
32+
@Override
33+
public String getConfigProfile() {
34+
return "someotherprofile";
35+
}
36+
}
37+
38+
@Test
39+
public void base() {
40+
//RestAssured.when().get("/jpa/testfunctionality/base").then().body(is("OK"));
41+
}
42+
43+
}

0 commit comments

Comments
 (0)