View Javadoc

1   package org.apache.maven.it;
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 org.apache.maven.it.Verifier;
23  import org.apache.maven.it.util.FileUtils;
24  import org.apache.maven.it.util.ResourceExtractor;
25  
26  import java.io.File;
27  import java.io.IOException;
28  import java.util.ArrayList;
29  import java.util.Collections;
30  import java.util.List;
31  import java.util.Properties;
32  
33  import javax.servlet.ServletException;
34  import javax.servlet.http.HttpServletRequest;
35  import javax.servlet.http.HttpServletResponse;
36  
37  import org.mortbay.jetty.Server;
38  import org.mortbay.jetty.handler.AbstractHandler;
39  import org.mortbay.jetty.handler.DefaultHandler;
40  import org.mortbay.jetty.handler.HandlerList;
41  import org.mortbay.jetty.handler.ResourceHandler;
42  
43  /**
44   * This is a test set for <a href="http://jira.codehaus.org/browse/MNG-4554">MNG-4554</a>.
45   * 
46   * @author Benjamin Bentmann
47   */
48  public class MavenITmng4554PluginPrefixMappingUpdateTest
49      extends AbstractMavenIntegrationTestCase
50  {
51  
52      public MavenITmng4554PluginPrefixMappingUpdateTest()
53      {
54          super( "[2.0.3,3.0-alpha-1),[3.0-alpha-7,)" );
55      }
56  
57      /**
58       * Test that the metadata holding the plugin prefix mapping is cached and not redownloaded upon each
59       * Maven invocation.
60       */
61      public void testitCached()
62          throws Exception
63      {
64          File testDir = ResourceExtractor.simpleExtractResources( getClass(), "/mng-4554" );
65  
66          String metadataUri = "/repo-1/org/apache/maven/its/mng4554/maven-metadata.xml";
67  
68          final List requestedUris = Collections.synchronizedList( new ArrayList() );
69  
70          AbstractHandler logHandler = new AbstractHandler()
71          {
72              public void handle( String target, HttpServletRequest request, HttpServletResponse response, int dispatch )
73                  throws IOException, ServletException
74              {
75                  requestedUris.add( request.getRequestURI() );
76              }
77          };
78  
79          ResourceHandler repoHandler = new ResourceHandler();
80          repoHandler.setResourceBase( testDir.getAbsolutePath() );
81  
82          HandlerList handlerList = new HandlerList();
83          handlerList.addHandler( logHandler );
84          handlerList.addHandler( repoHandler );
85          handlerList.addHandler( new DefaultHandler() );
86  
87          Server server = new Server( 0 );
88          server.setHandler( handlerList );
89          server.start();
90  
91          Verifier verifier = newVerifier( testDir.getAbsolutePath() );
92          try
93          {
94              verifier.setAutoclean( false );
95              verifier.deleteDirectory( "target" );
96              try
97              {
98                  verifier.deleteArtifacts( "org.apache.maven.its.mng4554" );
99              }
100             catch ( IOException e )
101             {
102                 // expected when running test on Windows using embedded Maven (JAR files locked by plugin class realm)
103                 assertFalse( new File( verifier.getArtifactMetadataPath( "org.apache.maven.its.mng4554", null, null, "maven-metadata-mng4554.xml" ) ).exists() );
104             }
105             Properties filterProps = verifier.newDefaultFilterProperties();
106             filterProps.setProperty( "@port@", Integer.toString( server.getConnectors()[0].getLocalPort() ) );
107             filterProps.setProperty( "@repo@", "repo-1" );
108             verifier.filterFile( "settings-template.xml", "settings.xml", "UTF-8", filterProps );
109             verifier.getCliOptions().add( "-s" );
110             verifier.getCliOptions().add( "settings.xml" );
111 
112             verifier.setLogFileName( "log-cached-1.txt" );
113             verifier.executeGoal( "a:touch" );
114             verifier.verifyErrorFreeLog();
115 
116             verifier.assertFilePresent( "target/touch.txt" );
117             assertTrue( requestedUris.toString(), requestedUris.contains( metadataUri ) );
118 
119             requestedUris.clear();
120 
121             verifier.setLogFileName( "log-cached-2.txt" );
122             verifier.executeGoal( "a:touch" );
123             verifier.verifyErrorFreeLog();
124 
125             assertFalse( requestedUris.toString(), requestedUris.contains( metadataUri ) );
126         }
127         finally
128         {
129             verifier.resetStreams();
130             server.stop();
131         }
132     }
133 
134     /**
135      * Test that the local metadata holding the plugin prefix mapping can be forcefully updated via the command
136      * line flag -U.
137      */
138     public void testitForcedUpdate()
139         throws Exception
140     {
141         File testDir = ResourceExtractor.simpleExtractResources( getClass(), "/mng-4554" );
142 
143         String metadataUri = "/repo-1/org/apache/maven/its/mng4554/maven-metadata.xml";
144 
145         final List requestedUris = Collections.synchronizedList( new ArrayList() );
146 
147         AbstractHandler logHandler = new AbstractHandler()
148         {
149             public void handle( String target, HttpServletRequest request, HttpServletResponse response, int dispatch )
150                 throws IOException, ServletException
151             {
152                 requestedUris.add( request.getRequestURI() );
153             }
154         };
155 
156         ResourceHandler repoHandler = new ResourceHandler();
157         repoHandler.setResourceBase( testDir.getAbsolutePath() );
158 
159         HandlerList handlerList = new HandlerList();
160         handlerList.addHandler( logHandler );
161         handlerList.addHandler( repoHandler );
162         handlerList.addHandler( new DefaultHandler() );
163 
164         Server server = new Server( 0 );
165         server.setHandler( handlerList );
166         server.start();
167 
168         Verifier verifier = newVerifier( testDir.getAbsolutePath() );
169         try
170         {
171             verifier.setAutoclean( false );
172             verifier.deleteDirectory( "target" );
173             try
174             {
175                 verifier.deleteArtifacts( "org.apache.maven.its.mng4554" );
176             }
177             catch ( IOException e )
178             {
179                 // expected when running test on Windows using embedded Maven (JAR files locked by plugin class realm)
180                 assertFalse( new File( verifier.getArtifactMetadataPath( "org.apache.maven.its.mng4554", null, null, "maven-metadata-mng4554.xml" ) ).exists() );
181             }
182             Properties filterProps = verifier.newDefaultFilterProperties();
183             filterProps.setProperty( "@port@", Integer.toString( server.getConnectors()[0].getLocalPort() ) );
184             filterProps.setProperty( "@repo@", "repo-1" );
185             verifier.filterFile( "settings-template.xml", "settings.xml", "UTF-8", filterProps );
186             verifier.getCliOptions().add( "-U" );
187             verifier.getCliOptions().add( "-s" );
188             verifier.getCliOptions().add( "settings.xml" );
189 
190             verifier.setLogFileName( "log-forced-1.txt" );
191             verifier.executeGoal( "a:touch" );
192             verifier.verifyErrorFreeLog();
193 
194             verifier.assertFilePresent( "target/touch.txt" );
195             assertTrue( requestedUris.toString(), requestedUris.contains( metadataUri ) );
196 
197             requestedUris.clear();
198 
199             verifier.setLogFileName( "log-forced-2.txt" );
200             verifier.executeGoal( "a:touch" );
201             verifier.verifyErrorFreeLog();
202 
203             assertTrue( requestedUris.toString(), requestedUris.contains( metadataUri ) );
204         }
205         finally
206         {
207             verifier.resetStreams();
208             server.stop();
209         }
210     }
211 
212     /**
213      * Test that the local metadata holding the plugin prefix mapping is automatically refetched from the remote
214      * repositories if the local metadata fails to resolve a new/other plugin prefix.
215      */
216     public void testitRefetched()
217         throws Exception
218     {
219         requiresMavenVersion( "[3.0-alpha-3,)" );
220 
221         File testDir = ResourceExtractor.simpleExtractResources( getClass(), "/mng-4554" );
222 
223         String metadataUri = "/repo-it/org/apache/maven/its/mng4554/maven-metadata.xml";
224 
225         final List requestedUris = Collections.synchronizedList( new ArrayList() );
226 
227         AbstractHandler logHandler = new AbstractHandler()
228         {
229             public void handle( String target, HttpServletRequest request, HttpServletResponse response, int dispatch )
230                 throws IOException, ServletException
231             {
232                 requestedUris.add( request.getRequestURI() );
233             }
234         };
235 
236         ResourceHandler repoHandler = new ResourceHandler();
237         repoHandler.setResourceBase( testDir.getAbsolutePath() );
238 
239         HandlerList handlerList = new HandlerList();
240         handlerList.addHandler( logHandler );
241         handlerList.addHandler( repoHandler );
242         handlerList.addHandler( new DefaultHandler() );
243 
244         Server server = new Server( 0 );
245         server.setHandler( handlerList );
246         server.start();
247 
248         Verifier verifier = newVerifier( testDir.getAbsolutePath() );
249         try
250         {
251             verifier.setAutoclean( false );
252             verifier.deleteDirectory( "target" );
253             try
254             {
255                 verifier.deleteArtifacts( "org.apache.maven.its.mng4554" );
256             }
257             catch ( IOException e )
258             {
259                 // expected when running test on Windows using embedded Maven (JAR files locked by plugin class realm)
260                 assertFalse( new File( verifier.getArtifactMetadataPath( "org.apache.maven.its.mng4554", null, null, "maven-metadata-mng4554.xml" ) ).exists() );
261             }
262             Properties filterProps = verifier.newDefaultFilterProperties();
263             filterProps.setProperty( "@port@", Integer.toString( server.getConnectors()[0].getLocalPort() ) );
264             filterProps.setProperty( "@repo@", "repo-it" );
265             verifier.filterFile( "settings-template.xml", "settings.xml", "UTF-8", filterProps );
266             verifier.getCliOptions().add( "-s" );
267             verifier.getCliOptions().add( "settings.xml" );
268 
269             FileUtils.copyDirectoryStructure( new File( testDir, "repo-1" ), new File( testDir, "repo-it" ) );
270 
271             verifier.setLogFileName( "log-refetched-1.txt" );
272             verifier.executeGoal( "a:touch" );
273             verifier.verifyErrorFreeLog();
274 
275             verifier.assertFilePresent( "target/touch.txt" );
276             assertTrue( requestedUris.toString(), requestedUris.contains( metadataUri ) );
277 
278             requestedUris.clear();
279 
280             // simulate deployment of new plugin which updates the prefix mapping in the remote repo
281             FileUtils.copyDirectoryStructure( new File( testDir, "repo-2" ), new File( testDir, "repo-it" ) );
282 
283             verifier.setLogFileName( "log-refetched-2.txt" );
284             verifier.executeGoal( "b:touch" );
285             verifier.verifyErrorFreeLog();
286 
287             assertTrue( requestedUris.toString(), requestedUris.contains( metadataUri ) );
288         }
289         finally
290         {
291             verifier.resetStreams();
292             server.stop();
293         }
294     }
295 
296 }