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.

MavenRepositorySearchTest.java 35KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941
  1. package org.apache.archiva.indexer.maven.search;
  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.indexer.search.RepositorySearchException;
  21. import org.apache.archiva.indexer.search.SearchFields;
  22. import org.apache.archiva.indexer.search.SearchResultHit;
  23. import org.apache.archiva.indexer.search.SearchResultLimits;
  24. import org.apache.archiva.indexer.search.SearchResults;
  25. import org.apache.archiva.indexer.util.SearchUtil;
  26. import org.apache.archiva.test.utils.ArchivaSpringJUnit4ClassRunner;
  27. import org.apache.maven.index_shaded.lucene.index.IndexUpgrader;
  28. import org.codehaus.plexus.util.FileUtils;
  29. import org.easymock.EasyMock;
  30. import org.junit.Test;
  31. import org.junit.runner.RunWith;
  32. import org.springframework.test.context.ContextConfiguration;
  33. import java.nio.file.Path;
  34. import java.nio.file.Paths;
  35. import java.util.ArrayList;
  36. import java.util.Arrays;
  37. import java.util.Collection;
  38. import java.util.Collections;
  39. import java.util.List;
  40. import java.util.Locale;
  41. @RunWith( ArchivaSpringJUnit4ClassRunner.class )
  42. @ContextConfiguration( locations = { "classpath*:/META-INF/spring-context.xml", "classpath:/spring-context.xml" } )
  43. public class MavenRepositorySearchTest
  44. extends AbstractMavenRepositorySearch
  45. {
  46. private void createSimpleIndex( boolean scan )
  47. throws Exception
  48. {
  49. List<Path> files = new ArrayList<>();
  50. files.add( Paths.get( org.apache.archiva.common.utils.FileUtils.getBasedir(), "target/repos", TEST_REPO_1,
  51. "/org/apache/archiva/archiva-search/1.0/archiva-search-1.0.jar" ) );
  52. files.add( Paths.get( org.apache.archiva.common.utils.FileUtils.getBasedir(), "target/repos", TEST_REPO_1,
  53. "/org/apache/archiva/archiva-test/1.0/archiva-test-1.0.jar" ));
  54. files.add( Paths.get( org.apache.archiva.common.utils.FileUtils.getBasedir(), "target/repos", TEST_REPO_1,
  55. "org/apache/archiva/archiva-test/2.0/archiva-test-2.0.jar" ));
  56. createIndex( TEST_REPO_1, files, scan );
  57. }
  58. private void createIndexContainingMoreArtifacts( boolean scan )
  59. throws Exception
  60. {
  61. List<Path> files = new ArrayList<>();
  62. files.add( Paths.get( org.apache.archiva.common.utils.FileUtils.getBasedir(), "target/repos/" + TEST_REPO_1
  63. + "/org/apache/archiva/archiva-search/1.0/archiva-search-1.0.jar" ) );
  64. files.add( Paths.get( org.apache.archiva.common.utils.FileUtils.getBasedir(), "target/repos/" + TEST_REPO_1
  65. + "/org/apache/archiva/archiva-test/1.0/archiva-test-1.0.jar" ) );
  66. files.add( Paths.get( org.apache.archiva.common.utils.FileUtils.getBasedir(), "target/repos/" + TEST_REPO_1
  67. + "/org/apache/archiva/archiva-test/2.0/archiva-test-2.0.jar" ) );
  68. files.add( Paths.get( org.apache.archiva.common.utils.FileUtils.getBasedir(), "target/repos/" + TEST_REPO_1
  69. + "/org/apache/archiva/archiva-webapp/1.0/archiva-webapp-1.0.war" ) );
  70. files.add( Paths.get( org.apache.archiva.common.utils.FileUtils.getBasedir(),
  71. "target/repos/" + TEST_REPO_1 + "/com/artifactid-numeric/1.0/artifactid-numeric-1.0.jar" ) );
  72. files.add( Paths.get( org.apache.archiva.common.utils.FileUtils.getBasedir(), "target/repos/" + TEST_REPO_1
  73. + "/com/artifactid-numeric123/1.0/artifactid-numeric123-1.0.jar" ) );
  74. files.add( Paths.get( org.apache.archiva.common.utils.FileUtils.getBasedir(),
  75. "target/repos/" + TEST_REPO_1 + "/com/classname-search/1.0/classname-search-1.0.jar" ) );
  76. createIndex( TEST_REPO_1, files, scan );
  77. }
  78. private void createIndexContainingMultipleArtifactsSameVersion( boolean scan )
  79. throws Exception
  80. {
  81. List<Path> files = new ArrayList<>();
  82. files.add( Paths.get( org.apache.archiva.common.utils.FileUtils.getBasedir(), "target/repos/" + TEST_REPO_1
  83. + "/org/apache/archiva/archiva-search/1.0/archiva-search-1.0.jar" ) );
  84. files.add( Paths.get( org.apache.archiva.common.utils.FileUtils.getBasedir(), "target/repos/" + TEST_REPO_1
  85. + "/org/apache/archiva/archiva-search/1.0/archiva-search-1.0.pom" ) );
  86. files.add( Paths.get( org.apache.archiva.common.utils.FileUtils.getBasedir(), "target/repos/" + TEST_REPO_1
  87. + "/org/apache/archiva/archiva-search/1.0/archiva-search-1.0-sources.jar" ) );
  88. createIndex( TEST_REPO_1, files, scan );
  89. }
  90. @Test
  91. public void testQuickSearch()
  92. throws Exception
  93. {
  94. createSimpleIndex( false );
  95. List<String> selectedRepos = Arrays.asList( TEST_REPO_1 );
  96. // search artifactId
  97. EasyMock.expect( archivaConfig.getDefaultLocale() ).andReturn( Locale.getDefault( ) ).anyTimes();
  98. EasyMock.expect( archivaConfig.getConfiguration()).andReturn(config).anyTimes();
  99. archivaConfigControl.replay();
  100. SearchResults results = search.search( "user", selectedRepos, "archiva-search", null, null );
  101. archivaConfigControl.verify();
  102. assertNotNull( results );
  103. SearchResultHit hit =
  104. results.getSearchResultHit( SearchUtil.getHitId( "org.apache.archiva", "archiva-search", null, "jar" ) );
  105. assertNotNull( "hit null in result " + results.getHits(), hit );
  106. assertEquals( "org.apache.archiva", hit.getGroupId() );
  107. assertEquals( "archiva-search", hit.getArtifactId() );
  108. assertEquals( "1.0", hit.getVersions().get( 0 ) );
  109. archivaConfigControl.reset();
  110. EasyMock.expect( archivaConfig.getDefaultLocale() ).andReturn( Locale.getDefault( ) ).anyTimes();
  111. EasyMock.expect( archivaConfig.getConfiguration()).andReturn(config).anyTimes();
  112. // search groupId
  113. archivaConfigControl.replay();
  114. results = search.search( "user", selectedRepos, "org.apache.archiva", null, null );
  115. archivaConfigControl.verify();
  116. assertNotNull( results );
  117. assertEquals( "total hints not 3", 3, results.getTotalHits() );
  118. //TODO: search for class & package names
  119. }
  120. @Test
  121. public void testQuickSearchNotWithClassifier()
  122. throws Exception
  123. {
  124. createSimpleIndex( true );
  125. List<String> selectedRepos = Arrays.asList( TEST_REPO_1 );
  126. // search artifactId
  127. EasyMock.expect( archivaConfig.getDefaultLocale() ).andReturn( Locale.getDefault( ) ).anyTimes();
  128. EasyMock.expect( archivaConfig.getConfiguration()).andReturn(config).anyTimes();
  129. archivaConfigControl.replay();
  130. SearchResults results = search.search( "user", selectedRepos, "archiva-search", null, null );
  131. archivaConfigControl.verify();
  132. assertNotNull( results );
  133. SearchResultHit hit =
  134. results.getSearchResultHit( SearchUtil.getHitId( "org.apache.archiva", "archiva-search", null, "jar" ) );
  135. assertNotNull( "hit null in result " + results.getHits(), hit );
  136. assertEquals( "org.apache.archiva", hit.getGroupId() );
  137. assertEquals( "archiva-search", hit.getArtifactId() );
  138. assertEquals( "1.0", hit.getVersions().get( 0 ) );
  139. archivaConfigControl.reset();
  140. // search groupId
  141. EasyMock.expect( archivaConfig.getDefaultLocale() ).andReturn( Locale.getDefault( ) ).anyTimes();
  142. EasyMock.expect( archivaConfig.getConfiguration()).andReturn(config).anyTimes();
  143. archivaConfigControl.replay();
  144. results = search.search( "user", selectedRepos, "archiva-search", null, null );
  145. archivaConfigControl.verify();
  146. assertNotNull( results );
  147. assertEquals( "total hints not 3 hits " + results.getHits(), 3, results.getTotalHits() );
  148. //TODO: search for class & package names
  149. }
  150. @Test
  151. public void testQuickSearchMultipleArtifactsSameVersion()
  152. throws Exception
  153. {
  154. createIndexContainingMultipleArtifactsSameVersion( false );
  155. List<String> selectedRepos = new ArrayList<>();
  156. selectedRepos.add( TEST_REPO_1 );
  157. // search artifactId
  158. EasyMock.expect( archivaConfig.getDefaultLocale() ).andReturn( Locale.getDefault( ) ).anyTimes();
  159. EasyMock.expect( archivaConfig.getConfiguration()).andReturn(config).anyTimes();
  160. archivaConfigControl.replay();
  161. SearchResults results = search.search( "user", selectedRepos, "archiva-search", null, null );
  162. archivaConfigControl.verify();
  163. assertNotNull( results );
  164. assertEquals( 3, results.getTotalHits() );
  165. SearchResultHit hit = results.getHits().get( 0 );
  166. assertEquals( "org.apache.archiva", hit.getGroupId() );
  167. assertEquals( "archiva-search", hit.getArtifactId() );
  168. assertEquals( "1.0", hit.getVersions().get( 0 ) );
  169. //only 1 version of 1.0 is retrieved
  170. assertEquals( 1, hit.getVersions().size() );
  171. }
  172. @Test
  173. public void testMultipleArtifactsSameVersionWithClassifier()
  174. throws Exception
  175. {
  176. createIndexContainingMultipleArtifactsSameVersion( true );
  177. List<String> selectedRepos = new ArrayList<>();
  178. selectedRepos.add( TEST_REPO_1 );
  179. // search artifactId
  180. EasyMock.expect( archivaConfig.getDefaultLocale() ).andReturn( Locale.getDefault( ) ).anyTimes();
  181. EasyMock.expect( archivaConfig.getConfiguration()).andReturn(config).anyTimes();
  182. archivaConfigControl.replay();
  183. SearchFields searchFields = new SearchFields();
  184. searchFields.setGroupId( "org.apache.archiva" );
  185. searchFields.setArtifactId( "archiva-search" );
  186. searchFields.setClassifier( "sources" );
  187. searchFields.setRepositories( selectedRepos );
  188. SearchResults results = search.search( "user", searchFields, null );
  189. archivaConfigControl.verify();
  190. assertNotNull( results );
  191. assertEquals( 1, results.getTotalHits() );
  192. SearchResultHit hit = results.getHits().get( 0 );
  193. assertEquals( "org.apache.archiva", hit.getGroupId() );
  194. assertEquals( "archiva-search", hit.getArtifactId() );
  195. assertEquals( "1.0", hit.getVersions().get( 0 ) );
  196. //only 1 version of 1.0 is retrieved
  197. assertEquals( 1, hit.getVersions().size() );
  198. }
  199. // search for existing artifact using multiple keywords
  200. @Test
  201. public void testQuickSearchWithMultipleKeywords()
  202. throws Exception
  203. {
  204. createSimpleIndex( false );
  205. List<String> selectedRepos = new ArrayList<>();
  206. selectedRepos.add( TEST_REPO_1 );
  207. EasyMock.expect( archivaConfig.getDefaultLocale() ).andReturn( Locale.getDefault( ) ).anyTimes();
  208. EasyMock.expect( archivaConfig.getConfiguration()).andReturn(config).anyTimes();
  209. archivaConfigControl.replay();
  210. SearchResults results = search.search( "user", selectedRepos, "archiva search", null, null );
  211. archivaConfigControl.verify();
  212. assertNotNull( results );
  213. assertEquals( 1, results.getTotalHits() );
  214. }
  215. @Test
  216. public void testQuickSearchWithPagination()
  217. throws Exception
  218. {
  219. createSimpleIndex( true );
  220. List<String> selectedRepos = new ArrayList<>();
  221. selectedRepos.add( TEST_REPO_1 );
  222. // page 1
  223. SearchResultLimits limits = new SearchResultLimits( 0 );
  224. limits.setPageSize( 1 );
  225. EasyMock.expect( archivaConfig.getDefaultLocale() ).andReturn( Locale.getDefault( ) ).anyTimes();
  226. EasyMock.expect( archivaConfig.getConfiguration()).andReturn(config).anyTimes();
  227. archivaConfigControl.replay();
  228. SearchResults results = search.search( "user", selectedRepos, "org", limits, Collections.emptyList() );
  229. archivaConfigControl.verify();
  230. assertNotNull( results );
  231. assertEquals( 1, results.getHits().size() );
  232. assertEquals( "total hits not 9 for page1 " + results, 9, results.getTotalHits() );
  233. assertEquals( "returned hits not 1 for page1 " + results, 1, results.getReturnedHitsCount() );
  234. assertEquals( limits, results.getLimits() );
  235. archivaConfigControl.reset();
  236. // page 2
  237. limits = new SearchResultLimits( 1 );
  238. limits.setPageSize( 1 );
  239. EasyMock.expect( archivaConfig.getDefaultLocale() ).andReturn( Locale.getDefault( ) ).anyTimes();
  240. EasyMock.expect( archivaConfig.getConfiguration()).andReturn(config).anyTimes();
  241. archivaConfigControl.replay();
  242. results = search.search( "user", selectedRepos, "org", limits, null );
  243. archivaConfigControl.verify();
  244. assertNotNull( results );
  245. assertEquals( "hits not 1", 1, results.getHits().size() );
  246. assertEquals( "total hits not 9 for page 2 " + results, 9, results.getTotalHits() );
  247. assertEquals( "returned hits not 1 for page2 " + results, 1, results.getReturnedHitsCount() );
  248. assertEquals( limits, results.getLimits() );
  249. }
  250. @Test
  251. public void testArtifactFoundInMultipleRepositories()
  252. throws Exception
  253. {
  254. createSimpleIndex( true );
  255. List<Path> files = new ArrayList<>();
  256. files.add( Paths.get( org.apache.archiva.common.utils.FileUtils.getBasedir(), "target/repos/" + TEST_REPO_2
  257. + "/org/apache/archiva/archiva-search/1.0/archiva-search-1.0.jar" ) );
  258. files.add( Paths.get( org.apache.archiva.common.utils.FileUtils.getBasedir(), "target/repos/" + TEST_REPO_2
  259. + "/org/apache/archiva/archiva-search/1.1/archiva-search-1.1.jar" ) );
  260. createIndex( TEST_REPO_2, files, false );
  261. List<String> selectedRepos = new ArrayList<>();
  262. selectedRepos.add( TEST_REPO_1 );
  263. selectedRepos.add( TEST_REPO_2 );
  264. config.addManagedRepository( createRepositoryConfig( TEST_REPO_2 ) );
  265. EasyMock.expect( archivaConfig.getDefaultLocale() ).andReturn( Locale.getDefault( ) ).anyTimes();
  266. EasyMock.expect( archivaConfig.getConfiguration()).andReturn(config).anyTimes();
  267. archivaConfigControl.replay();
  268. // wait lucene flush.....
  269. Thread.sleep( 2000 );
  270. SearchResults results = search.search( "user", selectedRepos, "archiva-search", null, null );
  271. archivaConfigControl.verify();
  272. assertNotNull( results );
  273. SearchResultHit hit =
  274. results.getSearchResultHit( SearchUtil.getHitId( "org.apache.archiva", "archiva-search", null, "jar" ) );
  275. assertNotNull(hit);
  276. assertEquals( "org.apache.archiva", hit.getGroupId() );
  277. assertEquals( "archiva-search", hit.getArtifactId() );
  278. assertEquals( "not 2 version for hit " + hit + "::" + niceDisplay( results ), 2, hit.getVersions().size() );
  279. assertTrue( hit.getVersions().contains( "1.0" ) );
  280. assertTrue( hit.getVersions().contains( "1.1" ) );
  281. archivaConfigControl.reset();
  282. // TODO: [BROWSE] in artifact info from browse, display all the repositories where the artifact is found
  283. }
  284. @Test
  285. public void testNoMatchFound()
  286. throws Exception
  287. {
  288. createSimpleIndex( false );
  289. List<String> selectedRepos = new ArrayList<>();
  290. selectedRepos.add( TEST_REPO_1 );
  291. EasyMock.expect( archivaConfig.getDefaultLocale() ).andReturn( Locale.getDefault( ) ).anyTimes();
  292. EasyMock.expect( archivaConfig.getConfiguration()).andReturn(config).anyTimes();
  293. archivaConfigControl.replay();
  294. SearchResults results = search.search( "user", selectedRepos, "dfghdfkweriuasndsaie", null, null );
  295. archivaConfigControl.verify();
  296. assertNotNull( results );
  297. assertEquals( 0, results.getTotalHits() );
  298. }
  299. @Test
  300. public void testNoIndexFound()
  301. throws Exception
  302. {
  303. List<String> selectedRepos = new ArrayList<>();
  304. selectedRepos.add( TEST_REPO_1 );
  305. EasyMock.expect( archivaConfig.getDefaultLocale() ).andReturn( Locale.getDefault( ) ).anyTimes();
  306. EasyMock.expect( archivaConfig.getConfiguration()).andReturn(config).anyTimes();
  307. archivaConfigControl.replay();
  308. SearchResults results = search.search( "user", selectedRepos, "org.apache.archiva", null, null );
  309. assertNotNull( results );
  310. assertEquals( 0, results.getTotalHits() );
  311. archivaConfigControl.verify();
  312. }
  313. @Test
  314. public void testRepositoryNotFound()
  315. throws Exception
  316. {
  317. List<String> selectedRepos = new ArrayList<>();
  318. selectedRepos.add( "non-existing-repo" );
  319. archivaConfigControl.replay();
  320. SearchResults results = search.search( "user", selectedRepos, "org.apache.archiva", null, null );
  321. assertNotNull( results );
  322. assertEquals( 0, results.getTotalHits() );
  323. archivaConfigControl.verify();
  324. }
  325. @Test
  326. public void testSearchWithinSearchResults()
  327. throws Exception
  328. {
  329. createSimpleIndex( true );
  330. List<String> selectedRepos = new ArrayList<>();
  331. selectedRepos.add( TEST_REPO_1 );
  332. List<String> previousSearchTerms = new ArrayList<>();
  333. previousSearchTerms.add( "archiva-test" );
  334. EasyMock.expect( archivaConfig.getDefaultLocale() ).andReturn( Locale.getDefault( ) ).anyTimes();
  335. EasyMock.expect( archivaConfig.getConfiguration()).andReturn(config).anyTimes();
  336. archivaConfigControl.replay();
  337. SearchResults results = search.search( "user", selectedRepos, "1.0", null, previousSearchTerms );
  338. archivaConfigControl.verify();
  339. assertNotNull( results );
  340. assertEquals( "total hints not 1", 1, results.getTotalHits() );
  341. SearchResultHit hit = results.getHits().get( 0 );
  342. assertEquals( "org.apache.archiva", hit.getGroupId() );
  343. assertEquals( "archiva-test", hit.getArtifactId() );
  344. assertEquals( "versions not 1", 1, hit.getVersions().size() );
  345. assertEquals( "1.0", hit.getVersions().get( 0 ) );
  346. }
  347. // tests for advanced search
  348. @Test
  349. public void testAdvancedSearch()
  350. throws Exception
  351. {
  352. List<Path> files = new ArrayList<>();
  353. files.add( Paths.get( org.apache.archiva.common.utils.FileUtils.getBasedir(), "target/repos/" + TEST_REPO_2
  354. + "/org/apache/archiva/archiva-search/1.0/archiva-search-1.0.jar" ) );
  355. files.add( Paths.get( org.apache.archiva.common.utils.FileUtils.getBasedir(), "target/repos/" + TEST_REPO_2
  356. + "/org/apache/archiva/archiva-search/1.1/archiva-search-1.1.jar" ) );
  357. createIndex( TEST_REPO_2, files, false );
  358. List<String> selectedRepos = new ArrayList<>();
  359. selectedRepos.add( TEST_REPO_2 );
  360. SearchFields searchFields = new SearchFields();
  361. searchFields.setGroupId( "org.apache.archiva" );
  362. searchFields.setVersion( "1.0" );
  363. searchFields.setRepositories( selectedRepos );
  364. EasyMock.expect( archivaConfig.getDefaultLocale() ).andReturn( Locale.getDefault( ) ).anyTimes();
  365. EasyMock.expect( archivaConfig.getConfiguration()).andReturn(config).anyTimes();
  366. archivaConfigControl.replay();
  367. SearchResults results = search.search( "user", searchFields, null );
  368. archivaConfigControl.verify();
  369. assertNotNull( results );
  370. assertEquals( 1, results.getTotalHits() );
  371. SearchResultHit hit = results.getHits().get( 0 );
  372. assertEquals( "org.apache.archiva", hit.getGroupId() );
  373. assertEquals( "archiva-search", hit.getArtifactId() );
  374. assertEquals( "1.0", hit.getVersions().get( 0 ) );
  375. }
  376. @Test
  377. public void testAdvancedSearchWithPagination()
  378. throws Exception
  379. {
  380. createIndexContainingMoreArtifacts( false );
  381. List<String> selectedRepos = new ArrayList<>();
  382. selectedRepos.add( TEST_REPO_1 );
  383. SearchFields searchFields = new SearchFields();
  384. searchFields.setGroupId( "org.apache.archiva" );
  385. searchFields.setRepositories( selectedRepos );
  386. // page 1
  387. SearchResultLimits limits = new SearchResultLimits( 0 );
  388. limits.setPageSize( 1 );
  389. EasyMock.expect( archivaConfig.getDefaultLocale() ).andReturn( Locale.getDefault( ) ).anyTimes();
  390. EasyMock.expect( archivaConfig.getConfiguration()).andReturn(config).anyTimes();
  391. archivaConfigControl.replay();
  392. SearchResults results = search.search( "user", searchFields, limits );
  393. archivaConfigControl.verify();
  394. assertNotNull( results );
  395. assertEquals( 4, results.getTotalHits() );
  396. assertEquals( 1, results.getHits().size() );
  397. // page 2
  398. archivaConfigControl.reset();
  399. limits = new SearchResultLimits( 1 );
  400. limits.setPageSize( 1 );
  401. EasyMock.expect( archivaConfig.getDefaultLocale() ).andReturn( Locale.getDefault( ) ).anyTimes();
  402. EasyMock.expect( archivaConfig.getConfiguration()).andReturn(config).anyTimes();
  403. archivaConfigControl.replay();
  404. results = search.search( "user", searchFields, limits );
  405. archivaConfigControl.verify();
  406. assertNotNull( results );
  407. assertEquals( 4, results.getTotalHits() );
  408. assertEquals( 1, results.getHits().size() );
  409. }
  410. // MRM-981 - artifactIds with numeric characters aren't found in advanced search
  411. @Test
  412. public void testAdvancedSearchArtifactIdHasNumericChar()
  413. throws Exception
  414. {
  415. List<Path> files = new ArrayList<>();
  416. files.add( Paths.get( org.apache.archiva.common.utils.FileUtils.getBasedir(),
  417. "target/repos/" + TEST_REPO_1 + "/com/artifactid-numeric/1.0/artifactid-numeric-1.0.jar" ) );
  418. files.add( Paths.get( org.apache.archiva.common.utils.FileUtils.getBasedir(), "target/repos/" + TEST_REPO_1
  419. + "/com/artifactid-numeric123/1.0/artifactid-numeric123-1.0.jar" ) );
  420. createIndex( TEST_REPO_1, files, true );
  421. List<String> selectedRepos = new ArrayList<>();
  422. selectedRepos.add( TEST_REPO_1 );
  423. SearchFields searchFields = new SearchFields();
  424. searchFields.setArtifactId( "artifactid-numeric" );
  425. searchFields.setRepositories( selectedRepos );
  426. EasyMock.expect( archivaConfig.getDefaultLocale() ).andReturn( Locale.getDefault( ) ).anyTimes();
  427. EasyMock.expect( archivaConfig.getConfiguration()).andReturn(config).anyTimes();
  428. archivaConfigControl.replay();
  429. SearchResults results = search.search( "user", searchFields, null );
  430. archivaConfigControl.verify();
  431. assertNotNull( results );
  432. assertEquals( 2, results.getTotalHits() );
  433. }
  434. @Test
  435. public void testAdvancedSearchNoRepositoriesConfigured()
  436. throws Exception
  437. {
  438. SearchFields searchFields = new SearchFields();
  439. searchFields.setArtifactId( "archiva" );
  440. searchFields.setRepositories( null );
  441. try
  442. {
  443. search.search( "user", searchFields, null );
  444. fail( "A RepositorySearchExcecption should have been thrown." );
  445. }
  446. catch ( RepositorySearchException e )
  447. {
  448. assertEquals( "Repositories cannot be null.", e.getMessage() );
  449. }
  450. }
  451. @Test
  452. public void testAdvancedSearchSearchFieldsAreNull()
  453. throws Exception
  454. {
  455. List<String> selectedRepos = new ArrayList<>();
  456. selectedRepos.add( TEST_REPO_1 );
  457. SearchFields searchFields = new SearchFields();
  458. searchFields.setRepositories( selectedRepos );
  459. try
  460. {
  461. EasyMock.expect( archivaConfig.getDefaultLocale() ).andReturn( Locale.getDefault( ) ).anyTimes();
  462. EasyMock.expect( archivaConfig.getConfiguration()).andReturn(config).anyTimes();
  463. archivaConfigControl.replay();
  464. search.search( "user", searchFields, null );
  465. archivaConfigControl.verify();
  466. fail( "A RepositorySearchExcecption should have been thrown." );
  467. }
  468. catch ( RepositorySearchException e )
  469. {
  470. assertEquals( "No search fields set.", e.getMessage() );
  471. }
  472. }
  473. @Test
  474. public void testAdvancedSearchSearchFieldsAreBlank()
  475. throws Exception
  476. {
  477. List<String> selectedRepos = new ArrayList<>();
  478. selectedRepos.add( TEST_REPO_1 );
  479. SearchFields searchFields = new SearchFields();
  480. searchFields.setGroupId( "" );
  481. searchFields.setArtifactId( "" );
  482. searchFields.setVersion( "" );
  483. searchFields.setPackaging( "" );
  484. searchFields.setClassName( "" );
  485. searchFields.setRepositories( selectedRepos );
  486. try
  487. {
  488. EasyMock.expect( archivaConfig.getDefaultLocale() ).andReturn( Locale.getDefault( ) ).anyTimes();
  489. EasyMock.expect( archivaConfig.getConfiguration()).andReturn(config).anyTimes();
  490. archivaConfigControl.replay();
  491. search.search( "user", searchFields, null );
  492. archivaConfigControl.verify();
  493. fail( "A RepositorySearchException should have been thrown." );
  494. }
  495. catch ( RepositorySearchException e )
  496. {
  497. assertEquals( "No search fields set.", e.getMessage() );
  498. }
  499. }
  500. @Test
  501. public void testAdvancedSearchAllSearchCriteriaSpecified()
  502. throws Exception
  503. {
  504. createSimpleIndex( true );
  505. List<String> selectedRepos = new ArrayList<>();
  506. selectedRepos.add( TEST_REPO_1 );
  507. SearchFields searchFields = new SearchFields();
  508. searchFields.setGroupId( "org.apache.archiva" );
  509. searchFields.setArtifactId( "archiva-test" );
  510. searchFields.setVersion( "2.0" );
  511. searchFields.setPackaging( "jar" );
  512. searchFields.setClassName( "org.apache.archiva.test.App" );
  513. searchFields.setRepositories( selectedRepos );
  514. EasyMock.expect( archivaConfig.getDefaultLocale() ).andReturn( Locale.getDefault( ) ).anyTimes();
  515. EasyMock.expect( archivaConfig.getConfiguration()).andReturn(config).anyTimes();
  516. archivaConfigControl.replay();
  517. SearchResults results = search.search( "user", searchFields, null );
  518. archivaConfigControl.verify();
  519. assertNotNull( results );
  520. assertEquals( "total hints not 1" + results, 1, results.getTotalHits() );
  521. SearchResultHit hit = results.getHits().get( 0 );
  522. assertEquals( "org.apache.archiva", hit.getGroupId() );
  523. assertEquals( "archiva-test", hit.getArtifactId() );
  524. assertEquals( "version not 2.0", "2.0", hit.getVersions().get( 0 ) );
  525. }
  526. @Test
  527. public void testAdvancedSearchJarArtifacts()
  528. throws Exception
  529. {
  530. createIndexContainingMoreArtifacts( true );
  531. List<String> selectedRepos = new ArrayList<>();
  532. selectedRepos.add( TEST_REPO_1 );
  533. SearchFields searchFields = new SearchFields();
  534. searchFields.setPackaging( "jar" );
  535. searchFields.setRepositories( selectedRepos );
  536. EasyMock.expect( archivaConfig.getDefaultLocale() ).andReturn( Locale.getDefault( ) ).anyTimes();
  537. EasyMock.expect( archivaConfig.getConfiguration()).andReturn(config).anyTimes();
  538. archivaConfigControl.replay();
  539. SearchResults results = search.search( "user", searchFields, null );
  540. archivaConfigControl.verify();
  541. assertNotNull( results );
  542. assertEquals( "not 8 but " + results.getTotalHits() + ":" + niceDisplay( results ), 8, results.getTotalHits() );
  543. }
  544. @Test
  545. public void testAdvancedSearchWithIncorrectPackaging()
  546. throws Exception
  547. {
  548. createSimpleIndex( true );
  549. List<String> selectedRepos = new ArrayList<>();
  550. selectedRepos.add( TEST_REPO_1 );
  551. SearchFields searchFields = new SearchFields();
  552. searchFields.setGroupId( "org.apache.archiva" );
  553. searchFields.setArtifactId( "archiva-test" );
  554. searchFields.setVersion( "2.0" );
  555. searchFields.setPackaging( "war" );
  556. searchFields.setRepositories( selectedRepos );
  557. EasyMock.expect( archivaConfig.getDefaultLocale() ).andReturn( Locale.getDefault( ) ).anyTimes();
  558. EasyMock.expect( archivaConfig.getConfiguration()).andReturn(config).anyTimes();
  559. archivaConfigControl.replay();
  560. SearchResults results = search.search( "user", searchFields, null );
  561. archivaConfigControl.verify();
  562. assertNotNull( results );
  563. assertEquals( 0, results.getTotalHits() );
  564. }
  565. @Test
  566. public void testAdvancedSearchClassname()
  567. throws Exception
  568. {
  569. createIndexContainingMoreArtifacts( true );
  570. List<String> selectedRepos = Arrays.asList( TEST_REPO_1 );
  571. SearchFields searchFields = new SearchFields();
  572. searchFields.setClassName( "com.classname.search.App" );
  573. searchFields.setRepositories( selectedRepos );
  574. EasyMock.expect( archivaConfig.getDefaultLocale() ).andReturn( Locale.getDefault( ) ).anyTimes();
  575. EasyMock.expect( archivaConfig.getConfiguration()).andReturn(config).anyTimes();
  576. archivaConfigControl.replay();
  577. SearchResults results = search.search( "user", searchFields, null );
  578. archivaConfigControl.verify();
  579. assertNotNull( results );
  580. assertEquals( "totalHits not 1 results " + results, 1, results.getTotalHits() );
  581. SearchResultHit hit = results.getHits().get( 0 );
  582. assertEquals( "groupId not com", "com", hit.getGroupId() );
  583. assertEquals( "arttifactId not classname-search", "classname-search", hit.getArtifactId() );
  584. assertEquals( " hits.version(0) not 1.0", "1.0", hit.getVersions().get( 0 ) );
  585. }
  586. @Test
  587. public void testAdvancedSearchNoIndexFound()
  588. throws Exception
  589. {
  590. List<String> selectedRepos = new ArrayList<>();
  591. selectedRepos.add( TEST_REPO_1 );
  592. SearchFields searchFields = new SearchFields();
  593. searchFields.setGroupId( "org.apache.archiva" );
  594. searchFields.setRepositories( selectedRepos );
  595. EasyMock.expect( archivaConfig.getDefaultLocale() ).andReturn( Locale.getDefault( ) ).anyTimes();
  596. EasyMock.expect( archivaConfig.getConfiguration()).andReturn(config).anyTimes();
  597. archivaConfigControl.replay();
  598. SearchResults results = search.search( "user", searchFields, null );
  599. archivaConfigControl.verify();
  600. assertNotNull( results );
  601. assertEquals( 0, results.getTotalHits() );
  602. }
  603. @Test
  604. public void testAdvancedSearchClassNameInWar()
  605. throws Exception
  606. {
  607. createIndexContainingMoreArtifacts( true );
  608. List<String> selectedRepos = Arrays.asList( TEST_REPO_1 );
  609. SearchFields searchFields = new SearchFields();
  610. searchFields.setClassName( "SomeClass" );
  611. searchFields.setRepositories( selectedRepos );
  612. EasyMock.expect( archivaConfig.getDefaultLocale() ).andReturn( Locale.getDefault( ) ).anyTimes();
  613. EasyMock.expect( archivaConfig.getConfiguration()).andReturn(config).anyTimes();
  614. archivaConfigControl.replay();
  615. SearchResults results = search.search( "user", searchFields, null );
  616. archivaConfigControl.verify();
  617. assertNotNull( results );
  618. assertEquals( 1, results.getHits().size() );
  619. assertEquals( "test-webapp", results.getHits().get( 0 ).getArtifactId() );
  620. }
  621. @Test
  622. public void getAllGroupIds()
  623. throws Exception
  624. {
  625. createIndexContainingMoreArtifacts( true );
  626. List<String> selectedRepos = Arrays.asList( TEST_REPO_1 );
  627. EasyMock.expect( archivaConfig.getConfiguration() ).andReturn( config ).times( 0, 2 );
  628. archivaConfigControl.replay();
  629. Collection<String> groupIds = search.getAllGroupIds( "user", selectedRepos );
  630. archivaConfigControl.verify();
  631. log.info( "groupIds: {}", groupIds );
  632. assertEquals( 3, groupIds.size() );
  633. assertTrue( groupIds.contains( "com" ) );
  634. assertTrue( groupIds.contains( "org.apache.felix" ) );
  635. assertTrue( groupIds.contains( "org.apache.archiva" ) );
  636. }
  637. @Test
  638. public void testSearchWithUnknownRepo()
  639. throws Exception
  640. {
  641. createIndexContainingMoreArtifacts( true );
  642. List<String> selectedRepos = Arrays.asList( "foo" );
  643. SearchFields searchFields = new SearchFields();
  644. searchFields.setClassName( "SomeClass" );
  645. searchFields.setRepositories( selectedRepos );
  646. archivaConfigControl.replay();
  647. SearchResults results = search.search( "user", searchFields, null );
  648. archivaConfigControl.verify();
  649. assertNotNull( results );
  650. assertEquals( 0, results.getHits().size() );
  651. }
  652. @Test
  653. public void nolimitedResult()
  654. throws Exception
  655. {
  656. Path repo = Paths.get( "target/repo-release" );
  657. FileUtils.deleteDirectory(repo.toFile());
  658. Path indexDirectory = repo.resolve(".index" );
  659. FileUtils.copyDirectoryStructure( Paths.get( "src/test/repo-release" ).toFile(), repo.toFile() );
  660. IndexUpgrader.main( new String[]{ indexDirectory.toAbsolutePath().toString() } );
  661. createIndex(REPO_RELEASE, Collections.emptyList(), false, indexDirectory );
  662. // indexer.addIndexingContext( REPO_RELEASE, REPO_RELEASE, repo.toFile(), indexDirectory.toFile(),
  663. // repo.toUri().toURL().toExternalForm(),
  664. // indexDirectory.toUri().toURL().toString(), indexCreators );
  665. SearchResultLimits limits = new SearchResultLimits( SearchResultLimits.ALL_PAGES );
  666. limits.setPageSize( 300 );
  667. EasyMock.expect( archivaConfig.getDefaultLocale() ).andReturn( Locale.getDefault( ) ).anyTimes();
  668. EasyMock.expect( archivaConfig.getConfiguration()).andReturn(config).anyTimes();
  669. archivaConfigControl.replay();
  670. SearchResults searchResults = search.search( null, Arrays.asList( REPO_RELEASE ), //
  671. "org.example", limits, //
  672. Collections.emptyList() );
  673. log.info( "results: {}", searchResults.getHits().size() );
  674. assertEquals( 255, searchResults.getHits().size() );
  675. SearchFields searchFields = new SearchFields();
  676. searchFields.setGroupId( "org.example" );
  677. searchFields.setRepositories( Arrays.asList( REPO_RELEASE ) );
  678. searchResults = search.search( null, searchFields, limits );
  679. log.info( "results: {}", searchResults.getHits().size() );
  680. assertEquals( 255, searchResults.getHits().size() );
  681. archivaConfigControl.verify();
  682. }
  683. }