package com.alibaba.cobar.client.router.config;
import static org.testng.AssertJUnit.assertEquals;
import static org.testng.AssertJUnit.assertTrue;
import static org.testng.AssertJUnit.fail;
import java.io.FileNotFoundException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import com.alibaba.cobar.client.router.CobarClientInternalRouter;
import com.alibaba.cobar.client.router.rules.IRoutingRule;
import com.alibaba.cobar.client.router.rules.ibatis.AbstractIBatisOrientedRule;
import com.alibaba.cobar.client.router.rules.ibatis.IBatisNamespaceShardingRule;
import com.alibaba.cobar.client.router.rules.ibatis.IBatisSqlActionShardingRule;
import com.alibaba.cobar.client.router.support.IBatisRoutingFact;
import com.alibaba.cobar.client.support.utils.CollectionUtils;
import com.alibaba.cobar.client.support.utils.MapUtils;
@Test
public class CobarInternalRouterXmlFactoryBeanTest {
CobarInteralRouterXmlFactoryBean factory;
@BeforeMethod
protected void setUp() throws Exception {
factory = new CobarInteralRouterXmlFactoryBean();
}
@AfterMethod
protected void tearDown() throws Exception {
factory = null;
}
public void testAssemblingRulesNormally() throws Exception {
factory.setConfigLocation(new ClassPathResource(
"com/alibaba/cobar/client/router/config/normal_rule_fixture.xml"));
factory.afterPropertiesSet();
CobarClientInternalRouter router = (CobarClientInternalRouter) factory.getObject();
List<Set<IRoutingRule<IBatisRoutingFact, List<String>>>> rules = router.getRuleSequences();
assertTrue(CollectionUtils.isNotEmpty(rules));
assertEquals(4, rules.size());
}
public void testAssemblingRulesWithoutConfiguringShards() {
factory.setConfigLocation(new ClassPathResource(
"com/alibaba/cobar/client/router/config/abnormal_rule_fixture1.xml"));
try {
factory.afterPropertiesSet();
fail();
} catch (Exception e) {
assertTrue(e instanceof IllegalArgumentException);
assertEquals("destination shards must be given explicitly.", e.getMessage());
}
}
public void testAssemblingRulesWithoutConfiguringNamspaceOrSqlmap() {
factory.setConfigLocation(new ClassPathResource(
"com/alibaba/cobar/client/router/config/abnormal_rule_fixture2.xml"));
try {
factory.afterPropertiesSet();
fail();
} catch (Exception e) {
assertTrue(e instanceof IllegalArgumentException);
assertEquals("at least one of 'namespace' or 'sqlAction' must be given.", e
.getMessage());
}
}
public void testAssemblingRulesWithConfiguringBothNamspaceAndSqlmap() {
factory.setConfigLocation(new ClassPathResource(
"com/alibaba/cobar/client/router/config/abnormal_rule_fixture3.xml"));
try {
factory.afterPropertiesSet();
fail();
} catch (Exception e) {
assertTrue(e instanceof IllegalArgumentException);
assertEquals(
"'namespace' and 'sqlAction' are alternatives, can't guess which one to use if both of them are provided.",
e.getMessage());
}
}
public void testAssemblingRulesWithInvalidFormatConfiguration() {
factory.setConfigLocation(new ClassPathResource(
"com/alibaba/cobar/client/router/config/abnormal_rule_fixture4.xml"));
try {
factory.afterPropertiesSet();
fail();
} catch (Exception e) {
// pass
}
}
public void testAssemblingRulesWithNonExistenceConfiguration() {
factory.setConfigLocation(new ClassPathResource(
"com/alibaba/cobar/client/router/config/abnormal_fixture.xml"));
try {
factory.afterPropertiesSet();
fail();
} catch (Exception e) {
assertTrue(e instanceof FileNotFoundException);
}
}
/**
* load two set of rules with same rule entries, same rule entry should be
* merge to one.
*
* @throws Exception
*/
public void testAssemblingRulesWithMultipleSameConfigurations() throws Exception {
Map<String, Object> functions = new HashMap<String, Object>();
functions.put("mock_function", new Object());
factory.setFunctionsMap(functions);
factory.setConfigLocations(new Resource[] {
new ClassPathResource(
"com/alibaba/cobar/client/router/config/normal_rule_fixture.xml"),
new ClassPathResource(
"com/alibaba/cobar/client/router/config/normal_rule_fixture2.xml") });
factory.afterPropertiesSet();
CobarClientInternalRouter router = (CobarClientInternalRouter) factory.getObject();
List<Set<IRoutingRule<IBatisRoutingFact, List<String>>>> rules = router.getRuleSequences();
assertTrue(CollectionUtils.isNotEmpty(rules));
assertEquals(4, rules.size());
for (Set<IRoutingRule<IBatisRoutingFact, List<String>>> set : rules) {
assertEquals(1, set.size());
IRoutingRule<IBatisRoutingFact, List<String>> r = set.iterator().next();
if(r instanceof IBatisNamespaceShardingRule || r instanceof IBatisSqlActionShardingRule)
{
Map<String, Object> funcMap = ((AbstractIBatisOrientedRule)r).getFunctionMap();
assertTrue(MapUtils.isNotEmpty(funcMap));
assertEquals("mock_function", funcMap.keySet().iterator().next());
}
}
}
public void testAssemblingRulesWithMultiplePartialSameConfiguration() throws Exception {
factory.setConfigLocations(new Resource[] {
new ClassPathResource(
"com/alibaba/cobar/client/router/config/normal_rule_fixture.xml"),
new ClassPathResource(
"com/alibaba/cobar/client/router/config/normal_rule_fixture3.xml") });
factory.afterPropertiesSet();
CobarClientInternalRouter router = (CobarClientInternalRouter) factory.getObject();
List<Set<IRoutingRule<IBatisRoutingFact, List<String>>>> rules = router.getRuleSequences();
assertTrue(CollectionUtils.isNotEmpty(rules));
assertEquals(4, rules.size());
assertEquals(1, rules.get(0).size());
assertEquals(1, rules.get(1).size());
assertEquals(2, rules.get(2).size());
assertEquals(1, rules.get(3).size());
}
}