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 15KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346
  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.metadata.maven.MavenMetadataReader;
  27. import org.apache.archiva.model.ArchivaRepositoryMetadata;
  28. import org.apache.commons.lang3.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 = getAppserverBase().toAbsolutePath().toString();
  74. log.debug( "Appserver Base {}", appserverBase );
  75. Configuration configuration = archivaConfiguration.getConfiguration();
  76. repoRootFirst = Paths.get( appserverBase, "data/repositories/" + MANAGED_REPO_FIRST );
  77. repoRootLast = Paths.get( appserverBase, "data/repositories/" + MANAGED_REPO_LAST );
  78. configuration.addManagedRepository(
  79. createManagedRepository( MANAGED_REPO_FIRST, "First Test Repo", repoRootFirst, true ) );
  80. configuration.addManagedRepository(
  81. createManagedRepository( MANAGED_REPO_LAST, "Last Test Repo", repoRootLast, true ) );
  82. List<String> managedRepoIds = new ArrayList<>();
  83. managedRepoIds.add( MANAGED_REPO_FIRST );
  84. managedRepoIds.add( MANAGED_REPO_LAST );
  85. configuration.addRepositoryGroup( createRepositoryGroup( REPO_GROUP_WITH_VALID_REPOS, managedRepoIds ) );
  86. // Create the repository group with an invalid managed repository
  87. repoRootInvalid = Paths.get( appserverBase, "data/repositories/" + MANAGED_REPO_INVALID );
  88. ManagedRepositoryConfiguration managedRepositoryConfiguration =
  89. createManagedRepository( MANAGED_REPO_INVALID, "Invalid Test Repo", repoRootInvalid, true );
  90. configuration.addManagedRepository( managedRepositoryConfiguration );
  91. List<String> invalidManagedRepoIds = new ArrayList<>();
  92. invalidManagedRepoIds.add( MANAGED_REPO_FIRST );
  93. invalidManagedRepoIds.add( MANAGED_REPO_INVALID );
  94. invalidManagedRepoIds.add( MANAGED_REPO_LAST );
  95. configuration.addRepositoryGroup(
  96. createRepositoryGroup( REPO_GROUP_WITH_INVALID_REPOS, invalidManagedRepoIds ) );
  97. configuration.removeManagedRepository( managedRepositoryConfiguration );
  98. org.apache.archiva.common.utils.FileUtils.deleteDirectory( repoRootInvalid );
  99. repositoryRegistry.reload();
  100. saveConfiguration( archivaConfiguration );
  101. startRepository();
  102. }
  103. @Override
  104. @After
  105. public void tearDown()
  106. throws Exception
  107. {
  108. setupCleanRepo( repoRootFirst );
  109. setupCleanRepo( repoRootLast );
  110. repositoryRegistry.destroy();
  111. super.tearDown();
  112. String appserverBase = System.getProperty( "appserver.base" );
  113. if ( StringUtils.isNotEmpty( appserverBase ) )
  114. {
  115. FileUtils.deleteDirectory( Paths.get( appserverBase ) );
  116. }
  117. }
  118. /*
  119. * Test Case 3.c
  120. */
  121. @Test
  122. public void testGetFromFirstManagedRepositoryReturnOk()
  123. throws Exception
  124. {
  125. String resourceName = "dummy/dummy-first-resource/1.0/dummy-first-resource-1.0.txt";
  126. Path dummyInternalResourceFile = repoRootFirst.resolve( resourceName );
  127. Files.createDirectories( dummyInternalResourceFile.getParent() );
  128. org.apache.archiva.common.utils.FileUtils.writeStringToFile( dummyInternalResourceFile, Charset.defaultCharset(), "first" );
  129. WebRequest request = new GetMethodWebRequest(
  130. "http://machine.com/repository/" + REPO_GROUP_WITH_VALID_REPOS + "/" + resourceName );
  131. WebResponse response = getServletUnitClient().getResponse( request );
  132. assertResponseOK( response );
  133. assertThat( response.getContentAsString() ).isEqualTo( "first" );
  134. }
  135. /*
  136. * Test Case 3.c
  137. */
  138. @Test
  139. public void testGetFromLastManagedRepositoryReturnOk()
  140. throws Exception
  141. {
  142. String resourceName = "dummy/dummy-last-resource/1.0/dummy-last-resource-1.0.txt";
  143. Path dummyReleasesResourceFile = repoRootLast.resolve( resourceName );
  144. Files.createDirectories(dummyReleasesResourceFile.getParent());
  145. org.apache.archiva.common.utils.FileUtils.writeStringToFile(dummyReleasesResourceFile, Charset.defaultCharset(), "last");
  146. WebRequest request = new GetMethodWebRequest(
  147. "http://machine.com/repository/" + REPO_GROUP_WITH_VALID_REPOS + "/" + resourceName );
  148. WebResponse response = getServletUnitClient().getResponse( request );
  149. assertResponseOK( response );
  150. assertThat( response.getContentAsString() ).isEqualTo( "last" );
  151. }
  152. /*
  153. * Test Case 3.b
  154. */
  155. @Test
  156. public void testGetFromValidRepositoryGroupReturnNotFound()
  157. throws Exception
  158. {
  159. String resourceName = "dummy/dummy-no-resource/1.0/dummy-no-resource-1.0.txt";
  160. WebRequest request = new GetMethodWebRequest(
  161. "http://machine.com/repository/" + REPO_GROUP_WITH_VALID_REPOS + "/" + resourceName );
  162. WebResponse response = getServletUnitClient().getResponse( request );
  163. assertResponseNotFound( response );
  164. }
  165. /*
  166. * Test Case 4
  167. */
  168. @Test
  169. public void testPutValidRepositoryGroupReturnBadRequest()
  170. throws Exception
  171. {
  172. String resourceName = "dummy/dummy-put-resource/1.0/dummy-put-resource-1.0.txt";
  173. String putUrl = "http://machine.com/repository/" + REPO_GROUP_WITH_VALID_REPOS + "/" + resourceName;
  174. InputStream is = getClass().getResourceAsStream( "/artifact.jar" );
  175. WebRequest request = new PutMethodWebRequest( putUrl, is, "text/plain" );
  176. WebResponse response = getServletUnitClient().getResponse( request );
  177. assertResponseMethodNotAllowed( response );
  178. }
  179. // MRM-872
  180. @Test
  181. public void testGetMergedMetadata()
  182. throws Exception
  183. {
  184. // first metadata file
  185. String resourceName = "dummy/dummy-merged-metadata-resource/maven-metadata.xml";
  186. Path dummyInternalResourceFile = repoRootFirst.resolve( resourceName );
  187. Files.createDirectories(dummyInternalResourceFile.getParent());
  188. org.apache.archiva.common.utils.FileUtils.writeStringToFile( dummyInternalResourceFile,
  189. Charset.defaultCharset(), "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
  190. + "<metadata>\n<groupId>dummy</groupId>\n<artifactId>dummy-merged-metadata-resource</artifactId>\n"
  191. + "<versioning>\n<latest>1.0</latest>\n<release>1.0</release>\n<versions>\n<version>1.0</version>\n"
  192. + "<version>2.5</version>\n</versions>\n<lastUpdated>20080708095554</lastUpdated>\n</versioning>\n</metadata>" );
  193. //second metadata file
  194. resourceName = "dummy/dummy-merged-metadata-resource/maven-metadata.xml";
  195. dummyInternalResourceFile = repoRootLast.resolve( resourceName );
  196. Files.createDirectories(dummyInternalResourceFile.getParent());
  197. org.apache.archiva.common.utils.FileUtils.writeStringToFile( dummyInternalResourceFile, Charset.defaultCharset(), "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
  198. + "<metadata><groupId>dummy</groupId><artifactId>dummy-merged-metadata-resource</artifactId>"
  199. + "<versioning><latest>2.0</latest><release>2.0</release><versions><version>1.0</version>"
  200. + "<version>1.5</version><version>2.0</version></versions><lastUpdated>20080709095554</lastUpdated>"
  201. + "</versioning></metadata>" );
  202. WebRequest request = new GetMethodWebRequest(
  203. "http://machine.com/repository/" + REPO_GROUP_WITH_VALID_REPOS + "/dummy/"
  204. + "dummy-merged-metadata-resource/maven-metadata.xml" );
  205. WebResponse response = getServletUnitClient().getResource( request );
  206. Path returnedMetadata = getProjectBase().resolve( "target/test-classes/retrievedMetadataFile.xml" );
  207. org.apache.archiva.common.utils.FileUtils.writeStringToFile( returnedMetadata, Charset.defaultCharset(), response.getContentAsString() );
  208. MavenMetadataReader metadataReader = new MavenMetadataReader( );
  209. ArchivaRepositoryMetadata metadata = metadataReader.read( returnedMetadata );
  210. assertResponseOK( response );
  211. assertThat( metadata.getAvailableVersions() ).isNotNull()
  212. .hasSize( 4 ).contains( "1.0", "1.5", "2.0", "2.5" );
  213. //check if the checksum files were generated
  214. Path checksumFileSha1 = repoRootFirst.resolve( resourceName + ".sha1" );
  215. Files.createDirectories(checksumFileSha1.getParent());
  216. org.apache.archiva.common.utils.FileUtils.writeStringToFile(checksumFileSha1, Charset.defaultCharset(), "3290853214d3687134");
  217. Path checksumFileMd5 = repoRootFirst.resolve( resourceName + ".md5" );
  218. Files.createDirectories(checksumFileMd5.getParent());
  219. org.apache.archiva.common.utils.FileUtils.writeStringToFile(checksumFileMd5, Charset.defaultCharset(), "98745897234eda12836423");
  220. // request the sha1 checksum of the metadata
  221. request = new GetMethodWebRequest( "http://machine.com/repository/" + REPO_GROUP_WITH_VALID_REPOS + "/dummy/"
  222. + "dummy-merged-metadata-resource/maven-metadata.xml.sha1" );
  223. response = getServletUnitClient().getResource( request );
  224. assertResponseOK( response );
  225. assertThat( response.getContentAsString() )
  226. .startsWith( "f8a7a858a46887368adf0b30874de1f807d91453" );
  227. // request the md5 checksum of the metadata
  228. request = new GetMethodWebRequest( "http://machine.com/repository/" + REPO_GROUP_WITH_VALID_REPOS + "/dummy/"
  229. + "dummy-merged-metadata-resource/maven-metadata.xml.md5" );
  230. response = getServletUnitClient().getResource( request );
  231. assertResponseOK( response );
  232. assertThat( response.getContentAsString() )
  233. .startsWith( "cec864b66849153dd45fddb7cdde12b2" );
  234. }
  235. // MRM-901
  236. @Test
  237. public void testBrowseWithTwoArtifactsWithSameGroupIdInRepos()
  238. throws Exception
  239. {
  240. String resourceName = "dummy/dummy-artifact/1.0/dummy-artifact-1.0.txt";
  241. Path dummyInternalResourceFile = repoRootFirst.resolve( resourceName );
  242. Files.createDirectories(dummyInternalResourceFile.getParent());
  243. org.apache.archiva.common.utils.FileUtils.writeStringToFile(dummyInternalResourceFile, Charset.defaultCharset(), "first");
  244. resourceName = "dummy/dummy-artifact/2.0/dummy-artifact-2.0.txt";
  245. Path dummyReleasesResourceFile = repoRootLast.resolve( resourceName );
  246. Files.createDirectories(dummyReleasesResourceFile.getParent());
  247. org.apache.archiva.common.utils.FileUtils.writeStringToFile(dummyReleasesResourceFile, Charset.defaultCharset(), "last");
  248. WebRequest request = new GetMethodWebRequest(
  249. "http://machine.com/repository/" + REPO_GROUP_WITH_VALID_REPOS + "/dummy/dummy-artifact/" );
  250. WebResponse response = getServletUnitClient().getResource( request );
  251. assertResponseOK( response );
  252. assertThat( response.getContentAsString() ).contains( "Collection" )
  253. .contains( "dummy/dummy-artifact" )
  254. .contains( "1.0" )
  255. .contains( "2.0" );
  256. }
  257. protected void assertResponseMethodNotAllowed( WebResponse response )
  258. {
  259. assertThat( response ).isNotNull();
  260. assertThat( response.getStatusCode() ).isEqualTo( HttpServletResponse.SC_METHOD_NOT_ALLOWED );
  261. }
  262. protected RepositoryGroupConfiguration createRepositoryGroup( String id, List<String> repositories )
  263. {
  264. RepositoryGroupConfiguration repoGroupConfiguration = new RepositoryGroupConfiguration();
  265. repoGroupConfiguration.setId( id );
  266. repoGroupConfiguration.setRepositories( repositories );
  267. return repoGroupConfiguration;
  268. }
  269. }