Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

MetadataTransferTest.java 63KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403
  1. package org.apache.archiva.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. *
  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 org.apache.archiva.common.utils.VersionUtil;
  21. import org.apache.archiva.configuration.ProxyConnectorConfiguration;
  22. import org.apache.archiva.maven2.metadata.MavenMetadataReader;
  23. import org.apache.archiva.model.ArchivaRepositoryMetadata;
  24. import org.apache.archiva.model.Plugin;
  25. import org.apache.archiva.model.ProjectReference;
  26. import org.apache.archiva.model.SnapshotVersion;
  27. import org.apache.archiva.model.VersionedReference;
  28. import org.apache.archiva.policies.CachedFailuresPolicy;
  29. import org.apache.archiva.policies.ChecksumPolicy;
  30. import org.apache.archiva.policies.ReleasesPolicy;
  31. import org.apache.archiva.policies.SnapshotsPolicy;
  32. import org.apache.archiva.repository.metadata.MetadataTools;
  33. import org.apache.archiva.repository.metadata.RepositoryMetadataException;
  34. import org.apache.archiva.repository.metadata.RepositoryMetadataWriter;
  35. import org.apache.commons.lang.StringUtils;
  36. import org.apache.maven.wagon.TransferFailedException;
  37. import org.custommonkey.xmlunit.DetailedDiff;
  38. import org.custommonkey.xmlunit.Diff;
  39. import org.junit.Test;
  40. import javax.inject.Inject;
  41. import javax.inject.Named;
  42. import java.io.File;
  43. import java.io.StringWriter;
  44. import java.util.ArrayList;
  45. import java.util.Arrays;
  46. import static org.junit.Assert.*;
  47. /**
  48. * MetadataTransferTest - Tests the various fetching / merging concepts surrounding the maven-metadata.xml files
  49. * present in the repository.
  50. * <p/>
  51. * Test Case Naming is as follows.
  52. * <p/>
  53. * <code>
  54. * public void testGet[Release|Snapshot|Project]Metadata[Not]Proxied[Not|On]Local[Not|On|Multiple]Remote
  55. * </code>
  56. * <p/>
  57. * <pre>
  58. * Which should leave the following matrix of test cases.
  59. *
  60. * Metadata | Proxied | Local | Remote
  61. * ----------+----------+-------+---------
  62. * Release | Not | Not | n/a (1)
  63. * Release | Not | On | n/a (1)
  64. * Release | | Not | Not
  65. * Release | | Not | On
  66. * Release | | Not | Multiple
  67. * Release | | On | Not
  68. * Release | | On | On
  69. * Release | | On | Multiple
  70. * Snapshot | Not | Not | n/a (1)
  71. * Snapshot | Not | On | n/a (1)
  72. * Snapshot | | Not | Not
  73. * Snapshot | | Not | On
  74. * Snapshot | | Not | Multiple
  75. * Snapshot | | On | Not
  76. * Snapshot | | On | On
  77. * Snapshot | | On | Multiple
  78. * Project | Not | Not | n/a (1)
  79. * Project | Not | On | n/a (1)
  80. * Project | | Not | Not
  81. * Project | | Not | On
  82. * Project | | Not | Multiple
  83. * Project | | On | Not
  84. * Project | | On | On
  85. * Project | | On | Multiple
  86. *
  87. * (1) If it isn't proxied, no point in having a remote.
  88. * </pre>
  89. *
  90. *
  91. */
  92. public class MetadataTransferTest
  93. extends AbstractProxyTestCase
  94. {
  95. @Inject
  96. @Named(value = "metadataTools#mocked")
  97. private MetadataTools metadataTools;
  98. @Test
  99. public void testGetProjectMetadataProxiedNotLocalOnRemoteConnectoDisabled()
  100. throws Exception
  101. {
  102. // New project metadata that does not exist locally but exists on remote.
  103. String requestedResource = "org/apache/maven/test/get-found-in-proxy/maven-metadata.xml";
  104. setupTestableManagedRepository( requestedResource );
  105. // Configure Connector (usually done within archiva.xml configuration)
  106. saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED1, ChecksumPolicy.FIX, ReleasesPolicy.ALWAYS,
  107. SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, true );
  108. assertResourceNotFound( requestedResource );
  109. assertNoRepoMetadata( ID_PROXIED1, requestedResource );
  110. File expectedFile = new File( managedDefaultDir, requestedResource );
  111. ProjectReference metadata = createProjectReference( requestedResource );
  112. File downloadedFile = proxyHandler.fetchMetatadaFromProxies( managedDefaultRepository,
  113. managedDefaultRepository.toMetadataPath(
  114. metadata ) );
  115. assertNull( "Should not have downloaded a file.", downloadedFile );
  116. assertNoTempFiles( expectedFile );
  117. }
  118. // TODO: same test for other fetch* methods
  119. @Test
  120. public void testFetchFromTwoProxiesWhenFirstConnectionFails()
  121. throws Exception
  122. {
  123. // Project metadata that does not exist locally, but has multiple versions in remote repos
  124. String requestedResource = "org/apache/maven/test/get-default-layout/maven-metadata.xml";
  125. setupTestableManagedRepository( requestedResource );
  126. saveRemoteRepositoryConfig( "badproxied1", "Bad Proxied 1", "test://bad.machine.com/repo/", "default" );
  127. // Configure Connector (usually done within archiva.xml configuration)
  128. saveConnector( ID_DEFAULT_MANAGED, "badproxied1", ChecksumPolicy.FIX, ReleasesPolicy.ALWAYS,
  129. SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false );
  130. saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED2, ChecksumPolicy.FIX, ReleasesPolicy.ALWAYS,
  131. SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false );
  132. assertResourceNotFound( requestedResource );
  133. assertNoRepoMetadata( "badproxied1", requestedResource );
  134. assertNoRepoMetadata( ID_PROXIED2, requestedResource );
  135. // ensure that a hard failure in the first proxy connector is skipped and the second repository checked
  136. File expectedFile = new File( managedDefaultDir.getAbsoluteFile(),
  137. metadataTools.getRepositorySpecificName( "badproxied1", requestedResource ) );
  138. wagonMock.get( requestedResource, new File( expectedFile.getParentFile(), expectedFile.getName() + ".tmp" ) );
  139. wagonMockControl.setMatcher( customWagonGetMatcher );
  140. wagonMockControl.setThrowable( new TransferFailedException( "can't connect" ) );
  141. wagonMockControl.replay();
  142. assertFetchProjectOrGroup( requestedResource );
  143. wagonMockControl.verify();
  144. assertProjectMetadataContents( requestedResource, new String[]{ "1.0.1" }, "1.0.1", "1.0.1" );
  145. assertNoRepoMetadata( "badproxied1", requestedResource );
  146. assertRepoProjectMetadata( ID_PROXIED2, requestedResource, new String[]{ "1.0.1" } );
  147. }
  148. /**
  149. * Attempt to get the project metadata for non-existant artifact.
  150. * <p/>
  151. * Expected result: the maven-metadata.xml file is not created on the managed repository, nor returned
  152. * to the requesting client.
  153. */
  154. @Test
  155. public void testGetProjectMetadataNotProxiedNotLocal()
  156. throws Exception
  157. {
  158. // The artifactId "get-default-metadata-nonexistant" does not exist (intentionally).
  159. String requestedResource = "org/apache/maven/test/get-default-metadata-nonexistant/maven-metadata.xml";
  160. setupTestableManagedRepository( requestedResource );
  161. config.getConfiguration().setProxyConnectors( new ArrayList<ProxyConnectorConfiguration>( ) );
  162. assertResourceNotFound( requestedResource );
  163. // No proxy setup, nothing fetched, failure expected.
  164. assertFetchProjectOrGroupFailed( requestedResource );
  165. // No local artifactId, and no fetch, should equal no metadata file downloaded / created / updated.
  166. assertResourceNotFound( requestedResource );
  167. }
  168. @Test
  169. public void testGetProjectMetadataNotProxiedOnLocal()
  170. throws Exception
  171. {
  172. // Project metadata that exists and has multiple versions
  173. String requestedResource = "org/apache/maven/test/get-project-metadata/maven-metadata.xml";
  174. setupTestableManagedRepository( requestedResource );
  175. config.getConfiguration().setProxyConnectors( new ArrayList<ProxyConnectorConfiguration>( ) );
  176. assertResourceExists( requestedResource );
  177. // No proxy setup, nothing fetched from remote, but local exists.
  178. assertFetchProjectOrGroup( requestedResource );
  179. // Nothing fetched. Should only contain contents of what is in the repository.
  180. // A metadata update is not performed in this use case. Local metadata content is only
  181. // updated via the metadata updater consumer.
  182. assertProjectMetadataContents( requestedResource, new String[]{ "1.0" }, null, null );
  183. }
  184. @Test
  185. public void testGetProjectMetadataProxiedNotLocalMultipleRemotes()
  186. throws Exception
  187. {
  188. // Project metadata that does not exist locally, but has multiple versions in remote repos
  189. String requestedResource = "org/apache/maven/test/get-default-layout/maven-metadata.xml";
  190. setupTestableManagedRepository( requestedResource );
  191. // Configure Connector (usually done within archiva.xml configuration)
  192. saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED1, ChecksumPolicy.FIX, ReleasesPolicy.ALWAYS,
  193. SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false );
  194. saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED2, ChecksumPolicy.FIX, ReleasesPolicy.ALWAYS,
  195. SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false );
  196. assertResourceNotFound( requestedResource );
  197. assertNoRepoMetadata( ID_PROXIED1, requestedResource );
  198. assertNoRepoMetadata( ID_PROXIED2, requestedResource );
  199. // Two proxies setup, metadata fetched from both remotes.
  200. assertFetchProjectOrGroup( requestedResource );
  201. // Nothing fetched. Should only contain contents of what is in the repository.
  202. assertProjectMetadataContents( requestedResource, new String[]{ "1.0", "1.0.1" }, "1.0.1", "1.0.1" );
  203. assertRepoProjectMetadata( ID_PROXIED1, requestedResource, new String[]{ "1.0" } );
  204. assertRepoProjectMetadata( ID_PROXIED2, requestedResource, new String[]{ "1.0.1" } );
  205. }
  206. @Test
  207. public void testGetProjectMetadataProxiedNotLocalNotRemote()
  208. throws Exception
  209. {
  210. // Non-existant project metadata that does not exist locally and doesn't exist on remotes.
  211. String requestedResource = "org/apache/maven/test/get-bogus-artifact/maven-metadata.xml";
  212. setupTestableManagedRepository( requestedResource );
  213. // Configure Connector (usually done within archiva.xml configuration)
  214. saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED1, ChecksumPolicy.FIX, ReleasesPolicy.ALWAYS,
  215. SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false );
  216. saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED2, ChecksumPolicy.FIX, ReleasesPolicy.ALWAYS,
  217. SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false );
  218. assertResourceNotFound( requestedResource );
  219. assertNoRepoMetadata( ID_PROXIED1, requestedResource );
  220. assertNoRepoMetadata( ID_PROXIED2, requestedResource );
  221. // Two proxies setup, nothing fetched from remotes, local does not exist.
  222. assertFetchProjectOrGroupFailed( requestedResource );
  223. // Nothing fetched. Nothing should exist.
  224. assertResourceNotFound( requestedResource );
  225. assertNoRepoMetadata( ID_PROXIED1, requestedResource );
  226. assertNoRepoMetadata( ID_PROXIED2, requestedResource );
  227. }
  228. @Test
  229. public void testGetProjectMetadataProxiedNotLocalOnRemote()
  230. throws Exception
  231. {
  232. // New project metadata that does not exist locally but exists on remote.
  233. String requestedResource = "org/apache/maven/test/get-found-in-proxy/maven-metadata.xml";
  234. setupTestableManagedRepository( requestedResource );
  235. // Configure Connector (usually done within archiva.xml configuration)
  236. saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED1, ChecksumPolicy.FIX, ReleasesPolicy.ALWAYS,
  237. SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false );
  238. assertResourceNotFound( requestedResource );
  239. assertNoRepoMetadata( ID_PROXIED1, requestedResource );
  240. // One proxy setup, metadata fetched from remote, local does not exist.
  241. assertFetchProjectOrGroup( requestedResource );
  242. // Remote fetched. Local created/updated.
  243. assertProjectMetadataContents( requestedResource, new String[]{ "1.0.5" }, "1.0.5", "1.0.5" );
  244. assertRepoProjectMetadata( ID_PROXIED1, requestedResource, new String[]{ "1.0.5" } );
  245. }
  246. @Test
  247. public void testGetProjectMetadataProxiedOnLocalMultipleRemote()
  248. throws Exception
  249. {
  250. // Project metadata that exist locally, and has multiple versions in remote repos
  251. String requestedResource = "org/apache/maven/test/get-on-multiple-repos/maven-metadata.xml";
  252. setupTestableManagedRepository( requestedResource );
  253. // Configure Connector (usually done within archiva.xml configuration)
  254. saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED1, ChecksumPolicy.FIX, ReleasesPolicy.ALWAYS,
  255. SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false );
  256. saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED2, ChecksumPolicy.FIX, ReleasesPolicy.ALWAYS,
  257. SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false );
  258. assertProjectMetadataContents( requestedResource, new String[]{ "1.0" }, null, null );
  259. assertNoRepoMetadata( ID_PROXIED1, requestedResource );
  260. assertNoRepoMetadata( ID_PROXIED2, requestedResource );
  261. // Two proxies setup, metadata fetched from both remotes.
  262. assertFetchProjectOrGroup( requestedResource );
  263. // metadata fetched from both repos, and merged with local version.
  264. assertProjectMetadataContents( requestedResource, new String[]{ "1.0", "1.0.1", "2.0" }, "2.0", "2.0" );
  265. assertRepoProjectMetadata( ID_PROXIED1, requestedResource, new String[]{ "1.0", "2.0" } );
  266. assertRepoProjectMetadata( ID_PROXIED2, requestedResource, new String[]{ "1.0", "1.0.1" } );
  267. }
  268. @Test
  269. public void testGetProjectMetadataProxiedOnLocalNotRemote()
  270. throws Exception
  271. {
  272. // Project metadata that exist locally, and does not exist in remote repos.
  273. String requestedResource = "org/apache/maven/test/get-not-on-remotes/maven-metadata.xml";
  274. setupTestableManagedRepository( requestedResource );
  275. config.getConfiguration().setProxyConnectors( new ArrayList<ProxyConnectorConfiguration>( ) );
  276. // Configure Connector (usually done within archiva.xml configuration)
  277. saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED1, ChecksumPolicy.FIX, ReleasesPolicy.ALWAYS,
  278. SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false );
  279. saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED2, ChecksumPolicy.FIX, ReleasesPolicy.ALWAYS,
  280. SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false );
  281. assertProjectMetadataContents( requestedResource, new String[]{ "1.0-beta-2" }, null, null );
  282. assertNoRepoMetadata( ID_PROXIED1, requestedResource );
  283. assertNoRepoMetadata( ID_PROXIED2, requestedResource );
  284. // Two proxies setup, metadata fetch from remotes fail (because they dont exist).
  285. assertFetchProjectOrGroup( requestedResource );
  286. // metadata not fetched from both repos, and local version exists.
  287. // Since there was no updated metadata content from a remote/proxy, a metadata update on
  288. // the local file never ran. Local only updates are performed via the metadata updater consumer.
  289. assertProjectMetadataContents( requestedResource, new String[]{ "1.0-beta-2" }, null, null );
  290. assertNoRepoMetadata( ID_PROXIED1, requestedResource );
  291. assertNoRepoMetadata( ID_PROXIED2, requestedResource );
  292. }
  293. @Test
  294. public void testGetProjectMetadataProxiedOnLocalOnRemote()
  295. throws Exception
  296. {
  297. // Project metadata that exist locally and exists on remote.
  298. String requestedResource = "org/apache/maven/test/get-on-local-on-remote/maven-metadata.xml";
  299. setupTestableManagedRepository( requestedResource );
  300. // Configure Connector (usually done within archiva.xml configuration)
  301. saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED1, ChecksumPolicy.FIX, ReleasesPolicy.ALWAYS,
  302. SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false );
  303. assertProjectMetadataContents( requestedResource, new String[]{ "1.0.8", "1.0.22" }, null, null );
  304. assertNoRepoMetadata( ID_PROXIED1, requestedResource );
  305. // One proxy setup, metadata fetched from remote, local exists.
  306. assertFetchProjectOrGroup( requestedResource );
  307. // Remote fetched. Local updated.
  308. assertProjectMetadataContents( requestedResource, new String[]{ "1.0.8", "1.0.22", "2.0" }, "2.0", "2.0" );
  309. assertRepoProjectMetadata( ID_PROXIED1, requestedResource, new String[]{ "1.0.22", "2.0" } );
  310. }
  311. /**
  312. * A request for a release maven-metadata.xml file that does not exist locally, and the managed
  313. * repository has no proxied repositories set up.
  314. * <p/>
  315. * Expected result: the maven-metadata.xml file is not created on the managed repository, nor returned
  316. * to the requesting client.
  317. */
  318. @Test
  319. public void testGetReleaseMetadataNotProxiedNotLocal()
  320. throws Exception
  321. {
  322. // The artifactId "get-default-metadata-nonexistant" does not exist (intentionally).
  323. String requestedResource = "org/apache/maven/test/get-default-metadata-nonexistant/1.0/maven-metadata.xml";
  324. setupTestableManagedRepository( requestedResource );
  325. assertNoMetadata( requestedResource );
  326. // No proxy setup, nothing fetched, failure expected.
  327. assertFetchVersionedFailed( requestedResource );
  328. // No local artifactId, and no fetch, should equal no metadata file downloaded / created / updated.
  329. assertNoMetadata( requestedResource );
  330. }
  331. /**
  332. * A request for a maven-metadata.xml file that does exist locally, and the managed
  333. * repository has no proxied repositories set up.
  334. * <p/>
  335. * Expected result: the maven-metadata.xml file is updated locally, based off of the managed repository
  336. * information, and then returned to the client.
  337. */
  338. @Test
  339. public void testGetReleaseMetadataNotProxiedOnLocal()
  340. throws Exception
  341. {
  342. String requestedResource = "org/apache/maven/test/get-default-metadata/1.0/maven-metadata.xml";
  343. setupTestableManagedRepository( requestedResource );
  344. assertResourceExists( requestedResource );
  345. assertFetchVersioned( requestedResource );
  346. assertReleaseMetadataContents( requestedResource );
  347. }
  348. /**
  349. * A request for a release maven-metadata.xml file that does not exist on the managed repository, but
  350. * exists on multiple remote repositories.
  351. * <p/>
  352. * Expected result: the maven-metadata.xml file is downloaded from the remote into the repository specific
  353. * file location on the managed repository, a merge of the contents to the requested
  354. * maven-metadata.xml is performed, and then the merged maven-metadata.xml file is
  355. * returned to the client.
  356. */
  357. @Test
  358. public void testGetReleaseMetadataProxiedNotLocalMultipleRemotes()
  359. throws Exception
  360. {
  361. String requestedResource = "org/apache/maven/test/get-default-layout/1.0/maven-metadata.xml";
  362. setupTestableManagedRepository( requestedResource );
  363. // Configure Connector (usually done within archiva.xml configuration)
  364. saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED1, ChecksumPolicy.FIX, ReleasesPolicy.ALWAYS,
  365. SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false );
  366. saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED2, ChecksumPolicy.FIX, ReleasesPolicy.ALWAYS,
  367. SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false );
  368. assertResourceNotFound( requestedResource );
  369. assertNoRepoMetadata( ID_PROXIED1, requestedResource );
  370. assertNoRepoMetadata( ID_PROXIED2, requestedResource );
  371. assertFetchVersioned( requestedResource );
  372. assertReleaseMetadataContents( requestedResource );
  373. assertRepoReleaseMetadataContents( ID_PROXIED1, requestedResource );
  374. assertRepoReleaseMetadataContents( ID_PROXIED2, requestedResource );
  375. }
  376. /**
  377. * A request for a maven-metadata.xml file that does not exist locally, nor does it exist in a remote
  378. * proxied repository.
  379. * <p/>
  380. * Expected result: the maven-metadata.xml file is created locally, based off of managed repository
  381. * information, and then return to the client.
  382. */
  383. @Test
  384. public void testGetReleaseMetadataProxiedNotLocalNotRemote()
  385. throws Exception
  386. {
  387. String requestedResource = "org/apache/maven/test/get-bad-metadata/1.0/maven-metadata.xml";
  388. setupTestableManagedRepository( requestedResource );
  389. // Configure Connector (usually done within archiva.xml configuration)
  390. saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED1, ChecksumPolicy.FIX, ReleasesPolicy.ALWAYS,
  391. SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false );
  392. assertResourceNotFound( requestedResource );
  393. assertFetchProjectOrGroupFailed( requestedResource );
  394. assertResourceNotFound( requestedResource );
  395. assertNoRepoMetadata( ID_PROXIED1, requestedResource );
  396. }
  397. /**
  398. * A request for a maven-metadata.xml file that does not exist on the managed repository, but
  399. * exists on 1 remote repository.
  400. * <p/>
  401. * Expected result: the maven-metadata.xml file is downloaded from the remote into the repository specific
  402. * file location on the managed repository, a merge of the contents to the requested
  403. * maven-metadata.xml is performed, and then the merged maven-metadata.xml file is
  404. * returned to the client.
  405. */
  406. @Test
  407. public void testGetReleaseMetadataProxiedNotLocalOnRemote()
  408. throws Exception
  409. {
  410. String requestedResource = "org/apache/maven/test/get-default-layout/1.0/maven-metadata.xml";
  411. setupTestableManagedRepository( requestedResource );
  412. // Configure Connector (usually done within archiva.xml configuration)
  413. saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED1, ChecksumPolicy.FIX, ReleasesPolicy.ALWAYS,
  414. SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false );
  415. assertNoRepoMetadata( ID_PROXIED1, requestedResource );
  416. assertFetchVersioned( requestedResource );
  417. assertReleaseMetadataContents( requestedResource );
  418. assertRepoReleaseMetadataContents( ID_PROXIED1, requestedResource );
  419. }
  420. /**
  421. * A request for a maven-metadata.xml file that exists in the managed repository, but
  422. * not on any remote repository.
  423. * <p/>
  424. * Expected result: the maven-metadata.xml file does not exist on the remote proxied repository and
  425. * is not downloaded. There is no repository specific metadata file on the managed
  426. * repository. The managed repository maven-metadata.xml is returned to the
  427. * client as-is.
  428. */
  429. @Test
  430. public void testGetReleaseMetadataProxiedOnLocalNotRemote()
  431. throws Exception
  432. {
  433. String requestedResource = "org/apache/maven/test/get-not-on-remotes/1.0-beta-2/maven-metadata.xml";
  434. setupTestableManagedRepository( requestedResource );
  435. // Configure Connector (usually done within archiva.xml configuration)
  436. saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED1, ChecksumPolicy.FIX, ReleasesPolicy.ALWAYS,
  437. SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false );
  438. assertReleaseMetadataContents( requestedResource );
  439. assertFetchVersioned( requestedResource );
  440. assertReleaseMetadataContents( requestedResource );
  441. assertNoRepoMetadata( ID_PROXIED1, requestedResource );
  442. }
  443. /**
  444. * A request for a maven-metadata.xml file that exists in the managed repository, and on multiple
  445. * remote repositories.
  446. * <p/>
  447. * Expected result: the maven-metadata.xml file on the remote proxied repository is downloaded
  448. * and merged into the contents of the existing managed repository copy of
  449. * the maven-metadata.xml file.
  450. */
  451. @Test
  452. public void testGetReleaseMetadataProxiedOnLocalMultipleRemote()
  453. throws Exception
  454. {
  455. String requestedResource = "org/apache/maven/test/get-on-multiple-repos/1.0/maven-metadata.xml";
  456. setupTestableManagedRepository( requestedResource );
  457. // Configure Connector (usually done within archiva.xml configuration)
  458. saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED1, ChecksumPolicy.FIX, ReleasesPolicy.ALWAYS,
  459. SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false );
  460. saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED2, ChecksumPolicy.FIX, ReleasesPolicy.ALWAYS,
  461. SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false );
  462. assertReleaseMetadataContents( requestedResource );
  463. assertNoRepoMetadata( ID_PROXIED1, requestedResource );
  464. assertNoRepoMetadata( ID_PROXIED2, requestedResource );
  465. assertFetchVersioned( requestedResource );
  466. assertReleaseMetadataContents( requestedResource );
  467. assertRepoReleaseMetadataContents( ID_PROXIED1, requestedResource );
  468. assertRepoReleaseMetadataContents( ID_PROXIED2, requestedResource );
  469. }
  470. /**
  471. * A request for a maven-metadata.xml file that exists in the managed repository, and on one
  472. * remote repository.
  473. * <p/>
  474. * Expected result: the maven-metadata.xml file on the remote proxied repository is downloaded
  475. * and merged into the contents of the existing managed repository copy of
  476. * the maven-metadata.xml file.
  477. */
  478. @Test
  479. public void testGetReleaseMetadataProxiedOnLocalOnRemote()
  480. throws Exception
  481. {
  482. String requestedResource = "org/apache/maven/test/get-on-local-on-remote/1.0.22/maven-metadata.xml";
  483. setupTestableManagedRepository( requestedResource );
  484. // Configure Connector (usually done within archiva.xml configuration)
  485. saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED1, ChecksumPolicy.FIX, ReleasesPolicy.ALWAYS,
  486. SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false );
  487. assertReleaseMetadataContents( requestedResource );
  488. assertNoRepoMetadata( ID_PROXIED1, requestedResource );
  489. assertFetchVersioned( requestedResource );
  490. assertReleaseMetadataContents( requestedResource );
  491. assertRepoReleaseMetadataContents( ID_PROXIED1, requestedResource );
  492. }
  493. @Test
  494. public void testGetSnapshotMetadataNotProxiedNotLocal()
  495. throws Exception
  496. {
  497. // The artifactId "get-default-metadata-nonexistant" does not exist (intentionally).
  498. String requestedResource =
  499. "org/apache/maven/test/get-default-metadata-nonexistant/1.0-SNAPSHOT/maven-metadata.xml";
  500. setupTestableManagedRepository( requestedResource );
  501. assertNoMetadata( requestedResource );
  502. // No proxy setup, nothing fetched, no local file, failure expected.
  503. assertFetchVersionedFailed( requestedResource );
  504. // No local artifactId, and no fetch, should equal no metadata file downloaded / created / updated.
  505. assertNoMetadata( requestedResource );
  506. }
  507. @Test
  508. public void testGetSnapshotMetadataNotProxiedOnLocal()
  509. throws Exception
  510. {
  511. // The artifactId exists locally (but not on a remote repo)
  512. String requestedResource =
  513. "org/apache/maven/test/get-snapshot-on-local-not-remote/2.0-alpha-2-SNAPSHOT/maven-metadata.xml";
  514. setupTestableManagedRepository( requestedResource );
  515. assertResourceExists( requestedResource );
  516. // No proxy setup, nothing fetched from remote, local file exists, fetch should succeed.
  517. assertFetchVersioned( requestedResource );
  518. // Local metadata exists, should be updated to reflect the latest release.
  519. assertSnapshotMetadataContents( requestedResource, "20070821", "220304", 2 );
  520. }
  521. @Test
  522. public void testGetSnapshotMetadataProxiedNotLocalMultipleRemotes()
  523. throws Exception
  524. {
  525. String requestedResource =
  526. "org/apache/maven/test/get-timestamped-snapshot-in-both/1.0-SNAPSHOT/maven-metadata.xml";
  527. setupTestableManagedRepository( requestedResource );
  528. // Configure Connector (usually done within archiva.xml configuration)
  529. saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED1, ChecksumPolicy.FIX, ReleasesPolicy.ALWAYS,
  530. SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false );
  531. saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED2, ChecksumPolicy.FIX, ReleasesPolicy.ALWAYS,
  532. SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false );
  533. assertResourceNotFound( requestedResource );
  534. assertNoRepoMetadata( ID_PROXIED1, requestedResource );
  535. assertNoRepoMetadata( ID_PROXIED2, requestedResource );
  536. // Proxying 2 repos, both have content, local file updated.
  537. assertFetchVersioned( requestedResource );
  538. assertSnapshotMetadataContents( requestedResource, "20070101", "000103", 2 );
  539. assertRepoSnapshotMetadataContents( ID_PROXIED1, requestedResource, "20061227", "112101", 2 );
  540. assertRepoSnapshotMetadataContents( ID_PROXIED2, requestedResource, "20070101", "000103", 2 );
  541. }
  542. @Test
  543. public void testGetSnapshotMetadataProxiedNotLocalNotRemote()
  544. throws Exception
  545. {
  546. // The artifactId "get-default-metadata-nonexistant" does not exist (intentionally).
  547. String requestedResource =
  548. "org/apache/maven/test/get-default-metadata-nonexistant/1.0-SNAPSHOT/maven-metadata.xml";
  549. setupTestableManagedRepository( requestedResource );
  550. // Configure Connector (usually done within archiva.xml configuration)
  551. saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED1, ChecksumPolicy.FIX, ReleasesPolicy.ALWAYS,
  552. SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false );
  553. assertNoMetadata( requestedResource );
  554. // One proxy setup, nothing fetched, no local file, failure expected.
  555. assertFetchVersionedFailed( requestedResource );
  556. // No local artifactId, and no fetch, should equal no metadata file downloaded / created / updated.
  557. assertNoMetadata( requestedResource );
  558. assertNoRepoMetadata( ID_PROXIED1, requestedResource );
  559. }
  560. @Test
  561. public void testGetSnapshotMetadataProxiedNotLocalOnRemote()
  562. throws Exception
  563. {
  564. // Artifact exists only in the proxied1 location.
  565. String requestedResource = "org/apache/maven/test/get-metadata-snapshot/1.0-SNAPSHOT/maven-metadata.xml";
  566. setupTestableManagedRepository( requestedResource );
  567. // Configure Connector (usually done within archiva.xml configuration)
  568. saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED1, ChecksumPolicy.FIX, ReleasesPolicy.ALWAYS,
  569. SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false );
  570. assertResourceNotFound( requestedResource );
  571. // One proxy setup, one metadata fetched, local file created/updated.
  572. assertFetchVersioned( requestedResource );
  573. // Local artifact Id should contain latest (which in this case is from proxied download)
  574. assertSnapshotMetadataContents( requestedResource, "20050831", "101112", 1 );
  575. assertRepoSnapshotMetadataContents( ID_PROXIED1, requestedResource, "20050831", "101112", 1 );
  576. }
  577. @Test
  578. public void testGetSnapshotMetadataProxiedOnLocalMultipleRemote()
  579. throws Exception
  580. {
  581. String requestedResource = "org/apache/maven/test/get-snapshot-popular/2.0-SNAPSHOT/maven-metadata.xml";
  582. setupTestableManagedRepository( requestedResource );
  583. // Configure Connector (usually done within archiva.xml configuration)
  584. saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED1, ChecksumPolicy.FIX, ReleasesPolicy.ALWAYS,
  585. SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false );
  586. saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED2, ChecksumPolicy.FIX, ReleasesPolicy.ALWAYS,
  587. SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false );
  588. assertSnapshotMetadataContents( requestedResource, "20070822", "021008", 3 );
  589. assertNoRepoMetadata( ID_PROXIED1, requestedResource );
  590. assertNoRepoMetadata( ID_PROXIED2, requestedResource );
  591. // Proxying 2 repos, both have content, local file updated.
  592. assertFetchVersioned( requestedResource );
  593. assertSnapshotMetadataContents( requestedResource, "20070823", "212711", 6 );
  594. assertRepoSnapshotMetadataContents( ID_PROXIED1, requestedResource, "20070822", "145534", 9 );
  595. assertRepoSnapshotMetadataContents( ID_PROXIED2, requestedResource, "20070823", "212711", 6 );
  596. }
  597. @Test
  598. public void testGetSnapshotMetadataProxiedOnLocalNotRemote()
  599. throws Exception
  600. {
  601. // The artifactId exists locally (but not on a remote repo)
  602. String requestedResource =
  603. "org/apache/maven/test/get-snapshot-on-local-not-remote/2.0-alpha-2-SNAPSHOT/maven-metadata.xml";
  604. setupTestableManagedRepository( requestedResource );
  605. // Configure Connector (usually done within archiva.xml configuration)
  606. saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED1, ChecksumPolicy.FIX, ReleasesPolicy.ALWAYS,
  607. SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false );
  608. saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED2, ChecksumPolicy.FIX, ReleasesPolicy.ALWAYS,
  609. SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false );
  610. assertResourceExists( requestedResource );
  611. assertNoRepoMetadata( ID_PROXIED1, requestedResource );
  612. assertNoRepoMetadata( ID_PROXIED2, requestedResource );
  613. // two proxies setup, nothing fetched from either remote, local file exists, fetch should succeed.
  614. assertFetchVersioned( requestedResource );
  615. // Local metadata exists, repo metadatas should not exist, local file updated.
  616. assertSnapshotMetadataContents( requestedResource, "20070821", "220304", 2 );
  617. assertNoRepoMetadata( ID_PROXIED1, requestedResource );
  618. assertNoRepoMetadata( ID_PROXIED2, requestedResource );
  619. }
  620. @Test
  621. public void testGetSnapshotMetadataProxiedOnLocalOnRemote()
  622. throws Exception
  623. {
  624. // The artifactId exists locally (but not on a remote repo)
  625. String requestedResource =
  626. "org/apache/maven/test/get-present-metadata-snapshot/1.0-SNAPSHOT/maven-metadata.xml";
  627. setupTestableManagedRepository( requestedResource );
  628. // Configure Connector (usually done within archiva.xml configuration)
  629. saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED1, ChecksumPolicy.FIX, ReleasesPolicy.ALWAYS,
  630. SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false );
  631. assertSnapshotMetadataContents( requestedResource, "20050831", "101112", 1 );
  632. assertNoRepoMetadata( ID_PROXIED1, requestedResource );
  633. // two proxies setup, nothing fetched from either remote, local file exists, fetch should succeed.
  634. assertFetchVersioned( requestedResource );
  635. // Local metadata exists, repo metadata exists, local file updated.
  636. assertSnapshotMetadataContents( requestedResource, "20050831", "101112", 1 );
  637. assertRepoSnapshotMetadataContents( ID_PROXIED1, requestedResource, "20050831", "101112", 1 );
  638. }
  639. @Test
  640. public void testGetGroupMetadataNotProxiedNotLocal()
  641. throws Exception
  642. {
  643. // The artifactId "get-default-metadata-nonexistant" does not exist (intentionally).
  644. String requestedResource = "org/apache/maven/test/groups/get-default-metadata-nonexistant/maven-metadata.xml";
  645. setupTestableManagedRepository( requestedResource );
  646. assertResourceNotFound( requestedResource );
  647. // No proxy setup, nothing fetched, failure expected.
  648. assertFetchProjectOrGroupFailed( requestedResource );
  649. // No local artifactId, and no fetch, should equal no metadata file downloaded / created / updated.
  650. assertResourceNotFound( requestedResource );
  651. }
  652. @Test
  653. public void testGetGroupMetadataNotProxiedOnLocal()
  654. throws Exception
  655. {
  656. // Project metadata that exists and has multiple versions
  657. String requestedResource = "org/apache/maven/test/groups/get-project-metadata/maven-metadata.xml";
  658. setupTestableManagedRepository( requestedResource );
  659. assertResourceExists( requestedResource );
  660. // No proxy setup, nothing fetched from remote, but local exists.
  661. assertFetchProjectOrGroup( requestedResource );
  662. // Nothing fetched. Should only contain contents of what is in the repository.
  663. // A metadata update is not performed in this use case. Local metadata content is only
  664. // updated via the metadata updater consumer.
  665. assertGroupMetadataContents( requestedResource, new String[]{ "plugin1" } );
  666. }
  667. @Test
  668. public void testGetGroupMetadataProxiedNotLocalMultipleRemotes()
  669. throws Exception
  670. {
  671. // Project metadata that does not exist locally, but has multiple versions in remote repos
  672. String requestedResource = "org/apache/maven/test/groups/get-default-layout/maven-metadata.xml";
  673. setupTestableManagedRepository( requestedResource );
  674. // Configure Connector (usually done within archiva.xml configuration)
  675. saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED1, ChecksumPolicy.FIX, ReleasesPolicy.ALWAYS,
  676. SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false );
  677. saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED2, ChecksumPolicy.FIX, ReleasesPolicy.ALWAYS,
  678. SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false );
  679. assertResourceNotFound( requestedResource );
  680. assertNoRepoMetadata( ID_PROXIED1, requestedResource );
  681. assertNoRepoMetadata( ID_PROXIED2, requestedResource );
  682. // Two proxies setup, metadata fetched from both remotes.
  683. assertFetchProjectOrGroup( requestedResource );
  684. // Nothing fetched. Should only contain contents of what is in the repository.
  685. assertGroupMetadataContents( requestedResource, new String[]{ "plugin2", "plugin1" } );
  686. assertRepoGroupMetadataContents( ID_PROXIED1, requestedResource, new String[]{ "plugin1" } );
  687. assertRepoGroupMetadataContents( ID_PROXIED2, requestedResource, new String[]{ "plugin2" } );
  688. }
  689. @Test
  690. public void testGetGroupsMetadataProxiedNotLocalNotRemote()
  691. throws Exception
  692. {
  693. // Non-existant project metadata that does not exist locally and doesn't exist on remotes.
  694. String requestedResource = "org/apache/maven/test/groups/get-bogus-artifact/maven-metadata.xml";
  695. setupTestableManagedRepository( requestedResource );
  696. // Configure Connector (usually done within archiva.xml configuration)
  697. saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED1, ChecksumPolicy.FIX, ReleasesPolicy.ALWAYS,
  698. SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false );
  699. saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED2, ChecksumPolicy.FIX, ReleasesPolicy.ALWAYS,
  700. SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false );
  701. assertResourceNotFound( requestedResource );
  702. assertNoRepoMetadata( ID_PROXIED1, requestedResource );
  703. assertNoRepoMetadata( ID_PROXIED2, requestedResource );
  704. // Two proxies setup, nothing fetched from remotes, local does not exist.
  705. assertFetchProjectOrGroupFailed( requestedResource );
  706. // Nothing fetched. Nothing should exist.
  707. assertResourceNotFound( requestedResource );
  708. assertNoRepoMetadata( ID_PROXIED1, requestedResource );
  709. assertNoRepoMetadata( ID_PROXIED2, requestedResource );
  710. }
  711. @Test
  712. public void testGetGroupMetadataProxiedNotLocalOnRemote()
  713. throws Exception
  714. {
  715. // New project metadata that does not exist locally but exists on remote.
  716. String requestedResource = "org/apache/maven/test/groups/get-found-in-proxy/maven-metadata.xml";
  717. setupTestableManagedRepository( requestedResource );
  718. // Configure Connector (usually done within archiva.xml configuration)
  719. saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED1, ChecksumPolicy.FIX, ReleasesPolicy.ALWAYS,
  720. SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false );
  721. assertResourceNotFound( requestedResource );
  722. assertNoRepoMetadata( ID_PROXIED1, requestedResource );
  723. // One proxy setup, metadata fetched from remote, local does not exist.
  724. assertFetchProjectOrGroup( requestedResource );
  725. // Remote fetched. Local created/updated.
  726. assertGroupMetadataContents( requestedResource, new String[]{ "plugin3" } );
  727. assertRepoGroupMetadataContents( ID_PROXIED1, requestedResource, new String[]{ "plugin3" } );
  728. }
  729. @Test
  730. public void testGetGroupMetadataProxiedOnLocalMultipleRemote()
  731. throws Exception
  732. {
  733. // Project metadata that exist locally, and has multiple versions in remote repos
  734. String requestedResource = "org/apache/maven/test/groups/get-on-multiple-repos/maven-metadata.xml";
  735. setupTestableManagedRepository( requestedResource );
  736. // Configure Connector (usually done within archiva.xml configuration)
  737. saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED1, ChecksumPolicy.FIX, ReleasesPolicy.ALWAYS,
  738. SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false );
  739. saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED2, ChecksumPolicy.FIX, ReleasesPolicy.ALWAYS,
  740. SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false );
  741. assertGroupMetadataContents( requestedResource, new String[]{ "plugin1" } );
  742. assertNoRepoMetadata( ID_PROXIED1, requestedResource );
  743. assertNoRepoMetadata( ID_PROXIED2, requestedResource );
  744. // Two proxies setup, metadata fetched from both remotes.
  745. assertFetchProjectOrGroup( requestedResource );
  746. // metadata fetched from both repos, and merged with local version.
  747. assertGroupMetadataContents( requestedResource, new String[]{ "plugin1", "plugin2", "plugin4" } );
  748. assertRepoGroupMetadataContents( ID_PROXIED1, requestedResource, new String[]{ "plugin1", "plugin4" } );
  749. assertRepoGroupMetadataContents( ID_PROXIED2, requestedResource, new String[]{ "plugin1", "plugin2" } );
  750. }
  751. @Test
  752. public void testGetGroupMetadataProxiedOnLocalNotRemote()
  753. throws Exception
  754. {
  755. // Project metadata that exist locally, and does not exist in remote repos.
  756. String requestedResource = "org/apache/maven/test/groups/get-not-on-remotes/maven-metadata.xml";
  757. setupTestableManagedRepository( requestedResource );
  758. // Configure Connector (usually done within archiva.xml configuration)
  759. saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED1, ChecksumPolicy.FIX, ReleasesPolicy.ALWAYS,
  760. SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false );
  761. saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED2, ChecksumPolicy.FIX, ReleasesPolicy.ALWAYS,
  762. SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false );
  763. assertGroupMetadataContents( requestedResource, new String[]{ "plugin5" } );
  764. assertNoRepoMetadata( ID_PROXIED1, requestedResource );
  765. assertNoRepoMetadata( ID_PROXIED2, requestedResource );
  766. // Two proxies setup, metadata fetch from remotes fail (because they dont exist).
  767. assertFetchProjectOrGroup( requestedResource );
  768. // metadata not fetched from both repos, and local version exists.
  769. // Since there was no updated metadata content from a remote/proxy, a metadata update on
  770. // the local file never ran. Local only updates are performed via the metadata updater consumer.
  771. assertGroupMetadataContents( requestedResource, new String[]{ "plugin5" } );
  772. assertNoRepoMetadata( ID_PROXIED1, requestedResource );
  773. assertNoRepoMetadata( ID_PROXIED2, requestedResource );
  774. }
  775. @Test
  776. public void testGetGroupMetadataProxiedOnLocalOnRemote()
  777. throws Exception
  778. {
  779. // Project metadata that exist locally and exists on remote.
  780. String requestedResource = "org/apache/maven/test/groups/get-on-local-on-remote/maven-metadata.xml";
  781. setupTestableManagedRepository( requestedResource );
  782. // Configure Connector (usually done within archiva.xml configuration)
  783. saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED1, ChecksumPolicy.FIX, ReleasesPolicy.ALWAYS,
  784. SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false );
  785. assertGroupMetadataContents( requestedResource, new String[]{ "plugin6", "plugin7" } );
  786. assertNoRepoMetadata( ID_PROXIED1, requestedResource );
  787. // One proxy setup, metadata fetched from remote, local exists.
  788. assertFetchProjectOrGroup( requestedResource );
  789. // Remote fetched. Local updated.
  790. assertGroupMetadataContents( requestedResource, new String[]{ "plugin6", "plugin7", "plugin4" } );
  791. assertRepoGroupMetadataContents( ID_PROXIED1, requestedResource, new String[]{ "plugin7", "plugin4" } );
  792. }
  793. /**
  794. * Transfer the metadata file.
  795. *
  796. * @param requestedResource the requested resource
  797. * @throws Exception
  798. */
  799. private void assertFetchProjectOrGroup( String requestedResource )
  800. throws Exception
  801. {
  802. File expectedFile = new File( managedDefaultDir, requestedResource );
  803. ProjectReference metadata = createProjectReference( requestedResource );
  804. File downloadedFile = proxyHandler.fetchMetatadaFromProxies( managedDefaultRepository,
  805. managedDefaultRepository.toMetadataPath(
  806. metadata ) );
  807. assertNotNull( "Should have downloaded a file.", downloadedFile );
  808. assertNoTempFiles( expectedFile );
  809. }
  810. private ProjectReference createProjectReference( String path )
  811. throws RepositoryMetadataException
  812. {
  813. return metadataTools.toProjectReference( path );
  814. }
  815. /**
  816. * Transfer the metadata file, not expected to succeed.
  817. *
  818. * @param requestedResource the requested resource
  819. * @throws Exception
  820. */
  821. private void assertFetchProjectOrGroupFailed( String requestedResource )
  822. throws Exception
  823. {
  824. File expectedFile = new File( managedDefaultDir, requestedResource );
  825. ProjectReference metadata = createProjectReference( requestedResource );
  826. File downloadedFile = proxyHandler.fetchMetatadaFromProxies( managedDefaultRepository,
  827. managedDefaultRepository.toMetadataPath(
  828. metadata ) );
  829. assertNull( downloadedFile );
  830. assertNoTempFiles( expectedFile );
  831. }
  832. /**
  833. * Transfer the metadata file.
  834. *
  835. * @param requestedResource the requested resource
  836. * @throws Exception
  837. */
  838. private void assertFetchVersioned( String requestedResource )
  839. throws Exception
  840. {
  841. File expectedFile = new File( managedDefaultDir, requestedResource );
  842. VersionedReference metadata = createVersionedReference( requestedResource );
  843. File downloadedFile = proxyHandler.fetchMetatadaFromProxies( managedDefaultRepository,
  844. managedDefaultRepository.toMetadataPath(
  845. metadata ) );
  846. assertNotNull( "Should have downloaded a file.", downloadedFile );
  847. assertNoTempFiles( expectedFile );
  848. }
  849. private VersionedReference createVersionedReference( String path )
  850. throws RepositoryMetadataException
  851. {
  852. return metadataTools.toVersionedReference( path );
  853. }
  854. /**
  855. * Transfer the metadata file, not expected to succeed.
  856. *
  857. * @param requestedResource the requested resource
  858. * @throws Exception
  859. */
  860. private void assertFetchVersionedFailed( String requestedResource )
  861. throws Exception
  862. {
  863. File expectedFile = new File( managedDefaultDir, requestedResource );
  864. VersionedReference metadata = createVersionedReference( requestedResource );
  865. File downloadedFile = proxyHandler.fetchMetatadaFromProxies( managedDefaultRepository,
  866. managedDefaultRepository.toMetadataPath(
  867. metadata ) );
  868. assertNull( downloadedFile );
  869. assertNoTempFiles( expectedFile );
  870. }
  871. /**
  872. * Test for the existance of the requestedResource in the default managed repository.
  873. *
  874. * @param requestedResource the requested resource
  875. * @throws Exception
  876. */
  877. private void assertResourceExists( String requestedResource )
  878. throws Exception
  879. {
  880. File actualFile = new File( managedDefaultDir, requestedResource );
  881. assertTrue( "Resource should exist: " + requestedResource, actualFile.exists() );
  882. }
  883. private void assertMetadataEquals( String expectedMetadataXml, File actualFile )
  884. throws Exception
  885. {
  886. assertNotNull( "Actual File should not be null.", actualFile );
  887. assertTrue( "Actual file exists.", actualFile.exists() );
  888. StringWriter actualContents = new StringWriter();
  889. ArchivaRepositoryMetadata metadata = MavenMetadataReader.read( actualFile );
  890. RepositoryMetadataWriter.write( metadata, actualContents );
  891. DetailedDiff detailedDiff = new DetailedDiff( new Diff( expectedMetadataXml, actualContents.toString() ) );
  892. if ( !detailedDiff.similar() )
  893. {
  894. assertEquals( expectedMetadataXml, actualContents );
  895. }
  896. // assertEquals( "Check file contents.", expectedMetadataXml, actualContents );
  897. }
  898. /**
  899. * Ensures that the requested resource is not present in the managed repository.
  900. *
  901. * @param requestedResource the requested resource
  902. * @throws Exception
  903. */
  904. private void assertNoMetadata( String requestedResource )
  905. throws Exception
  906. {
  907. File expectedFile = new File( managedDefaultDir, requestedResource );
  908. assertFalse( "metadata should not exist: " + expectedFile, expectedFile.exists() );
  909. }
  910. /**
  911. * Ensures that the proxied repository specific maven metadata file does NOT exist in the
  912. * managed repository.
  913. *
  914. * @param proxiedRepoId the proxied repository id to validate with.
  915. * @param requestedResource the resource requested.
  916. */
  917. private void assertNoRepoMetadata( String proxiedRepoId, String requestedResource )
  918. {
  919. String proxiedFile = metadataTools.getRepositorySpecificName( proxiedRepoId, requestedResource );
  920. File actualFile = new File( managedDefaultDir, proxiedFile );
  921. assertFalse( "Repo specific metadata should not exist: " + actualFile, actualFile.exists() );
  922. }
  923. private void assertGroupMetadataContents( String requestedResource, String expectedPlugins[] )
  924. throws Exception
  925. {
  926. File actualFile = new File( managedDefaultDir, requestedResource );
  927. assertTrue( "Snapshot Metadata should exist: " + requestedResource, actualFile.exists() );
  928. ProjectReference actualMetadata = createGroupReference( requestedResource );
  929. assertGroupMetadata( actualFile, actualMetadata, expectedPlugins );
  930. }
  931. private ProjectReference createGroupReference( String requestedResource )
  932. throws RepositoryMetadataException
  933. {
  934. ProjectReference projectReference = createProjectReference( requestedResource );
  935. projectReference.setGroupId( projectReference.getGroupId() + "." + projectReference.getArtifactId() );
  936. projectReference.setArtifactId( null );
  937. return projectReference;
  938. }
  939. private void assertRepoGroupMetadataContents( String proxiedRepoId, String requestedResource,
  940. String expectedPlugins[] )
  941. throws Exception
  942. {
  943. String proxiedFile = metadataTools.getRepositorySpecificName( proxiedRepoId, requestedResource );
  944. File actualFile = new File( managedDefaultDir, proxiedFile );
  945. assertTrue( "Repo Specific Group Metadata should exist: " + requestedResource, actualFile.exists() );
  946. ProjectReference actualMetadata = createGroupReference( requestedResource );
  947. assertGroupMetadata( actualFile, actualMetadata, expectedPlugins );
  948. }
  949. private void assertGroupMetadata( File actualFile, ProjectReference actualMetadata, String expectedPlugins[] )
  950. throws Exception
  951. {
  952. // Build expected metadata XML
  953. StringWriter expectedMetadataXml = new StringWriter();
  954. ArchivaRepositoryMetadata m = new ArchivaRepositoryMetadata();
  955. m.setGroupId( actualMetadata.getGroupId() );
  956. for ( String pluginId : expectedPlugins )
  957. {
  958. Plugin p = new Plugin();
  959. p.setPrefix( pluginId );
  960. p.setArtifactId( pluginId + "-maven-plugin" );
  961. p.setName( "The " + pluginId + " Plugin" );
  962. m.getPlugins().add( p );
  963. }
  964. RepositoryMetadataWriter.write( m, expectedMetadataXml );
  965. // Compare the file to the actual contents.
  966. assertMetadataEquals( expectedMetadataXml.toString(), actualFile );
  967. }
  968. /**
  969. * Test for the existance of the requestedResource in the default managed repository, and if it exists,
  970. * does it contain the specified list of expected versions?
  971. *
  972. * @param requestedResource the requested resource
  973. * @throws Exception
  974. */
  975. private void assertProjectMetadataContents( String requestedResource, String expectedVersions[],
  976. String latestVersion, String releaseVersion )
  977. throws Exception
  978. {
  979. File actualFile = new File( managedDefaultDir, requestedResource );
  980. assertTrue( actualFile.exists() );
  981. ProjectReference metadata = createProjectReference( requestedResource );
  982. // Build expected metadata XML
  983. StringWriter expectedMetadataXml = new StringWriter();
  984. ArchivaRepositoryMetadata m = new ArchivaRepositoryMetadata();
  985. m.setGroupId( metadata.getGroupId() );
  986. m.setArtifactId( metadata.getArtifactId() );
  987. m.setLatestVersion( latestVersion );
  988. m.setReleasedVersion( releaseVersion );
  989. if ( expectedVersions != null )
  990. {
  991. m.getAvailableVersions().addAll( Arrays.asList( expectedVersions ) );
  992. }
  993. RepositoryMetadataWriter.write( m, expectedMetadataXml );
  994. // Compare the file to the actual contents.
  995. assertMetadataEquals( expectedMetadataXml.toString(), actualFile );
  996. }
  997. /**
  998. * Test for the existance of the requestedResource in the default managed repository, and if it exists,
  999. * does it contain the expected release maven-metadata.xml contents?
  1000. *
  1001. * @param requestedResource the requested resource
  1002. * @throws Exception
  1003. */
  1004. private void assertReleaseMetadataContents( String requestedResource )
  1005. throws Exception
  1006. {
  1007. File actualFile = new File( managedDefaultDir, requestedResource );
  1008. assertTrue( "Release Metadata should exist: " + requestedResource, actualFile.exists() );
  1009. VersionedReference metadata = createVersionedReference( requestedResource );
  1010. // Build expected metadata XML
  1011. StringWriter expectedMetadataXml = new StringWriter();
  1012. ArchivaRepositoryMetadata m = new ArchivaRepositoryMetadata();
  1013. m.setGroupId( metadata.getGroupId() );
  1014. m.setArtifactId( metadata.getArtifactId() );
  1015. m.setVersion( metadata.getVersion() );
  1016. RepositoryMetadataWriter.write( m, expectedMetadataXml );
  1017. // Compare the file to the actual contents.
  1018. assertMetadataEquals( expectedMetadataXml.toString(), actualFile );
  1019. }
  1020. /**
  1021. * Test for the existance of the snapshot metadata in the default managed repository, and if it exists,
  1022. * does it contain the expected release maven-metadata.xml contents?
  1023. *
  1024. * @param requestedResource the requested resource
  1025. * @param expectedDate the date in "yyyyMMdd" format
  1026. * @param expectedTime the time in "hhmmss" format
  1027. * @param expectedBuildnumber the build number
  1028. * @throws Exception
  1029. */
  1030. private void assertSnapshotMetadataContents( String requestedResource, String expectedDate, String expectedTime,
  1031. int expectedBuildnumber )
  1032. throws Exception
  1033. {
  1034. File actualFile = new File( managedDefaultDir, requestedResource );
  1035. assertTrue( "Snapshot Metadata should exist: " + requestedResource, actualFile.exists() );
  1036. VersionedReference actualMetadata = createVersionedReference( requestedResource );
  1037. assertSnapshotMetadata( actualFile, actualMetadata, expectedDate, expectedTime, expectedBuildnumber );
  1038. }
  1039. /**
  1040. * Test for the existance of the proxied repository specific snapshot metadata in the default managed
  1041. * repository, and if it exists, does it contain the expected release maven-metadata.xml contents?
  1042. *
  1043. * @param proxiedRepoId the repository id of the proxied repository.
  1044. * @param requestedResource the requested resource
  1045. * @param expectedDate the date in "yyyyMMdd" format
  1046. * @param expectedTime the time in "hhmmss" format
  1047. * @param expectedBuildnumber the build number
  1048. * @throws Exception
  1049. */
  1050. private void assertRepoSnapshotMetadataContents( String proxiedRepoId, String requestedResource,
  1051. String expectedDate, String expectedTime, int expectedBuildnumber )
  1052. throws Exception
  1053. {
  1054. String proxiedFile = metadataTools.getRepositorySpecificName( proxiedRepoId, requestedResource );
  1055. File actualFile = new File( managedDefaultDir, proxiedFile );
  1056. assertTrue( "Repo Specific Snapshot Metadata should exist: " + requestedResource, actualFile.exists() );
  1057. VersionedReference actualMetadata = createVersionedReference( requestedResource );
  1058. assertSnapshotMetadata( actualFile, actualMetadata, expectedDate, expectedTime, expectedBuildnumber );
  1059. }
  1060. private void assertSnapshotMetadata( File actualFile, VersionedReference actualMetadata, String expectedDate,
  1061. String expectedTime, int expectedBuildnumber )
  1062. throws RepositoryMetadataException, Exception
  1063. {
  1064. // Build expected metadata XML
  1065. StringWriter expectedMetadataXml = new StringWriter();
  1066. ArchivaRepositoryMetadata m = new ArchivaRepositoryMetadata();
  1067. m.setGroupId( actualMetadata.getGroupId() );
  1068. m.setArtifactId( actualMetadata.getArtifactId() );
  1069. m.setVersion( VersionUtil.getBaseVersion( actualMetadata.getVersion() ) );
  1070. m.setSnapshotVersion( new SnapshotVersion() );
  1071. if ( StringUtils.isNotBlank( expectedDate ) && StringUtils.isNotBlank( expectedTime ) )
  1072. {
  1073. m.getSnapshotVersion().setTimestamp( expectedDate + "." + expectedTime );
  1074. }
  1075. m.getSnapshotVersion().setBuildNumber( expectedBuildnumber );
  1076. m.setLastUpdated( expectedDate + expectedTime );
  1077. RepositoryMetadataWriter.write( m, expectedMetadataXml );
  1078. // Compare the file to the actual contents.
  1079. assertMetadataEquals( expectedMetadataXml.toString(), actualFile );
  1080. }
  1081. /**
  1082. * Ensures that the repository specific maven metadata file exists, and contains the appropriate
  1083. * list of expected versions within.
  1084. *
  1085. * @param proxiedRepoId
  1086. * @param requestedResource
  1087. * @param expectedProxyVersions
  1088. */
  1089. private void assertRepoProjectMetadata( String proxiedRepoId, String requestedResource,
  1090. String[] expectedProxyVersions )
  1091. throws Exception
  1092. {
  1093. String proxiedFile = metadataTools.getRepositorySpecificName( proxiedRepoId, requestedResource );
  1094. File actualFile = new File( managedDefaultDir, proxiedFile );
  1095. assertTrue( actualFile.exists() );
  1096. ProjectReference metadata = createProjectReference( requestedResource );
  1097. // Build expected metadata XML
  1098. StringWriter expectedMetadataXml = new StringWriter();
  1099. ArchivaRepositoryMetadata m = new ArchivaRepositoryMetadata();
  1100. m.setGroupId( metadata.getGroupId() );
  1101. m.setArtifactId( metadata.getArtifactId() );
  1102. if ( expectedProxyVersions != null )
  1103. {
  1104. m.getAvailableVersions().addAll( Arrays.asList( expectedProxyVersions ) );
  1105. }
  1106. RepositoryMetadataWriter.write( m, expectedMetadataXml );
  1107. // Compare the file to the actual contents.
  1108. assertMetadataEquals( expectedMetadataXml.toString(), actualFile );
  1109. }
  1110. /**
  1111. * Ensures that the repository specific maven metadata file exists, and contains the appropriate
  1112. * list of expected versions within.
  1113. *
  1114. * @param proxiedRepoId
  1115. * @param requestedResource
  1116. */
  1117. private void assertRepoReleaseMetadataContents( String proxiedRepoId, String requestedResource )
  1118. throws Exception
  1119. {
  1120. String proxiedFile = metadataTools.getRepositorySpecificName( proxiedRepoId, requestedResource );
  1121. File actualFile = new File( managedDefaultDir, proxiedFile );
  1122. assertTrue( "Release metadata for repo should exist: " + actualFile, actualFile.exists() );
  1123. VersionedReference metadata = createVersionedReference( requestedResource );
  1124. // Build expected metadata XML
  1125. StringWriter expectedMetadataXml = new StringWriter();
  1126. ArchivaRepositoryMetadata m = new ArchivaRepositoryMetadata();
  1127. m.setGroupId( metadata.getGroupId() );
  1128. m.setArtifactId( metadata.getArtifactId() );
  1129. m.setVersion( metadata.getVersion() );
  1130. RepositoryMetadataWriter.write( m, expectedMetadataXml );
  1131. // Compare the file to the actual contents.
  1132. assertMetadataEquals( expectedMetadataXml.toString(), actualFile );
  1133. }
  1134. /**
  1135. * Test for the non-existance of the requestedResource in the default managed repository.
  1136. *
  1137. * @param requestedResource the requested resource
  1138. * @throws Exception
  1139. */
  1140. private void assertResourceNotFound( String requestedResource )
  1141. throws Exception
  1142. {
  1143. File actualFile = new File( managedDefaultDir, requestedResource );
  1144. assertFalse( "Resource should not exist: " + requestedResource, actualFile.exists() );
  1145. }
  1146. }