package cn.org.rapid_framework.web.httpinclude; import java.io.IOException; import java.io.PrintStream; import java.io.UnsupportedEncodingException; import java.io.Writer; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import junit.framework.TestCase; import org.springframework.mock.web.MockHttpServletRequest; import org.springframework.mock.web.MockHttpServletResponse; import org.springframework.mock.web.MockRequestDispatcher; import cn.org.rapid_framework.test.util.MultiThreadTestUtils; public class HttpIncludeTest extends TestCase { String cookie = "_javaeye3_session_=BAh7BzoMdXNlcl9pZGkCxEw6D3Nlc3Npb25faWQiJTg2NTRkNDgxNjhiYzhiY2RhODg1N2M3OTBjMGNkYTI5--a2a5c1d58579038336b581bab0ad2b53b4526ca5"; MockHttpServletResponse response = new MockHttpServletResponse(); MockHttpServletRequest request = new MockHttpServletRequest(); HttpInclude http = new HttpInclude(request, response); public void test_remote_with_cookie() { response.setCharacterEncoding("UTF-8"); System.out.println(http.include("http://www.163.com")); } boolean includeExecuted = false; public void test_local_write_date_with_output_stream() throws UnsupportedEncodingException { final MockHttpServletResponse response = new MockHttpServletResponse(); response.setCharacterEncoding("UTF-8"); MockHttpServletRequest request = new MockHttpServletRequest(){ @Override public RequestDispatcher getRequestDispatcher(final String path) { return new MockRequestDispatcher(path) { @Override public void include(ServletRequest servletRequest,ServletResponse servletResponse){ try { response.setIncludedUrl(path); new PrintStream(servletResponse.getOutputStream()).append("test_local_write_date_with_output_stream").flush(); // super.include(servletRequest, servletResponse); includeExecuted = true; }catch(Exception e) { throw new RuntimeException(e); } } }; } }; HttpInclude http = new HttpInclude(request, response); String includeContent = http.include("/userinfo/blog.htm"); System.out.println(includeContent); System.out.println(response.getIncludedUrl()); assertTrue(includeExecuted); assertEquals(includeContent,"test_local_write_date_with_output_stream"); assertEquals(response.getIncludedUrl(),"/userinfo/blog.htm"); } public void test_local_write_date_with_write() throws UnsupportedEncodingException { final MockHttpServletResponse response = new MockHttpServletResponse(); response.setCharacterEncoding("UTF-8"); MockHttpServletRequest request = new MockHttpServletRequest(){ @Override public RequestDispatcher getRequestDispatcher(final String path) { return new MockRequestDispatcher(path) { @Override public void include(ServletRequest servletRequest,ServletResponse servletResponse){ try { response.setIncludedUrl(path); servletResponse.getWriter().append("test_local_write_date_with_write"); // super.include(servletRequest, servletResponse); includeExecuted = true; }catch(Exception e) { throw new RuntimeException(e); } } }; } }; HttpInclude http = new HttpInclude(request, response); String includeContent = http.include("/userinfo/blog.htm"); System.out.println(includeContent); System.out.println(response.getIncludedUrl()); assertTrue(includeExecuted); assertEquals(includeContent,"test_local_write_date_with_write"); assertEquals(response.getIncludedUrl(),"/userinfo/blog.htm"); } public void test_local_write_date_with_call_writer_and_outputstream() throws UnsupportedEncodingException { final MockHttpServletResponse response = new MockHttpServletResponse(); response.setCharacterEncoding("UTF-8"); MockHttpServletRequest request = new MockHttpServletRequest() { @Override public RequestDispatcher getRequestDispatcher(final String path) { return new MockRequestDispatcher(path) { @Override public void include(ServletRequest servletRequest, ServletResponse servletResponse){ try { response.setIncludedUrl(path); servletResponse.getWriter().append( "test_local_write_date_with_write"); servletResponse.getOutputStream().write('c'); }catch(IOException e) { throw new RuntimeException(e); } } }; } }; HttpInclude http = new HttpInclude(request, response); try { String includeContent = http.include("/userinfo/blog.htm"); fail(); } catch (IllegalStateException e) { assertTrue(e.getMessage().contains( "getWriter() has already been called for this response")); } } public void test_local_write_date_with_call_outputstream_and_writer() throws UnsupportedEncodingException { final MockHttpServletResponse response = new MockHttpServletResponse(); response.setCharacterEncoding("UTF-8"); MockHttpServletRequest request = new MockHttpServletRequest() { @Override public RequestDispatcher getRequestDispatcher(final String path) { return new MockRequestDispatcher(path) { @Override public void include(ServletRequest servletRequest, ServletResponse servletResponse){ try { response.setIncludedUrl(path); servletResponse.getOutputStream().write('c'); servletResponse.getWriter().append( "test_local_write_date_with_write"); }catch(IOException e) { throw new RuntimeException(e); } } }; } }; HttpInclude http = new HttpInclude(request, response); try { String includeContent = http.include("/userinfo/blog.htm"); fail(); } catch (IllegalStateException e) { assertTrue(e.getMessage().contains( "getOutputStream() has already been called for this response")); } } private int count = 0; public void testPerformance() throws InterruptedException { final Writer NULL_WRITER = new Writer() { @Override public void close() throws IOException { } @Override public void flush() throws IOException { } @Override public void write(char[] cbuf, int off, int len) throws IOException { } }; System.setProperty("http.maxConnections", "1"); int threads = 5; MultiThreadTestUtils.executeAndWait(threads, new Runnable() { public void run() { String msg = count+++" thread:"+Thread.currentThread().toString(); System.out.println(msg); for(int i = 0; i < 5; i++) { System.out.println(msg+" "+i); http.include("http://www.taobao.com", NULL_WRITER); } } }); // for(int i = 0; i < 10; i++) { // System.out.println(count++); // http.include("http://www.taobao.com", NULL_WRITER); // } } }