/* ================================================================== * Created [2009-4-27 下午11:32:55] by Jon.King * ================================================================== * TSS * ================================================================== * mailTo:jinpujun@hotmail.com * Copyright (c) Jon.King, 2009-2012 * ================================================================== */ package com.jinhe.tss.core.sso.servlet; import java.io.IOException; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import junit.framework.TestCase; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.HttpStatus; import org.apache.commons.httpclient.methods.PostMethod; import org.apache.commons.httpclient.methods.StringRequestEntity; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.Node; import org.dom4j.io.SAXReader; import org.mortbay.jetty.Connector; import org.mortbay.jetty.Server; import org.mortbay.jetty.handler.HandlerList; import org.mortbay.jetty.nio.SelectChannelConnector; import org.mortbay.jetty.servlet.Context; import org.mortbay.jetty.servlet.ServletHandler; import com.jinhe.tss.core.exception.BusinessException; import com.jinhe.tss.core.util.XMLDocUtil; import com.jinhe.tss.core.web.servlet.MultiRequestServlet; /** * <p> MultiRequestServletTest.java </p> * <p> * servlet请求合并测试对象。 * 先将合并的总请求发到MultiRequestServlet,然后MultiRequestServlet解析总的请求, * 将一个个子请求分离出来分别执行(这里子请求一律重新请求到SimpleRequestServlet), * 再将每个子请求的返回结果合并为一个总的结果(响应)。 * </p> */ public class MultiRequestServletTest extends TestCase { private Server server; protected void setUp() throws Exception { super.setUp(); super.setUp(); server = new Server(); // 设置监听端口为8083 Connector connector = new SelectChannelConnector(); connector.setPort(8083); server.setConnectors(new Connector[]{connector}); Context context = new Context(server, "/tss", Context.SESSIONS); ServletHandler handler = new ServletHandler(); handler.addServletWithMapping(MultiRequestServlet.class, "/multi"); handler.addServletWithMapping(SimpleRequestServlet.class, "/simple/*"); HandlerList handlers = new HandlerList(); handlers.addHandler(handler); context.setHandler(handlers); server.start(); } /** * <p> SimpleRequestServlet.java </p> * do nothing,简单的返回请求地址 */ public static class SimpleRequestServlet extends HttpServlet { private static final long serialVersionUID = -6852492423340779582L; protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.getWriter().println("<Response><url>" + request.getServletPath() + "</url></Response>"); } } protected void tearDown() throws Exception { super.tearDown(); server.stop(); } /** * Test method for {@link com.jinhe.tss.core.web.servlet.MultiRequestServlet#doPost(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)}. */ public final void testDoPost() throws ServletException, IOException { HttpClient client = new HttpClient(); PostMethod httppost = new PostMethod("http://localhost:8083/tss/multi"); //设置请求内容 String body = "<Requests>" + "<Request url=\"/simple/1\"><Param><Name><![CDATA[token]]></Name><Value><![CDATA[12345]]></Value></Param></Request>" + "<Request url=\"/simple/2\"><Param><Name><![CDATA[token]]></Name><Value><![CDATA[12w45]]></Value></Param></Request>" + "<Request url=\"/simple/3\"></Request>" + "<Request url=\"/simple/4\"><Param><Name><![CDATA[token]]></Name><Value><![CDATA[12s45]]></Value></Param></Request>" + "</Requests>"; httppost.setRequestEntity(new StringRequestEntity(body, null, null)); try { //请求 client.executeMethod(httppost); int statusCode = httppost.getStatusCode(); if (statusCode == HttpStatus.SC_OK) { try { Document doc = new SAXReader().read(httppost.getResponseBodyAsStream()); System.out.println(doc.asXML()); List<Element> nodes = XMLDocUtil.selectNodes(doc, "/Responses/Response/url"); assertEquals(4, nodes.size()); int i = 1; for(Node node :nodes) { assertEquals("/simple/" + i++, node.getText()); } } catch (DocumentException e) { throw new BusinessException("解析合并请求的xml数据流失败", e); } } else { fail("请求连接失败"); } } finally { httppost.releaseConnection(); } } }