package com.taobao.tddl.group.jdbc;
import javax.sql.DataSource;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;
import org.springframework.jdbc.core.ColumnMapRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import com.taobao.tddl.common.GroupDataSourceRouteHelper;
import com.taobao.tddl.common.mock.MockDataSource;
import com.taobao.tddl.common.model.DBType;
import com.taobao.tddl.group.jdbc.DataSourceFetcher;
import com.taobao.tddl.group.jdbc.TGroupDataSource;
/**
* @author linxuan
*/
public class ThreadLocalDataSourceIndexTest {
@BeforeClass
public static void beforeClass() {
}
private static MockDataSource createMockDataSource(String name) {
MockDataSource mds = new MockDataSource();
mds.setName(name);
mds.setDbIndex("");
return mds;
}
private static TGroupDataSource createGroupDataSource(String weightStr) {
TGroupDataSource tgds = new TGroupDataSource();
tgds.setDsKeyAndWeightCommaArray(weightStr);
tgds.setDbType(DBType.MYSQL);
tgds.setDataSourceFetcher(new DataSourceFetcher() {
@Override
public DataSource getDataSource(String key) {
return createMockDataSource(key);
}
@Override
public DBType getDataSourceDBType(String key) {
return null;
}
});
tgds.init();
return tgds;
}
@Test
public void test_不设i() {
JdbcTemplate jt = new JdbcTemplate(createGroupDataSource("ds0:rw, ds1:r, ds2:r, ds3:r"));
MockDataSource.clearTrace();
GroupDataSourceRouteHelper.executeByGroupDataSourceIndex(1);
jt.query("select 1 from dual", new Object[] {}, new ColumnMapRowMapper());
MockDataSource.showTrace();
Assert.assertTrue(MockDataSource.hasTrace("", "ds1", "select 1 from dual"));
MockDataSource.clearTrace();
GroupDataSourceRouteHelper.executeByGroupDataSourceIndex(2);
jt.query("select 1 from dual", new Object[] {}, new ColumnMapRowMapper());
MockDataSource.showTrace();
Assert.assertTrue(MockDataSource.hasTrace("", "ds2", "select 1 from dual"));
}
@Test
public void test_设单个i不加数字等同于没设() {
JdbcTemplate jt = new JdbcTemplate(createGroupDataSource("ds0:rwi, ds1:ri, ds2:ri, ds3:ri"));
MockDataSource.clearTrace();
GroupDataSourceRouteHelper.executeByGroupDataSourceIndex(1);
jt.query("select 1 from dual", new Object[] {}, new ColumnMapRowMapper());
MockDataSource.showTrace();
Assert.assertTrue(MockDataSource.hasTrace("", "ds1", "select 1 from dual"));
}
@Test
public void test_设单个in() {
JdbcTemplate jt = new JdbcTemplate(createGroupDataSource("ds0:rwi5, ds1:ri6, ds2:ri7, ds3:ri8"));
MockDataSource.clearTrace();
GroupDataSourceRouteHelper.executeByGroupDataSourceIndex(6);
jt.query("select 1 from dual", new Object[] {}, new ColumnMapRowMapper());
MockDataSource.showTrace();
Assert.assertTrue(MockDataSource.hasTrace("", "ds1", "select 1 from dual"));
MockDataSource.clearTrace();
GroupDataSourceRouteHelper.executeByGroupDataSourceIndex(8);
jt.query("select 1 from dual", new Object[] {}, new ColumnMapRowMapper());
MockDataSource.showTrace();
Assert.assertTrue(MockDataSource.hasTrace("", "ds3", "select 1 from dual"));
}
@Test
public void test_设多个i分流() {
JdbcTemplate jt = new JdbcTemplate(createGroupDataSource("ds0:rwi0, ds1:ri0, ds2:ri1, ds3:ri1"));
MockDataSource.clearTrace();
GroupDataSourceRouteHelper.executeByGroupDataSourceIndex(0);
jt.query("select 1 from dual", new Object[] {}, new ColumnMapRowMapper());
MockDataSource.showTrace();
Assert.assertTrue(MockDataSource.hasTrace("", "ds0", "select") || MockDataSource.hasTrace("", "ds1", "select"));
MockDataSource.clearTrace();
GroupDataSourceRouteHelper.executeByGroupDataSourceIndex(1);
jt.query("select 1 from dual", new Object[] {}, new ColumnMapRowMapper());
MockDataSource.showTrace();
Assert.assertTrue(MockDataSource.hasTrace("", "ds2", "select") || MockDataSource.hasTrace("", "ds3", "select"));
}
@Test
public void test_1个ds设多个i() {
JdbcTemplate jt = new JdbcTemplate(createGroupDataSource("ds0:rwi0, ds1:ri0i1, ds2:ri1, ds3:r, ds4:ri3"));
MockDataSource.clearTrace();
GroupDataSourceRouteHelper.executeByGroupDataSourceIndex(0);
jt.query("select 1 from dual", new Object[] {}, new ColumnMapRowMapper());
MockDataSource.showTrace();
Assert.assertTrue(MockDataSource.hasTrace("", "ds0", "select") || MockDataSource.hasTrace("", "ds1", "select"));
MockDataSource.clearTrace();
GroupDataSourceRouteHelper.executeByGroupDataSourceIndex(1);
jt.query("select 1 from dual", new Object[] {}, new ColumnMapRowMapper());
MockDataSource.showTrace();
Assert.assertTrue(MockDataSource.hasTrace("", "ds1", "select") || MockDataSource.hasTrace("", "ds2", "select"));
MockDataSource.clearTrace();
GroupDataSourceRouteHelper.executeByGroupDataSourceIndex(3);
jt.query("select 1 from dual", new Object[] {}, new ColumnMapRowMapper());
MockDataSource.showTrace();
Assert.assertTrue(MockDataSource.hasTrace("", "ds3", "select") || MockDataSource.hasTrace("", "ds4", "select"));
}
}