1 package org.apache.tomcat.maven.common;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 import junit.framework.TestCase;
22 import org.apache.catalina.Context;
23 import org.apache.catalina.startup.Tomcat;
24 import org.apache.commons.io.IOUtils;
25 import org.apache.tomcat.maven.common.deployer.TomcatManager;
26 import org.apache.tomcat.maven.common.deployer.TomcatManagerResponse;
27
28 import javax.servlet.ServletException;
29 import javax.servlet.http.HttpServlet;
30 import javax.servlet.http.HttpServletRequest;
31 import javax.servlet.http.HttpServletResponse;
32 import java.io.File;
33 import java.io.FileInputStream;
34 import java.io.FileOutputStream;
35 import java.io.IOException;
36 import java.io.StringWriter;
37 import java.net.URL;
38 import java.util.ArrayList;
39 import java.util.List;
40
41
42
43
44 public class TomcatManagerTest
45 extends TestCase
46 {
47
48 Tomcat tomcat;
49
50 Tomcat redirectTomcat;
51
52 UploadServlet uploadServlet;
53
54 RedirectServlet redirectServlet;
55
56 int port;
57
58 int redirectPort;
59
60 public static String getBasedir()
61 {
62 return System.getProperty( "basedir" );
63 }
64
65 @Override
66 protected void setUp()
67 throws Exception
68 {
69 super.setUp();
70 tomcat = new Tomcat();
71 tomcat.setBaseDir( System.getProperty( "java.io.tmpdir" ) );
72 tomcat.setPort( 0 );
73
74 Context context = tomcat.addContext( "", System.getProperty( "java.io.tmpdir" ) );
75 uploadServlet = new UploadServlet();
76 tomcat.addServlet( context, "foo", uploadServlet );
77 context.addServletMapping( "/*", "foo" );
78
79 tomcat.start();
80
81 port = tomcat.getConnector().getLocalPort();
82
83 System.out.println( "Tomcat started on port:" + port );
84
85 redirectTomcat = new Tomcat();
86 redirectTomcat.setBaseDir( System.getProperty( "java.io.tmpdir" ) );
87 redirectTomcat.setPort( 0 );
88 context = redirectTomcat.addContext( "", System.getProperty( "java.io.tmpdir" ) );
89 redirectServlet = new RedirectServlet();
90 redirectTomcat.addServlet( context, "foo", redirectServlet );
91 context.addServletMapping( "/*", "foo" );
92 redirectTomcat.start();
93 redirectPort = redirectTomcat.getConnector().getLocalPort();
94
95 System.out.println( "redirect Tomcat started on port:" + redirectPort );
96 }
97
98 @Override
99 protected void tearDown()
100 throws Exception
101 {
102 super.tearDown();
103 tomcat.stop();
104 }
105
106
107 public void testDeployWar()
108 throws Exception
109 {
110 uploadServlet.uploadedResources.clear();
111 TomcatManager tomcatManager = new TomcatManager( new URL( "http://localhost:" + this.port + "/foo/bar" ) );
112 TomcatManagerResponse response =
113 tomcatManager.deploy( "foo", new File( getBasedir(), "src/test/resources/test.txt" ) );
114
115 assertEquals( 200, response.getStatusCode() );
116
117 assertEquals( 1, uploadServlet.uploadedResources.size() );
118 assertEquals( "/foo/bar/deploy", uploadServlet.uploadedResources.get( 0 ).requestUri );
119 FileInputStream fileInputStream = new FileInputStream( uploadServlet.uploadedResources.get( 0 ).uploadedFile );
120 try
121 {
122 StringWriter sw = new StringWriter();
123 IOUtils.copy( fileInputStream, sw );
124 assertTrue( sw.toString().contains( "Apache Tomcat rocks!!" ) );
125 }
126 finally
127 {
128 fileInputStream.close();
129 }
130 }
131
132 public void testDeployWarWithRedirect()
133 throws Exception
134 {
135 uploadServlet.uploadedResources.clear();
136 TomcatManager tomcatManager =
137 new TomcatManager( new URL( "http://localhost:" + this.redirectPort + "/foo/bar" ) );
138 redirectServlet.redirectPath = "http://localhost:" + this.port + "/foo/bar/redirected";
139 TomcatManagerResponse response =
140 tomcatManager.deploy( "foo", new File( getBasedir(), "src/test/resources/test.txt" ) );
141
142 assertEquals( 200, response.getStatusCode() );
143
144 assertEquals( "no request to redirect servlet", 1, redirectServlet.uploadedResources.size() );
145 assertEquals( "/foo/bar/deploy", redirectServlet.uploadedResources.get( 0 ).requestUri );
146 assertEquals( "no redirected request to upload servlet", 1, uploadServlet.uploadedResources.size() );
147
148 assertEquals( "/foo/bar/deploy", redirectServlet.uploadedResources.get( 0 ).requestUri );
149
150 FileInputStream fileInputStream = new FileInputStream( uploadServlet.uploadedResources.get( 0 ).uploadedFile );
151 try
152 {
153 StringWriter sw = new StringWriter();
154 IOUtils.copy( fileInputStream, sw );
155 assertTrue( sw.toString().contains( "Apache Tomcat rocks!!" ) );
156 }
157 finally
158 {
159 fileInputStream.close();
160 }
161 }
162
163 public void testDeployWarWithRedirectRelative()
164 throws Exception
165 {
166 uploadServlet.uploadedResources.clear();
167 TomcatManager tomcatManager =
168 new TomcatManager( new URL( "http://localhost:" + this.redirectPort + "/foo/bar" ) );
169 redirectServlet.redirectPath = "redirectrelative/foo";
170 TomcatManagerResponse response =
171 tomcatManager.deploy( "foo", new File( getBasedir(), "src/test/resources/test.txt" ) );
172
173 assertEquals( 200, response.getStatusCode() );
174
175 assertEquals( "no request to redirect servlet", 2, redirectServlet.uploadedResources.size() );
176 assertEquals( "/foo/bar/deploy", redirectServlet.uploadedResources.get( 0 ).requestUri );
177 assertEquals( "found redirected request to upload servlet", 0, uploadServlet.uploadedResources.size() );
178
179 assertEquals( "/foo/bar/deploy", redirectServlet.uploadedResources.get( 0 ).requestUri );
180
181 FileInputStream fileInputStream =
182 new FileInputStream( redirectServlet.uploadedResources.get( 1 ).uploadedFile );
183 try
184 {
185 StringWriter sw = new StringWriter();
186 IOUtils.copy( fileInputStream, sw );
187 assertTrue( sw.toString().contains( "Apache Tomcat rocks!!" ) );
188 }
189 finally
190 {
191 fileInputStream.close();
192 }
193 }
194
195
196
197
198
199 public class UploadedResource
200 {
201 public String requestUri;
202
203 public File uploadedFile;
204
205 public UploadedResource( String requestUri, File uploadedFile )
206 {
207 this.requestUri = requestUri;
208 this.uploadedFile = uploadedFile;
209 }
210 }
211
212 public class UploadServlet
213 extends HttpServlet
214 {
215
216 public List<UploadedResource> uploadedResources = new ArrayList<UploadedResource>();
217
218 @Override
219 protected void doPut( HttpServletRequest req, HttpServletResponse resp )
220 throws ServletException, IOException
221 {
222 System.out.println( "put ok:" + req.getRequestURI() );
223 File file = File.createTempFile( "tomcat-unit-test", "tmp" );
224 uploadedResources.add( new UploadedResource( req.getRequestURI(), file ) );
225 IOUtils.copy( req.getInputStream(), new FileOutputStream( file ) );
226 }
227 }
228
229 public class RedirectServlet
230 extends HttpServlet
231 {
232 int redirectPort = 0;
233
234 String redirectPath;
235
236 public List<UploadedResource> uploadedResources = new ArrayList<UploadedResource>();
237
238 @Override
239 protected void doPut( HttpServletRequest req, HttpServletResponse resp )
240 throws ServletException, IOException
241 {
242 System.out.println( "RedirectServlet put ok:" + req.getRequestURI() );
243 if ( req.getRequestURI().contains( "redirectrelative" ) )
244 {
245 File file = File.createTempFile( "tomcat-unit-test", "tmp" );
246 uploadedResources.add( new UploadedResource( req.getRequestURI(), file ) );
247 IOUtils.copy( req.getInputStream(), new FileOutputStream( file ) );
248 return;
249 }
250 uploadedResources.add( new UploadedResource( req.getRequestURI(), null ) );
251 String redirectUri =
252 redirectPort > 0 ? "http://localhost:" + redirectPort + "/" + redirectPath : redirectPath;
253 resp.sendRedirect( redirectUri );
254 }
255 }
256 }