View Javadoc

1   package org.apache.tomcat.maven.common;
2   /*
3    * Licensed to the Apache Software Foundation (ASF) under one
4    * or more contributor license agreements.  See the NOTICE file
5    * distributed with this work for additional information
6    * regarding copyright ownership.  The ASF licenses this file
7    * to you under the Apache License, Version 2.0 (the
8    * "License"); you may not use this file except in compliance
9    * with the License.  You may obtain a copy of the License at
10   *
11   *   http://www.apache.org/licenses/LICENSE-2.0
12   *
13   * Unless required by applicable law or agreed to in writing,
14   * software distributed under the License is distributed on an
15   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16   * KIND, either express or implied.  See the License for the
17   * specific language governing permissions and limitations
18   * under the License.
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   * @author Olivier Lamy
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     // internal for tests
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 }