/**
* Project: dubbo.registry.server
*
* File Created at Oct 18, 2010
* $Id: RouteRuleTest.java 181192 2012-06-21 05:05:47Z tony.chenl $
*
* Copyright 1999-2100 Alibaba.com Corporation Limited.
* All rights reserved.
*
* This software is the confidential and proprietary information of
* Alibaba Company. ("Confidential Information"). You shall not
* disclose such Confidential Information and shall use it only in
* accordance with the terms of the license agreement you entered into
* with Alibaba.com.
*/
package com.alibaba.dubbo.registry.common.route;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.text.ParseException;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Set;
import junit.framework.Assert;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.matchers.JUnitMatchers;
import com.alibaba.dubbo.registry.common.domain.Route;
import com.alibaba.dubbo.registry.common.route.RouteRule.MatchPair;
/**
* @author william.liangf
* @author ding.lid
*/
public class RouteRuleTest {
@BeforeClass
public static void setUpBeforeClass() throws Exception {
}
@AfterClass
public static void tearDownAfterClass() throws Exception {
}
@Before
public void setUp() throws Exception {
}
@After
public void tearDown() throws Exception {
}
final RouteRule.MatchPair pair;
{
Set<String> matches = new HashSet<String>();
matches.add("+a");
matches.add("+b");
matches.add("+c");
Set<String> unmatches = new HashSet<String>();
matches.add("-a");
matches.add("-b");
pair = new RouteRule.MatchPair(matches, unmatches);
}
@org.junit.Test
public void test_MatchPair_copy() throws Exception {
MatchPair copy = pair.copy();
assertEquals(pair, copy);
copy.matches.remove("+a");
assertFalse(pair.equals(copy));
copy = pair.copy();
copy.matches.add("+z");
assertFalse(pair.equals(copy));
}
@org.junit.Test
public void test_MatchPair_freeze() throws Exception {
pair.freeze();
try {
pair.matches.add("+z");
fail();
}catch (UnsupportedOperationException expected) {
}
try {
pair.unmatches.add("+z");
fail();
}catch (UnsupportedOperationException expected) {
}
}
@org.junit.Test
public void test_MatchPair_containeValue() throws Exception {
assertTrue(pair.containeValue("+a"));
assertTrue(pair.containeValue("+b"));
assertFalse(pair.containeValue("c"));
assertTrue(pair.containeValue("-a"));
}
@org.junit.Test
public void testParse_blank() throws Exception {
try {
RouteRule.parse((Route)null);
fail();
}
catch (ParseException expected) {
assertThat(expected.getMessage(), JUnitMatchers.containsString("null route"));
}
try {
RouteRule.parse("", "");
fail();
}
catch (ParseException expected) {
assertThat(expected.getMessage(), JUnitMatchers.containsString("Illegal route rule without then express"));
}
try {
RouteRule.parse(" ", " ");
fail();
}
catch (ParseException expected) {
assertThat(expected.getMessage(), JUnitMatchers.containsString("Illegal route rule without then express"));
}
}
/*@org.junit.Test
public void testParse_EmptyWhen() {
try{
RouteRule.parse("", "provider.application=morgan&provider.host=10.16.26.51&provider.port=1020");
fail();
}catch(ParseException expected){
assertThat(expected.getMessage(), JUnitMatchers.containsString("Illegal route rule without when express"));
}
}*/
@org.junit.Test
public void testParse_EmptyThen() {
String expr = "service=com.alibaba.MemberService,AuthService&consumer.host=127.0.0.1&consumer.version != 1.0.0";
try{
RouteRule.parse(expr, "");
Assert.fail();
}catch(ParseException expected){
assertThat(expected.getMessage(), JUnitMatchers.containsString("Illegal route rule without then express"));
}
}
@org.junit.Test
public void testParse_NoKeyName() {
try{
RouteRule.parse("service=com.alibaba.MemberService,AuthService&consumer.host=127.0.0.1&!=valueOnnnnnly",
"provider.application=morgan&provider.host=10.16.26.51&provider.port=1020");
Assert.fail();
}catch(ParseException expected){
assertThat(expected.getMessage(), JUnitMatchers.containsString("Illegal route rule"));
assertThat(expected.getMessage(), JUnitMatchers.containsString("before \"valueOnnnnnly\"."));
}
try{
RouteRule.parse("service=com.alibaba.MemberService,AuthService&consumer.host=127.0.0.1&=valueOnnnnnly",
"provider.application=morgan&provider.host=10.16.26.51&provider.port=1020");
Assert.fail();
}catch(ParseException expected){
assertThat(expected.getMessage(), JUnitMatchers.containsString("Illegal route rule"));
assertThat(expected.getMessage(), JUnitMatchers.containsString("before \"valueOnnnnnly\"."));
}
}
@org.junit.Test
public void testParse_MatchRight() throws Exception {
final Map<String, RouteRule.MatchPair> whenParams = new HashMap<String, RouteRule.MatchPair>();
final Map<String, RouteRule.MatchPair> thenParams = new HashMap<String, RouteRule.MatchPair>();
RouteRule.MatchPair p = new RouteRule.MatchPair();
p.matches.add("com.alibaba.MemberService");
p.matches.add("AuthService");
whenParams.put("service", p);
p = new RouteRule.MatchPair();
p.matches.add("127.0.0.1");
p.matches.add("17.58.25.62");
whenParams.put("consumer.host", p);
p = new RouteRule.MatchPair();
p.matches.add("1.0.0");
p.matches.add("1.0.6");
whenParams.put("consumer.version", p);
p = new RouteRule.MatchPair();
p.matches.add("morgan");
p.matches.add("pc2");
thenParams.put("provider.application", p);
p = new RouteRule.MatchPair();
p.matches.add("10.16.26.51");
thenParams.put("provider.host", p);
p = new RouteRule.MatchPair();
p.matches.add("1020");
thenParams.put("provider.port", p);
assertEquals(RouteRule.createFromCondition(whenParams, thenParams),
RouteRule.parse("service=com.alibaba.MemberService,AuthService&consumer.host=127.0.0.1,17.58.25.62&consumer.version = 1.0.0,1.0.6",
"provider.application=morgan,pc2&provider.host=10.16.26.51&provider.port=1020"));
}
@org.junit.Test
public void testParse_MisMatchRight() throws Exception {
final Map<String, RouteRule.MatchPair> whenParams = new HashMap<String, RouteRule.MatchPair>();
final Map<String, RouteRule.MatchPair> thenParams = new HashMap<String, RouteRule.MatchPair>();
RouteRule.MatchPair p = new RouteRule.MatchPair();
p.unmatches.add("com.alibaba.MemberService");
p.unmatches.add("AuthService");
whenParams.put("service", p);
p = new RouteRule.MatchPair();
p.unmatches.add("127.0.0.1");
whenParams.put("consumer.host", p);
p = new RouteRule.MatchPair();
p.unmatches.add("1.0.0");
p.unmatches.add("1.0.6");
whenParams.put("consumer.version", p);
p = new RouteRule.MatchPair();
p.unmatches.add("morgan");
p.unmatches.add("pc2");
thenParams.put("provider.application", p);
p = new RouteRule.MatchPair();
p.unmatches.add("10.16.26.51");
thenParams.put("provider.host", p);
p = new RouteRule.MatchPair();
p.unmatches.add("1020");
thenParams.put("provider.port", p);
assertEquals(RouteRule.createFromCondition(whenParams, thenParams),
RouteRule.parse("service!=com.alibaba.MemberService,AuthService&consumer.host!=127.0.0.1&consumer.version != 1.0.0,1.0.6",
"provider.application!=morgan,pc2&provider.host!=10.16.26.51&provider.port!=1020"));
}
@org.junit.Test
public void testParse_Simple() throws Exception {
final Map<String, RouteRule.MatchPair> whenParams = new HashMap<String, RouteRule.MatchPair>();
final Map<String, RouteRule.MatchPair> thenParams = new HashMap<String, RouteRule.MatchPair>();
RouteRule.MatchPair p = new RouteRule.MatchPair();
p.matches.add("com.alibaba.morgan.*");
p.unmatches.add("com.alibaba.morgan.MemberService");
whenParams.put("service", p);
p = new RouteRule.MatchPair();
p.matches.add("10.16.26.51");
thenParams.put("provider.host", p);
assertEquals(RouteRule.createFromCondition(whenParams, thenParams),
RouteRule.parse("service=com.alibaba.morgan.*&service!=com.alibaba.morgan.MemberService", "provider.host=10.16.26.51"));
}
@org.junit.Test
public void testParse_AllRight() throws Exception {
final Map<String, RouteRule.MatchPair> whenParams = new HashMap<String, RouteRule.MatchPair>();
final Map<String, RouteRule.MatchPair> thenParams = new HashMap<String, RouteRule.MatchPair>();
RouteRule.MatchPair p = new RouteRule.MatchPair();
p.matches.add("com.alibaba.MemberService");
p.matches.add("AuthService");
p.unmatches.add("com.alibaba.DomainService");
p.unmatches.add("com.alibaba.ViewCacheService");
whenParams.put("service", p);
p = new RouteRule.MatchPair();
p.unmatches.add("127.0.0.1");
p.unmatches.add("15.11.57.6");
whenParams.put("consumer.host", p);
p = new RouteRule.MatchPair();
p.matches.add("2.0.0");
p.unmatches.add("1.0.0");
whenParams.put("consumer.version", p);
p = new RouteRule.MatchPair();
p.matches.add("morgan");
p.matches.add("pc2");
thenParams.put("provider.application", p);
p = new RouteRule.MatchPair();
p.matches.add("10.16.26.51");
thenParams.put("provider.host", p);
p = new RouteRule.MatchPair();
p.matches.add("1020");
thenParams.put("provider.port", p);
assertEquals(RouteRule.createFromCondition(whenParams, thenParams),
RouteRule.parse("service=com.alibaba.MemberService,AuthService&service!=com.alibaba.DomainService,com.alibaba.ViewCacheService" +
"&consumer.host!=127.0.0.1,15.11.57.6&consumer.version = 2.0.0&consumer.version != 1.0.0",
"provider.application=morgan,pc2&provider.host=10.16.26.51&provider.port=1020"));
}
@org.junit.Test
public void testParseRule_empty() throws Exception {
Map<String, RouteRule.MatchPair> condtion = RouteRule.parseRule(null);
assertEquals(0, condtion.size());
condtion = RouteRule.parseRule("");
assertEquals(0, condtion.size());
condtion = RouteRule.parseRule(" ");
assertEquals(0, condtion.size());
}
@org.junit.Test
public void testParseRule_complex() throws Exception {
Map<String, RouteRule.MatchPair> when = RouteRule.parseRule("when1=valueW1 ,valueW1 & when2 = valueW2,valueW3, valueW4 & when2 != valueWu,valueWv & when3!=valueWx,valueWy");
Map<String, RouteRule.MatchPair> then = RouteRule.parseRule("then1 = valueT1 & then2 = valueT2,valueT3, valueT4");
Map<String, RouteRule.MatchPair> expectedWhen = new HashMap<String, RouteRule.MatchPair>();
RouteRule.MatchPair p = new RouteRule.MatchPair();
p.matches.add("valueW1");
expectedWhen.put("when1", p);
p = new RouteRule.MatchPair();
p.matches.add("valueW2");
p.matches.add("valueW3");
p.matches.add("valueW4");
p.unmatches.add("valueWu");
p.unmatches.add("valueWv");
expectedWhen.put("when2", p);
p = new RouteRule.MatchPair();
p.unmatches.add("valueWx");
p.unmatches.add("valueWy");
expectedWhen.put("when3", p);
assertEquals(expectedWhen, when);
Map<String, RouteRule.MatchPair> expectedThen = new HashMap<String, RouteRule.MatchPair>();
p = new RouteRule.MatchPair();
p.matches.add("valueT1");
expectedThen.put("then1", p);
p = new RouteRule.MatchPair();
p.matches.add("valueT2");
p.matches.add("valueT3");
p.matches.add("valueT4");
expectedThen.put("then2", p);
assertEquals(expectedThen, then);
}
@org.junit.Test
public void testParseNameAndValueListString2Condition() throws Exception {
Map<String, String> params = new HashMap<String, String>();
params.put("key0", "");
params.put("key1", "value11");
params.put("key2", "value21,value22");
params.put("key3", " value31 , value32, value33, value31 ");
params.put("key100", null);
Map<String, String> notParams = new HashMap<String, String>();
notParams.put("key0", "");
notParams.put("key1", "v11,v12");
notParams.put("key2", " v21, v22, ,,,, v23 ");
notParams.put("key4", "v41, v42");
notParams.put("key100", null);
Map<String, RouteRule.MatchPair> out = RouteRule.parseNameAndValueListString2Condition(params, notParams);
Map<String, RouteRule.MatchPair> expected = new HashMap<String, RouteRule.MatchPair>();
RouteRule.MatchPair p = new RouteRule.MatchPair();
p.matches.add("value11");
p.unmatches.add("v11");
p.unmatches.add("v12");
expected.put("key1", p);
p = new RouteRule.MatchPair();
p.matches.add("value21");
p.matches.add("value22");
p.unmatches.add("v21");
p.unmatches.add("v22");
p.unmatches.add("v23");
expected.put("key2", p);
p = new RouteRule.MatchPair();
p.matches.add("value31");
p.matches.add("value32");
p.matches.add("value33");
expected.put("key3", p);
p = new RouteRule.MatchPair();
p.unmatches.add("v41");
p.unmatches.add("v42");
expected.put("key4", p);
assertEquals(expected, out);
}
@org.junit.Test
public void test_Parse_StringString() throws Exception {
RouteRule rule = RouteRule.parse("when1=valueW1 ,valueW1 & when2 = valueW2,valueW3, valueW4 & when2 != valueWu,valueWv & when3!=valueWx,valueWy"
, "then1 = valueT1 & then2 = valueT2,valueT3, valueT4");
Map<String, RouteRule.MatchPair> expectedWhen = new HashMap<String, RouteRule.MatchPair>();
RouteRule.MatchPair p = new RouteRule.MatchPair();
p.matches.add("valueW1");
expectedWhen.put("when1", p);
p = new RouteRule.MatchPair();
p.matches.add("valueW2");
p.matches.add("valueW3");
p.matches.add("valueW4");
p.unmatches.add("valueWu");
p.unmatches.add("valueWv");
expectedWhen.put("when2", p);
p = new RouteRule.MatchPair();
p.unmatches.add("valueWx");
p.unmatches.add("valueWy");
expectedWhen.put("when3", p);
assertEquals(expectedWhen, rule.getWhenCondition());
Map<String, RouteRule.MatchPair> expectedThen = new HashMap<String, RouteRule.MatchPair>();
p = new RouteRule.MatchPair();
p.matches.add("valueT1");
expectedThen.put("then1", p);
p = new RouteRule.MatchPair();
p.matches.add("valueT2");
p.matches.add("valueT3");
p.matches.add("valueT4");
expectedThen.put("then2", p);
assertEquals(expectedThen, rule.getThenCondition());
RouteRule ruleExpected = RouteRule.createFromCondition(expectedWhen, expectedThen);
assertEquals(ruleExpected, rule);
RouteRule ruleFromToString = RouteRule.parse(rule.getWhenConditionString(), rule.getThenConditionString());
System.out.println(ruleFromToString);
assertEquals(ruleExpected, ruleFromToString);
}
@org.junit.Test
public void test_Parse_String() throws Exception {
{
RouteRule rule1 = RouteRule.parse(""
, "then1 = valueT1 & then2 = valueT2,valueT3, valueT4");
RouteRule rule2 = RouteRule.parse(" => then1 = valueT1 & then2 = valueT2,valueT3, valueT4");
assertEquals(rule1, rule2);
}
{
RouteRule rule1 = RouteRule.parse("when1=valueW1 ,valueW1 & when2 = valueW2,valueW3, valueW4 & when2 != valueWu,valueWv & when3!=valueWx,valueWy"
, "then1 = valueT1 & then2 = valueT2,valueT3, valueT4");
RouteRule rule2 = RouteRule.parse("when1=valueW1 ,valueW1 & when2 = valueW2,valueW3, valueW4 & when2 != valueWu,valueWv & when3!=valueWx,valueWy"
+ " => then1 = valueT1 & then2 = valueT2,valueT3, valueT4");
assertEquals(rule1, rule2);
assertEquals(rule1,RouteRule.parse(rule2.toString()));
}
}
@org.junit.Test
public void test_isWhenContainValue() throws Exception {
RouteRule r = RouteRule.parse("when1 = valueW1 & when3 != valueWx,valueWy & when2 = valueW4,valueW2,valueW3 & when2 != valueWu,valueWv" ,
"then2 = valueT2,valueT4,valueT3 & then1 = valueT1");
assertTrue(r.isWhenContainValue("when1", "valueW1"));
assertTrue(r.isWhenContainValue("when2", "valueW2"));
assertTrue(r.isWhenContainValue("when2", "valueW3"));
assertTrue(r.isWhenContainValue("when2", "valueW4"));
assertTrue(r.isContainValue("when1", "valueW1"));
assertTrue(r.isContainValue("when2", "valueW2"));
assertTrue(r.isContainValue("when2", "valueW3"));
assertTrue(r.isContainValue("when2", "valueW4"));
assertFalse(r.isWhenContainValue("when1", "BlaBla"));
assertFalse(r.isWhenContainValue("Bbbbb", "BlaBla"));
assertFalse(r.isContainValue("when1", "BlaBla"));
assertFalse(r.isContainValue("Bbbbb", "BlaBla"));
}
@org.junit.Test
public void test_isThenContainValue() throws Exception {
RouteRule r = RouteRule.parse("when1 = valueW1 & when3 != valueWx,valueWy & when2 = valueW4,valueW2,valueW3 & when2 != valueWu,valueWv", "then2 = valueT2,valueT4,valueT3 & then1 = valueT1");
assertTrue(r.isThenContainValue("then1", "valueT1"));
assertTrue(r.isThenContainValue("then2", "valueT2"));
assertTrue(r.isThenContainValue("then2", "valueT3"));
assertTrue(r.isThenContainValue("then2", "valueT4"));
assertTrue(r.isContainValue("then1", "valueT1"));
assertTrue(r.isContainValue("then2", "valueT2"));
assertTrue(r.isContainValue("then2", "valueT3"));
assertTrue(r.isContainValue("then2", "valueT4"));
assertFalse(r.isThenContainValue("then2", "BlaBla"));
assertFalse(r.isThenContainValue("Bbbbb", "BlaBla"));
assertFalse(r.isContainValue("then2", "BlaBla"));
assertFalse(r.isContainValue("Bbbbb", "BlaBla"));
}
@org.junit.Test
public void test_copyWithRemove() throws Exception {
RouteRule r = RouteRule.parse("when1 = valueW1 & when3 != valueWx,valueWy & when2 = valueW4,valueW2,valueW3 & when2 != valueWu,valueWv",
"then2 = valueT2,valueT4,valueT3 & then1 = valueT1");
{
RouteRule c = RouteRule.copyWithRemove(r, new HashSet<String>(Arrays.asList("when0", "when1")), null);
assertEquals(RouteRule.parse("when3 != valueWx,valueWy & when2 = valueW4,valueW2,valueW3 & when2 != valueWu,valueWv",
"then2 = valueT2,valueT4,valueT3 & then1 = valueT1"), c);
}
{
RouteRule c = RouteRule.copyWithRemove(r, null, new HashSet<String>(Arrays.asList("then1", "then0")));
assertEquals(RouteRule.parse("when1 = valueW1 & when3 != valueWx,valueWy & when2 = valueW4,valueW2,valueW3 & when2 != valueWu,valueWv",
"then2 = valueT2,valueT4,valueT3"), c);
}
{
RouteRule c = RouteRule.copyWithRemove(r, new HashSet<String>(Arrays.asList("when0", "when1")),
new HashSet<String>(Arrays.asList("then1", "then0")));
assertEquals(RouteRule.parse("when3 != valueWx,valueWy & when2 = valueW4,valueW2,valueW3 & when2 != valueWu,valueWv",
"then2 = valueT2,valueT4,valueT3"), c);
}
}
@org.junit.Test
public void test_copyWithReplace() throws Exception {
RouteRule r = RouteRule.parse("when1 = valueW1 & when3 != valueWx,valueWy & when2 = valueW4,valueW2,valueW3 & when2 != valueWu,valueWv",
"then2 = valueT2,valueT4,valueT3 & then1 = valueT1");
{
Map<String, RouteRule.MatchPair> whenCondition = new HashMap<String, RouteRule.MatchPair>();
RouteRule.MatchPair p = new MatchPair();
p.matches.add("w1a");
p.matches.add("w1b");
p.matches.add("w1c");
p.unmatches.add("w1-a");
whenCondition.put("when1", p);
p = new MatchPair();
p.matches.add("w9a");
p.matches.add("w9b");
whenCondition.put("when9", p);
RouteRule c = RouteRule.copyWithReplace(r, whenCondition, null);
assertEquals(RouteRule.parse("when1 = w1a,w1b,w1c & when1 != w1-a & when9 = w9a,w9b " +
" & when3 != valueWx,valueWy & when2 = valueW4,valueW2,valueW3 & when2 != valueWu,valueWv",
"then2 = valueT2,valueT4,valueT3 & then1 = valueT1"), c);
}
{
Map<String, RouteRule.MatchPair> thenCondition = new HashMap<String, RouteRule.MatchPair>();
RouteRule.MatchPair p = new MatchPair();
p.matches.add("t1a");
p.matches.add("t1b");
p.matches.add("t1c");
p.unmatches.add("t1-a");
thenCondition.put("then1", p);
RouteRule c = RouteRule.copyWithReplace(r, null, thenCondition);
assertEquals(RouteRule.parse("when1 = valueW1 & when3 != valueWx,valueWy & when2 = valueW4,valueW2,valueW3 & when2 != valueWu,valueWv"
, "then2 = valueT2,valueT4,valueT3 & then1 = t1a,t1b,t1c & then1 != t1-a"), c);
}
}
@org.junit.Test
public void test_join() throws Exception {
Set<String> set = new LinkedHashSet<String>();
assertEquals("", RouteRule.join(set));
set.add("1");
set.add("2");
set.add("3");
assertEquals("1,2,3", RouteRule.join(set));
}
}