Package com.alibaba.cobar.client.router.config

Source Code of com.alibaba.cobar.client.router.config.CobarInternalRouterXmlFactoryBeanTest

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());
    }
}
TOP

Related Classes of com.alibaba.cobar.client.router.config.CobarInternalRouterXmlFactoryBeanTest

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.