]> source.dussan.org Git - archiva.git/blob
c0b24cee5254262c10518e313d54c6fea4efad70
[archiva.git] /
1 package org.apache.maven.archiva.web.repository;
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 com.meterware.httpunit.GetMethodWebRequest;
23 import com.meterware.httpunit.PutMethodWebRequest;
24 import com.meterware.httpunit.WebLink;
25 import com.meterware.httpunit.WebRequest;
26 import com.meterware.httpunit.WebResponse;
27 import com.meterware.servletunit.ServletRunner;
28 import com.meterware.servletunit.ServletUnitClient;
29
30 import org.apache.commons.io.FileUtils;
31 import org.apache.maven.archiva.configuration.ArchivaConfiguration;
32 import org.apache.maven.archiva.configuration.Configuration;
33 import org.apache.maven.archiva.configuration.ManagedRepositoryConfiguration;
34 import org.apache.maven.archiva.configuration.RemoteRepositoryConfiguration;
35 import org.codehaus.plexus.PlexusConstants;
36 import org.codehaus.plexus.PlexusTestCase;
37 import org.codehaus.plexus.webdav.util.MimeTypes;
38
39 import java.io.File;
40 import java.io.IOException;
41
42 import javax.servlet.ServletContext;
43 import javax.servlet.http.HttpServletResponse;
44 import javax.servlet.http.HttpSession;
45
46 /**
47  * RepositoryServletTest 
48  *
49  * @author <a href="mailto:joakime@apache.org">Joakim Erdfelt</a>
50  * @version $Id$
51  */
52 public class RepositoryServletTest
53     extends PlexusTestCase
54 {
55     private ServletUnitClient sc;
56
57     private static final String REQUEST_PATH = "http://localhost/repository/internal/path/to/artifact.jar";
58
59     private File repositoryLocation;
60
61     private ArchivaConfiguration configuration;
62
63     private static final String REPOSITORY_ID = "internal";
64
65     private static final String NEW_REPOSITORY_ID = "new-id";
66
67     private static final String NEW_REPOSITORY_NAME = "New Repository";
68
69     protected void setUp()
70         throws Exception
71     {
72         super.setUp();
73
74         String appserverBase = getTestFile( "target/appserver-base" ).getAbsolutePath();
75         System.setProperty( "appserver.base", appserverBase );
76
77         File testConf = getTestFile( "src/test/resources/repository-archiva.xml" );
78         File testConfDest = new File( appserverBase, "conf/archiva.xml" );
79         FileUtils.copyFile( testConf, testConfDest );
80
81         configuration = (ArchivaConfiguration) lookup( ArchivaConfiguration.ROLE );
82         repositoryLocation = new File( appserverBase, "data/repositories/internal" );
83         Configuration config = configuration.getConfiguration();
84
85         config.addManagedRepository( createManagedRepository( "internal", "Internal Test Repo", repositoryLocation ) );
86         saveConfiguration();
87
88         ServletRunner sr = new ServletRunner();
89         sr.registerServlet( "/repository/*", UnauthenticatedRepositoryServlet.class.getName() );
90         sc = sr.newClient();
91         HttpSession session = sc.getSession( true );
92         ServletContext servletContext = session.getServletContext();
93         servletContext.setAttribute( PlexusConstants.PLEXUS_KEY, getContainer() );
94     }
95
96     public void testPutWithMissingParentCollection()
97         throws Exception
98     {
99         FileUtils.deleteDirectory( repositoryLocation );
100
101         WebRequest request = new PutMethodWebRequest( REQUEST_PATH, getClass().getResourceAsStream( "/artifact.jar" ),
102                                                       "application/octet-stream" );
103         WebResponse response = sc.getResponse( request );
104         assertNotNull( "Should have received response", response );
105         assertEquals( "file contents", "artifact.jar\n", FileUtils
106             .readFileToString( new File( repositoryLocation, "path/to/artifact.jar" ), null ) );
107     }
108
109     public void testGetRepository()
110         throws Exception
111     {
112         RepositoryServlet servlet = (RepositoryServlet) sc.newInvocation( REQUEST_PATH ).getServlet();
113         assertNotNull( servlet );
114
115         assertRepositoryValid( servlet, REPOSITORY_ID );
116     }
117
118     public void testGetRepositoryAfterDelete()
119         throws Exception
120     {
121         RepositoryServlet servlet = (RepositoryServlet) sc.newInvocation( REQUEST_PATH ).getServlet();
122         assertNotNull( servlet );
123
124         Configuration c = configuration.getConfiguration();
125         c.removeManagedRepository( c.findManagedRepositoryById( REPOSITORY_ID ) );
126         saveConfiguration();
127
128         ManagedRepositoryConfiguration repository = servlet.getRepository( REPOSITORY_ID );
129         assertNull( repository );
130     }
131
132     public void testGetRepositoryAfterAdd()
133         throws Exception
134     {
135         RepositoryServlet servlet = (RepositoryServlet) sc.newInvocation( REQUEST_PATH ).getServlet();
136         assertNotNull( servlet );
137
138         Configuration c = configuration.getConfiguration();
139         ManagedRepositoryConfiguration repo = new ManagedRepositoryConfiguration();
140         repo.setId( NEW_REPOSITORY_ID );
141         repo.setName( NEW_REPOSITORY_NAME );
142         File repoRoot = new File( getBasedir(), "target/test-repository-root" );
143         if ( !repoRoot.exists() )
144         {
145             repoRoot.mkdirs();
146         }
147         repo.setLocation( repoRoot.getAbsolutePath() );
148         c.addManagedRepository( repo );
149         saveConfiguration();
150
151         ManagedRepositoryConfiguration repository = servlet.getRepository( NEW_REPOSITORY_ID );
152         assertNotNull( repository );
153         assertEquals( NEW_REPOSITORY_NAME, repository.getName() );
154
155         // check other is still intact
156         assertRepositoryValid( servlet, REPOSITORY_ID );
157     }
158
159     public void testBrowse()
160         throws Exception
161     {
162         RepositoryServlet servlet = (RepositoryServlet) sc.newInvocation( REQUEST_PATH ).getServlet();
163         assertNotNull( servlet );
164         assertRepositoryValid( servlet, REPOSITORY_ID );
165
166         new File( repositoryLocation, "org/apache/archiva" ).mkdirs();
167         new File( repositoryLocation, "net/sourceforge" ).mkdirs();
168         new File( repositoryLocation, "commons-lang" ).mkdirs();
169
170         WebRequest request = new GetMethodWebRequest( "http://machine.com/repository/internal/" );
171         WebResponse response = sc.getResponse( request );
172         assertEquals( "Response", HttpServletResponse.SC_OK, response.getResponseCode() );
173
174         // dumpResponse( response );
175
176         WebLink links[] = response.getLinks();
177         String expectedLinks[] = new String[] { "./commons-lang/", "./net/", "./org/", "./path/" };
178
179         assertEquals( "Links.length", expectedLinks.length, links.length );
180         for ( int i = 0; i < links.length; i++ )
181         {
182             assertEquals( "Link[" + i + "]", expectedLinks[i], links[i].getURLString() );
183         }
184     }
185
186     public void testGetNoProxyChecksumDefaultLayout()
187         throws Exception
188     {
189         RepositoryServlet servlet = (RepositoryServlet) sc.newInvocation( REQUEST_PATH ).getServlet();
190         assertNotNull( servlet );
191         assertRepositoryValid( servlet, REPOSITORY_ID );
192
193         String commonsLangSha1 = "commons-lang/commons-lang/2.1/commons-lang-2.1.jar.sha1";
194
195         File checksumFile = new File( repositoryLocation, commonsLangSha1 );
196         checksumFile.getParentFile().mkdirs();
197
198         FileUtils.writeStringToFile( checksumFile, "dummy-checksum", null );
199         
200         WebRequest request = new GetMethodWebRequest( "http://machine.com/repository/internal/" + commonsLangSha1 );
201         WebResponse response = sc.getResponse( request );
202         assertEquals( "Response OK", HttpServletResponse.SC_OK, response.getResponseCode() );
203
204         assertEquals( "Expected file contents", "dummy-checksum", response.getText() );
205     }
206     
207     public void testGetNoProxyChecksumLegacyLayout()
208         throws Exception
209     {
210         RepositoryServlet servlet = (RepositoryServlet) sc.newInvocation( REQUEST_PATH ).getServlet();
211         assertNotNull( servlet );
212         assertRepositoryValid( servlet, REPOSITORY_ID );
213
214         String commonsLangSha1 = "commons-lang/commons-lang/2.1/commons-lang-2.1.jar.sha1";
215
216         File checksumFile = new File( repositoryLocation, commonsLangSha1 );
217         checksumFile.getParentFile().mkdirs();
218
219         FileUtils.writeStringToFile( checksumFile, "dummy-checksum", null );
220
221         WebRequest request = new GetMethodWebRequest( "http://machine.com/repository/internal/" + 
222                                                       "commons-lang/jars/commons-lang-2.1.jar.sha1" );
223         WebResponse response = sc.getResponse( request );
224         assertEquals( "Response OK", HttpServletResponse.SC_OK, response.getResponseCode() );
225
226         assertEquals( "Expected file contents", "dummy-checksum", response.getText() );
227     }
228     
229     public void testGetNoProxyVersionedMetadataDefaultLayout()
230         throws Exception
231     {
232         RepositoryServlet servlet = (RepositoryServlet) sc.newInvocation( REQUEST_PATH ).getServlet();
233         assertNotNull( servlet );
234         assertRepositoryValid( servlet, REPOSITORY_ID );
235
236         String commonsLangMetadata = "commons-lang/commons-lang/2.1/maven-metadata.xml";
237         String expectedMetadataContents = "dummy-versioned-metadata";
238
239         File metadataFile = new File( repositoryLocation, commonsLangMetadata );
240         metadataFile.getParentFile().mkdirs();
241
242         FileUtils.writeStringToFile( metadataFile, expectedMetadataContents, null );
243
244         WebRequest request = new GetMethodWebRequest( "http://machine.com/repository/internal/" + commonsLangMetadata );
245         WebResponse response = sc.getResponse( request );
246         assertEquals( "Response OK", HttpServletResponse.SC_OK, response.getResponseCode() );
247
248         assertEquals( "Expected file contents", expectedMetadataContents, response.getText() );
249     }
250     
251     public void testGetNoProxyProjectMetadataDefaultLayout()
252         throws Exception
253     {
254         RepositoryServlet servlet = (RepositoryServlet) sc.newInvocation( REQUEST_PATH ).getServlet();
255         assertNotNull( servlet );
256         assertRepositoryValid( servlet, REPOSITORY_ID );
257
258         String commonsLangMetadata = "commons-lang/commons-lang/maven-metadata.xml";
259         String expectedMetadataContents = "dummy-project-metadata";
260
261         File metadataFile = new File( repositoryLocation, commonsLangMetadata );
262         metadataFile.getParentFile().mkdirs();
263
264         FileUtils.writeStringToFile( metadataFile, expectedMetadataContents, null );
265
266         WebRequest request = new GetMethodWebRequest( "http://machine.com/repository/internal/" + commonsLangMetadata );
267         WebResponse response = sc.getResponse( request );
268         assertEquals( "Response OK", HttpServletResponse.SC_OK, response.getResponseCode() );
269
270         assertEquals( "Expected file contents", expectedMetadataContents, response.getText() );
271     }
272     
273     public void testGetNoProxyArtifactDefaultLayout()
274         throws Exception
275     {
276         RepositoryServlet servlet = (RepositoryServlet) sc.newInvocation( REQUEST_PATH ).getServlet();
277         assertNotNull( servlet );
278         assertRepositoryValid( servlet, REPOSITORY_ID );
279
280         String commonsLangJar = "commons-lang/commons-lang/2.1/commons-lang-2.1.jar";
281         String expectedArtifactContents = "dummy-commons-lang-artifact";
282
283         File artifactFile = new File( repositoryLocation, commonsLangJar );
284         artifactFile.getParentFile().mkdirs();
285
286         FileUtils.writeStringToFile( artifactFile, expectedArtifactContents, null );
287
288         WebRequest request = new GetMethodWebRequest( "http://machine.com/repository/internal/" + commonsLangJar );
289         WebResponse response = sc.getResponse( request );
290         assertEquals( "Response OK", HttpServletResponse.SC_OK, response.getResponseCode() );
291
292         assertEquals( "Expected file contents", expectedArtifactContents, response.getText() );
293     }
294     
295     public void testMimeTypesAvailable()
296         throws Exception
297     {
298         MimeTypes mimeTypes = (MimeTypes) lookup( MimeTypes.class );
299         assertNotNull( mimeTypes );
300         
301         // Test for some added types.
302         assertEquals( "sha1", "text/plain", mimeTypes.getMimeType( "foo.sha1" ) );
303         assertEquals( "md5", "text/plain", mimeTypes.getMimeType( "foo.md5" ) );
304         assertEquals( "pgp", "application/pgp-encrypted", mimeTypes.getMimeType( "foo.pgp" ) );
305     }
306
307     private void dumpResponse( WebResponse response )
308     {
309         System.out.println( "---(response)---" );
310         System.out.println( "" + response.getResponseCode() + " " + response.getResponseMessage() );
311
312         String headerNames[] = response.getHeaderFieldNames();
313         for ( String headerName : headerNames )
314         {
315             System.out.println( "[header] " + headerName + ": " + response.getHeaderField( headerName ) );
316         }
317
318         System.out.println( "---(text)---" );
319         try
320         {
321             System.out.println( response.getText() );
322         }
323         catch ( IOException e )
324         {
325             System.err.print( "[Exception] : " );
326             e.printStackTrace( System.err );
327         }
328     }
329
330     private void assertRepositoryValid( RepositoryServlet servlet, String repoId )
331     {
332         ManagedRepositoryConfiguration repository = servlet.getRepository( repoId );
333         assertNotNull( "Archiva Managed Repository id:<" + repoId + "> should exist.", repository );
334         File repoRoot = new File( repository.getLocation() );
335         assertTrue( "Archiva Managed Repository id:<" + repoId + "> should have a valid location on disk.", repoRoot
336             .exists()
337             && repoRoot.isDirectory() );
338     }
339
340     private void saveConfiguration()
341         throws Exception
342     {
343         configuration.save( configuration.getConfiguration() );
344         // TODO it would be better to use a mock configuration and "save" to more accurately reflect the calls made
345         // RepositoryServlet servlet
346         // servlet.configurationEvent( new ConfigurationEvent( ConfigurationEvent.SAVED ) );
347     }
348
349     private ManagedRepositoryConfiguration createManagedRepository( String id, String name, File location )
350     {
351         ManagedRepositoryConfiguration repo = new ManagedRepositoryConfiguration();
352         repo.setId( id );
353         repo.setName( name );
354         repo.setLocation( location.getAbsolutePath() );
355         return repo;
356     }
357
358     private RemoteRepositoryConfiguration createRemoteRepository( String id, String name, String url )
359     {
360         RemoteRepositoryConfiguration repo = new RemoteRepositoryConfiguration();
361         repo.setId( id );
362         repo.setName( name );
363         repo.setUrl( url );
364         return repo;
365     }
366 }