|
11 | 11 | import com.oracle.bmc.databasetools.requests.CreateDatabaseToolsConnectionRequest;
|
12 | 12 | import com.oracle.bmc.databasetools.requests.DeleteDatabaseToolsConnectionRequest;
|
13 | 13 | import com.oracle.bmc.databasetools.requests.GetDatabaseToolsConnectionRequest;
|
| 14 | +import com.oracle.bmc.databasetools.requests.UpdateDatabaseToolsConnectionRequest; |
14 | 15 | import com.oracle.bmc.databasetools.responses.CreateDatabaseToolsConnectionResponse;
|
15 | 16 | import com.oracle.bmc.databasetools.responses.DeleteDatabaseToolsConnectionResponse;
|
16 | 17 | import com.oracle.bmc.databasetools.responses.GetDatabaseToolsConnectionResponse;
|
| 18 | +import com.oracle.bmc.databasetools.responses.UpdateDatabaseToolsConnectionResponse; |
17 | 19 | import com.oracle.bmc.http.internal.BaseSyncClient;
|
18 | 20 | import oracle.jdbc.datasource.impl.OracleDataSource;
|
19 | 21 | import oracle.jdbc.provider.TestProperties;
|
|
33 | 35 | import java.util.Arrays;
|
34 | 36 | import java.util.Objects;
|
35 | 37 |
|
| 38 | +import static org.junit.jupiter.api.Assertions.assertThrows; |
| 39 | + |
36 | 40 | /**
|
37 | 41 | * Verifies the {@link OciDatabaseToolsConnectionProvider} as implementing
|
38 | 42 | * behavior specified by its JavaDoc.
|
@@ -177,6 +181,80 @@ public void testGetPropertiesFromDeletedConnection() {
|
177 | 181 | () -> PROVIDER.getConnectionProperties(ocid));
|
178 | 182 | }
|
179 | 183 |
|
| 184 | + /** |
| 185 | + * Verify that the cache is purged after hitting 1017 error. |
| 186 | + * Specifically, get connection to the same url twice, but modify the 'user' |
| 187 | + * every time. |
| 188 | + * A new db tools connection is created and deleted for this test. |
| 189 | + **/ |
| 190 | + @Test |
| 191 | + public void testCachePurged() throws SQLException { |
| 192 | + String OCI_DISPLAY_NAME = "display_name_for_connection"; |
| 193 | + String OCI_USERNAME = "admin"; |
| 194 | + String OCI_PASSWORD_OCID = TestProperties.getOrAbort( |
| 195 | + OciTestProperty.OCI_PASSWORD_OCID); |
| 196 | + String OCI_DATABASE_OCID = TestProperties.getOrAbort( |
| 197 | + OciTestProperty.OCI_DATABASE_OCID); |
| 198 | + String OCI_COMPARTMENT_ID = TestProperties.getOrAbort( |
| 199 | + OciTestProperty.OCI_COMPARTMENT_ID); |
| 200 | + String OCI_DATABASE_CONNECTION_STRING = getConnectionStringFromAutonomousDatabase( |
| 201 | + OCI_DATABASE_OCID); |
| 202 | + |
| 203 | + // Create new Connection |
| 204 | + CreateDatabaseToolsConnectionResponse createResponse = sendCreateConnRequest( |
| 205 | + OCI_USERNAME, OCI_PASSWORD_OCID, OCI_DISPLAY_NAME, OCI_COMPARTMENT_ID, |
| 206 | + OCI_DATABASE_CONNECTION_STRING, OCI_DATABASE_OCID); |
| 207 | + |
| 208 | + // The db tools connection is being created. |
| 209 | + Assertions.assertEquals(201, |
| 210 | + createResponse.get__httpStatusCode__()); |
| 211 | + |
| 212 | + // Retrieve OCID of Connection |
| 213 | + String ocid = createResponse |
| 214 | + .getDatabaseToolsConnection().getId(); |
| 215 | + |
| 216 | + // The url used to connect to Database |
| 217 | + String url = "jdbc:oracle:thin:@config-ocidbtools://" + ocid; |
| 218 | + |
| 219 | + // Set value of 'user' wrong |
| 220 | + UpdateDatabaseToolsConnectionDetails updateDatabaseToolsConnectionDetails = |
| 221 | + UpdateDatabaseToolsConnectionOracleDatabaseDetails.builder() |
| 222 | + .userName(OCI_USERNAME + "wrong") |
| 223 | + .build(); |
| 224 | + |
| 225 | + UpdateDatabaseToolsConnectionResponse updateResponse = |
| 226 | + sendUpdateConnRequest(ocid, updateDatabaseToolsConnectionDetails); |
| 227 | + Assertions.assertEquals(202, updateResponse.get__httpStatusCode__()); |
| 228 | + |
| 229 | + // Connection fails: hit 1017 |
| 230 | + SQLException exception = assertThrows(SQLException.class, |
| 231 | + () -> tryConnection(url), "Should throw an SQLException"); |
| 232 | + Assertions.assertEquals(exception.getErrorCode(), 1017); |
| 233 | + |
| 234 | + // Set value of 'user' correct |
| 235 | + UpdateDatabaseToolsConnectionDetails updateDatabaseToolsConnectionDetails2 = UpdateDatabaseToolsConnectionOracleDatabaseDetails.builder() |
| 236 | + .userName(OCI_USERNAME).build(); |
| 237 | + |
| 238 | + UpdateDatabaseToolsConnectionResponse updateResponse2 = |
| 239 | + sendUpdateConnRequest(ocid, updateDatabaseToolsConnectionDetails2); |
| 240 | + Assertions.assertEquals(202, updateResponse2.get__httpStatusCode__()); |
| 241 | + |
| 242 | + // Connection succeeds |
| 243 | + Connection conn = tryConnection(url); |
| 244 | + Assertions.assertNotNull(conn); |
| 245 | + |
| 246 | + Statement st = conn.createStatement(); |
| 247 | + ResultSet rs = st.executeQuery("SELECT 'Hello, db' FROM sys.dual"); |
| 248 | + Assertions.assertNotNull(rs.next()); |
| 249 | + Assertions.assertEquals("Hello, db", rs.getString(1)); |
| 250 | + |
| 251 | + // Finally delete Connection |
| 252 | + DeleteDatabaseToolsConnectionResponse deleteResponse = sendDeleteConnRequest( |
| 253 | + ocid); |
| 254 | + Assertions.assertEquals(202, |
| 255 | + deleteResponse.get__httpStatusCode__()); /* Request accepted. This db tools connection will be deleted */ |
| 256 | + } |
| 257 | + |
180 | 258 | /**
|
181 | 259 | * Helper function: send create DB Tools Connection request
|
182 | 260 | * @param OCI_DATABASE_OCID The OCID of the Autonomous Database
|
@@ -268,6 +346,27 @@ private GetDatabaseToolsConnectionResponse sendGetConnRequest(String ocid) {
|
268 | 346 | return response;
|
269 | 347 | }
|
270 | 348 |
|
| 349 | + /** |
| 350 | + * Helper function: send update DB Tools Connection request |
| 351 | + * @param ocid The OCID of DB Tools Connection |
| 352 | + * @param updateDatabaseToolsConnectionDetails |
| 353 | + * The updateDatabaseToolsConnectionDetails to update to this |
| 354 | + * connection |
| 355 | + * @return UpdateDatabaseToolsConnectionResponse |
| 356 | + */ |
| 357 | + private UpdateDatabaseToolsConnectionResponse sendUpdateConnRequest(String ocid, UpdateDatabaseToolsConnectionDetails updateDatabaseToolsConnectionDetails){ |
| 358 | + /* Create a request and dependent object(s). */ |
| 359 | + UpdateDatabaseToolsConnectionRequest updateDatabaseToolsConnectionRequest |
| 360 | + = UpdateDatabaseToolsConnectionRequest.builder() |
| 361 | + .databaseToolsConnectionId(ocid) |
| 362 | + .updateDatabaseToolsConnectionDetails(updateDatabaseToolsConnectionDetails) |
| 363 | + .build(); |
| 364 | + |
| 365 | + /* Send request to the Client */ |
| 366 | + UpdateDatabaseToolsConnectionResponse response = client.updateDatabaseToolsConnection(updateDatabaseToolsConnectionRequest); |
| 367 | + return response; |
| 368 | + } |
| 369 | + |
271 | 370 | /**
|
272 | 371 | * Helper function: send get Autonomous Database request
|
273 | 372 | * @param OCI_DATABASE_OCID The OCID of the Autonomous Database
|
@@ -300,4 +399,14 @@ private String getConnectionStringFromAutonomousDatabase(
|
300 | 399 | .getValue();
|
301 | 400 | return CONNECTION_STRING;
|
302 | 401 | }
|
| 402 | + |
| 403 | + /** |
| 404 | + * Helper function: try to get connection form specified url |
| 405 | + **/ |
| 406 | + private Connection tryConnection(String url) throws SQLException { |
| 407 | + OracleDataSource ds = new OracleDataSource(); |
| 408 | + ds.setURL(url); |
| 409 | + Connection conn = ds.getConnection(); |
| 410 | + return conn; |
| 411 | + } |
303 | 412 | }
|
0 commit comments