16
16
import org .testcontainers .containers .GenericContainer ;
17
17
import org .testcontainers .containers .wait .strategy .Wait ;
18
18
19
+ import java .io .IOException ;
19
20
import java .time .Duration ;
20
21
21
22
public class OracleRule extends ExternalResource {
22
23
24
+ public static final OracleRule SHARED_INSTANCE = new OracleRule ();
25
+
23
26
static final String IMAGE = "gvenzl/oracle-xe" ;
24
27
static final String PASSWORD = "vertx" ;
25
28
static final int PORT = 1521 ;
26
29
27
- static final GenericContainer <?> ORACLE_DB ;
30
+ private GenericContainer <?> server ;
31
+ private OracleConnectOptions options ;
28
32
29
- static {
30
- String containerVersion = System .getProperty ("oracle-container.version" );
31
- if (containerVersion == null || containerVersion .isEmpty ()) {
32
- containerVersion = "18-slim" ;
33
+ @ Override
34
+ protected void before () throws IOException {
35
+ if (server == null ) {
36
+ options = startOracle ();
37
+ }
38
+ }
39
+
40
+ private boolean isNullOrEmpty (String s ) {
41
+ return s == null || s .isEmpty ();
42
+ }
43
+
44
+ @ Override
45
+ protected void after () {
46
+ if (this != SHARED_INSTANCE ) {
47
+ stopOracle ();
33
48
}
49
+ }
50
+
51
+ private OracleConnectOptions startOracle () throws IOException {
52
+ String containerVersion = System .getProperty ("oracle-container.version" );
53
+ containerVersion = isNullOrEmpty (containerVersion ) ? "18-slim" : containerVersion ;
34
54
35
55
String image = IMAGE + ":" + containerVersion ;
36
56
37
- ORACLE_DB = new GenericContainer <>(image )
57
+ server = new GenericContainer <>(image )
38
58
.withEnv ("ORACLE_PASSWORD" , PASSWORD )
39
59
.withExposedPorts (PORT )
40
60
.withClasspathResourceMapping ("tck/import.sql" , "/container-entrypoint-initdb.d/import.sql" , BindMode .READ_ONLY )
@@ -44,53 +64,27 @@ public class OracleRule extends ExternalResource {
44
64
)
45
65
.withStartupTimeout (Duration .ofMinutes (15 ));
46
66
47
- ORACLE_DB .start ();
48
- }
49
-
50
- public static String getPassword () {
51
- return PASSWORD ;
52
- }
53
-
54
- public static String getUser () {
55
- return "sys as sysdba" ;
56
- }
67
+ server .start ();
57
68
58
- public static String getDatabaseHost () {
59
- return ORACLE_DB .getHost ();
60
- }
61
-
62
- public static int getDatabasePort () {
63
- return ORACLE_DB .getMappedPort (1521 );
64
- }
65
-
66
- public static String getDatabase () {
67
- return "xe" ;
69
+ return new OracleConnectOptions ()
70
+ .setHost (server .getContainerIpAddress ())
71
+ .setPort (server .getMappedPort (PORT ))
72
+ .setUser ("sys as sysdba" )
73
+ .setPassword (PASSWORD )
74
+ .setDatabase ("xe" );
68
75
}
69
76
70
- private OracleConnectOptions options ;
71
-
72
- public static final OracleRule SHARED_INSTANCE = new OracleRule ();
73
-
74
- public synchronized OracleConnectOptions getOptions () throws Exception {
75
- return new OracleConnectOptions ()
76
- .setPort (getDatabasePort ())
77
- .setHost (getDatabaseHost ())
78
- .setUser (getUser ())
79
- .setPassword (getPassword ())
80
- .setDatabase (getDatabase ());
77
+ private void stopOracle () {
78
+ if (server != null ) {
79
+ try {
80
+ server .stop ();
81
+ } finally {
82
+ server = null ;
83
+ }
84
+ }
81
85
}
82
86
83
87
public OracleConnectOptions options () {
84
88
return new OracleConnectOptions (options );
85
89
}
86
-
87
- @ Override
88
- protected void before () throws Throwable {
89
- options = getOptions ();
90
- }
91
-
92
- @ Override
93
- protected void after () {
94
-
95
- }
96
90
}
0 commit comments