blob: b591d86919c5f4da580121af70163ea77cef6139 [file] [log] [blame]
// SPDX-License-Identifier: LGPL-2.1-or-later
// Copyright (c) 2012-2014 Monty Program Ab
// Copyright (c) 2015-2021 MariaDB Corporation Ab
package org.mariadb.jdbc.integration;
import static org.junit.jupiter.api.Assertions.*;
import java.sql.*;
import javax.sql.DataSource;
import javax.sql.PooledConnection;
import javax.sql.XAConnection;
import org.junit.jupiter.api.Assumptions;
import org.junit.jupiter.api.Test;
import org.mariadb.jdbc.MariaDbDataSource;
public class DataSourceTest extends Common {
@Test
public void basic() throws SQLException {
MariaDbDataSource ds = new MariaDbDataSource(mDefUrl);
testDs(ds);
ds = new MariaDbDataSource();
ds.setUrl(mDefUrl);
testDs(ds);
ds = new MariaDbDataSource();
ds.setPassword("ttt");
ds.setUrl(mDefUrl);
assertThrows(SQLException.class, ds::getConnection);
}
private void testDs(MariaDbDataSource ds) throws SQLException {
try (Connection con1 = ds.getConnection()) {
try (Connection con2 = ds.getConnection()) {
ResultSet rs1 = con1.createStatement().executeQuery("SELECT 1");
ResultSet rs2 = con2.createStatement().executeQuery("SELECT 2");
while (rs1.next()) {
assertEquals(1, rs1.getInt(1));
}
while (rs2.next()) {
assertEquals(2, rs2.getInt(1));
}
}
}
PooledConnection con1 = null;
PooledConnection con2 = null;
try {
con1 = ds.getPooledConnection();
con2 = ds.getPooledConnection();
ResultSet rs1 = con1.getConnection().createStatement().executeQuery("SELECT 1");
ResultSet rs2 = con2.getConnection().createStatement().executeQuery("SELECT 2");
while (rs1.next()) {
assertEquals(1, rs1.getInt(1));
}
while (rs2.next()) {
assertEquals(2, rs2.getInt(1));
}
} finally {
if (con1 != null) con1.close();
if (con2 != null) con2.close();
}
XAConnection conx1 = null;
XAConnection conx2 = null;
try {
conx1 = ds.getXAConnection();
conx2 = ds.getXAConnection();
ResultSet rs1 = conx1.getConnection().createStatement().executeQuery("SELECT 1");
ResultSet rs2 = conx2.getConnection().createStatement().executeQuery("SELECT 2");
while (rs1.next()) {
assertEquals(1, rs1.getInt(1));
}
while (rs2.next()) {
assertEquals(2, rs2.getInt(1));
}
} finally {
if (conx1 != null) con1.close();
if (conx2 != null) con2.close();
}
}
@Test
public void basic2() throws SQLException {
MariaDbDataSource ds = new MariaDbDataSource();
assertNull(ds.getUrl());
assertNull(ds.getUser());
assertEquals(30, ds.getLoginTimeout());
DriverManager.setLoginTimeout(40);
assertEquals(40, ds.getLoginTimeout());
DriverManager.setLoginTimeout(0);
ds.setLoginTimeout(50);
assertEquals(50, ds.getLoginTimeout());
assertThrows(SQLException.class, () -> ds.getConnection());
assertThrows(SQLException.class, () -> ds.getConnection("user", "password"));
assertThrows(SQLException.class, () -> ds.getPooledConnection());
assertThrows(SQLException.class, () -> ds.getPooledConnection("user", "password"));
assertThrows(SQLException.class, () -> ds.getXAConnection());
assertThrows(SQLException.class, () -> ds.getXAConnection("user", "password"));
ds.setUser("dd");
assertEquals("dd", ds.getUser());
ds.setPassword("pwd");
assertThrows(SQLException.class, () -> ds.getConnection());
assertThrows(SQLException.class, () -> ds.getPooledConnection());
assertThrows(SQLException.class, () -> ds.setUrl("jdbc:wrong://d"));
ds.setUrl("jdbc:mariadb://myhost:5500/db?someOption=val");
assertEquals(
"jdbc:mariadb://myhost:5500/db?user=dd&password=***&someOption=val&connectTimeout=50000",
ds.getUrl());
}
@Test
public void switchUser() throws SQLException {
Assumptions.assumeTrue(
!"maxscale".equals(System.getenv("srv"))
&& !"skysql".equals(System.getenv("srv"))
&& !"skysql-ha".equals(System.getenv("srv")));
Statement stmt = sharedConn.createStatement();
try {
stmt.execute("DROP USER 'dsUser'");
} catch (SQLException e) {
// eat
}
if (minVersion(8, 0, 0)) {
if (isMariaDBServer()) {
stmt.execute("CREATE USER 'dsUser'@'%' IDENTIFIED BY 'MySup8%rPassw@ord'");
stmt.execute("GRANT SELECT ON " + sharedConn.getCatalog() + ".* TO 'dsUser'@'%'");
} else {
stmt.execute(
"CREATE USER 'dsUser'@'%' IDENTIFIED WITH mysql_native_password BY"
+ " 'MySup8%rPassw@ord'");
stmt.execute("GRANT SELECT ON " + sharedConn.getCatalog() + ".* TO 'dsUser'@'%'");
}
} else {
stmt.execute("CREATE USER 'dsUser'@'%'");
stmt.execute(
"GRANT SELECT ON "
+ sharedConn.getCatalog()
+ ".* TO 'dsUser'@'%' IDENTIFIED BY 'MySup8%rPassw@ord'");
}
// mysql 8.0.31 broken public key retrieval, so avoid FLUSHING for now
Assumptions.assumeTrue(!isMariaDBServer() && !exactVersion(8, 0, 31));
stmt.execute("FLUSH PRIVILEGES");
DataSource ds = new MariaDbDataSource(mDefUrl + "&allowPublicKeyRetrieval");
try (Connection con1 = ds.getConnection()) {
try (Connection con2 = ds.getConnection("dsUser", "MySup8%rPassw@ord")) {
ResultSet rs1 = con1.createStatement().executeQuery("SELECT 1");
ResultSet rs2 = con2.createStatement().executeQuery("SELECT 2");
while (rs1.next()) {
assertEquals(1, rs1.getInt(1));
}
while (rs2.next()) {
assertEquals(2, rs2.getInt(1));
}
}
} finally {
try {
stmt.execute("DROP USER 'dsUser'");
} catch (SQLException e) {
// eat
}
}
// mysql has issue when creating new user with native password
if (haveSsl() && !isMariaDBServer() && minVersion(8, 0, 0)) {
try (Connection con = createCon("sslMode=trust")) {
con.createStatement().execute("DO 1");
}
}
}
@Test
public void exceptions() throws SQLException {
DataSource ds = new MariaDbDataSource(mDefUrl);
ds.unwrap(javax.sql.DataSource.class);
ds.unwrap(MariaDbDataSource.class);
Common.assertThrowsContains(
SQLException.class,
() -> ds.unwrap(String.class),
"Datasource is not a wrapper for java.lang.String");
assertTrue(ds.isWrapperFor(javax.sql.DataSource.class));
assertTrue(ds.isWrapperFor(MariaDbDataSource.class));
assertFalse(ds.isWrapperFor(String.class));
Common.assertThrowsContains(
SQLException.class,
() -> new MariaDbDataSource("jdbc:wrongUrl"),
"Wrong mariaDB url: jdbc:wrongUrl");
assertNull(ds.getLogWriter());
assertNull(ds.getParentLogger());
ds.setLogWriter(null);
assertEquals(30, ds.getLoginTimeout());
ds.setLoginTimeout(60);
assertEquals(60, ds.getLoginTimeout());
}
}