Skip to content

Commit d607ab8

Browse files
committed
PR ebean-orm#3153 - TEST: TestServerOffline
1 parent e666277 commit d607ab8

1 file changed

Lines changed: 154 additions & 0 deletions

File tree

Lines changed: 154 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,154 @@
1+
package io.ebean.test.config;
2+
3+
4+
import io.ebean.Database;
5+
import io.ebean.DatabaseFactory;
6+
import io.ebean.annotation.Platform;
7+
import io.ebean.config.DatabaseConfig;
8+
import io.ebean.datasource.DataSourceAlert;
9+
import io.ebean.datasource.DataSourceInitialiseException;
10+
import io.ebean.xtest.ForPlatform;
11+
12+
import io.ebean.xtest.base.PlatformCondition;
13+
import org.junit.jupiter.api.Test;
14+
import org.junit.jupiter.api.extension.ExtendWith;
15+
import org.tests.model.basic.EBasicVer;
16+
17+
import java.sql.Connection;
18+
import java.sql.DriverManager;
19+
import java.sql.SQLException;
20+
import java.sql.Statement;
21+
import java.util.Properties;
22+
23+
import javax.persistence.PersistenceException;
24+
import javax.sql.DataSource;
25+
26+
import static org.assertj.core.api.Assertions.assertThat;
27+
import static org.assertj.core.api.Assertions.assertThatThrownBy;
28+
29+
@ExtendWith(PlatformCondition.class)
30+
public class TestServerOffline {
31+
32+
@Test
33+
@ForPlatform({Platform.H2})
34+
public void testOffline_default() throws SQLException {
35+
36+
String url = "jdbc:h2:mem:testoffline1";
37+
try (Connection bootup = DriverManager.getConnection(url, "sa", "secret")) {
38+
Properties props = props(url);
39+
DatabaseConfig config = config(props);
40+
41+
assertThatThrownBy(() -> DatabaseFactory.create(config))
42+
.isInstanceOf(DataSourceInitialiseException.class);
43+
}
44+
45+
}
46+
47+
private static class LazyDatasourceInitializer implements DataSourceAlert {
48+
49+
public Database server;
50+
51+
private boolean initialized;
52+
53+
@Override
54+
public void dataSourceUp(DataSource dataSource) {
55+
if (!initialized) {
56+
initDatabase();
57+
}
58+
}
59+
60+
public synchronized void initDatabase() {
61+
if (!initialized) {
62+
server.runDdl();
63+
initialized = true;
64+
}
65+
}
66+
67+
@Override
68+
public void dataSourceDown(DataSource dataSource, SQLException reason) {}
69+
70+
@Override
71+
public void dataSourceWarning(DataSource dataSource, String msg) {}
72+
73+
}
74+
75+
@Test
76+
@ForPlatform({Platform.H2})
77+
public void testOffline_recovery() throws SQLException {
78+
79+
String url = "jdbc:h2:mem:testoffline3";
80+
try (Connection bootup = DriverManager.getConnection(url, "sa", "secret")) {
81+
82+
Properties props = props(url);
83+
84+
// to bring up ebean without a database, we must disable various things
85+
// that happen on startup
86+
props.setProperty("datasource.h2_offline.failOnStart", "false");
87+
props.setProperty("ebean.h2_offline.skipDataSourceCheck", "true");
88+
props.setProperty("ebean.h2_offline.ddl.run", "false");
89+
DatabaseConfig config = config(props);
90+
91+
LazyDatasourceInitializer alert = new LazyDatasourceInitializer() ;
92+
config.getDataSourceConfig().setAlert(alert);
93+
config.getDataSourceConfig().setHeartbeatFreqSecs(1);
94+
95+
Database h2Offline = DatabaseFactory.create(config);
96+
alert.server = h2Offline;
97+
assertThat(h2Offline).isNotNull();
98+
// DB is online now in offline mode
99+
100+
// Accessing the DB will throw a PE
101+
assertThatThrownBy(() -> alert.initDatabase())
102+
.isInstanceOf(PersistenceException.class)
103+
.hasMessageContaining("Failed to obtain connection to run DDL");
104+
105+
assertThatThrownBy(() -> h2Offline.find(EBasicVer.class).findCount()).isInstanceOf(PersistenceException.class);
106+
107+
// so - reset the password so that the server can reconnect
108+
try (Statement stmt = bootup.createStatement()) {
109+
stmt.execute("alter user sa set password 'sa'");
110+
}
111+
112+
assertThat(alert.initialized).isFalse();
113+
114+
// next access to ebean should bring DS online
115+
h2Offline.find(EBasicVer.class).findCount();
116+
assertThat(alert.initialized).isTrue();
117+
118+
// check if server is working (ie ddl was run)
119+
EBasicVer bean = new EBasicVer("foo");
120+
h2Offline.save(bean);
121+
assertThat(h2Offline.find(EBasicVer.class).findCount()).isEqualTo(1);
122+
h2Offline.delete(bean);
123+
}
124+
}
125+
126+
private Properties props(String url) {
127+
128+
Properties props = new Properties();
129+
130+
props.setProperty("datasource.h2_offline.username", "sa");
131+
props.setProperty("datasource.h2_offline.password", "sa");
132+
props.setProperty("datasource.h2_offline.url", url);
133+
props.setProperty("datasource.h2_offline.driver", "org.h2.Driver");
134+
135+
props.setProperty("ebean.h2_offline.databasePlatformName", "h2");
136+
props.setProperty("ebean.h2_offline.ddl.extra", "false");
137+
138+
props.setProperty("ebean.h2_offline.ddl.generate", "true");
139+
props.setProperty("ebean.h2_offline.ddl.run", "true");
140+
141+
return props;
142+
}
143+
144+
private DatabaseConfig config(Properties props) {
145+
DatabaseConfig config = new DatabaseConfig();
146+
config.setName("h2_offline");
147+
config.loadFromProperties(props);
148+
config.setDefaultServer(false);
149+
config.setRegister(false);
150+
config.getClasses().add(EBasicVer.class);
151+
return config;
152+
}
153+
154+
}

0 commit comments

Comments
 (0)