View Javadoc

1   package org.apache.maven.plugins.site;
2   
3   /*
4    * Licensed to the Apache Software Foundation (ASF) under one
5    * or more contributor license agreements.  See the NOTICE file
6    * distributed with this work for additional information
7    * regarding copyright ownership.  The ASF licenses this file
8    * to you under the Apache License, Version 2.0 (the
9    * "License"); you may not use this file except in compliance
10   * with the License.  You may obtain a copy of the License at
11   *
12   *   http://www.apache.org/licenses/LICENSE-2.0
13   *
14   * Unless required by applicable law or agreed to in writing,
15   * software distributed under the License is distributed on an
16   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17   * KIND, either express or implied.  See the License for the
18   * specific language governing permissions and limitations
19   * under the License.
20   */
21  
22  import java.io.File;
23  import java.util.Arrays;
24  import java.util.Collections;
25  import java.util.HashMap;
26  import java.util.List;
27  import java.util.Map;
28  
29  import org.apache.commons.io.FileUtils;
30  import org.apache.maven.artifact.repository.ArtifactRepositoryFactory;
31  import org.apache.maven.doxia.tools.SiteTool;
32  import org.apache.maven.execution.DefaultMavenExecutionRequest;
33  import org.apache.maven.execution.MavenExecutionRequest;
34  import org.apache.maven.execution.MavenSession;
35  import org.apache.maven.plugin.AbstractMojo;
36  import org.apache.maven.plugin.testing.AbstractMojoTestCase;
37  import org.apache.maven.plugins.site.SimpleDavServerHandler.HttpRequest;
38  import org.apache.maven.plugins.site.stubs.SiteMavenProjectStub;
39  import org.apache.maven.settings.Proxy;
40  import org.apache.maven.settings.Settings;
41  import org.codehaus.plexus.util.ReflectionUtils;
42  import org.junit.Before;
43  import org.junit.Test;
44  import org.junit.runner.RunWith;
45  import org.junit.runners.JUnit4;
46  import org.slf4j.Logger;
47  import org.slf4j.LoggerFactory;
48  
49  /**
50   * @author Olivier Lamy
51   * @version $Id: AbstractSiteDeployWebDavTest.html 861484 2013-05-09 23:10:16Z hboutemy $
52   */
53  @RunWith(JUnit4.class)
54  public abstract class AbstractSiteDeployWebDavTest
55      extends AbstractMojoTestCase
56  {
57  
58      File siteTargetPath = new File( getBasedir() + File.separator + "target" + File.separator + "siteTargetDeploy" );
59  
60      private Logger log = LoggerFactory.getLogger( getClass() );
61  
62      @Before
63      public void setUp()
64          throws Exception
65      {
66          super.setUp();
67          if ( !siteTargetPath.exists() )
68          {
69              siteTargetPath.mkdirs();
70              FileUtils.cleanDirectory( siteTargetPath );
71          }
72      }
73  
74      abstract String getMojoName();
75  
76      abstract AbstractMojo getMojo( File pluginXmlFile )
77          throws Exception;
78  
79      @Test
80      public void noAuthzDavDeploy()
81          throws Exception
82      {
83          FileUtils.cleanDirectory( siteTargetPath );
84          SimpleDavServerHandler simpleDavServerHandler = new SimpleDavServerHandler( siteTargetPath );
85  
86          try
87          {
88              File pluginXmlFile = getTestFile( "src/test/resources/unit/deploy-dav/pom.xml" );
89              AbstractMojo mojo = getMojo( pluginXmlFile );
90              assertNotNull( mojo );
91              SiteMavenProjectStub siteMavenProjectStub =
92                  new SiteMavenProjectStub( "src/test/resources/unit/deploy-dav/pom.xml" );
93  
94              assertTrue( "dav server port not available: " + simpleDavServerHandler.getPort(),
95                          simpleDavServerHandler.getPort() > 0 );
96  
97              siteMavenProjectStub.getDistributionManagement().getSite()
98                  .setUrl( "dav:http://localhost:" + simpleDavServerHandler.getPort() + "/site/" );
99  
100             setVariableValueToObject( mojo, "project", siteMavenProjectStub );
101             Settings settings = new Settings();
102             setVariableValueToObject( mojo, "settings", settings );
103             File inputDirectory = new File( "src/test/resources/unit/deploy-dav/target/site" );
104 
105             setVariableValueToObject( mojo, "inputDirectory", inputDirectory );
106             mojo.execute();
107 
108             assertContentInFiles();
109             assertFalse( requestsContainsProxyUse( simpleDavServerHandler.httpRequests ) );
110         }
111         finally
112         {
113             simpleDavServerHandler.stop();
114         }
115     }
116 
117     @Test
118     public void davDeployThruProxyWithoutAuthzInProxy()
119         throws Exception
120     {
121 
122         FileUtils.cleanDirectory( siteTargetPath );
123         SimpleDavServerHandler simpleDavServerHandler = new SimpleDavServerHandler( siteTargetPath );
124         try
125         {
126             File pluginXmlFile = getTestFile( "src/test/resources/unit/deploy-dav/pom.xml" );
127             AbstractMojo mojo = getMojo( pluginXmlFile );
128             assertNotNull( mojo );
129             SiteMavenProjectStub siteMavenProjectStub =
130                 new SiteMavenProjectStub( "src/test/resources/unit/deploy-dav/pom.xml" );
131             // olamy, Note : toto is something like foo or bar for french folks :-)
132             String siteUrl = "dav:http://toto.com/site/";
133             siteMavenProjectStub.getDistributionManagement().getSite().setUrl( siteUrl );
134 
135             setVariableValueToObject( mojo, "project", siteMavenProjectStub );
136             Settings settings = new Settings();
137             Proxy proxy = new Proxy();
138 
139             //dummy proxy
140             proxy.setActive( true );
141             proxy.setHost( "localhost" );
142             proxy.setPort( simpleDavServerHandler.getPort() );
143             proxy.setProtocol( "http" );
144             proxy.setNonProxyHosts( "www.google.com|*.somewhere.com" );
145             settings.addProxy( proxy );
146 
147             setVariableValueToObject( mojo, "settings", settings );
148 
149             MavenExecutionRequest request = new DefaultMavenExecutionRequest();
150             request.setProxies( Arrays.asList( proxy ) );
151             MavenSession mavenSession = new MavenSession( getContainer(), null, request, null );
152 
153             setVariableValueToObject( mojo, "mavenSession", mavenSession );
154 
155             File inputDirectory = new File( "src/test/resources/unit/deploy-dav/target/site" );
156 
157             setVariableValueToObject( mojo, "inputDirectory", inputDirectory );
158             mojo.execute();
159 
160             assertContentInFiles();
161 
162             assertTrue( requestsContainsProxyUse( simpleDavServerHandler.httpRequests ) );
163 
164             for ( HttpRequest rq : simpleDavServerHandler.httpRequests )
165             {
166                 log.info( rq.toString() );
167             }
168 
169         }
170         finally
171         {
172             simpleDavServerHandler.stop();
173         }        
174         
175     }
176 
177     @Test
178     public void davDeployThruProxyWitAuthzInProxy() throws Exception
179     {
180 
181         FileUtils.cleanDirectory( siteTargetPath );
182         //SimpleDavServerHandler simpleDavServerHandler = new SimpleDavServerHandler( siteTargetPath );
183 
184         Map<String, String> authentications = new HashMap<String, String>();
185         authentications.put( "foo", "titi" );
186 
187         AuthAsyncProxyServlet servlet = new AuthAsyncProxyServlet( authentications, siteTargetPath );
188 
189         SimpleDavServerHandler simpleDavServerHandler = new SimpleDavServerHandler( servlet );        
190         try
191         {
192             File pluginXmlFile = getTestFile( "src/test/resources/unit/deploy-dav/pom.xml" );
193             AbstractMojo mojo = getMojo( pluginXmlFile );
194             assertNotNull( mojo );
195             SiteMavenProjectStub siteMavenProjectStub =
196                 new SiteMavenProjectStub( "src/test/resources/unit/deploy-dav/pom.xml" );
197 
198             siteMavenProjectStub.getDistributionManagement().getSite()
199                 .setUrl( "dav:http://toto.com/site/" );
200 
201             setVariableValueToObject( mojo, "project", siteMavenProjectStub );
202             Settings settings = new Settings();
203             Proxy proxy = new Proxy();
204 
205             //dummy proxy
206             proxy.setActive( true );
207             proxy.setHost( "localhost" );
208             proxy.setPort( simpleDavServerHandler.getPort() );
209             proxy.setProtocol( "dav" );
210             proxy.setUsername( "foo" );
211             proxy.setPassword( "titi" );
212             proxy.setNonProxyHosts( "www.google.com|*.somewhere.com" );
213             settings.addProxy( proxy );
214 
215             setVariableValueToObject( mojo, "settings", settings );
216 
217             MavenExecutionRequest request = new DefaultMavenExecutionRequest();
218             request.setProxies( Arrays.asList( proxy ) );
219             MavenSession mavenSession = new MavenSession( getContainer(), null, request, null );
220 
221             setVariableValueToObject( mojo, "mavenSession", mavenSession );
222 
223             File inputDirectory = new File( "src/test/resources/unit/deploy-dav/target/site" );
224 
225             // test which mojo we are using
226             if ( ReflectionUtils.getFieldByNameIncludingSuperclasses( "inputDirectory", mojo.getClass() ) != null )
227             {
228                 setVariableValueToObject( mojo, "inputDirectory", inputDirectory );
229             }
230             else
231             {
232                 ArtifactRepositoryFactory artifactRepositoryFactory = getContainer().lookup( ArtifactRepositoryFactory.class );
233 
234                 setVariableValueToObject( mojo, "stagingDirectory", inputDirectory );
235                 setVariableValueToObject( mojo, "reactorProjects", Collections.emptyList() );
236                 setVariableValueToObject( mojo, "localRepository",
237                                           artifactRepositoryFactory.createArtifactRepository( "local", "foo", "default",
238                                                                                               null, null ) );
239                 setVariableValueToObject( mojo, "siteTool", getContainer().lookup( SiteTool.class ) );
240                 setVariableValueToObject( mojo, "siteDirectory", new File("foo") );
241                 setVariableValueToObject( mojo, "repositories", Collections.emptyList() );
242             }
243             mojo.execute();
244 
245             assertContentInFiles();
246             assertTrue( requestsContainsProxyUse( servlet.httpRequests ) );
247             assertAtLeastOneRequestContainsHeader( servlet.httpRequests, "Proxy-Authorization" );
248             for ( HttpRequest rq : servlet.httpRequests )
249             {
250                 log.info( rq.toString() );
251             }
252         }
253         finally
254         {
255             simpleDavServerHandler.stop();
256         }  
257     }        
258 
259     private void assertContentInFiles()
260         throws Exception
261     {
262         File fileToTest = new File( siteTargetPath, "site" + File.separator + "index.html" );
263         assertTrue( fileToTest.exists() );
264         String fileContent = FileUtils.readFileToString( fileToTest );
265         assertTrue( fileContent.contains( "Welcome to Apache Maven" ) );
266 
267         fileToTest = new File( siteTargetPath, "site" + File.separator + "css" + File.separator + "maven-base.css" );
268         assertTrue( fileToTest.exists() );
269         fileContent = FileUtils.readFileToString( fileToTest );
270         assertTrue( fileContent.contains( "background-image: url(../images/collapsed.gif);" ) );
271     }
272 
273     /**
274      * @param requests
275      * @return true if at least on request use proxy http header Proxy-Connection : Keep-Alive
276      */
277     private boolean requestsContainsProxyUse( List<HttpRequest> requests )
278     {
279         return assertAtLeastOneRequestContainsHeader( requests, "Proxy-Connection" );
280     }
281 
282     private boolean assertAtLeastOneRequestContainsHeader( List<HttpRequest> requests, String headerName )
283     {
284         for ( HttpRequest rq : requests )
285         {
286             boolean containsProxyHeader = rq.headers.containsKey( headerName );
287             if ( containsProxyHeader )
288             {
289                 return true;
290             }
291         }
292         return false;
293     }
294 }