]> source.dussan.org Git - archiva.git/blob
067ba0e9ed2e43ee22ad1a65a0d92c2e0973e6ea
[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.WebConversation;
23 import com.meterware.httpunit.WebResponse;
24
25 import org.apache.commons.io.FileUtils;
26 import org.apache.maven.archiva.configuration.ProxyConnectorConfiguration;
27 import org.apache.maven.archiva.configuration.RemoteRepositoryConfiguration;
28 import org.apache.maven.archiva.policies.CachedFailuresPolicy;
29 import org.apache.maven.archiva.policies.ChecksumPolicy;
30 import org.apache.maven.archiva.policies.ReleasesPolicy;
31 import org.apache.maven.archiva.policies.SnapshotsPolicy;
32 import org.mortbay.jetty.Connector;
33 import org.mortbay.jetty.Server;
34 import org.mortbay.jetty.bio.SocketConnector;
35 import org.mortbay.jetty.handler.ContextHandler;
36 import org.mortbay.jetty.handler.ContextHandlerCollection;
37 import org.mortbay.jetty.servlet.DefaultServlet;
38 import org.mortbay.jetty.servlet.ServletHandler;
39
40 import java.io.File;
41
42 /**
43  * AbstractRepositoryServletProxiedTestCase 
44  *
45  * @author <a href="mailto:joakime@apache.org">Joakim Erdfelt</a>
46  * @version $Id$
47  */
48 public abstract class AbstractRepositoryServletProxiedTestCase
49     extends AbstractRepositoryServletTestCase
50 {
51     class RemoteRepoInfo
52     {
53         public String id;
54
55         public String url;
56
57         public String context;
58
59         public Server server;
60
61         public File root;
62
63         public RemoteRepositoryConfiguration config;
64     }
65
66     protected static final long ONE_SECOND = ( 1000 * 60 );
67
68     protected static final long ONE_MINUTE = ( ONE_SECOND * 60 );
69
70     protected static final long ONE_HOUR = ( ONE_MINUTE * 60 );
71
72     protected static final long ONE_DAY = ( ONE_HOUR * 24 );
73
74     protected static final long OVER_ONE_HOUR = ( ONE_HOUR + ONE_MINUTE );
75
76     protected static final long OVER_ONE_DAY = ( ONE_DAY + ONE_HOUR );
77
78     protected static final long OLDER = ( -1 );
79
80     protected static final long NEWER = 0;
81
82     protected static final int EXPECT_MANAGED_CONTENTS = 1;
83
84     protected static final int EXPECT_REMOTE_CONTENTS = 2;
85
86     protected static final int EXPECT_NOT_FOUND = 3;
87
88     protected static final boolean HAS_MANAGED_COPY = true;
89
90     protected static final boolean NO_MANAGED_COPY = false;
91
92     protected RemoteRepoInfo remoteCentral;
93
94     protected RemoteRepoInfo remoteSnapshots;
95     
96     protected RemoteRepoInfo remotePrivateSnapshots;
97     
98     @Override
99     protected void setUp()
100         throws Exception
101     {
102         super.setUp();
103     }
104
105     protected RemoteRepoInfo createServer( String id )
106         throws Exception
107     {
108         RemoteRepoInfo repo = new RemoteRepoInfo();
109         repo.id = id;
110         repo.context = "/" + id;
111         repo.root = getTestFile( "target/remote-repos/" + id + "/" );
112
113         // Remove exising root contents.
114         if ( repo.root.exists() )
115         {
116             FileUtils.deleteDirectory( repo.root );
117         }
118
119         // Establish root directory.
120         if ( !repo.root.exists() )
121         {
122             repo.root.mkdirs();
123         }
124
125         repo.server = new Server();
126         ContextHandlerCollection contexts = new ContextHandlerCollection();
127         repo.server.setHandler( contexts );
128
129         SocketConnector connector = new SocketConnector();
130         connector.setPort( 0 ); // 0 means, choose and empty port. (we'll find out which, later)
131
132         repo.server.setConnectors( new Connector[] { connector } );
133
134         ContextHandler context = new ContextHandler();
135         context.setContextPath( repo.context );
136         context.setResourceBase( repo.root.getAbsolutePath() );
137         context.setAttribute( "dirAllowed", true );
138         context.setAttribute( "maxCacheSize", 0 );
139         ServletHandler servlet = new ServletHandler();
140         servlet.addServletWithMapping( DefaultServlet.class.getName(), "/" );
141         context.setHandler( servlet );
142         contexts.addHandler( context );
143
144         repo.server.start();
145
146         int port = connector.getLocalPort();
147         repo.url = "http://localhost:" + port + repo.context;
148         System.out.println( "Remote HTTP Server started on " + repo.url );
149
150         repo.config = createRemoteRepository( repo.id, "Testable [" + repo.id + "] Remote Repo", repo.url );
151
152         return repo;
153     }
154
155     protected void assertServerSetupCorrectly( RemoteRepoInfo remoteRepo )
156         throws Exception
157     {
158         WebConversation wc = new WebConversation();
159         WebResponse response = wc.getResponse( remoteRepo.url );
160         assertResponseOK( response );
161     }
162
163     private void setupConnector( String repoId, RemoteRepoInfo remoteRepo, String releasesPolicy, String snapshotsPolicy )
164     {
165         ProxyConnectorConfiguration connector = new ProxyConnectorConfiguration();
166         connector.setSourceRepoId( repoId );
167         connector.setTargetRepoId( remoteRepo.id );
168         connector.addPolicy( ProxyConnectorConfiguration.POLICY_RELEASES, releasesPolicy );
169         connector.addPolicy( ProxyConnectorConfiguration.POLICY_SNAPSHOTS, snapshotsPolicy );
170         connector.addPolicy( ProxyConnectorConfiguration.POLICY_CHECKSUM, ChecksumPolicy.IGNORED );
171         connector.addPolicy( ProxyConnectorConfiguration.POLICY_CACHE_FAILURES, CachedFailuresPolicy.IGNORED );
172
173         archivaConfiguration.getConfiguration().addProxyConnector( connector );
174     }
175
176     protected void shutdownServer( RemoteRepoInfo remoteRepo )
177     {
178         if ( remoteRepo != null )
179         {
180             if ( remoteRepo.server != null )
181             {
182                 if ( remoteRepo.server.isRunning() )
183                 {
184                     try
185                     {
186                         remoteRepo.server.stop();
187                         // int graceful = remoteRepo.server.getGracefulShutdown();
188                         // System.out.println( "server set to graceful shutdown: " + graceful );
189                         // remoteRepo = null;
190                     }
191                     catch ( Exception e )
192                     {
193                         e.printStackTrace( System.err );
194                     }
195                 }
196             }
197         }
198     }
199
200     protected File populateRepo( RemoteRepoInfo remoteRepo, String path, String contents )
201         throws Exception
202     {
203         File destFile = new File( remoteRepo.root, path );
204         destFile.getParentFile().mkdirs();
205         FileUtils.writeStringToFile( destFile, contents, null );
206         return destFile;
207     }
208
209     protected void setupCentralRemoteRepo()
210         throws Exception
211     {
212         remoteCentral = createServer( "central" );
213
214         assertServerSetupCorrectly( remoteCentral );
215         archivaConfiguration.getConfiguration().addRemoteRepository( remoteCentral.config );
216         setupCleanRepo( remoteCentral.root );
217     }
218
219     protected void setupConnector( String repoId, RemoteRepoInfo remoteRepo )
220     {
221         setupConnector( repoId, remoteRepo, ReleasesPolicy.IGNORED, SnapshotsPolicy.IGNORED );
222     }
223
224     protected void setupReleaseConnector( String managedRepoId, RemoteRepoInfo remoteRepo, String releasePolicy )
225     {
226         setupConnector( managedRepoId, remoteRepo, releasePolicy, SnapshotsPolicy.IGNORED );
227     }
228
229     protected void setupSnapshotConnector( String managedRepoId, RemoteRepoInfo remoteRepo, String snapshotsPolicy )
230     {
231         setupConnector( managedRepoId, remoteRepo, ReleasesPolicy.IGNORED, snapshotsPolicy );
232     }
233
234     protected void setupSnapshotsRemoteRepo()
235         throws Exception
236     {
237         remoteSnapshots = createServer( "snapshots" );
238
239         assertServerSetupCorrectly( remoteSnapshots );
240         archivaConfiguration.getConfiguration().addRemoteRepository( remoteSnapshots.config );
241         setupCleanRepo( remoteSnapshots.root );
242     }
243
244     @Override
245     protected void tearDown()
246         throws Exception
247     {
248         shutdownServer( remoteCentral );
249         shutdownServer( remoteSnapshots );
250         super.tearDown();
251     }
252 }