/*
Copyright (c) 2014, 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.fabric.jdbc;
import java.sql.ResultSet;
import java.sql.Statement;
import testsuite.fabric.BaseFabricTestCase;
import com.mysql.fabric.jdbc.FabricMySQLConnection;
import com.mysql.fabric.jdbc.FabricMySQLDataSource;
/**
* TODO: document required setup for this test
*/
public class TestHABasics extends BaseFabricTestCase {
private FabricMySQLDataSource ds;
private FabricMySQLConnection conn;
private String masterPort = System.getProperty("com.mysql.fabric.testsuite.global.port");
public TestHABasics() throws Exception {
super();
this.ds = getNewDefaultDataSource();
}
public void setUp() throws Exception {
this.conn = (FabricMySQLConnection)ds.getConnection(this.username, this.password);
this.conn.setServerGroupName("ha_config1_group");
}
public void tearDown() throws Exception {
this.conn.close();
}
private String getPort() throws Exception {
ResultSet rs = this.conn.createStatement().executeQuery("show variables like 'port'");
assertTrue(rs.next());
String port1 = rs.getString(2);
rs.close();
return port1;
}
/**
* Test that writes go to the master and reads go to the slave(s).
*/
public void testReadWriteSplitting() throws Exception {
// make sure we start on the master
assertEquals(this.masterPort, getPort());
Statement s = this.conn.createStatement();
s.executeUpdate("drop table if exists fruits");
s.executeUpdate("create table fruits (name varchar(30))");
s.executeUpdate("insert into fruits values ('Rambutan'), ('Starfruit')");
// go to the slave and verify
this.conn.setReadOnly(true);
assertTrue(!this.masterPort.equals(getPort()));
// allow a little replication lag and check for data
Thread.sleep(3000);
ResultSet rs = s.executeQuery("select name from fruits order by 1");
assertTrue(rs.next());
assertEquals("Rambutan", rs.getString(1));
assertTrue(rs.next());
assertEquals("Starfruit", rs.getString(1));
assertFalse(rs.next());
rs.close();
this.conn.setReadOnly(false);
s.executeUpdate("drop table fruits");
}
public void testFailoverManual() throws Exception {
// Statement s = this.conn.createStatement();
// s.executeUpdate("drop table if exists fruits");
// s.executeUpdate("create table fruits (name varchar(30))");
// Thread.sleep(10000);
// try {
// s.executeUpdate("insert into fruits values ('')");
// fail("Master should be unavailable");
// } catch(SQLException ex) {
// ex.printStackTrace();
// s.executeUpdate("insert into fruits values ('Starfruit')");
// }
}
}