]> source.dussan.org Git - archiva.git/blob
6a88643341fcb8b5c0f95fe799a9089e62056ea8
[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.meterware.httpunit.WebConversation;
23 import com.meterware.httpunit.WebResponse;
24 import org.apache.archiva.configuration.ProxyConnectorConfiguration;
25 import org.apache.archiva.configuration.RemoteRepositoryConfiguration;
26 import org.apache.archiva.policies.CachedFailuresPolicy;
27 import org.apache.archiva.policies.ChecksumPolicy;
28 import org.apache.archiva.policies.ReleasesPolicy;
29 import org.apache.archiva.policies.SnapshotsPolicy;
30 import org.apache.commons.io.FileUtils;
31 import org.eclipse.jetty.server.Server;
32 import org.eclipse.jetty.server.handler.ContextHandler;
33 import org.eclipse.jetty.server.handler.ContextHandlerCollection;
34 import org.eclipse.jetty.servlet.DefaultServlet;
35 import org.eclipse.jetty.servlet.ServletContextHandler;
36 import org.eclipse.jetty.servlet.ServletHandler;
37 import org.eclipse.jetty.servlet.ServletHolder;
38 import org.junit.After;
39 import org.junit.Before;
40
41 import java.io.File;
42
43 /**
44  * AbstractRepositoryServletProxiedTestCase
45  *
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 /* milliseconds */ );
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     @Before
97     public void setUp()
98         throws Exception
99     {
100         super.setUp();
101     }
102
103     @Override
104     @After
105     public void tearDown()
106         throws Exception
107     {
108         shutdownServer( remoteCentral );
109         shutdownServer( remoteSnapshots );
110         super.tearDown();
111     }
112
113     protected RemoteRepoInfo createServer( String id )
114         throws Exception
115     {
116         RemoteRepoInfo repo = new RemoteRepoInfo();
117         repo.id = id;
118         repo.context = "/" + id;
119         repo.root = new File( "target/remote-repos/" + id + "/" );
120
121         // Remove exising root contents.
122         if ( repo.root.exists() )
123         {
124             FileUtils.deleteDirectory( repo.root );
125         }
126
127         // Establish root directory.
128         if ( !repo.root.exists() )
129         {
130             repo.root.mkdirs();
131         }
132
133         repo.server = new Server( 0 );
134         ContextHandlerCollection contexts = new ContextHandlerCollection();
135         repo.server.setHandler( contexts );
136
137         ServletContextHandler context = new ServletContextHandler();
138         context.setContextPath( repo.context );
139         context.setResourceBase( repo.root.getAbsolutePath() );
140         context.setAttribute( "dirAllowed", true );
141         context.setAttribute( "maxCacheSize", 0 );
142
143         ServletHolder sh = new ServletHolder( DefaultServlet.class );
144         context.addServlet( sh, "/" );
145
146         contexts.addHandler( context );
147
148         repo.server.start();
149
150         int port = repo.server.getConnectors()[0].getLocalPort();
151         repo.url = "http://localhost:" + port + repo.context;
152         log.info( "Remote HTTP Server started on " + repo.url );
153
154         repo.config = createRemoteRepository( repo.id, "Testable [" + repo.id + "] Remote Repo", repo.url );
155
156         return repo;
157     }
158
159     protected void assertServerSetupCorrectly( RemoteRepoInfo remoteRepo )
160         throws Exception
161     {
162         WebConversation wc = new WebConversation();
163         WebResponse response = wc.getResponse( remoteRepo.url );
164         assertResponseOK( response );
165     }
166
167     private void setupConnector( String repoId, RemoteRepoInfo remoteRepo, String releasesPolicy,
168                                  String snapshotsPolicy )
169     {
170         ProxyConnectorConfiguration connector = new ProxyConnectorConfiguration();
171         connector.setSourceRepoId( repoId );
172         connector.setTargetRepoId( remoteRepo.id );
173         connector.addPolicy( ProxyConnectorConfiguration.POLICY_RELEASES, releasesPolicy );
174         connector.addPolicy( ProxyConnectorConfiguration.POLICY_SNAPSHOTS, snapshotsPolicy );
175         connector.addPolicy( ProxyConnectorConfiguration.POLICY_CHECKSUM, ChecksumPolicy.IGNORE );
176         connector.addPolicy( ProxyConnectorConfiguration.POLICY_CACHE_FAILURES, CachedFailuresPolicy.NO );
177
178         archivaConfiguration.getConfiguration().addProxyConnector( connector );
179     }
180
181     protected void shutdownServer( RemoteRepoInfo remoteRepo )
182     {
183         if ( remoteRepo != null )
184         {
185             if ( remoteRepo.server != null )
186             {
187                 if ( remoteRepo.server.isRunning() )
188                 {
189                     try
190                     {
191                         remoteRepo.server.stop();
192                         // int graceful = remoteRepo.server.getGracefulShutdown();
193                         // System.out.println( "server set to graceful shutdown: " + graceful );
194                         // remoteRepo = null;
195                     }
196                     catch ( Exception e )
197                     {
198                         e.printStackTrace( System.err );
199                     }
200                 }
201             }
202         }
203     }
204
205     protected File populateRepo( RemoteRepoInfo remoteRepo, String path, String contents )
206         throws Exception
207     {
208         File destFile = new File( remoteRepo.root, path );
209         if (destFile.exists())
210         {
211             destFile.delete();
212         }
213         destFile.getParentFile().mkdirs();
214         FileUtils.writeStringToFile( destFile, contents, null );
215         return destFile;
216     }
217
218     protected void setupCentralRemoteRepo()
219         throws Exception
220     {
221         remoteCentral = createServer( "central" );
222
223         assertServerSetupCorrectly( remoteCentral );
224
225         RemoteRepositoryConfiguration remoteRepositoryConfiguration =
226             archivaConfiguration.getConfiguration().getRemoteRepositoriesAsMap().get( remoteCentral.id );
227         if ( remoteRepositoryConfiguration != null )
228         {
229             archivaConfiguration.getConfiguration().removeRemoteRepository( remoteRepositoryConfiguration );
230         }
231
232         archivaConfiguration.getConfiguration().addRemoteRepository( remoteCentral.config );
233         setupCleanRepo( remoteCentral.root );
234     }
235
236     protected void setupConnector( String repoId, RemoteRepoInfo remoteRepo )
237     {
238         setupConnector( repoId, remoteRepo, ReleasesPolicy.ALWAYS, SnapshotsPolicy.ALWAYS );
239     }
240
241     protected void setupReleaseConnector( String managedRepoId, RemoteRepoInfo remoteRepo, String releasePolicy )
242     {
243         setupConnector( managedRepoId, remoteRepo, releasePolicy, SnapshotsPolicy.ALWAYS );
244     }
245
246     protected void setupSnapshotConnector( String managedRepoId, RemoteRepoInfo remoteRepo, String snapshotsPolicy )
247     {
248         setupConnector( managedRepoId, remoteRepo, ReleasesPolicy.ALWAYS, snapshotsPolicy );
249     }
250
251     protected void setupSnapshotsRemoteRepo()
252         throws Exception
253     {
254         remoteSnapshots = createServer( "snapshots" );
255
256         assertServerSetupCorrectly( remoteSnapshots );
257         RemoteRepositoryConfiguration remoteRepositoryConfiguration =
258             archivaConfiguration.getConfiguration().getRemoteRepositoriesAsMap().get( remoteSnapshots.id );
259         if ( remoteRepositoryConfiguration != null )
260         {
261             archivaConfiguration.getConfiguration().removeRemoteRepository( remoteRepositoryConfiguration );
262         }
263         archivaConfiguration.getConfiguration().addRemoteRepository( remoteSnapshots.config );
264         setupCleanRepo( remoteSnapshots.root );
265     }
266
267
268 }