|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
package testsuite.simple; |
|
|
|
import java.io.File; |
|
import java.sql.Connection; |
|
import java.util.Hashtable; |
|
|
|
import javax.naming.Context; |
|
import javax.naming.InitialContext; |
|
import javax.naming.Name; |
|
import javax.naming.NameParser; |
|
import javax.naming.Reference; |
|
import javax.naming.spi.ObjectFactory; |
|
import javax.sql.DataSource; |
|
import javax.sql.PooledConnection; |
|
|
|
import testsuite.BaseTestCase; |
|
|
|
import com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource; |
|
import com.mysql.jdbc.jdbc2.optional.MysqlXADataSource; |
|
|
|
|
|
|
|
|
|
|
|
|
|
public class DataSourceTest extends BaseTestCase { |
|
|
|
|
|
|
|
private Context ctx; |
|
|
|
private File tempDir; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public DataSourceTest(String name) { |
|
super(name); |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public static void main(String[] args) { |
|
junit.textui.TestRunner.run(DataSourceTest.class); |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public void setUp() throws Exception { |
|
super.setUp(); |
|
registerDataSource(); |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public void tearDown() throws Exception { |
|
this.ctx.unbind(this.tempDir.getAbsolutePath() + "/test"); |
|
this.ctx.close(); |
|
this.tempDir.delete(); |
|
super.tearDown(); |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public void testDataSource() throws Exception { |
|
NameParser nameParser = this.ctx.getNameParser(""); |
|
Name datasourceName = nameParser.parse(this.tempDir.getAbsolutePath() |
|
+ "/test"); |
|
Object obj = this.ctx.lookup(datasourceName); |
|
DataSource boundDs = null; |
|
|
|
if (obj instanceof DataSource) { |
|
boundDs = (DataSource) obj; |
|
} else if (obj instanceof Reference) { |
|
|
|
|
|
|
|
|
|
Reference objAsRef = (Reference) obj; |
|
ObjectFactory factory = (ObjectFactory) Class.forName( |
|
objAsRef.getFactoryClassName()).newInstance(); |
|
boundDs = (DataSource) factory.getObjectInstance(objAsRef, |
|
datasourceName, this.ctx, new Hashtable()); |
|
} |
|
|
|
assertTrue("Datasource not bound", boundDs != null); |
|
|
|
Connection con = boundDs.getConnection(); |
|
con.close(); |
|
assertTrue("Connection can not be obtained from data source", |
|
con != null); |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public void testChangeUserAndCharsets() throws Exception { |
|
if (versionMeetsMinimum(4, 1)) { |
|
MysqlConnectionPoolDataSource ds = new MysqlConnectionPoolDataSource(); |
|
ds.setURL(BaseTestCase.dbUrl); |
|
ds.setCharacterEncoding("utf-8"); |
|
PooledConnection pooledConnection = ds.getPooledConnection(); |
|
|
|
Connection connToMySQL = pooledConnection.getConnection(); |
|
this.rs = connToMySQL.createStatement().executeQuery( |
|
"SELECT @@character_set_results"); |
|
assertTrue(this.rs.next()); |
|
|
|
String toCheck = null; |
|
|
|
if (versionMeetsMinimum(4, 1, 15)) { |
|
if (versionMeetsMinimum(5, 0)) { |
|
if (versionMeetsMinimum(5, 0, 13)) { |
|
toCheck = null; |
|
} else { |
|
toCheck = "NULL"; |
|
} |
|
} else { |
|
toCheck = null; |
|
} |
|
} else { |
|
toCheck = "NULL"; |
|
} |
|
|
|
assertEquals(toCheck, this.rs.getString(1)); |
|
|
|
this.rs = connToMySQL.createStatement().executeQuery( |
|
"SHOW SESSION VARIABLES LIKE 'character_set_client'"); |
|
assertTrue(this.rs.next()); |
|
assertEquals("utf8", this.rs.getString(2)); |
|
|
|
connToMySQL.close(); |
|
|
|
connToMySQL = pooledConnection.getConnection(); |
|
this.rs = connToMySQL.createStatement().executeQuery( |
|
"SELECT @@character_set_results"); |
|
assertTrue(this.rs.next()); |
|
assertEquals(toCheck, this.rs.getString(1)); |
|
|
|
this.rs = connToMySQL.createStatement().executeQuery( |
|
"SHOW SESSION VARIABLES LIKE 'character_set_client'"); |
|
assertTrue(this.rs.next()); |
|
assertEquals("utf8", this.rs.getString(2)); |
|
|
|
pooledConnection.getConnection().close(); |
|
} |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
public void testXADataSource() throws Exception { |
|
|
|
MysqlXADataSource ds = new MysqlXADataSource(); |
|
ds.setUrl(dbUrl); |
|
|
|
String name = "XA"; |
|
this.ctx.rebind(name, ds); |
|
|
|
Object result = this.ctx.lookup(name); |
|
|
|
assertNotNull("XADataSource not bound into JNDI", result); |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private void registerDataSource() throws Exception { |
|
this.tempDir = File.createTempFile("jnditest", null); |
|
this.tempDir.delete(); |
|
this.tempDir.mkdir(); |
|
this.tempDir.deleteOnExit(); |
|
|
|
com.mysql.jdbc.jdbc2.optional.MysqlDataSource ds; |
|
Hashtable env = new Hashtable(); |
|
env.put(Context.INITIAL_CONTEXT_FACTORY, |
|
"com.sun.jndi.fscontext.RefFSContextFactory"); |
|
this.ctx = new InitialContext(env); |
|
assertTrue("Naming Context not created", this.ctx != null); |
|
ds = new com.mysql.jdbc.jdbc2.optional.MysqlDataSource(); |
|
ds.setUrl(dbUrl); |
|
this.ctx.bind(this.tempDir.getAbsolutePath() + "/test", ds); |
|
} |
|
} |
|
|