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