/* * Copyright 1999-2012 Alibaba Group. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.alibaba.cobar.manager.qa.monitor; import java.sql.Connection; import java.sql.SQLException; import java.util.List; import org.apache.log4j.Logger; import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import com.alibaba.cobar.manager.dataobject.cobarnode.DataNodesStatus; import com.alibaba.cobar.manager.qa.util.TestUtils; public class TestDataNodes extends TestCobarAdapter { private Connection managerConnection = null; private Connection dmlConnection = null; private static final Logger logger = Logger.getLogger(TestDataNodes.class); List<DataNodesStatus> dataNodeStatusList = null; @Override @Before public void initData() { super.initData(); try { if (null != managerConnection) { managerConnection.close(); } managerConnection = sCobarNode.createManagerConnection(); if (null != dmlConnection){ dmlConnection.close(); } dmlConnection = sCobarNode.createDMLConnection("ddl_test"); if (null != dataNodeStatusList) { dataNodeStatusList.clear(); } } catch (Exception e) { logger.error(e.getMessage(), e); Assert.fail(); } } @Override @After public void end() { super.end(); try { if (null != managerConnection) { managerConnection.close(); } if (null != dmlConnection){ dmlConnection.close(); } if (null != dataNodeStatusList) { dataNodeStatusList.clear(); } } catch (Exception e) { logger.error("destroy adpter error"); Assert.fail(); } } public DataNodesStatus getDataNodeStatus(String poolName) { DataNodesStatus dataNodeStatus = null; dataNodeStatusList = cobarAdapter.listDataNodes(); for (DataNodesStatus data : dataNodeStatusList) { String dataNode = data.getPoolName(); if (poolName.equals(dataNode)) { dataNodeStatus = data; break; } } return dataNodeStatus; } /* * test has suspect that there are no dataNodes with duplicated poolName * first test switch @@dataSource poolName, then test switch @@dataSource poolName:index */ @Test public void testSwitchIndex() { String testDataNode = null; boolean resultSwitch = false; int indexBeforeSwitch = 0; int indexAfterSwitch = 0; int dataSourceNumOfTestDataNode = 0; dataNodeStatusList = cobarAdapter.listDataNodes(); //test first dataNode with multi-dataSources or last dataNode with single dataSource for (DataNodesStatus dataNodeStatus : dataNodeStatusList) { testDataNode = dataNodeStatus.getPoolName(); indexBeforeSwitch = dataNodeStatus.getIndex(); String[] dataSources = dataNodeStatus.getDataSource().split(","); dataSourceNumOfTestDataNode = dataSources.length; if (dataSourceNumOfTestDataNode > 1) { resultSwitch = true; break; } } Assert.assertNotNull(testDataNode); //switch @@dataSource poolName try { sCobarNode.excuteSQL(managerConnection, "switch @@dataSource " + testDataNode); } catch (SQLException e) { logger.error(e.getMessage(), e); Assert.fail(); } DataNodesStatus testDataNodeStatus = this.getDataNodeStatus(testDataNode); Assert.assertNotNull(testDataNodeStatus); indexAfterSwitch = testDataNodeStatus.getIndex(); if (resultSwitch) { Assert.assertTrue(indexBeforeSwitch != indexAfterSwitch); } else { Assert.assertTrue(indexBeforeSwitch == indexAfterSwitch); } //switch @@dataSource poolName:index try { sCobarNode.excuteSQL(managerConnection, "switch @@dataSource " + testDataNode + " : " + indexBeforeSwitch); } catch (SQLException e) { logger.error(e.getMessage(), e); Assert.fail(); } testDataNodeStatus = this.getDataNodeStatus(testDataNode); Assert.assertNotNull(testDataNodeStatus); indexAfterSwitch = testDataNodeStatus.getIndex(); Assert.assertTrue(indexBeforeSwitch == indexAfterSwitch); } @Test public void testRecoverTime() { int recoverTime = 10; dataNodeStatusList = cobarAdapter.listDataNodes(); Assert.assertTrue(dataNodeStatusList.size() >= 1); String testDataNode = dataNodeStatusList.get(0).getPoolName(); try { sCobarNode.excuteSQL(managerConnection, "stop @@heartbeat " + testDataNode + " : " + recoverTime); } catch (SQLException e) { logger.error(e.getMessage(), e); Assert.fail(); } DataNodesStatus testDataNodeStatus = this.getDataNodeStatus(testDataNode); Assert.assertNotNull(testDataNodeStatus); double remainTime = testDataNodeStatus.getRecoveryTime(); Assert.assertTrue((remainTime > 0) && (remainTime <= recoverTime)); TestUtils.waitForMonment(recoverTime * 1000); testDataNodeStatus = this.getDataNodeStatus(testDataNode); Assert.assertNotNull(testDataNodeStatus); remainTime = testDataNodeStatus.getRecoveryTime(); Assert.assertTrue(remainTime == -1); } @Test public void testExcute(){ String testDataNode = "ddl_test"; dataNodeStatusList = cobarAdapter.listDataNodes(); DataNodesStatus testDNStatusBefore= getDataNodeStatus(testDataNode); Assert.assertNotNull(testDNStatusBefore); try { sCobarNode.excuteSQL(dmlConnection, "show tables"); } catch (SQLException e) { logger.error(e.getMessage(), e); Assert.fail(); } DataNodesStatus testDNStatusAfter= getDataNodeStatus(testDataNode); Assert.assertNotNull(testDNStatusAfter); Assert.assertEquals(testDNStatusBefore.getExecuteCount() + 1, testDNStatusAfter.getExecuteCount()); } /* * excute num is not affacted by switch index */ @Test public void testExcuteAfterSwitchIndex(){ String testDataNode = "ddl_test"; dataNodeStatusList = cobarAdapter.listDataNodes(); DataNodesStatus testDNStatusBefore= getDataNodeStatus(testDataNode); Assert.assertNotNull(testDNStatusBefore); try { sCobarNode.excuteSQL(managerConnection, "switch @@dataSource " + testDataNode); sCobarNode.excuteSQL(dmlConnection, "show tables"); } catch (SQLException e) { logger.error(e.getMessage(), e); Assert.fail(); } DataNodesStatus testDNStatusAfter= getDataNodeStatus(testDataNode); Assert.assertNotNull(testDNStatusAfter); Assert.assertEquals(testDNStatusBefore.getExecuteCount() + 1, testDNStatusAfter.getExecuteCount()); } }