1 package org.apache.maven.archiva.webdav;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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.commons.lang.StringUtils;
31 import org.apache.maven.archiva.configuration.Configuration;
32 import org.apache.maven.archiva.configuration.ManagedRepositoryConfiguration;
33 import org.apache.maven.archiva.configuration.RepositoryGroupConfiguration;
34 import org.apache.maven.archiva.model.ArchivaRepositoryMetadata;
35 import org.apache.maven.archiva.repository.metadata.RepositoryMetadataReader;
36
37 import com.meterware.httpunit.GetMethodWebRequest;
38 import com.meterware.httpunit.PutMethodWebRequest;
39 import com.meterware.httpunit.WebRequest;
40 import com.meterware.httpunit.WebResponse;
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60 public class RepositoryServletRepositoryGroupTest
61 extends AbstractRepositoryServletTestCase
62 {
63 protected File repoRootFirst;
64
65 protected File repoRootLast;
66
67 protected File repoRootInvalid;
68
69 protected static final String MANAGED_REPO_FIRST = "first";
70
71 protected static final String MANAGED_REPO_LAST = "last";
72
73 protected static final String MANAGED_REPO_INVALID = "invalid";
74
75 protected static final String REPO_GROUP_WITH_VALID_REPOS = "group-with-valid-repos";
76
77 protected static final String REPO_GROUP_WITH_INVALID_REPOS = "group-with-invalid-repos";
78
79
80 @Override
81 protected void setUp()
82 throws Exception
83 {
84 super.setUp();
85
86 String appserverBase = System.getProperty( "appserver.base" );
87
88 Configuration configuration = archivaConfiguration.getConfiguration();
89
90 repoRootFirst = new File( appserverBase, "data/repositories/" + MANAGED_REPO_FIRST );
91 repoRootLast = new File( appserverBase, "data/repositories/" + MANAGED_REPO_LAST );
92
93 configuration.addManagedRepository( createManagedRepository( MANAGED_REPO_FIRST, "First Test Repo", repoRootFirst, true ) );
94 configuration.addManagedRepository( createManagedRepository( MANAGED_REPO_LAST, "Last Test Repo", repoRootLast, true ) );
95
96 List<String> managedRepoIds = new ArrayList<String>();
97 managedRepoIds.add( MANAGED_REPO_FIRST );
98 managedRepoIds.add( MANAGED_REPO_LAST );
99
100 configuration.addRepositoryGroup( createRepositoryGroup( REPO_GROUP_WITH_VALID_REPOS, managedRepoIds ) );
101
102
103 repoRootInvalid = new File( appserverBase, "data/repositories/" + MANAGED_REPO_INVALID );
104 ManagedRepositoryConfiguration managedRepositoryConfiguration = createManagedRepository( MANAGED_REPO_INVALID, "Invalid Test Repo", repoRootInvalid, true );
105
106 configuration.addManagedRepository( createManagedRepository( MANAGED_REPO_FIRST, "First Test Repo", repoRootFirst, true ) );
107 configuration.addManagedRepository( managedRepositoryConfiguration );
108 configuration.addManagedRepository( createManagedRepository( MANAGED_REPO_LAST, "Last Test Repo", repoRootLast, true ) );
109
110 List<String> invalidManagedRepoIds = new ArrayList<String>();
111 invalidManagedRepoIds.add( MANAGED_REPO_FIRST );
112 invalidManagedRepoIds.add( MANAGED_REPO_INVALID );
113 invalidManagedRepoIds.add( MANAGED_REPO_LAST );
114
115 configuration.addRepositoryGroup( createRepositoryGroup( REPO_GROUP_WITH_INVALID_REPOS, invalidManagedRepoIds ) );
116
117 configuration.removeManagedRepository( managedRepositoryConfiguration );
118 FileUtils.deleteDirectory( repoRootInvalid );
119
120 saveConfiguration( archivaConfiguration );
121 }
122
123 @Override
124 protected void tearDown()
125 throws Exception
126 {
127 setupCleanRepo( repoRootFirst );
128 setupCleanRepo( repoRootLast );
129
130 super.tearDown();
131 }
132
133
134
135
136 public void testGetFromFirstManagedRepositoryReturnOk()
137 throws Exception
138 {
139 String resourceName = "dummy/dummy-first-resource/1.0/dummy-first-resource-1.0.txt";
140
141 File dummyInternalResourceFile = new File( repoRootFirst, resourceName );
142 dummyInternalResourceFile.getParentFile().mkdirs();
143 FileUtils.writeStringToFile( dummyInternalResourceFile, "first", null );
144
145 WebRequest request = new GetMethodWebRequest( "http://machine.com/repository/" + REPO_GROUP_WITH_VALID_REPOS + "/" + resourceName );
146 WebResponse response = sc.getResponse( request );
147
148 assertResponseOK( response );
149 assertEquals( "Expected file contents", "first", response.getText() );
150 }
151
152
153
154
155 public void testGetFromLastManagedRepositoryReturnOk()
156 throws Exception
157 {
158 String resourceName = "dummy/dummy-last-resource/1.0/dummy-last-resource-1.0.txt";
159
160 File dummyReleasesResourceFile = new File( repoRootLast, resourceName );
161 dummyReleasesResourceFile.getParentFile().mkdirs();
162 FileUtils.writeStringToFile( dummyReleasesResourceFile, "last", null );
163
164 WebRequest request = new GetMethodWebRequest( "http://machine.com/repository/" + REPO_GROUP_WITH_VALID_REPOS + "/" + resourceName );
165 WebResponse response = sc.getResponse( request );
166
167 assertResponseOK( response );
168 assertEquals( "Expected file contents", "last", response.getText() );
169 }
170
171
172
173
174 public void testGetFromValidRepositoryGroupReturnNotFound()
175 throws Exception
176 {
177 String resourceName = "dummy/dummy-no-resource/1.0/dummy-no-resource-1.0.txt";
178
179 WebRequest request = new GetMethodWebRequest( "http://machine.com/repository/" + REPO_GROUP_WITH_VALID_REPOS + "/" + resourceName );
180 WebResponse response = sc.getResponse( request );
181
182 assertResponseNotFound( response );
183 }
184
185
186
187
188 public void testGetInvalidManagedRepositoryInGroupReturnNotFound()
189 throws Exception
190 {
191 String resourceName = "dummy/dummy-no-resource/1.0/dummy-no-resource-1.0.txt";
192
193 WebRequest request = new GetMethodWebRequest( "http://machine.com/repository/" + REPO_GROUP_WITH_INVALID_REPOS + "/" + resourceName );
194 WebResponse response = sc.getResponse( request );
195
196 assertResponseInternalServerError( response );
197 }
198
199
200
201
202 public void testPutValidRepositoryGroupReturnBadRequest()
203 throws Exception
204 {
205 String resourceName = "dummy/dummy-put-resource/1.0/dummy-put-resource-1.0.txt";
206 String putUrl = "http://machine.com/repository/" + REPO_GROUP_WITH_VALID_REPOS + "/" + resourceName;
207 InputStream is = getClass().getResourceAsStream( "/artifact.jar" );
208
209 WebRequest request = new PutMethodWebRequest( putUrl, is, "text/plain" );
210 WebResponse response = sc.getResponse( request );
211
212 assertResponseMethodNotAllowed( response );
213 }
214
215
216 public void testGetMergedMetadata()
217 throws Exception
218 {
219
220 String resourceName = "dummy/dummy-merged-metadata-resource/maven-metadata.xml";
221
222 File dummyInternalResourceFile = new File( repoRootFirst, resourceName );
223 dummyInternalResourceFile.getParentFile().mkdirs();
224 FileUtils.writeStringToFile( dummyInternalResourceFile, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
225 "<metadata>\n<groupId>dummy</groupId>\n<artifactId>dummy-merged-metadata-resource</artifactId>\n" +
226 "<versioning>\n<latest>1.0</latest>\n<release>1.0</release>\n<versions>\n<version>1.0</version>\n" +
227 "<version>2.5</version>\n</versions>\n<lastUpdated>20080708095554</lastUpdated>\n</versioning>\n</metadata>", null );
228
229
230 resourceName = "dummy/dummy-merged-metadata-resource/maven-metadata.xml";
231 dummyInternalResourceFile = new File( repoRootLast, resourceName );
232 dummyInternalResourceFile.getParentFile().mkdirs();
233 FileUtils.writeStringToFile( dummyInternalResourceFile, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
234 "<metadata><groupId>dummy</groupId><artifactId>dummy-merged-metadata-resource</artifactId>" +
235 "<versioning><latest>2.0</latest><release>2.0</release><versions><version>1.0</version>" +
236 "<version>1.5</version><version>2.0</version></versions><lastUpdated>20080709095554</lastUpdated>" +
237 "</versioning></metadata>", null );
238
239 WebRequest request = new GetMethodWebRequest( "http://machine.com/repository/" + REPO_GROUP_WITH_VALID_REPOS + "/dummy/" +
240 "dummy-merged-metadata-resource/maven-metadata.xml" );
241 WebResponse response = sc.getResource( request );
242
243 File returnedMetadata = new File( getBasedir(), "/target/test-classes/retrievedMetadataFile.xml");
244 FileUtils.writeStringToFile( returnedMetadata, response.getText() );
245 ArchivaRepositoryMetadata metadata = RepositoryMetadataReader.read( returnedMetadata );
246
247 assertResponseOK( response );
248 assertEquals( "Versions list size", 4, metadata.getAvailableVersions().size() );
249 assertTrue( "Versions list contains version 1.0", metadata.getAvailableVersions().contains( "1.0" ) );
250 assertTrue( "Versions list contains version 1.5", metadata.getAvailableVersions().contains( "1.5" ) );
251 assertTrue( "Versions list contains version 2.0", metadata.getAvailableVersions().contains( "2.0" ) );
252 assertTrue( "Versions list contains version 2.5", metadata.getAvailableVersions().contains( "2.5" ) );
253
254
255 File checksumFileSha1 = new File( repoRootFirst, resourceName + ".sha1" );
256 checksumFileSha1.getParentFile().mkdirs();
257 FileUtils.writeStringToFile( checksumFileSha1, "3290853214d3687134", null );
258
259 File checksumFileMd5 = new File( repoRootFirst, resourceName + ".md5" );
260 checksumFileMd5.getParentFile().mkdirs();
261 FileUtils.writeStringToFile( checksumFileMd5, "98745897234eda12836423", null );
262
263
264 request =
265 new GetMethodWebRequest( "http://machine.com/repository/" + REPO_GROUP_WITH_VALID_REPOS + "/dummy/" +
266 "dummy-merged-metadata-resource/maven-metadata.xml.sha1" );
267 response = sc.getResource( request );
268
269 assertResponseOK( response );
270 assertEquals( "add113b0d7f8c6adb92a5015a7a3701081edf998 maven-metadata-group-with-valid-repos.xml", response.getText() );
271
272
273 request =
274 new GetMethodWebRequest( "http://machine.com/repository/" + REPO_GROUP_WITH_VALID_REPOS + "/dummy/" +
275 "dummy-merged-metadata-resource/maven-metadata.xml.md5" );
276 response = sc.getResource( request );
277
278 assertResponseOK( response );
279 assertEquals( "5b85ea4aa5f52bb76760041a52f98de8 maven-metadata-group-with-valid-repos.xml", response.getText().trim() );
280 }
281
282
283 public void testBrowseWithTwoArtifactsWithSameGroupIdInRepos()
284 throws Exception
285 {
286 String resourceName = "dummy/dummy-artifact/1.0/dummy-artifact-1.0.txt";
287
288 File dummyInternalResourceFile = new File( repoRootFirst, resourceName );
289 dummyInternalResourceFile.getParentFile().mkdirs();
290 FileUtils.writeStringToFile( dummyInternalResourceFile, "first", null );
291
292 resourceName = "dummy/dummy-artifact/2.0/dummy-artifact-2.0.txt";
293
294 File dummyReleasesResourceFile = new File( repoRootLast, resourceName );
295 dummyReleasesResourceFile.getParentFile().mkdirs();
296 FileUtils.writeStringToFile( dummyReleasesResourceFile, "last", null );
297
298 WebRequest request = new GetMethodWebRequest( "http://machine.com/repository/" + REPO_GROUP_WITH_VALID_REPOS + "/dummy/dummy-artifact/" );
299 WebResponse response = sc.getResource( request );
300
301 assertResponseOK( response );
302 assertTrue( StringUtils.contains( response.getText(), "Collection" ) );
303 assertTrue( StringUtils.contains( response.getText(), "dummy/dummy-artifact" ) );
304 assertTrue( StringUtils.contains( response.getText(), "1.0" ) );
305 assertTrue( StringUtils.contains( response.getText(), "2.0" ) );
306 }
307
308 protected void assertResponseMethodNotAllowed( WebResponse response )
309 {
310 assertNotNull( "Should have recieved a response", response );
311 assertEquals( "Should have been an 405/Method Not Allowed response code.", HttpServletResponse.SC_METHOD_NOT_ALLOWED, response.getResponseCode() );
312 }
313
314 protected RepositoryGroupConfiguration createRepositoryGroup( String id, List<String> repositories )
315 {
316 RepositoryGroupConfiguration repoGroupConfiguration = new RepositoryGroupConfiguration();
317 repoGroupConfiguration.setId( id );
318 repoGroupConfiguration.setRepositories( repositories );
319 return repoGroupConfiguration;
320 }
321 }