|  |  | @@ -3,7 +3,6 @@ package chanjarster.weixin.api; | 
		
	
		
			
			|  |  |  | import java.util.Map; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | import org.testng.Assert; | 
		
	
		
			
			|  |  |  | import org.testng.annotations.BeforeMethod; | 
		
	
		
			
			|  |  |  | import org.testng.annotations.DataProvider; | 
		
	
		
			
			|  |  |  | import org.testng.annotations.Test; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
	
		
			
				|  |  | @@ -17,40 +16,78 @@ import chanjarster.weixin.bean.WxXmlMessage; | 
		
	
		
			
			|  |  |  | @Test | 
		
	
		
			
			|  |  |  | public class WxMessageRouterTest { | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | protected StringBuilder sb; | 
		
	
		
			
			|  |  |  | protected WxMessageRouter router; | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | @BeforeMethod | 
		
	
		
			
			|  |  |  | public void prepare() { | 
		
	
		
			
			|  |  |  | this.sb = new StringBuilder(); | 
		
	
		
			
			|  |  |  | this.router = new WxMessageRouter(); | 
		
	
		
			
			|  |  |  | @Test(enabled = false) | 
		
	
		
			
			|  |  |  | public void prepare(boolean async, StringBuffer sb, WxMessageRouter router) { | 
		
	
		
			
			|  |  |  | router | 
		
	
		
			
			|  |  |  | .rule() | 
		
	
		
			
			|  |  |  | .async(async) | 
		
	
		
			
			|  |  |  | .msgType(WxConsts.XML_MSG_TEXT).event(WxConsts.EVT_CLICK).eventKey("KEY_1").content("CONTENT_1") | 
		
	
		
			
			|  |  |  | .handler(new WxEchoMessageHandler(sb, "COMBINE_4")) | 
		
	
		
			
			|  |  |  | .end() | 
		
	
		
			
			|  |  |  | .rule() | 
		
	
		
			
			|  |  |  | .async(async) | 
		
	
		
			
			|  |  |  | .msgType(WxConsts.XML_MSG_TEXT).event(WxConsts.EVT_CLICK).eventKey("KEY_1") | 
		
	
		
			
			|  |  |  | .handler(new WxEchoMessageHandler(sb, "COMBINE_3")) | 
		
	
		
			
			|  |  |  | .end() | 
		
	
		
			
			|  |  |  | .rule() | 
		
	
		
			
			|  |  |  | .async(async) | 
		
	
		
			
			|  |  |  | .msgType(WxConsts.XML_MSG_TEXT).event(WxConsts.EVT_CLICK) | 
		
	
		
			
			|  |  |  | .handler(new WxEchoMessageHandler(sb, "COMBINE_2")) | 
		
	
		
			
			|  |  |  | .end() | 
		
	
		
			
			|  |  |  | .rule().msgType(WxConsts.XML_MSG_TEXT).handler(new WxEchoMessageHandler(sb, WxConsts.XML_MSG_TEXT)).end() | 
		
	
		
			
			|  |  |  | .rule().event(WxConsts.EVT_CLICK).handler(new WxEchoMessageHandler(sb, WxConsts.EVT_CLICK)).end() | 
		
	
		
			
			|  |  |  | .rule().eventKey("KEY_1").handler(new WxEchoMessageHandler(sb, "KEY_1")).end() | 
		
	
		
			
			|  |  |  | .rule().content("CONTENT_1").handler(new WxEchoMessageHandler(sb, "CONTENT_1")).end() | 
		
	
		
			
			|  |  |  | .rule().handler(new WxEchoMessageHandler(sb, "ALL")).end(); | 
		
	
		
			
			|  |  |  | .rule().async(async).msgType(WxConsts.XML_MSG_TEXT).handler(new WxEchoMessageHandler(sb, WxConsts.XML_MSG_TEXT)).end() | 
		
	
		
			
			|  |  |  | .rule().async(async).event(WxConsts.EVT_CLICK).handler(new WxEchoMessageHandler(sb, WxConsts.EVT_CLICK)).end() | 
		
	
		
			
			|  |  |  | .rule().async(async).eventKey("KEY_1").handler(new WxEchoMessageHandler(sb, "KEY_1")).end() | 
		
	
		
			
			|  |  |  | .rule().async(async).content("CONTENT_1").handler(new WxEchoMessageHandler(sb, "CONTENT_1")).end() | 
		
	
		
			
			|  |  |  | .rule().async(async).handler(new WxEchoMessageHandler(sb, "ALL")).end(); | 
		
	
		
			
			|  |  |  | ; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | @Test(dataProvider="messages-1") | 
		
	
		
			
			|  |  |  | public void testSimple(WxXmlMessage message, String expected) { | 
		
	
		
			
			|  |  |  | public void testSync(WxXmlMessage message, String expected) { | 
		
	
		
			
			|  |  |  | StringBuffer sb = new StringBuffer(); | 
		
	
		
			
			|  |  |  | WxMessageRouter router = new WxMessageRouter(); | 
		
	
		
			
			|  |  |  | prepare(false, sb, router); | 
		
	
		
			
			|  |  |  | router.route(message); | 
		
	
		
			
			|  |  |  | Assert.assertEquals(sb.toString(), expected); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | @Test(dataProvider="messages-1") | 
		
	
		
			
			|  |  |  | public void testAsync(WxXmlMessage message, String expected) throws InterruptedException { | 
		
	
		
			
			|  |  |  | StringBuffer sb = new StringBuffer(); | 
		
	
		
			
			|  |  |  | WxMessageRouter router = new WxMessageRouter(); | 
		
	
		
			
			|  |  |  | prepare(true,  sb, router); | 
		
	
		
			
			|  |  |  | router.route(message); | 
		
	
		
			
			|  |  |  | Thread.sleep(500l); | 
		
	
		
			
			|  |  |  | Assert.assertEquals(sb.toString(), expected); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | public void testConcurrency() throws InterruptedException { | 
		
	
		
			
			|  |  |  | final WxMessageRouter router = new WxMessageRouter(); | 
		
	
		
			
			|  |  |  | router.rule().handler(new WxMessageHandler() { | 
		
	
		
			
			|  |  |  | @Override | 
		
	
		
			
			|  |  |  | public WxXmlMessage handle(WxXmlMessage wxMessage, Map<String, Object> context) { | 
		
	
		
			
			|  |  |  | // TODO Auto-generated method stub | 
		
	
		
			
			|  |  |  | return null; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | }).end(); | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | final WxXmlMessage m = new WxXmlMessage(); | 
		
	
		
			
			|  |  |  | Runnable r = new Runnable() { | 
		
	
		
			
			|  |  |  | @Override | 
		
	
		
			
			|  |  |  | public void run() { | 
		
	
		
			
			|  |  |  | router.route(m); | 
		
	
		
			
			|  |  |  | try { | 
		
	
		
			
			|  |  |  | Thread.sleep(1000l); | 
		
	
		
			
			|  |  |  | } catch (InterruptedException e) { | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | }; | 
		
	
		
			
			|  |  |  | for (int i = 0; i < 10; i++) { | 
		
	
		
			
			|  |  |  | new Thread(r).start(); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | Thread.sleep(1000l * 2); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | @DataProvider(name="messages-1") | 
		
	
		
			
			|  |  |  | public Object[][] messages2() { | 
		
	
		
			
			|  |  |  | WxXmlMessage message1 = new WxXmlMessage(); | 
		
	
	
		
			
				|  |  | @@ -98,17 +135,18 @@ public class WxMessageRouterTest { | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | public static class WxEchoMessageHandler implements WxMessageHandler { | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | private StringBuilder sb; | 
		
	
		
			
			|  |  |  | private StringBuffer sb; | 
		
	
		
			
			|  |  |  | private String echoStr; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | public WxEchoMessageHandler(StringBuilder sb, String echoStr) { | 
		
	
		
			
			|  |  |  | public WxEchoMessageHandler(StringBuffer sb, String echoStr) { | 
		
	
		
			
			|  |  |  | this.sb = sb; | 
		
	
		
			
			|  |  |  | this.echoStr = echoStr; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | @Override | 
		
	
		
			
			|  |  |  | public void handle(WxXmlMessage wxMessage, Map<String, Object> context) { | 
		
	
		
			
			|  |  |  | public WxXmlMessage handle(WxXmlMessage wxMessage, Map<String, Object> context) { | 
		
	
		
			
			|  |  |  | sb.append(this.echoStr).append(','); | 
		
	
		
			
			|  |  |  | return null; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | } | 
		
	
	
		
			
				|  |  | 
 |