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.

MetadataTransferTest.java 63KB

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