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