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