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.

HttpProxyTransferTest.java 12KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277
  1. package org.apache.archiva.maven.proxy;
  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. * Unless required by applicable law or agreed to in writing,
  13. * software distributed under the License is distributed on an
  14. * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  15. * KIND, either express or implied. See the License for the
  16. * specific language governing permissions and limitations
  17. * under the License.
  18. */
  19. import org.apache.archiva.configuration.ArchivaConfiguration;
  20. import org.apache.archiva.configuration.NetworkProxyConfiguration;
  21. import org.apache.archiva.configuration.ProxyConnectorConfiguration;
  22. import org.apache.archiva.configuration.RemoteRepositoryConfiguration;
  23. import org.apache.archiva.policies.CachedFailuresPolicy;
  24. import org.apache.archiva.policies.ChecksumPolicy;
  25. import org.apache.archiva.policies.PropagateErrorsDownloadPolicy;
  26. import org.apache.archiva.policies.PropagateErrorsOnUpdateDownloadPolicy;
  27. import org.apache.archiva.policies.ReleasesPolicy;
  28. import org.apache.archiva.policies.SnapshotsPolicy;
  29. import org.apache.archiva.proxy.ProxyRegistry;
  30. import org.apache.archiva.proxy.model.RepositoryProxyHandler;
  31. import org.apache.archiva.repository.ManagedRepository;
  32. import org.apache.archiva.repository.ManagedRepositoryContent;
  33. import org.apache.archiva.repository.RepositoryRegistry;
  34. import org.apache.archiva.repository.base.RepositoryHandlerDependencies;
  35. import org.apache.archiva.repository.base.managed.BasicManagedRepository;
  36. import org.apache.archiva.repository.content.Artifact;
  37. import org.apache.archiva.repository.content.BaseRepositoryContentLayout;
  38. import org.apache.archiva.repository.storage.StorageAsset;
  39. import org.apache.archiva.test.utils.ArchivaSpringJUnit4ClassRunner;
  40. import org.apache.commons.io.FileUtils;
  41. import org.apache.commons.lang3.StringUtils;
  42. import org.apache.maven.wagon.Wagon;
  43. import org.apache.maven.wagon.providers.http.HttpWagon;
  44. import org.eclipse.jetty.server.Handler;
  45. import org.eclipse.jetty.server.HttpConnectionFactory;
  46. import org.eclipse.jetty.server.Request;
  47. import org.eclipse.jetty.server.Server;
  48. import org.eclipse.jetty.server.ServerConnector;
  49. import org.eclipse.jetty.server.handler.AbstractHandler;
  50. import org.junit.After;
  51. import org.junit.Before;
  52. import org.junit.Test;
  53. import org.junit.runner.RunWith;
  54. import org.springframework.context.ApplicationContext;
  55. import org.springframework.test.context.ContextConfiguration;
  56. import javax.inject.Inject;
  57. import javax.servlet.ServletException;
  58. import javax.servlet.http.HttpServletRequest;
  59. import javax.servlet.http.HttpServletResponse;
  60. import java.io.IOException;
  61. import java.nio.charset.Charset;
  62. import java.nio.file.Files;
  63. import java.nio.file.Path;
  64. import java.nio.file.Paths;
  65. import static org.junit.Assert.*;
  66. /**
  67. * Integration test for connecting over a HTTP proxy.
  68. *
  69. *
  70. */
  71. @RunWith( ArchivaSpringJUnit4ClassRunner.class )
  72. @ContextConfiguration( locations = { "classpath*:/META-INF/spring-context.xml", "classpath:/spring-context.xml" } )
  73. public class HttpProxyTransferTest
  74. {
  75. private static final String PROXY_ID = "proxy";
  76. private static final String MANAGED_ID = "default-managed-repository";
  77. private static final String PROXIED_ID = "proxied1";
  78. private static final String PROXIED_BASEDIR = "src/test/repositories/proxied1";
  79. private RepositoryProxyHandler proxyHandler;
  80. private ManagedRepositoryContent managedDefaultRepository;
  81. @Inject
  82. private ApplicationContext applicationContext;
  83. @Inject
  84. private RepositoryRegistry repositoryRegistry;
  85. @Inject
  86. private ArchivaConfiguration config;
  87. @Inject
  88. private ProxyRegistry proxyRegistry;
  89. @SuppressWarnings( "unused" )
  90. @Inject
  91. RepositoryHandlerDependencies repositoryHandlerDependencies;
  92. private Server server;
  93. protected ManagedRepositoryContent createRepository( String id, String name, String path, String layout )
  94. throws Exception
  95. {
  96. ManagedRepository repo = BasicManagedRepository.newFilesystemInstance(id, name, Paths.get(path).resolve(id));
  97. repositoryRegistry.putRepository(repo);
  98. return repositoryRegistry.getManagedRepository(id).getContent();
  99. }
  100. @Before
  101. public void setUp()
  102. throws Exception
  103. {
  104. proxyHandler = applicationContext.getBean( "repositoryProxyHandler#test", RepositoryProxyHandler.class );
  105. // clear from previous tests - TODO the spring context should be initialised per test instead, or the config
  106. // made a complete mock
  107. config.getConfiguration().getProxyConnectors().clear();
  108. // Setup source repository (using default layout)
  109. String repoPath = "target/test-repository/managed/" + getClass().getSimpleName();
  110. Path destRepoDir = Paths.get( repoPath );
  111. // Cleanout destination dirs.
  112. if ( Files.exists(destRepoDir))
  113. {
  114. FileUtils.deleteDirectory( destRepoDir.toFile() );
  115. }
  116. // Make the destination dir.
  117. Files.createDirectories(destRepoDir);
  118. Handler handler = new AbstractHandler()
  119. {
  120. @Override
  121. public void handle( String s, Request request, HttpServletRequest httpServletRequest,
  122. HttpServletResponse response )
  123. throws IOException, ServletException
  124. {
  125. response.setContentType( "text/plain" );
  126. response.setStatus( HttpServletResponse.SC_OK );
  127. response.getWriter().print( "get-default-layout-1.0.jar\n\n" );
  128. assertNotNull( request.getHeader( "Proxy-Connection" ) );
  129. ( (Request) request ).setHandled( true );
  130. }
  131. public void handle( String target, HttpServletRequest request, HttpServletResponse response, int dispatch )
  132. throws IOException, ServletException
  133. {
  134. response.setContentType( "text/plain" );
  135. response.setStatus( HttpServletResponse.SC_OK );
  136. response.getWriter().print( "get-default-layout-1.0.jar\n\n" );
  137. assertNotNull( request.getHeader( "Proxy-Connection" ) );
  138. ( (Request) request ).setHandled( true );
  139. }
  140. };
  141. server = new Server( );
  142. ServerConnector serverConnector = new ServerConnector( server, new HttpConnectionFactory());
  143. server.addConnector( serverConnector );
  144. server.setHandler( handler );
  145. server.start();
  146. int port = serverConnector.getLocalPort();
  147. NetworkProxyConfiguration proxyConfig = new NetworkProxyConfiguration();
  148. proxyConfig.setHost( "localhost" );
  149. proxyConfig.setPort( port );
  150. proxyConfig.setProtocol( "http" );
  151. proxyConfig.setId( PROXY_ID );
  152. config.getConfiguration().addNetworkProxy( proxyConfig );
  153. ( (MockConfiguration) config ).triggerChange("networkProxies.networkProxy(0).host", "localhost");
  154. // Setup target (proxied to) repository.
  155. RemoteRepositoryConfiguration repoConfig = new RemoteRepositoryConfiguration();
  156. repoConfig.setId( PROXIED_ID );
  157. repoConfig.setName( "Proxied Repository 1" );
  158. repoConfig.setLayout( "default" );
  159. repoConfig.setUrl( "http://www.example.com/" );
  160. config.getConfiguration().addRemoteRepository( repoConfig );
  161. Wagon wagon = new HttpWagon( );
  162. WagonDelegate delegate = (WagonDelegate) applicationContext.getBean( "wagon#http", Wagon.class );
  163. delegate.setDelegate( wagon );
  164. proxyRegistry.reload();
  165. repositoryRegistry.reload();
  166. managedDefaultRepository = createRepository(MANAGED_ID, "Default Managed Repository", repoPath, "default");
  167. }
  168. @After
  169. public void tearDown()
  170. throws Exception
  171. {
  172. if (server!=null) {
  173. server.stop();
  174. }
  175. }
  176. @Test
  177. public void testGetOverHttpProxy()
  178. throws Exception
  179. {
  180. assertTrue( StringUtils.isEmpty( System.getProperty( "http.proxyHost" , "" ) ));
  181. assertTrue( StringUtils.isEmpty( System.getProperty( "http.proxyPort", "" ) ) );
  182. String path = "org/apache/maven/test/get-default-layout/1.0/get-default-layout-1.0.jar";
  183. // Configure Connector (usually done within archiva.xml configuration)
  184. addConnector();
  185. managedDefaultRepository = repositoryRegistry.getManagedRepository(MANAGED_ID).getContent();
  186. BaseRepositoryContentLayout layout = managedDefaultRepository.getLayout( BaseRepositoryContentLayout.class );
  187. Path expectedFile = managedDefaultRepository.getRepository().getRoot().resolve( path ).getFilePath();
  188. Files.deleteIfExists( expectedFile );
  189. Artifact artifact = layout.getArtifact( path );
  190. // Attempt the proxy fetch.
  191. StorageAsset downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository.getRepository(), artifact );
  192. Path sourceFile = Paths.get( PROXIED_BASEDIR, path );
  193. assertNotNull( "Expected File should not be null.", expectedFile );
  194. assertNotNull( "Actual File should not be null.", downloadedFile );
  195. assertTrue( "Check actual file exists.", Files.exists(downloadedFile.getFilePath()));
  196. assertTrue( "Check filename path is appropriate.", Files.isSameFile( expectedFile, downloadedFile.getFilePath()));
  197. assertTrue( "Check file path matches.", Files.isSameFile( expectedFile, downloadedFile.getFilePath()));
  198. String expectedContents = FileUtils.readFileToString( sourceFile.toFile(), Charset.defaultCharset() );
  199. String actualContents = FileUtils.readFileToString( downloadedFile.getFilePath().toFile(), Charset.defaultCharset() );
  200. assertEquals( "Check file contents.", expectedContents, actualContents );
  201. assertTrue( StringUtils.isEmpty( System.getProperty( "http.proxyHost", "" ) ) );
  202. assertTrue( StringUtils.isEmpty( System.getProperty( "http.proxyPort" , "") ) );
  203. }
  204. private void addConnector()
  205. {
  206. ProxyConnectorConfiguration connectorConfig = new ProxyConnectorConfiguration();
  207. connectorConfig.setProxyId( PROXY_ID );
  208. connectorConfig.setSourceRepoId( MANAGED_ID );
  209. connectorConfig.setTargetRepoId( PROXIED_ID );
  210. connectorConfig.addPolicy( ProxyConnectorConfiguration.POLICY_CHECKSUM, ChecksumPolicy.FIX.getId() );
  211. connectorConfig.addPolicy( ProxyConnectorConfiguration.POLICY_RELEASES, ReleasesPolicy.ONCE.getId() );
  212. connectorConfig.addPolicy( ProxyConnectorConfiguration.POLICY_SNAPSHOTS, SnapshotsPolicy.ONCE.getId() );
  213. connectorConfig.addPolicy( ProxyConnectorConfiguration.POLICY_CACHE_FAILURES, CachedFailuresPolicy.NO.getId() );
  214. connectorConfig.addPolicy( ProxyConnectorConfiguration.POLICY_PROPAGATE_ERRORS,
  215. PropagateErrorsDownloadPolicy.QUEUE.getId() );
  216. connectorConfig.addPolicy( ProxyConnectorConfiguration.POLICY_PROPAGATE_ERRORS_ON_UPDATE,
  217. PropagateErrorsOnUpdateDownloadPolicy.NOT_PRESENT.getId() );
  218. int count = config.getConfiguration().getProxyConnectors().size();
  219. config.getConfiguration().addProxyConnector( connectorConfig );
  220. // Proper Triggering ...
  221. String prefix = "proxyConnectors.proxyConnector(" + count + ")";
  222. ( (MockConfiguration) config ).triggerChange( prefix + ".sourceRepoId", connectorConfig.getSourceRepoId() );
  223. }
  224. }