]> source.dussan.org Git - archiva.git/blob
5eaccf4a16d3cb86c439de48b4e67b9d37babf27
[archiva.git] /
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 import com.gargoylesoftware.htmlunit.HttpMethod;
23 import com.gargoylesoftware.htmlunit.NicelyResynchronizingAjaxController;
24 import com.gargoylesoftware.htmlunit.WebClient;
25 import com.gargoylesoftware.htmlunit.WebRequest;
26 import com.gargoylesoftware.htmlunit.WebResponse;
27 import junit.framework.Assert;
28 import junit.framework.TestCase;
29 import net.sf.ehcache.CacheManager;
30 import org.apache.archiva.admin.model.beans.ManagedRepository;
31 import org.apache.archiva.admin.model.managed.ManagedRepositoryAdmin;
32 import org.apache.archiva.configuration.ArchivaConfiguration;
33 import org.apache.archiva.configuration.Configuration;
34 import org.apache.archiva.configuration.ManagedRepositoryConfiguration;
35 import org.apache.archiva.configuration.RemoteRepositoryConfiguration;
36 import org.apache.archiva.test.utils.ArchivaSpringJUnit4ClassRunner;
37 import org.apache.archiva.webdav.util.MavenIndexerCleaner;
38 import org.apache.catalina.core.StandardContext;
39 import org.apache.catalina.startup.Tomcat;
40 import org.apache.commons.io.FileUtils;
41 import org.junit.After;
42 import org.junit.Before;
43 import org.junit.runner.RunWith;
44 import org.slf4j.Logger;
45 import org.slf4j.LoggerFactory;
46 import org.springframework.beans.BeansException;
47 import org.springframework.beans.factory.BeanFactory;
48 import org.springframework.beans.factory.NoSuchBeanDefinitionException;
49 import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
50 import org.springframework.context.ApplicationContext;
51 import org.springframework.context.ApplicationEvent;
52 import org.springframework.context.MessageSourceResolvable;
53 import org.springframework.context.NoSuchMessageException;
54 import org.springframework.core.env.Environment;
55 import org.springframework.core.io.Resource;
56 import org.springframework.mock.web.MockHttpServletRequest;
57 import org.springframework.mock.web.MockHttpServletResponse;
58 import org.springframework.mock.web.MockServletConfig;
59 import org.springframework.mock.web.MockServletContext;
60 import org.springframework.test.context.ContextConfiguration;
61 import org.springframework.web.context.WebApplicationContext;
62
63 import javax.inject.Inject;
64 import javax.servlet.Servlet;
65 import javax.servlet.ServletContext;
66 import javax.servlet.http.HttpServletRequest;
67 import javax.servlet.http.HttpServletResponse;
68 import java.io.File;
69 import java.io.IOException;
70 import java.io.InputStream;
71 import java.io.UnsupportedEncodingException;
72 import java.lang.annotation.Annotation;
73 import java.net.URL;
74 import java.nio.charset.Charset;
75 import java.util.Locale;
76 import java.util.Map;
77
78 /**
79  * AbstractRepositoryServletTestCase
80  */
81 @RunWith( ArchivaSpringJUnit4ClassRunner.class )
82 @ContextConfiguration( locations = { "classpath*:/META-INF/spring-context.xml", "classpath*:spring-context.xml",
83     "classpath*:/repository-servlet-simple.xml" } )
84 public abstract class AbstractRepositoryServletTestCase
85     extends TestCase
86 {
87     protected static final String REPOID_INTERNAL = "internal";
88
89     protected static final String REPOID_LEGACY = "legacy";
90
91     protected File repoRootInternal;
92
93     protected File repoRootLegacy;
94
95     @Inject
96     protected ArchivaConfiguration archivaConfiguration;
97
98     @Inject
99     protected ApplicationContext applicationContext;
100
101     @Inject
102     protected ManagedRepositoryAdmin managedRepositoryAdmin;
103
104     protected Logger log = LoggerFactory.getLogger( getClass() );
105
106
107     protected void saveConfiguration()
108         throws Exception
109     {
110         saveConfiguration( archivaConfiguration );
111     }
112
113     protected Tomcat tomcat;
114
115     protected static int port;
116
117
118     StandardContext context;
119
120     @Before
121     public void setUp()
122         throws Exception
123     {
124
125         super.setUp();
126
127         String appserverBase = new File( "target/appserver-base" ).getAbsolutePath();
128         System.setProperty( "appserver.base", appserverBase );
129
130         File testConf = new File( "src/test/resources/repository-archiva.xml" );
131         File testConfDest = new File( appserverBase, "conf/archiva.xml" );
132         if ( testConfDest.exists() )
133         {
134             FileUtils.deleteQuietly( testConfDest );
135         }
136         FileUtils.copyFile( testConf, testConfDest );
137
138
139         repoRootInternal = new File( appserverBase, "data/repositories/internal" );
140         repoRootLegacy = new File( appserverBase, "data/repositories/legacy" );
141         Configuration config = archivaConfiguration.getConfiguration();
142
143         config.getManagedRepositories().clear();
144
145         config.addManagedRepository(
146             createManagedRepository( REPOID_INTERNAL, "Internal Test Repo", repoRootInternal, true ) );
147
148         managedRepositoryAdmin.createIndexContext( managedRepositoryAdmin.getManagedRepository( REPOID_INTERNAL ) );
149
150         config.addManagedRepository(
151             createManagedRepository( REPOID_LEGACY, "Legacy Format Test Repo", repoRootLegacy, "legacy", true ) );
152
153         config.getProxyConnectors().clear();
154
155         config.getRemoteRepositories().clear();
156
157         saveConfiguration( archivaConfiguration );
158
159         CacheManager.getInstance().clearAll();
160
161         applicationContext.getBean( MavenIndexerCleaner.class ).cleanupIndex();
162
163
164     }
165
166     protected UnauthenticatedRepositoryServlet unauthenticatedRepositoryServlet =
167         new UnauthenticatedRepositoryServlet();
168
169     protected void startRepository()
170         throws Exception
171     {
172
173         final MockServletContext mockServletContext = new MockServletContext();
174
175         WebApplicationContext webApplicationContext =
176             new TestWebapplicationContext( applicationContext, mockServletContext );
177
178         mockServletContext.setAttribute( WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE,
179                                          webApplicationContext );
180
181         MockServletConfig mockServletConfig = new MockServletConfig()
182         {
183             @Override
184             public ServletContext getServletContext()
185             {
186                 return mockServletContext;
187             }
188         };
189
190         unauthenticatedRepositoryServlet.init( mockServletConfig );
191
192     }
193
194
195     static class TestWebapplicationContext
196         implements WebApplicationContext
197     {
198         private ApplicationContext applicationContext;
199
200         private ServletContext servletContext;
201
202         TestWebapplicationContext( ApplicationContext applicationContext, ServletContext servletContext )
203         {
204             this.applicationContext = applicationContext;
205         }
206
207         @Override
208         public ServletContext getServletContext()
209         {
210             return servletContext;
211         }
212
213         @Override
214         public String getId()
215         {
216             return applicationContext.getId();
217         }
218
219         @Override
220         public String getApplicationName()
221         {
222             return applicationContext.getApplicationName();
223         }
224
225         @Override
226         public String getDisplayName()
227         {
228             return applicationContext.getDisplayName();
229         }
230
231         @Override
232         public long getStartupDate()
233         {
234             return applicationContext.getStartupDate();
235         }
236
237         @Override
238         public ApplicationContext getParent()
239         {
240             return applicationContext.getParent();
241         }
242
243         @Override
244         public AutowireCapableBeanFactory getAutowireCapableBeanFactory()
245             throws IllegalStateException
246         {
247             return applicationContext.getAutowireCapableBeanFactory();
248         }
249
250         @Override
251         public void publishEvent( ApplicationEvent applicationEvent )
252         {
253             applicationContext.publishEvent( applicationEvent );
254         }
255
256         @Override
257         public Environment getEnvironment()
258         {
259             return applicationContext.getEnvironment();
260         }
261
262         @Override
263         public BeanFactory getParentBeanFactory()
264         {
265             return applicationContext.getParentBeanFactory();
266         }
267
268         @Override
269         public boolean containsLocalBean( String s )
270         {
271             return applicationContext.containsLocalBean( s );
272         }
273
274         @Override
275         public boolean containsBeanDefinition( String s )
276         {
277             return applicationContext.containsBeanDefinition( s );
278         }
279
280         @Override
281         public int getBeanDefinitionCount()
282         {
283             return applicationContext.getBeanDefinitionCount();
284         }
285
286         @Override
287         public String[] getBeanDefinitionNames()
288         {
289             return applicationContext.getBeanDefinitionNames();
290         }
291
292         @Override
293         public String[] getBeanNamesForType( Class<?> aClass )
294         {
295             return applicationContext.getBeanNamesForType( aClass );
296         }
297
298         @Override
299         public String[] getBeanNamesForType( Class<?> aClass, boolean b, boolean b2 )
300         {
301             return applicationContext.getBeanNamesForType( aClass, b, b2 );
302         }
303
304         @Override
305         public <T> Map<String, T> getBeansOfType( Class<T> tClass )
306             throws BeansException
307         {
308             return applicationContext.getBeansOfType( tClass );
309         }
310
311         @Override
312         public <T> Map<String, T> getBeansOfType( Class<T> tClass, boolean b, boolean b2 )
313             throws BeansException
314         {
315             return applicationContext.getBeansOfType( tClass, b, b2 );
316         }
317
318         @Override
319         public String[] getBeanNamesForAnnotation( Class<? extends Annotation> aClass )
320         {
321             return applicationContext.getBeanNamesForAnnotation( aClass );
322         }
323
324         @Override
325         public Map<String, Object> getBeansWithAnnotation( Class<? extends Annotation> aClass )
326             throws BeansException
327         {
328             return applicationContext.getBeansWithAnnotation( aClass );
329         }
330
331         @Override
332         public <A extends Annotation> A findAnnotationOnBean( String s, Class<A> aClass )
333             throws NoSuchBeanDefinitionException
334         {
335             return applicationContext.findAnnotationOnBean( s, aClass );
336         }
337
338         @Override
339         public Object getBean( String s )
340             throws BeansException
341         {
342             return applicationContext.getBean( s );
343         }
344
345         @Override
346         public <T> T getBean( String s, Class<T> tClass )
347             throws BeansException
348         {
349             return applicationContext.getBean( s, tClass );
350         }
351
352         @Override
353         public <T> T getBean( Class<T> tClass )
354             throws BeansException
355         {
356             return applicationContext.getBean( tClass );
357         }
358
359         @Override
360         public Object getBean( String s, Object... objects )
361             throws BeansException
362         {
363             return applicationContext.getBean( s, objects );
364         }
365
366         @Override
367         public boolean containsBean( String s )
368         {
369             return applicationContext.containsBean( s );
370         }
371
372         @Override
373         public boolean isSingleton( String s )
374             throws NoSuchBeanDefinitionException
375         {
376             return applicationContext.isSingleton( s );
377         }
378
379         @Override
380         public boolean isPrototype( String s )
381             throws NoSuchBeanDefinitionException
382         {
383             return applicationContext.isPrototype( s );
384         }
385
386         @Override
387         public boolean isTypeMatch( String s, Class<?> aClass )
388             throws NoSuchBeanDefinitionException
389         {
390             return applicationContext.isTypeMatch( s, aClass );
391         }
392
393         @Override
394         public Class<?> getType( String s )
395             throws NoSuchBeanDefinitionException
396         {
397             return applicationContext.getType( s );
398         }
399
400         @Override
401         public String[] getAliases( String s )
402         {
403             return applicationContext.getAliases( s );
404         }
405
406         @Override
407         public String getMessage( String s, Object[] objects, String s2, Locale locale )
408         {
409             return applicationContext.getMessage( s, objects, s2, locale );
410         }
411
412         @Override
413         public String getMessage( String s, Object[] objects, Locale locale )
414             throws NoSuchMessageException
415         {
416             return applicationContext.getMessage( s, objects, locale );
417         }
418
419         @Override
420         public String getMessage( MessageSourceResolvable messageSourceResolvable, Locale locale )
421             throws NoSuchMessageException
422         {
423             return applicationContext.getMessage( messageSourceResolvable, locale );
424         }
425
426         @Override
427         public Resource[] getResources( String s )
428             throws IOException
429         {
430             return applicationContext.getResources( s );
431         }
432
433         @Override
434         public Resource getResource( String s )
435         {
436             return applicationContext.getResource( s );
437         }
438
439         @Override
440         public ClassLoader getClassLoader()
441         {
442             return applicationContext.getClassLoader();
443         }
444     }
445
446     protected Servlet findServlet( String name )
447         throws Exception
448     {
449         return unauthenticatedRepositoryServlet;
450         /*
451         Container[] childs = context.findChildren();
452         for ( Container container : childs )
453         {
454             if ( StringUtils.equals( container.getName(), name ) )
455             {
456                 Tomcat.ExistingStandardWrapper esw = Tomcat.ExistingStandardWrapper.class.cast( container );
457                 Servlet servlet = esw.loadServlet();
458
459                 return servlet;
460             }
461         }
462         return null;*/
463     }
464
465     protected String getSpringConfigLocation()
466     {
467         return "classpath*:/META-INF/spring-context.xml,classpath*:spring-context.xml";
468     }
469
470
471
472
473     /*
474     protected ServletUnitClient getServletUnitClient()
475         throws Exception
476     {
477         if ( servletUnitClient != null )
478         {
479             return servletUnitClient;
480         }
481         servletRunner = new ServletRunner( new File( "src/test/resources/WEB-INF/web.xml" ) );
482
483         servletRunner.registerServlet( "/repository/*", UnauthenticatedRepositoryServlet.class.getName() );
484
485         servletUnitClient = servletRunner.newClient();
486
487         return servletUnitClient;
488     }*/
489
490     /*
491     protected <P extends Page> P page(final String path) throws IOException {
492         return newClient().getPage(base.toExternalForm() + "repository/" + path);
493     }
494     */
495
496     protected static WebClient newClient()
497     {
498         final WebClient webClient = new WebClient();
499         webClient.getOptions().setJavaScriptEnabled( false );
500         webClient.getOptions().setCssEnabled( false );
501         webClient.getOptions().setAppletEnabled( false );
502         webClient.getOptions().setThrowExceptionOnFailingStatusCode( false );
503         webClient.setAjaxController( new NicelyResynchronizingAjaxController() );
504         return webClient;
505     }
506
507
508     protected WebResponse getWebResponse( String path )
509         throws Exception
510     {
511         return getWebResponse( new GetMethodWebRequest( "http://localhost" + path ) );
512     }
513
514     protected WebResponse getWebResponse( WebRequest webRequest )
515         throws Exception
516     {
517
518         //WebClient client = newClient();
519         //client.getPage( "http://localhost:" + port + "/reinit/reload" );
520         //return client.getPage( "http://localhost:" + port + path ).getWebResponse();
521
522         MockHttpServletRequest request = new MockHttpServletRequest();
523         request.setRequestURI( webRequest.getUrl().getPath() );
524         request.addHeader( "User-Agent", "Apache Archiva unit test" );
525
526         request.setMethod( webRequest.getHttpMethod().name() );
527
528         final MockHttpServletResponse response = execute( request );
529
530         return new WebResponse( null, null, 1 )
531         {
532             @Override
533             public String getContentAsString()
534             {
535                 try
536                 {
537                     return response.getContentAsString();
538                 }
539                 catch ( UnsupportedEncodingException e )
540                 {
541                     throw new RuntimeException( e.getMessage(), e );
542                 }
543             }
544
545             @Override
546             public int getStatusCode()
547             {
548                 return response.getStatus();
549             }
550         };
551     }
552
553     protected MockHttpServletResponse execute( HttpServletRequest request )
554         throws Exception
555     {
556         MockHttpServletResponse response = new MockHttpServletResponse()
557         {
558             public String getContentAsString()
559                 throws UnsupportedEncodingException
560             {
561                 String errorMessage = getErrorMessage();
562                 return ( errorMessage != null ) ? errorMessage : super.getContentAsString();
563             }
564         };
565         this.unauthenticatedRepositoryServlet.service( request, response );
566         return response;
567     }
568
569     public static class GetMethodWebRequest
570         extends WebRequest
571     {
572         String url;
573
574         public GetMethodWebRequest( String url )
575             throws Exception
576         {
577             super( new URL( url ) );
578             this.url = url;
579
580         }
581     }
582
583     public static class PutMethodWebRequest
584         extends WebRequest
585     {
586         String url;
587
588         public PutMethodWebRequest( String url, InputStream inputStream, String contentType )
589             throws Exception
590         {
591             super( new URL( url ), HttpMethod.PUT );
592             this.url = url;
593         }
594
595
596     }
597
598     public static class ServletUnitClient
599     {
600
601         AbstractRepositoryServletTestCase abstractRepositoryServletTestCase;
602
603         public ServletUnitClient( AbstractRepositoryServletTestCase abstractRepositoryServletTestCase )
604         {
605             this.abstractRepositoryServletTestCase = abstractRepositoryServletTestCase;
606         }
607
608         public WebResponse getResponse( WebRequest request )
609             throws Exception
610         {
611             return abstractRepositoryServletTestCase.getWebResponse( request );
612         }
613
614         public WebResponse getResource( WebRequest request )
615             throws Exception
616         {
617             return getResponse( request );
618         }
619     }
620
621     public ServletUnitClient getServletUnitClient()
622     {
623         return new ServletUnitClient( this );
624     }
625
626     @Override
627     @After
628     public void tearDown()
629         throws Exception
630     {
631
632         if ( repoRootInternal.exists() )
633         {
634             FileUtils.deleteDirectory( repoRootInternal );
635         }
636
637         if ( repoRootLegacy.exists() )
638         {
639             FileUtils.deleteDirectory( repoRootLegacy );
640         }
641
642         if ( this.tomcat != null )
643         {
644             this.tomcat.stop();
645         }
646
647     }
648
649
650     protected void assertFileContents( String expectedContents, File repoRoot, String path )
651         throws IOException
652     {
653         File actualFile = new File( repoRoot, path );
654         assertTrue( "File <" + actualFile.getAbsolutePath() + "> should exist.", actualFile.exists() );
655         assertTrue( "File <" + actualFile.getAbsolutePath() + "> should be a file (not a dir/link/device/etc).",
656                     actualFile.isFile() );
657
658         String actualContents = FileUtils.readFileToString( actualFile, Charset.defaultCharset() );
659         assertEquals( "File Contents of <" + actualFile.getAbsolutePath() + ">", expectedContents, actualContents );
660     }
661
662     protected void assertRepositoryValid( RepositoryServlet servlet, String repoId )
663         throws Exception
664     {
665         ManagedRepository repository = servlet.getRepository( repoId );
666         assertNotNull( "Archiva Managed Repository id:<" + repoId + "> should exist.", repository );
667         File repoRoot = new File( repository.getLocation() );
668         assertTrue( "Archiva Managed Repository id:<" + repoId + "> should have a valid location on disk.",
669                     repoRoot.exists() && repoRoot.isDirectory() );
670     }
671
672     protected void assertResponseOK( WebResponse response )
673     {
674
675         assertNotNull( "Should have recieved a response", response );
676         Assert.assertEquals( "Should have been an OK response code", HttpServletResponse.SC_OK,
677                              response.getStatusCode() );
678     }
679
680     protected void assertResponseOK( WebResponse response, String path )
681     {
682         assertNotNull( "Should have recieved a response", response );
683         Assert.assertEquals( "Should have been an OK response code for path: " + path, HttpServletResponse.SC_OK,
684                              response.getStatusCode() );
685     }
686
687     protected void assertResponseNotFound( WebResponse response )
688     {
689         assertNotNull( "Should have recieved a response", response );
690         Assert.assertEquals( "Should have been an 404/Not Found response code.", HttpServletResponse.SC_NOT_FOUND,
691                              response.getStatusCode() );
692     }
693
694     protected void assertResponseInternalServerError( WebResponse response )
695     {
696         assertNotNull( "Should have recieved a response", response );
697         Assert.assertEquals( "Should have been an 500/Internal Server Error response code.",
698                              HttpServletResponse.SC_INTERNAL_SERVER_ERROR, response.getStatusCode() );
699     }
700
701     protected void assertResponseConflictError( WebResponse response )
702     {
703         assertNotNull( "Should have received a response", response );
704         Assert.assertEquals( "Should have been a 409/Conflict response code.", HttpServletResponse.SC_CONFLICT,
705                              response.getStatusCode() );
706     }
707
708     protected ManagedRepositoryConfiguration createManagedRepository( String id, String name, File location,
709                                                                       boolean blockRedeployments )
710     {
711         ManagedRepositoryConfiguration repo = new ManagedRepositoryConfiguration();
712         repo.setId( id );
713         repo.setName( name );
714         repo.setLocation( location.getAbsolutePath() );
715         repo.setBlockRedeployments( blockRedeployments );
716
717         return repo;
718     }
719
720     protected ManagedRepositoryConfiguration createManagedRepository( String id, String name, File location,
721                                                                       String layout, boolean blockRedeployments )
722     {
723         ManagedRepositoryConfiguration repo = createManagedRepository( id, name, location, blockRedeployments );
724         repo.setLayout( layout );
725         return repo;
726     }
727
728     protected RemoteRepositoryConfiguration createRemoteRepository( String id, String name, String url )
729     {
730         RemoteRepositoryConfiguration repo = new RemoteRepositoryConfiguration();
731         repo.setId( id );
732         repo.setName( name );
733         repo.setUrl( url );
734         return repo;
735     }
736
737     protected void saveConfiguration( ArchivaConfiguration archivaConfiguration )
738         throws Exception
739     {
740         archivaConfiguration.save( archivaConfiguration.getConfiguration() );
741     }
742
743
744     protected void setupCleanRepo( File repoRootDir )
745         throws IOException
746     {
747         FileUtils.deleteDirectory( repoRootDir );
748         if ( !repoRootDir.exists() )
749         {
750             repoRootDir.mkdirs();
751         }
752     }
753
754     protected void assertManagedFileNotExists( File repoRootInternal, String resourcePath )
755     {
756         File repoFile = new File( repoRootInternal, resourcePath );
757         assertFalse( "Managed Repository File <" + repoFile.getAbsolutePath() + "> should not exist.",
758                      repoFile.exists() );
759     }
760
761     protected void setupCleanInternalRepo()
762         throws Exception
763     {
764         setupCleanRepo( repoRootInternal );
765     }
766
767     protected File populateRepo( File repoRootManaged, String path, String contents )
768         throws Exception
769     {
770         File destFile = new File( repoRootManaged, path );
771         destFile.getParentFile().mkdirs();
772         FileUtils.writeStringToFile( destFile, contents, Charset.defaultCharset() );
773         return destFile;
774     }
775 }