/* Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved. The MySQL Connector/J is licensed under the terms of the GPLv2 <http://www.gnu.org/licenses/old-licenses/gpl-2.0.html>, like most MySQL Connectors. There are special exceptions to the terms and conditions of the GPLv2 as it is applied to this software, see the FLOSS License Exception <http://www.mysql.com/about/legal/licensing/foss-exception.html>. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; version 2 of the License. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ 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; /** * * @author Mark Matthews * @version $Id$ */ public class DataSourceTest extends BaseTestCase { // ~ Instance fields // -------------------------------------------------------- private Context ctx; private File tempDir; // ~ Constructors // ----------------------------------------------------------- /** * Creates a new DataSourceTest object. * * @param name * DOCUMENT ME! */ public DataSourceTest(String name) { super(name); } // ~ Methods // ---------------------------------------------------------------- /** * Runs all test cases in this test suite * * @param args */ public static void main(String[] args) { junit.textui.TestRunner.run(DataSourceTest.class); } /** * Sets up this test, calling registerDataSource() to bind a DataSource into * JNDI, using the FSContext JNDI provider from Sun * * @throws Exception * if an error occurs. */ public void setUp() throws Exception { super.setUp(); registerDataSource(); } /** * Un-binds the DataSource, and cleans up the filesystem * * @throws Exception * if an error occurs */ public void tearDown() throws Exception { try { this.ctx.unbind(this.tempDir.getAbsolutePath() + "/test"); this.ctx.close(); this.tempDir.delete(); } finally { super.tearDown(); } } /** * Tests that we can get a connection from the DataSource bound in JNDI * during test setup * * @throws Exception * if an error occurs */ public void testDataSource() throws Exception { NameParser nameParser = this.ctx.getNameParser(""); Name datasourceName = nameParser.parse("_test"); Object obj = this.ctx.lookup(datasourceName); DataSource boundDs = null; if (obj instanceof DataSource) { boundDs = (DataSource) obj; } else if (obj instanceof Reference) { // // For some reason, this comes back as a Reference // instance under CruiseControl !? // Reference objAsRef = (Reference) obj; ObjectFactory factory = (ObjectFactory) Class.forName( objAsRef.getFactoryClassName()).newInstance(); boundDs = (DataSource) factory.getObjectInstance(objAsRef, datasourceName, this.ctx, new Hashtable<Object, Object>()); } assertTrue("Datasource not bound", boundDs != null); Connection con = boundDs.getConnection(); con.close(); assertTrue("Connection can not be obtained from data source", con != null); } /** * Tests whether Connection.changeUser() (and thus pooled connections) * restore character set information correctly. * * @throws Exception * if the test fails. */ 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()); //Cause of utf8mb4 assertEquals(0, this.rs.getString(2).indexOf("utf8")); 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()); //Cause of utf8mb4 assertEquals(0, this.rs.getString(2).indexOf("utf8")); pooledConnection.getConnection().close(); } } /** * Tests whether XADataSources can be bound into JNDI * * @throws Exception if the test fails. */ 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); } /** * This method is separated from the rest of the example since you normally * would NOT register a JDBC driver in your code. It would likely be * configered into your naming and directory service using some GUI. * * @throws Exception * if an error occurs */ 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<String, String> env = new Hashtable<String, String>(); env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.fscontext.RefFSContextFactory"); env.put(Context.PROVIDER_URL, this.tempDir.toURI().toString()); this.ctx = new InitialContext(env); assertTrue("Naming Context not created", this.ctx != null); ds = new com.mysql.jdbc.jdbc2.optional.MysqlDataSource(); ds.setUrl(dbUrl); // from BaseTestCase this.ctx.bind("_test", ds); } }