View Javadoc

1   package org.apache.maven.archiva.webdav;
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.io.InputStream;
24  import java.util.ArrayList;
25  import java.util.List;
26  
27  import javax.servlet.http.HttpServletResponse;
28  
29  import org.apache.commons.io.FileUtils;
30  import org.apache.commons.lang.StringUtils;
31  import org.apache.maven.archiva.configuration.Configuration;
32  import org.apache.maven.archiva.configuration.ManagedRepositoryConfiguration;
33  import org.apache.maven.archiva.configuration.RepositoryGroupConfiguration;
34  import org.apache.maven.archiva.model.ArchivaRepositoryMetadata;
35  import org.apache.maven.archiva.repository.metadata.RepositoryMetadataReader;
36  
37  import com.meterware.httpunit.GetMethodWebRequest;
38  import com.meterware.httpunit.PutMethodWebRequest;
39  import com.meterware.httpunit.WebRequest;
40  import com.meterware.httpunit.WebResponse;
41  
42  
43  /**
44   * RepositoryServletRepositoryGroupTest
45   * 
46   * Test Case 1.  Accessing a valid repository group root url (e.g. http://machine.com/repository/repository-group/) returns a Bad Request (HTTP 400)
47   * Test Case 2.  Accessing an invalid repository group root url is forwarded to managed repository checking (this is not covered here)
48   * Test Case 3.  Accessing an artifact in a valid repository group will iterate over the managed repositories in the repository group
49   *     Test Case 3.a.  If an invalid managed repository is encountered (managed repository doesn't exist),
50   *                     a Not Found (HTTP 404) is returned and the iteration is broken
51   *     Test Case 3.b.  If an artifact is not found in a valid managed repository (after proxying, etc.),
52   *                     a Not Found (HTTP 404) is set but not returned yet, the iteration continues to the next managed repository.
53   *                     The Not Found (HTTP 404) is returned after exhausting all valid managed repositories
54   *     Test Case 3.c.  If an artifact is found in a valid managed repository,
55   *                     the artifact is returned, the iteration is broken and any Not Found (HTTP 404) is disregarded
56   * Test Case 4.  Accessing a valid repository group with any http write method returns a Bad Request (HTTP 400)
57   *                     
58   *
59   */
60  public class RepositoryServletRepositoryGroupTest
61      extends AbstractRepositoryServletTestCase
62  {
63      protected File repoRootFirst;
64      
65      protected File repoRootLast;
66      
67      protected File repoRootInvalid;
68      
69      protected static final String MANAGED_REPO_FIRST = "first";
70      
71      protected static final String MANAGED_REPO_LAST = "last";
72      
73      protected static final String MANAGED_REPO_INVALID = "invalid";
74      
75      protected static final String REPO_GROUP_WITH_VALID_REPOS = "group-with-valid-repos";
76  
77      protected static final String REPO_GROUP_WITH_INVALID_REPOS = "group-with-invalid-repos";
78      
79      
80      @Override
81      protected void setUp()
82          throws Exception
83      {
84          super.setUp();
85          
86          String appserverBase = System.getProperty( "appserver.base" );
87          
88          Configuration configuration = archivaConfiguration.getConfiguration();
89          
90          repoRootFirst = new File( appserverBase, "data/repositories/" + MANAGED_REPO_FIRST );
91          repoRootLast = new File( appserverBase, "data/repositories/" + MANAGED_REPO_LAST );
92          
93          configuration.addManagedRepository( createManagedRepository( MANAGED_REPO_FIRST, "First Test Repo", repoRootFirst, true ) );
94          configuration.addManagedRepository( createManagedRepository( MANAGED_REPO_LAST, "Last Test Repo", repoRootLast, true ) );
95          
96          List<String> managedRepoIds = new ArrayList<String>();
97          managedRepoIds.add( MANAGED_REPO_FIRST );
98          managedRepoIds.add( MANAGED_REPO_LAST );
99          
100         configuration.addRepositoryGroup( createRepositoryGroup( REPO_GROUP_WITH_VALID_REPOS, managedRepoIds ) );
101         
102         // Create the repository group with an invalid managed repository
103         repoRootInvalid = new File( appserverBase, "data/repositories/" + MANAGED_REPO_INVALID );
104         ManagedRepositoryConfiguration managedRepositoryConfiguration = createManagedRepository( MANAGED_REPO_INVALID, "Invalid Test Repo", repoRootInvalid, true );
105         
106         configuration.addManagedRepository( createManagedRepository( MANAGED_REPO_FIRST, "First Test Repo", repoRootFirst, true ) );
107         configuration.addManagedRepository( managedRepositoryConfiguration );
108         configuration.addManagedRepository( createManagedRepository( MANAGED_REPO_LAST, "Last Test Repo", repoRootLast, true ) );
109         
110         List<String> invalidManagedRepoIds = new ArrayList<String>();
111         invalidManagedRepoIds.add( MANAGED_REPO_FIRST );
112         invalidManagedRepoIds.add( MANAGED_REPO_INVALID );
113         invalidManagedRepoIds.add( MANAGED_REPO_LAST );
114         
115         configuration.addRepositoryGroup( createRepositoryGroup( REPO_GROUP_WITH_INVALID_REPOS, invalidManagedRepoIds ) );
116         
117         configuration.removeManagedRepository( managedRepositoryConfiguration );
118         FileUtils.deleteDirectory( repoRootInvalid );
119         
120         saveConfiguration( archivaConfiguration );
121     }
122     
123     @Override
124     protected void tearDown()
125         throws Exception
126     {
127         setupCleanRepo( repoRootFirst );
128         setupCleanRepo( repoRootLast );
129         
130         super.tearDown();
131     }
132         
133     /*
134      * Test Case 3.c
135      */
136     public void testGetFromFirstManagedRepositoryReturnOk()
137         throws Exception
138     {
139         String resourceName = "dummy/dummy-first-resource/1.0/dummy-first-resource-1.0.txt";
140         
141         File dummyInternalResourceFile = new File( repoRootFirst, resourceName );
142         dummyInternalResourceFile.getParentFile().mkdirs();
143         FileUtils.writeStringToFile( dummyInternalResourceFile, "first", null );
144         
145         WebRequest request = new GetMethodWebRequest( "http://machine.com/repository/" + REPO_GROUP_WITH_VALID_REPOS + "/" + resourceName );
146         WebResponse response = sc.getResponse( request );
147         
148         assertResponseOK( response );
149         assertEquals( "Expected file contents", "first", response.getText() );
150     }
151     
152     /*
153      * Test Case 3.c
154      */
155     public void testGetFromLastManagedRepositoryReturnOk()
156         throws Exception
157     {        
158         String resourceName = "dummy/dummy-last-resource/1.0/dummy-last-resource-1.0.txt";
159         
160         File dummyReleasesResourceFile = new File( repoRootLast, resourceName );
161         dummyReleasesResourceFile.getParentFile().mkdirs();
162         FileUtils.writeStringToFile( dummyReleasesResourceFile, "last", null );
163     
164         WebRequest request = new GetMethodWebRequest( "http://machine.com/repository/" + REPO_GROUP_WITH_VALID_REPOS + "/" + resourceName );
165         WebResponse response = sc.getResponse( request );
166         
167         assertResponseOK( response );
168         assertEquals( "Expected file contents", "last", response.getText() );
169     }
170     
171     /*
172      * Test Case 3.b
173      */
174     public void testGetFromValidRepositoryGroupReturnNotFound()
175         throws Exception
176     {
177         String resourceName = "dummy/dummy-no-resource/1.0/dummy-no-resource-1.0.txt";
178         
179         WebRequest request = new GetMethodWebRequest( "http://machine.com/repository/" + REPO_GROUP_WITH_VALID_REPOS + "/" + resourceName );
180         WebResponse response = sc.getResponse( request );
181         
182         assertResponseNotFound( response );
183     } 
184     
185     /*
186      * Test Case 3.a
187      */
188     public void testGetInvalidManagedRepositoryInGroupReturnNotFound()
189         throws Exception
190     {
191         String resourceName = "dummy/dummy-no-resource/1.0/dummy-no-resource-1.0.txt";
192         
193         WebRequest request = new GetMethodWebRequest( "http://machine.com/repository/" + REPO_GROUP_WITH_INVALID_REPOS + "/" + resourceName );
194         WebResponse response = sc.getResponse( request );
195         
196         assertResponseInternalServerError( response );
197     }
198     
199     /*
200      * Test Case 4
201      */
202     public void testPutValidRepositoryGroupReturnBadRequest()
203         throws Exception
204     {
205         String resourceName = "dummy/dummy-put-resource/1.0/dummy-put-resource-1.0.txt";
206         String putUrl = "http://machine.com/repository/" + REPO_GROUP_WITH_VALID_REPOS + "/" + resourceName;
207         InputStream is = getClass().getResourceAsStream( "/artifact.jar" );
208         
209         WebRequest request = new PutMethodWebRequest( putUrl, is, "text/plain" );
210         WebResponse response = sc.getResponse( request );
211          
212         assertResponseMethodNotAllowed( response );
213     }
214         
215     // MRM-872
216     public void testGetMergedMetadata()
217         throws Exception
218     {   
219         // first metadata file        
220         String resourceName = "dummy/dummy-merged-metadata-resource/maven-metadata.xml";  
221         
222         File dummyInternalResourceFile = new File( repoRootFirst, resourceName );
223         dummyInternalResourceFile.getParentFile().mkdirs();
224         FileUtils.writeStringToFile( dummyInternalResourceFile, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
225         		"<metadata>\n<groupId>dummy</groupId>\n<artifactId>dummy-merged-metadata-resource</artifactId>\n" +
226         		"<versioning>\n<latest>1.0</latest>\n<release>1.0</release>\n<versions>\n<version>1.0</version>\n" +
227         		"<version>2.5</version>\n</versions>\n<lastUpdated>20080708095554</lastUpdated>\n</versioning>\n</metadata>", null );
228         
229         //second metadata file
230         resourceName = "dummy/dummy-merged-metadata-resource/maven-metadata.xml";        
231         dummyInternalResourceFile = new File( repoRootLast, resourceName );
232         dummyInternalResourceFile.getParentFile().mkdirs();
233         FileUtils.writeStringToFile( dummyInternalResourceFile, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
234                 "<metadata><groupId>dummy</groupId><artifactId>dummy-merged-metadata-resource</artifactId>" +
235                 "<versioning><latest>2.0</latest><release>2.0</release><versions><version>1.0</version>" +
236                 "<version>1.5</version><version>2.0</version></versions><lastUpdated>20080709095554</lastUpdated>" +
237                 "</versioning></metadata>", null );
238         
239         WebRequest request = new GetMethodWebRequest( "http://machine.com/repository/" + REPO_GROUP_WITH_VALID_REPOS + "/dummy/" +
240                 "dummy-merged-metadata-resource/maven-metadata.xml" );
241         WebResponse response = sc.getResource( request );              
242         
243         File returnedMetadata = new File( getBasedir(), "/target/test-classes/retrievedMetadataFile.xml");
244         FileUtils.writeStringToFile( returnedMetadata, response.getText() );
245         ArchivaRepositoryMetadata metadata = RepositoryMetadataReader.read( returnedMetadata );        
246         
247         assertResponseOK( response );
248         assertEquals( "Versions list size", 4, metadata.getAvailableVersions().size() );
249         assertTrue( "Versions list contains version 1.0", metadata.getAvailableVersions().contains( "1.0" ) );
250         assertTrue( "Versions list contains version 1.5", metadata.getAvailableVersions().contains( "1.5" ) );
251         assertTrue( "Versions list contains version 2.0", metadata.getAvailableVersions().contains( "2.0" ) );
252         assertTrue( "Versions list contains version 2.5", metadata.getAvailableVersions().contains( "2.5" ) );
253         
254         //check if the checksum files were generated
255         File checksumFileSha1 = new File( repoRootFirst, resourceName + ".sha1" );
256         checksumFileSha1.getParentFile().mkdirs();
257         FileUtils.writeStringToFile( checksumFileSha1, "3290853214d3687134", null );
258         
259         File checksumFileMd5 = new File( repoRootFirst, resourceName + ".md5" );
260         checksumFileMd5.getParentFile().mkdirs();
261         FileUtils.writeStringToFile( checksumFileMd5, "98745897234eda12836423", null );
262         
263         // request the sha1 checksum of the metadata
264         request =
265             new GetMethodWebRequest( "http://machine.com/repository/" + REPO_GROUP_WITH_VALID_REPOS + "/dummy/" +
266                 "dummy-merged-metadata-resource/maven-metadata.xml.sha1" );
267         response = sc.getResource( request );
268         
269         assertResponseOK( response );
270         assertEquals( "add113b0d7f8c6adb92a5015a7a3701081edf998  maven-metadata-group-with-valid-repos.xml", response.getText() );
271         
272         // request the md5 checksum of the metadata
273         request =
274             new GetMethodWebRequest( "http://machine.com/repository/" + REPO_GROUP_WITH_VALID_REPOS + "/dummy/" +
275                 "dummy-merged-metadata-resource/maven-metadata.xml.md5" );
276         response = sc.getResource( request );
277                 
278         assertResponseOK( response );
279         assertEquals( "5b85ea4aa5f52bb76760041a52f98de8  maven-metadata-group-with-valid-repos.xml", response.getText().trim() );
280     }
281     
282     // MRM-901
283     public void testBrowseWithTwoArtifactsWithSameGroupIdInRepos()
284         throws Exception
285     {
286         String resourceName = "dummy/dummy-artifact/1.0/dummy-artifact-1.0.txt";
287         
288         File dummyInternalResourceFile = new File( repoRootFirst, resourceName );
289         dummyInternalResourceFile.getParentFile().mkdirs();
290         FileUtils.writeStringToFile( dummyInternalResourceFile, "first", null );
291         
292         resourceName = "dummy/dummy-artifact/2.0/dummy-artifact-2.0.txt";
293         
294         File dummyReleasesResourceFile = new File( repoRootLast, resourceName );
295         dummyReleasesResourceFile.getParentFile().mkdirs();
296         FileUtils.writeStringToFile( dummyReleasesResourceFile, "last", null );
297         
298         WebRequest request = new GetMethodWebRequest( "http://machine.com/repository/" + REPO_GROUP_WITH_VALID_REPOS + "/dummy/dummy-artifact/" );
299         WebResponse response = sc.getResource( request );
300         
301         assertResponseOK( response );
302         assertTrue( StringUtils.contains( response.getText(), "Collection" ) );
303         assertTrue( StringUtils.contains( response.getText(), "dummy/dummy-artifact" ) );
304         assertTrue( StringUtils.contains( response.getText(), "1.0" ) );
305         assertTrue( StringUtils.contains( response.getText(), "2.0" ) );
306     }
307         
308     protected void assertResponseMethodNotAllowed( WebResponse response )
309     {
310         assertNotNull( "Should have recieved a response", response );
311         assertEquals( "Should have been an 405/Method Not Allowed response code.", HttpServletResponse.SC_METHOD_NOT_ALLOWED, response.getResponseCode() );
312     }
313 
314     protected RepositoryGroupConfiguration createRepositoryGroup( String id, List<String> repositories )
315     {
316         RepositoryGroupConfiguration repoGroupConfiguration = new RepositoryGroupConfiguration();
317         repoGroupConfiguration.setId( id );
318         repoGroupConfiguration.setRepositories( repositories );
319         return repoGroupConfiguration;
320     }
321 }