package com.taobao.tddl.atom.common;
import java.io.IOException;
import java.util.Properties;
import org.junit.Assert;
import org.junit.Ignore;
import org.junit.Test;
import org.springframework.jdbc.core.JdbcTemplate;
import com.taobao.diamond.mockserver.MockServer;
import com.taobao.tddl.atom.BaseAtomTest;
import com.taobao.tddl.atom.TAtomDataSource;
import com.taobao.tddl.atom.config.TAtomConfParser;
import com.taobao.tddl.atom.config.TAtomDsConfDO;
import com.taobao.tddl.atom.exception.AtomAlreadyInitException;
public class TAtomDataSourceTest extends BaseAtomTest {
static String TEST_SQL = "select 1 from dual";
@Test
public void testInitTAtomDataSource_初始化() throws Exception {
String appName = "tddl_sample";
String dbKey = "tddl_sample_0";
// Oracle测试
// TAtomDataSource tAtomDataSource = createTAtomDataSource(appName,
// dbKey, "oracle");
// JdbcTemplate jtp = new JdbcTemplate(tAtomDataSource);
// int actual = jtp.queryForInt(TAtomDataSourceUnitTest.TEST_SQL);
// Assert.assertEquals(actual, 1);
// tAtomDataSource.destroyDataSource();
// mysql测试
TAtomDataSource tAtomDataSource = createTAtomDataSource(appName, dbKey, "mysql");
JdbcTemplate jtp = new JdbcTemplate(tAtomDataSource);
int actual = jtp.queryForInt(TAtomDataSourceTest.TEST_SQL);
Assert.assertEquals(actual, 1);
tAtomDataSource.destroyDataSource();
}
// @Test
// public void testOracleChange_切换Ip() throws IOException,
// AtomAlreadyInitException, Exception {
// testChange(new ChangeTestConfig() {
// public Properties doChange(Properties prop) {
// prop.setProperty(TAtomConfParser.GLOBA_IP_KEY, "127.0.0.1");
// return prop;
// }
// }, new ChangeTestConfig() {
// public Properties doChange(Properties prop) {
// prop.setProperty(TAtomConfParser.GLOBA_IP_KEY,
// prop.getProperty(TAtomConfParser.GLOBA_IP_KEY));
// return prop;
// }
// }, "globa", "oracle", "testOracleChange_切换Ip");
// }
@Test
public void testMysqlChange_切换Ip() throws IOException, AtomAlreadyInitException, Exception {
testChange(new ChangeTestConfig() {
public Properties doChange(Properties prop) {
prop.setProperty(TAtomConfParser.GLOBA_IP_KEY, "127.0.0.1");
return prop;
}
}, new ChangeTestConfig() {
public Properties doChange(Properties prop) {
prop.setProperty(TAtomConfParser.GLOBA_IP_KEY, prop.getProperty(TAtomConfParser.GLOBA_IP_KEY));
return prop;
}
}, "globa", "mysql", "testMysqlChange_切换Ip");
}
// @Test
// public void testOracleChange_切换Port() throws IOException,
// AtomAlreadyInitException, Exception {
// testChange(new ChangeTestConfig() {
// public Properties doChange(Properties prop) {
// prop.setProperty(TAtomConfParser.GLOBA_PORT_KEY, "1234");
// return prop;
// }
// }, new ChangeTestConfig() {
// public Properties doChange(Properties prop) {
// prop.setProperty(TAtomConfParser.GLOBA_PORT_KEY,
// prop.getProperty(TAtomConfParser.GLOBA_PORT_KEY));
// return prop;
// }
// }, "globa", "oracle", "testOracleChange_切换Port");
// }
@Test
public void testMysqlChange_切换Port() throws IOException, AtomAlreadyInitException, Exception {
testChange(new ChangeTestConfig() {
public Properties doChange(Properties prop) {
prop.setProperty(TAtomConfParser.GLOBA_PORT_KEY, "1234");
return prop;
}
}, new ChangeTestConfig() {
public Properties doChange(Properties prop) {
prop.setProperty(TAtomConfParser.GLOBA_PORT_KEY, prop.getProperty(TAtomConfParser.GLOBA_PORT_KEY));
return prop;
}
}, "globa", "mysql", "testMysqlChange_切换Port");
}
// @Test
// public void testOracleChange_切换DbName() throws IOException,
// AtomAlreadyInitException, Exception {
// testChange(new ChangeTestConfig() {
// public Properties doChange(Properties prop) {
// prop.setProperty(TAtomConfParser.GLOBA_DB_NAME_KEY, "test");
// return prop;
// }
// }, new ChangeTestConfig() {
// public Properties doChange(Properties prop) {
// String dbName = prop.getProperty(TAtomConfParser.GLOBA_DB_NAME_KEY);
// prop.setProperty(TAtomConfParser.GLOBA_DB_NAME_KEY, dbName);
// return prop;
// }
// }, "globa", "oracle", "testOracleChange_切换DbName");
// }
@Test
public void testMsqlChange_切换DbName() throws IOException, AtomAlreadyInitException, Exception {
testChange(new ChangeTestConfig() {
public Properties doChange(Properties prop) {
prop.setProperty(TAtomConfParser.GLOBA_DB_NAME_KEY, "tddl_sample_x");
return prop;
}
}, new ChangeTestConfig() {
public Properties doChange(Properties prop) {
String dbName = prop.getProperty(TAtomConfParser.GLOBA_DB_NAME_KEY);
prop.setProperty(TAtomConfParser.GLOBA_DB_NAME_KEY, dbName);
return prop;
}
}, "globa", "mysql", "testMsqlChange_切换DbName");
}
// @Test
// public void testOracleChange_切换userName() throws IOException,
// AtomAlreadyInitException, Exception {
// testChange(new ChangeTestConfig() {
// public Properties doChange(Properties prop) {
// prop.setProperty(TAtomConfParser.APP_USER_NAME_KEY, "test1");
// return prop;
// }
// }, new ChangeTestConfig() {
// public Properties doChange(Properties prop) {
// String dbName = prop.getProperty(TAtomConfParser.APP_USER_NAME_KEY);
// prop.setProperty(TAtomConfParser.APP_USER_NAME_KEY, dbName);
// return prop;
// }
// }, "app", "oracle", "testOracleChange_切换userName");
// }
@Test
public void testMysqlChange_切换userName() throws IOException, AtomAlreadyInitException, Exception {
testChange(new ChangeTestConfig() {
public Properties doChange(Properties prop) {
prop.setProperty(TAtomConfParser.APP_USER_NAME_KEY, "test1");
return prop;
}
}, new ChangeTestConfig() {
public Properties doChange(Properties prop) {
String dbName = prop.getProperty(TAtomConfParser.APP_USER_NAME_KEY);
prop.setProperty(TAtomConfParser.APP_USER_NAME_KEY, dbName);
return prop;
}
}, "app", "mysql", "testMysqlChange_切换userName");
}
// @Test
// public void testChange_切换DBStatus() throws IOException,
// AtomAlreadyInitException, Exception {
// String appName = "unitTest1";
// String dbKey = "dev-db1";
// //初始化持久配置中心数据
// TAtomDataSource tAtomDataSource = createTAtomDataSource(appName, dbKey,
// "oracle");
// Assert.assertTrue(!tAtomDataSource.getDbStatus().isNaStatus());
//
// List<DruidDbStatusListener> dbStatusListeners = new
// ArrayList<DruidDbStatusListener>(1);
// final List<String> testList = Collections.synchronizedList(new
// ArrayList<String>(1));
// dbStatusListeners.add(new DruidDbStatusListener() {
// public void handleData(DruidDbStatusEnum oldStatus, DruidDbStatusEnum
// newStatus) {
// testList.add("handleData");
// }
// });
// tAtomDataSource.setDbStatusListeners(dbStatusListeners);
// Properties prop = PropLoadTestUtil.loadPropFromFile("conf/" + "oracle" +
// "/globa.properties");
// prop.put(TAtomConfParser.GLOBA_DB_STATUS_KEY,
// DruidDbStatusEnum.NA_STATUS.getStatus());
// MockServer.setConfigInfo(TAtomConstants.getGlobalDataId(dbKey),
// PropLoadTestUtil.convertProp2Str(prop));
// Thread.sleep(1200);
// Assert.assertTrue(!testList.isEmpty());
// Assert.assertTrue(tAtomDataSource.getDbStatus().isNaStatus());
// }
// @Test
// public void testOracleChange_切换Passwd() throws IOException,
// AtomAlreadyInitException, Exception {
// testChangePasswd(new ChangeTestConfig() {
// public Properties doChange(Properties prop) {
// prop.setProperty(TAtomConfParser.PASSWD_ENC_PASSWD_KEY,
// "-3e8955f636757c420baa8034f95c4c3a");
// return prop;
// }
// }, new ChangeTestConfig() {
// public Properties doChange(Properties prop) {
// String encPasswd =
// prop.getProperty(TAtomConfParser.PASSWD_ENC_PASSWD_KEY);
// prop.setProperty(TAtomConfParser.PASSWD_ENC_PASSWD_KEY, encPasswd);
// return prop;
// }
// }, "oracle");
// }
@Test
@Ignore("druid运行时改变密码,短期内不会关闭老的链接")
public void testMySqlChange_切换Passwd() throws IOException, AtomAlreadyInitException, Exception {
testChangePasswd(new ChangeTestConfig() {
public Properties doChange(Properties prop) {
prop.setProperty(TAtomConfParser.PASSWD_ENC_PASSWD_KEY, "-1d5d861112cd38cbefd3c2fcad17eaaf");
return prop;
}
}, new ChangeTestConfig() {
public Properties doChange(Properties prop) {
String encPasswd = prop.getProperty(TAtomConfParser.PASSWD_ENC_PASSWD_KEY);
prop.setProperty(TAtomConfParser.PASSWD_ENC_PASSWD_KEY, encPasswd);
return prop;
}
}, "mysql");
}
private void testChangePasswd(ChangeTestConfig change, ChangeTestConfig restore, String dbType)
throws IOException,
AtomAlreadyInitException,
Exception {
String appName = "tddl_sample";
String dbKey = "unitTestDb-" + dbType;
String configName = "";
String testSql = TAtomDataSourceTest.TEST_SQL;
configName = dbType;
TAtomDataSource tAtomDataSource = createTAtomDataSource(appName, dbKey, configName);
JdbcTemplate jtp = new JdbcTemplate(tAtomDataSource);
int actual = jtp.queryForInt(testSql);
Assert.assertEquals(actual, 1);
// 设置错误的IP进行推送
// 全局配置
String globaStr = PropLoadTestUtil.loadPropFile2String("conf/" + configName + "/globa.properties");
MockServer.setConfigInfo(TAtomConstants.getGlobalDataId(dbKey), globaStr);
// 应用配置
String appStr = PropLoadTestUtil.loadPropFile2String("conf/" + configName + "/app.properties");
MockServer.setConfigInfo(TAtomConstants.getAppDataId(appName, dbKey), appStr);
// 解析配置
TAtomDsConfDO tAtomDsConfDO = TAtomConfParser.parserTAtomDsConfDO(globaStr, appStr);
Properties passwdProp = PropLoadTestUtil.loadPropFromFile("conf/" + configName + "/passwd.properties");
String passwdDataId = TAtomConstants.getPasswdDataId(tAtomDsConfDO.getDbName(),
tAtomDsConfDO.getDbType(),
tAtomDsConfDO.getUserName());
MockServer.setConfigInfo(passwdDataId, PropLoadTestUtil.convertProp2Str(change.doChange(passwdProp)));
Thread.sleep(3000);
// 期待出现错误
boolean result = false;
try {
actual = jtp.queryForInt(testSql);
} catch (Throwable e) {
result = true;
}
Assert.assertTrue(result);
MockServer.setConfigInfo(passwdDataId,
PropLoadTestUtil.convertProp2Str(restore.doChange(PropLoadTestUtil.loadPropFromFile("conf/" + configName
+ "/passwd.properties"))));
Thread.sleep(3000);
// 期待结果正常
actual = jtp.queryForInt(testSql);
Assert.assertEquals(actual, 1);
tAtomDataSource.destroyDataSource();
}
private void testChange(ChangeTestConfig change, ChangeTestConfig restore, String type, String dbType,
String methodName) throws IOException, AtomAlreadyInitException, Exception {
String appName = "tddl_sample";
String dbKey = "unitTestDb-" + methodName;
String configName = dbType;
String testSql = TAtomDataSourceTest.TEST_SQL;
TAtomDataSource tAtomDataSource = createTAtomDataSource(appName, dbKey, configName);
JdbcTemplate jtp = new JdbcTemplate(tAtomDataSource);
int actual = jtp.queryForInt(testSql);
Assert.assertEquals(actual, 1);
// 设置错误的IP进行推送
String fileName = "";
String dataId = "";
if (type.equals("globa")) {
fileName = "/globa.properties";
dataId = TAtomConstants.getGlobalDataId(dbKey);
} else if (type.equals("app")) {
fileName = "/app.properties";
dataId = TAtomConstants.getAppDataId(appName, dbKey);
}
Properties prop = PropLoadTestUtil.loadPropFromFile("conf/" + configName + fileName);
MockServer.setConfigInfo(dataId, PropLoadTestUtil.convertProp2Str(change.doChange(prop)));
Thread.sleep(3000);
// 期待出现错误
boolean result = false;
try {
actual = jtp.queryForInt(testSql);
} catch (Throwable e) {
result = true;
}
Assert.assertTrue(result);
MockServer.setConfigInfo(dataId,
PropLoadTestUtil.convertProp2Str(restore.doChange(PropLoadTestUtil.loadPropFromFile("conf/" + configName
+ fileName))));
Thread.sleep(3000);
// 期待结果正常
actual = jtp.queryForInt(testSql);
Assert.assertEquals(actual, 1);
tAtomDataSource.destroyDataSource();
}
private TAtomDataSource createTAtomDataSource(String appName, String dbKey, String configName)
throws IOException,
AtomAlreadyInitException,
Exception {
// 全局配置
String globaStr = PropLoadTestUtil.loadPropFile2String("conf/" + configName + "/globa.properties");
MockServer.setConfigInfo(TAtomConstants.getGlobalDataId(dbKey), globaStr);
// 应用配置
String appStr = PropLoadTestUtil.loadPropFile2String("conf/" + configName + "/app.properties");
MockServer.setConfigInfo(TAtomConstants.getAppDataId(appName, dbKey), appStr);
// 解析配置
TAtomDsConfDO tAtomDsConfDO = TAtomConfParser.parserTAtomDsConfDO(globaStr, appStr);
// 密码配置
String passwdStr = PropLoadTestUtil.loadPropFile2String("conf/" + configName + "/passwd.properties");
MockServer.setConfigInfo(TAtomConstants.getPasswdDataId(tAtomDsConfDO.getDbName(),
tAtomDsConfDO.getDbType(),
tAtomDsConfDO.getUserName()), passwdStr);
// 进行初始化
TAtomDataSource tAtomDataSource = new TAtomDataSource();
tAtomDataSource.setAppName(appName);
tAtomDataSource.setDbKey(dbKey);
tAtomDataSource.init();
return tAtomDataSource;
}
private interface ChangeTestConfig {
Properties doChange(Properties prop);
}
}