Package testsuite.simple

Source Code of testsuite.simple.DataSourceTest

/*
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);
  }
}
TOP

Related Classes of testsuite.simple.DataSourceTest

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.