You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

RepositoryServletRepositoryGroupTest.java 16KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361
  1. package org.apache.archiva.webdav;
  2. /*
  3. * Licensed to the Apache Software Foundation (ASF) under one
  4. * or more contributor license agreements. See the NOTICE file
  5. * distributed with this work for additional information
  6. * regarding copyright ownership. The ASF licenses this file
  7. * to you under the Apache License, Version 2.0 (the
  8. * "License"); you may not use this file except in compliance
  9. * with the License. You may obtain a copy of the License at
  10. *
  11. * http://www.apache.org/licenses/LICENSE-2.0
  12. *
  13. * Unless required by applicable law or agreed to in writing,
  14. * software distributed under the License is distributed on an
  15. * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  16. * KIND, either express or implied. See the License for the
  17. * specific language governing permissions and limitations
  18. * under the License.
  19. */
  20. import com.gargoylesoftware.htmlunit.WebRequest;
  21. import com.gargoylesoftware.htmlunit.WebResponse;
  22. import org.apache.archiva.common.utils.FileUtils;
  23. import org.apache.archiva.configuration.Configuration;
  24. import org.apache.archiva.configuration.ManagedRepositoryConfiguration;
  25. import org.apache.archiva.configuration.RepositoryGroupConfiguration;
  26. import org.apache.archiva.maven2.metadata.MavenMetadataReader;
  27. import org.apache.archiva.model.ArchivaRepositoryMetadata;
  28. import org.apache.commons.lang.StringUtils;
  29. import org.junit.After;
  30. import org.junit.Before;
  31. import org.junit.Test;
  32. import javax.servlet.http.HttpServletResponse;
  33. import java.io.InputStream;
  34. import java.nio.charset.Charset;
  35. import java.nio.file.Files;
  36. import java.nio.file.Path;
  37. import java.nio.file.Paths;
  38. import java.util.ArrayList;
  39. import java.util.List;
  40. import static org.assertj.core.api.Assertions.assertThat;
  41. /**
  42. * RepositoryServletRepositoryGroupTest
  43. * <p/>
  44. * Test Case 1. Accessing a valid repository group root url (e.g. http://machine.com/repository/repository-group/) returns a Bad Request (HTTP 400)
  45. * Test Case 2. Accessing an invalid repository group root url is forwarded to managed repository checking (this is not covered here)
  46. * Test Case 3. Accessing an artifact in a valid repository group will iterate over the managed repositories in the repository group
  47. * Test Case 3.a. If an invalid managed repository is encountered (managed repository doesn't exist),
  48. * a Not Found (HTTP 404) is returned and the iteration is broken
  49. * Test Case 3.b. If an artifact is not found in a valid managed repository (after proxying, etc.),
  50. * a Not Found (HTTP 404) is set but not returned yet, the iteration continues to the next managed repository.
  51. * The Not Found (HTTP 404) is returned after exhausting all valid managed repositories
  52. * Test Case 3.c. If an artifact is found in a valid managed repository,
  53. * the artifact is returned, the iteration is broken and any Not Found (HTTP 404) is disregarded
  54. * Test Case 4. Accessing a valid repository group with any http write method returns a Bad Request (HTTP 400)
  55. */
  56. public class RepositoryServletRepositoryGroupTest
  57. extends AbstractRepositoryServletTestCase
  58. {
  59. protected Path repoRootFirst;
  60. protected Path repoRootLast;
  61. protected Path repoRootInvalid;
  62. protected static final String MANAGED_REPO_FIRST = "first";
  63. protected static final String MANAGED_REPO_LAST = "last";
  64. protected static final String MANAGED_REPO_INVALID = "invalid";
  65. protected static final String REPO_GROUP_WITH_VALID_REPOS = "group-with-valid-repos";
  66. protected static final String REPO_GROUP_WITH_INVALID_REPOS = "group-with-invalid-repos";
  67. @Override
  68. @Before
  69. public void setUp()
  70. throws Exception
  71. {
  72. super.setUp();
  73. String appserverBase = System.getProperty( "appserver.base" );
  74. Configuration configuration = archivaConfiguration.getConfiguration();
  75. repoRootFirst = Paths.get( appserverBase, "data/repositories/" + MANAGED_REPO_FIRST );
  76. repoRootLast = Paths.get( appserverBase, "data/repositories/" + MANAGED_REPO_LAST );
  77. configuration.addManagedRepository(
  78. createManagedRepository( MANAGED_REPO_FIRST, "First Test Repo", repoRootFirst, true ) );
  79. configuration.addManagedRepository(
  80. createManagedRepository( MANAGED_REPO_LAST, "Last Test Repo", repoRootLast, true ) );
  81. List<String> managedRepoIds = new ArrayList<>();
  82. managedRepoIds.add( MANAGED_REPO_FIRST );
  83. managedRepoIds.add( MANAGED_REPO_LAST );
  84. configuration.addRepositoryGroup( createRepositoryGroup( REPO_GROUP_WITH_VALID_REPOS, managedRepoIds ) );
  85. // Create the repository group with an invalid managed repository
  86. repoRootInvalid = Paths.get( appserverBase, "data/repositories/" + MANAGED_REPO_INVALID );
  87. ManagedRepositoryConfiguration managedRepositoryConfiguration =
  88. createManagedRepository( MANAGED_REPO_INVALID, "Invalid Test Repo", repoRootInvalid, true );
  89. configuration.addManagedRepository(
  90. createManagedRepository( MANAGED_REPO_FIRST, "First Test Repo", repoRootFirst, true ) );
  91. configuration.addManagedRepository( managedRepositoryConfiguration );
  92. configuration.addManagedRepository(
  93. createManagedRepository( MANAGED_REPO_LAST, "Last Test Repo", repoRootLast, true ) );
  94. List<String> invalidManagedRepoIds = new ArrayList<>();
  95. invalidManagedRepoIds.add( MANAGED_REPO_FIRST );
  96. invalidManagedRepoIds.add( MANAGED_REPO_INVALID );
  97. invalidManagedRepoIds.add( MANAGED_REPO_LAST );
  98. configuration.addRepositoryGroup(
  99. createRepositoryGroup( REPO_GROUP_WITH_INVALID_REPOS, invalidManagedRepoIds ) );
  100. configuration.removeManagedRepository( managedRepositoryConfiguration );
  101. org.apache.archiva.common.utils.FileUtils.deleteDirectory( repoRootInvalid );
  102. repositoryRegistry.reload();
  103. saveConfiguration( archivaConfiguration );
  104. startRepository();
  105. }
  106. @Override
  107. @After
  108. public void tearDown()
  109. throws Exception
  110. {
  111. setupCleanRepo( repoRootFirst );
  112. setupCleanRepo( repoRootLast );
  113. super.tearDown();
  114. String appserverBase = System.getProperty( "appserver.base" );
  115. if ( StringUtils.isNotEmpty( appserverBase ) )
  116. {
  117. FileUtils.deleteDirectory( Paths.get( appserverBase ) );
  118. }
  119. }
  120. /*
  121. * Test Case 3.c
  122. */
  123. @Test
  124. public void testGetFromFirstManagedRepositoryReturnOk()
  125. throws Exception
  126. {
  127. String resourceName = "dummy/dummy-first-resource/1.0/dummy-first-resource-1.0.txt";
  128. Path dummyInternalResourceFile = repoRootFirst.resolve( resourceName );
  129. Files.createDirectories( dummyInternalResourceFile.getParent() );
  130. org.apache.archiva.common.utils.FileUtils.writeStringToFile( dummyInternalResourceFile, Charset.defaultCharset(), "first" );
  131. WebRequest request = new GetMethodWebRequest(
  132. "http://machine.com/repository/" + REPO_GROUP_WITH_VALID_REPOS + "/" + resourceName );
  133. WebResponse response = getServletUnitClient().getResponse( request );
  134. assertResponseOK( response );
  135. assertThat( response.getContentAsString() ).isEqualTo( "first" );
  136. }
  137. /*
  138. * Test Case 3.c
  139. */
  140. @Test
  141. public void testGetFromLastManagedRepositoryReturnOk()
  142. throws Exception
  143. {
  144. String resourceName = "dummy/dummy-last-resource/1.0/dummy-last-resource-1.0.txt";
  145. Path dummyReleasesResourceFile = repoRootLast.resolve( resourceName );
  146. Files.createDirectories(dummyReleasesResourceFile.getParent());
  147. org.apache.archiva.common.utils.FileUtils.writeStringToFile(dummyReleasesResourceFile, Charset.defaultCharset(), "last");
  148. WebRequest request = new GetMethodWebRequest(
  149. "http://machine.com/repository/" + REPO_GROUP_WITH_VALID_REPOS + "/" + resourceName );
  150. WebResponse response = getServletUnitClient().getResponse( request );
  151. assertResponseOK( response );
  152. assertThat( response.getContentAsString() ).isEqualTo( "last" );
  153. }
  154. /*
  155. * Test Case 3.b
  156. */
  157. @Test
  158. public void testGetFromValidRepositoryGroupReturnNotFound()
  159. throws Exception
  160. {
  161. String resourceName = "dummy/dummy-no-resource/1.0/dummy-no-resource-1.0.txt";
  162. WebRequest request = new GetMethodWebRequest(
  163. "http://machine.com/repository/" + REPO_GROUP_WITH_VALID_REPOS + "/" + resourceName );
  164. WebResponse response = getServletUnitClient().getResponse( request );
  165. assertResponseNotFound( response );
  166. }
  167. /*
  168. * Test Case 3.a
  169. */
  170. @Test
  171. public void testGetInvalidManagedRepositoryInGroupReturnNotFound()
  172. throws Exception
  173. {
  174. String resourceName = "dummy/dummy-no-resource/1.0/dummy-no-resource-1.0.txt";
  175. WebRequest request = new GetMethodWebRequest(
  176. "http://machine.com/repository/" + REPO_GROUP_WITH_INVALID_REPOS + "/" + resourceName );
  177. WebResponse response = getServletUnitClient().getResponse( request );
  178. assertResponseInternalServerError( response );
  179. }
  180. /*
  181. * Test Case 4
  182. */
  183. @Test
  184. public void testPutValidRepositoryGroupReturnBadRequest()
  185. throws Exception
  186. {
  187. String resourceName = "dummy/dummy-put-resource/1.0/dummy-put-resource-1.0.txt";
  188. String putUrl = "http://machine.com/repository/" + REPO_GROUP_WITH_VALID_REPOS + "/" + resourceName;
  189. InputStream is = getClass().getResourceAsStream( "/artifact.jar" );
  190. WebRequest request = new PutMethodWebRequest( putUrl, is, "text/plain" );
  191. WebResponse response = getServletUnitClient().getResponse( request );
  192. assertResponseMethodNotAllowed( response );
  193. }
  194. // MRM-872
  195. @Test
  196. public void testGetMergedMetadata()
  197. throws Exception
  198. {
  199. // first metadata file
  200. String resourceName = "dummy/dummy-merged-metadata-resource/maven-metadata.xml";
  201. Path dummyInternalResourceFile = repoRootFirst.resolve( resourceName );
  202. Files.createDirectories(dummyInternalResourceFile.getParent());
  203. org.apache.archiva.common.utils.FileUtils.writeStringToFile( dummyInternalResourceFile,
  204. Charset.defaultCharset(), "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
  205. + "<metadata>\n<groupId>dummy</groupId>\n<artifactId>dummy-merged-metadata-resource</artifactId>\n"
  206. + "<versioning>\n<latest>1.0</latest>\n<release>1.0</release>\n<versions>\n<version>1.0</version>\n"
  207. + "<version>2.5</version>\n</versions>\n<lastUpdated>20080708095554</lastUpdated>\n</versioning>\n</metadata>" );
  208. //second metadata file
  209. resourceName = "dummy/dummy-merged-metadata-resource/maven-metadata.xml";
  210. dummyInternalResourceFile = repoRootLast.resolve( resourceName );
  211. Files.createDirectories(dummyInternalResourceFile.getParent());
  212. org.apache.archiva.common.utils.FileUtils.writeStringToFile( dummyInternalResourceFile, Charset.defaultCharset(), "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
  213. + "<metadata><groupId>dummy</groupId><artifactId>dummy-merged-metadata-resource</artifactId>"
  214. + "<versioning><latest>2.0</latest><release>2.0</release><versions><version>1.0</version>"
  215. + "<version>1.5</version><version>2.0</version></versions><lastUpdated>20080709095554</lastUpdated>"
  216. + "</versioning></metadata>" );
  217. WebRequest request = new GetMethodWebRequest(
  218. "http://machine.com/repository/" + REPO_GROUP_WITH_VALID_REPOS + "/dummy/"
  219. + "dummy-merged-metadata-resource/maven-metadata.xml" );
  220. WebResponse response = getServletUnitClient().getResource( request );
  221. Path returnedMetadata = getProjectBase().resolve( "target/test-classes/retrievedMetadataFile.xml" );
  222. org.apache.archiva.common.utils.FileUtils.writeStringToFile( returnedMetadata, Charset.defaultCharset(), response.getContentAsString() );
  223. ArchivaRepositoryMetadata metadata = MavenMetadataReader.read( returnedMetadata );
  224. assertResponseOK( response );
  225. assertThat( metadata.getAvailableVersions() ).isNotNull()
  226. .hasSize( 4 ).contains( "1.0", "1.5", "2.0", "2.5" );
  227. //check if the checksum files were generated
  228. Path checksumFileSha1 = repoRootFirst.resolve( resourceName + ".sha1" );
  229. Files.createDirectories(checksumFileSha1.getParent());
  230. org.apache.archiva.common.utils.FileUtils.writeStringToFile(checksumFileSha1, Charset.defaultCharset(), "3290853214d3687134");
  231. Path checksumFileMd5 = repoRootFirst.resolve( resourceName + ".md5" );
  232. Files.createDirectories(checksumFileMd5.getParent());
  233. org.apache.archiva.common.utils.FileUtils.writeStringToFile(checksumFileMd5, Charset.defaultCharset(), "98745897234eda12836423");
  234. // request the sha1 checksum of the metadata
  235. request = new GetMethodWebRequest( "http://machine.com/repository/" + REPO_GROUP_WITH_VALID_REPOS + "/dummy/"
  236. + "dummy-merged-metadata-resource/maven-metadata.xml.sha1" );
  237. response = getServletUnitClient().getResource( request );
  238. assertResponseOK( response );
  239. assertThat( response.getContentAsString() )
  240. .isEqualTo( "add113b0d7f8c6adb92a5015a7a3701081edf998 maven-metadata-group-with-valid-repos.xml" );
  241. // request the md5 checksum of the metadata
  242. request = new GetMethodWebRequest( "http://machine.com/repository/" + REPO_GROUP_WITH_VALID_REPOS + "/dummy/"
  243. + "dummy-merged-metadata-resource/maven-metadata.xml.md5" );
  244. response = getServletUnitClient().getResource( request );
  245. assertResponseOK( response );
  246. assertThat( response.getContentAsString() )
  247. .isEqualTo( "5b85ea4aa5f52bb76760041a52f98de8 maven-metadata-group-with-valid-repos.xml" );
  248. }
  249. // MRM-901
  250. @Test
  251. public void testBrowseWithTwoArtifactsWithSameGroupIdInRepos()
  252. throws Exception
  253. {
  254. String resourceName = "dummy/dummy-artifact/1.0/dummy-artifact-1.0.txt";
  255. Path dummyInternalResourceFile = repoRootFirst.resolve( resourceName );
  256. Files.createDirectories(dummyInternalResourceFile.getParent());
  257. org.apache.archiva.common.utils.FileUtils.writeStringToFile(dummyInternalResourceFile, Charset.defaultCharset(), "first");
  258. resourceName = "dummy/dummy-artifact/2.0/dummy-artifact-2.0.txt";
  259. Path dummyReleasesResourceFile = repoRootLast.resolve( resourceName );
  260. Files.createDirectories(dummyReleasesResourceFile.getParent());
  261. org.apache.archiva.common.utils.FileUtils.writeStringToFile(dummyReleasesResourceFile, Charset.defaultCharset(), "last");
  262. WebRequest request = new GetMethodWebRequest(
  263. "http://machine.com/repository/" + REPO_GROUP_WITH_VALID_REPOS + "/dummy/dummy-artifact/" );
  264. WebResponse response = getServletUnitClient().getResource( request );
  265. assertResponseOK( response );
  266. assertThat( response.getContentAsString() ).contains( "Collection" )
  267. .contains( "dummy/dummy-artifact" )
  268. .contains( "1.0" )
  269. .contains( "2.0" );
  270. }
  271. protected void assertResponseMethodNotAllowed( WebResponse response )
  272. {
  273. assertThat( response ).isNotNull();
  274. assertThat( response.getStatusCode() ).isEqualTo( HttpServletResponse.SC_METHOD_NOT_ALLOWED );
  275. }
  276. protected RepositoryGroupConfiguration createRepositoryGroup( String id, List<String> repositories )
  277. {
  278. RepositoryGroupConfiguration repoGroupConfiguration = new RepositoryGroupConfiguration();
  279. repoGroupConfiguration.setId( id );
  280. repoGroupConfiguration.setRepositories( repositories );
  281. return repoGroupConfiguration;
  282. }
  283. }