View Javadoc
1   package org.apache.archiva.indexer.search;
2   
3   /*
4    * Licensed to the Apache Software Foundation (ASF) under one
5    * or more contributor license agreements.  See the NOTICE file
6    * distributed with this work for additional information
7    * regarding copyright ownership.  The ASF licenses this file
8    * to you under the Apache License, Version 2.0 (the
9    * "License"); you may not use this file except in compliance
10   * with the License.  You may obtain a copy of the License at
11   *
12   *  http://www.apache.org/licenses/LICENSE-2.0
13   *
14   * Unless required by applicable law or agreed to in writing,
15   * software distributed under the License is distributed on an
16   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17   * KIND, either express or implied.  See the License for the
18   * specific language governing permissions and limitations
19   * under the License.
20   */
21  
22  import org.apache.archiva.common.utils.FileUtil;
23  import org.apache.archiva.indexer.util.SearchUtil;
24  import org.apache.archiva.test.utils.ArchivaSpringJUnit4ClassRunner;
25  import org.codehaus.plexus.util.FileUtils;
26  import org.easymock.EasyMock;
27  import org.junit.Test;
28  import org.junit.runner.RunWith;
29  import org.springframework.test.context.ContextConfiguration;
30  
31  import java.io.File;
32  import java.nio.file.Files;
33  import java.nio.file.Path;
34  import java.nio.file.Paths;
35  import java.nio.file.StandardCopyOption;
36  import java.util.ArrayList;
37  import java.util.Arrays;
38  import java.util.Collection;
39  import java.util.Collections;
40  import java.util.List;
41  
42  
43  @RunWith(ArchivaSpringJUnit4ClassRunner.class)
44  @ContextConfiguration(locations = { "classpath*:/META-INF/spring-context.xml", "classpath:/spring-context.xml" })
45  public class MavenRepositorySearchTest
46      extends AbstractMavenRepositorySearch
47  {
48  
49  
50      private void createSimpleIndex( boolean scan )
51          throws Exception
52      {
53          List<File> files = new ArrayList<>();
54          files.add( Paths.get( FileUtil.getBasedir(), "src/test", TEST_REPO_1,
55                                "/org/apache/archiva/archiva-search/1.0/archiva-search-1.0.jar" ).toFile() );
56          files.add( Paths.get( FileUtil.getBasedir(), "src/test", TEST_REPO_1,
57                                "/org/apache/archiva/archiva-test/1.0/archiva-test-1.0.jar" ).toFile() );
58          files.add( Paths.get( FileUtil.getBasedir(), "src/test", TEST_REPO_1,
59                                "org/apache/archiva/archiva-test/2.0/archiva-test-2.0.jar" ).toFile() );
60  
61          createIndex( TEST_REPO_1, files, scan );
62      }
63  
64      private void createIndexContainingMoreArtifacts( boolean scan )
65          throws Exception
66      {
67          List<File> files = new ArrayList<>();
68          files.add( new File( FileUtil.getBasedir(), "src/test/" + TEST_REPO_1
69              + "/org/apache/archiva/archiva-search/1.0/archiva-search-1.0.jar" ) );
70          files.add( new File( FileUtil.getBasedir(), "src/test/" + TEST_REPO_1
71              + "/org/apache/archiva/archiva-test/1.0/archiva-test-1.0.jar" ) );
72          files.add( new File( FileUtil.getBasedir(), "src/test/" + TEST_REPO_1
73              + "/org/apache/archiva/archiva-test/2.0/archiva-test-2.0.jar" ) );
74          files.add( new File( FileUtil.getBasedir(), "src/test/" + TEST_REPO_1
75              + "/org/apache/archiva/archiva-webapp/1.0/archiva-webapp-1.0.war" ) );
76          files.add( new File( FileUtil.getBasedir(),
77                               "src/test/" + TEST_REPO_1 + "/com/artifactid-numeric/1.0/artifactid-numeric-1.0.jar" ) );
78          files.add( new File( FileUtil.getBasedir(), "src/test/" + TEST_REPO_1
79              + "/com/artifactid-numeric123/1.0/artifactid-numeric123-1.0.jar" ) );
80          files.add( new File( FileUtil.getBasedir(),
81                               "src/test/" + TEST_REPO_1 + "/com/classname-search/1.0/classname-search-1.0.jar" ) );
82  
83          createIndex( TEST_REPO_1, files, scan );
84      }
85  
86      private void createIndexContainingMultipleArtifactsSameVersion( boolean scan )
87          throws Exception
88      {
89          List<File> files = new ArrayList<>();
90  
91          files.add( new File( FileUtil.getBasedir(), "src/test/" + TEST_REPO_1
92              + "/org/apache/archiva/archiva-search/1.0/archiva-search-1.0.jar" ) );
93  
94          files.add( new File( FileUtil.getBasedir(), "src/test/" + TEST_REPO_1
95              + "/org/apache/archiva/archiva-search/1.0/archiva-search-1.0.pom" ) );
96  
97          files.add( new File( FileUtil.getBasedir(), "src/test/" + TEST_REPO_1
98              + "/org/apache/archiva/archiva-search/1.0/archiva-search-1.0-sources.jar" ) );
99  
100         createIndex( TEST_REPO_1, files, scan );
101     }
102 
103     @Test
104     public void testQuickSearch()
105         throws Exception
106     {
107         createSimpleIndex( false );
108 
109         List<String> selectedRepos = Arrays.asList( TEST_REPO_1 );
110 
111         // search artifactId
112         EasyMock.expect( archivaConfig.getConfiguration() ).andReturn( config ).times( 1, 2 );
113 
114         archivaConfigControl.replay();
115 
116         SearchResults results = search.search( "user", selectedRepos, "archiva-search", null, null );
117 
118         archivaConfigControl.verify();
119 
120         assertNotNull( results );
121 
122         SearchResultHit hit =
123             results.getSearchResultHit( SearchUtil.getHitId( "org.apache.archiva", "archiva-search", null, "jar" ) );
124         assertNotNull( "hit null in result " + results.getHits(), hit );
125         assertEquals( "org.apache.archiva", hit.getGroupId() );
126         assertEquals( "archiva-search", hit.getArtifactId() );
127         assertEquals( "1.0", hit.getVersions().get( 0 ) );
128 
129         archivaConfigControl.reset();
130 
131         // search groupId
132         EasyMock.expect( archivaConfig.getConfiguration() ).andReturn( config ).times( 1, 2 );
133 
134         archivaConfigControl.replay();
135 
136         results = search.search( "user", selectedRepos, "org.apache.archiva", null, null );
137 
138         archivaConfigControl.verify();
139 
140         assertNotNull( results );
141         assertEquals( "total hints not 3", 3, results.getTotalHits() );
142 
143         //TODO: search for class & package names
144     }
145 
146     @Test
147     public void testQuickSearchNotWithClassifier()
148         throws Exception
149     {
150         createSimpleIndex( true );
151 
152         List<String> selectedRepos = Arrays.asList( TEST_REPO_1 );
153 
154         // search artifactId
155         EasyMock.expect( archivaConfig.getConfiguration() ).andReturn( config ).times( 1, 2 );
156 
157         archivaConfigControl.replay();
158 
159         SearchResults results = search.search( "user", selectedRepos, "archiva-search", null, null );
160 
161         archivaConfigControl.verify();
162 
163         assertNotNull( results );
164 
165         SearchResultHit hit =
166             results.getSearchResultHit( SearchUtil.getHitId( "org.apache.archiva", "archiva-search", null, "jar" ) );
167         assertNotNull( "hit null in result " + results.getHits(), hit );
168         assertEquals( "org.apache.archiva", hit.getGroupId() );
169         assertEquals( "archiva-search", hit.getArtifactId() );
170         assertEquals( "1.0", hit.getVersions().get( 0 ) );
171 
172         archivaConfigControl.reset();
173 
174         // search groupId
175         EasyMock.expect( archivaConfig.getConfiguration() ).andReturn( config ).times( 1, 2 );
176 
177         archivaConfigControl.replay();
178 
179         results = search.search( "user", selectedRepos, "archiva-search", null, null );
180 
181         archivaConfigControl.verify();
182 
183         assertNotNull( results );
184         assertEquals( "total hints not 3 hits " + results.getHits(), 3, results.getTotalHits() );
185 
186         //TODO: search for class & package names
187     }
188 
189     @Test
190     public void testQuickSearchMultipleArtifactsSameVersion()
191         throws Exception
192     {
193         createIndexContainingMultipleArtifactsSameVersion( false );
194 
195         List<String> selectedRepos = new ArrayList<>();
196         selectedRepos.add( TEST_REPO_1 );
197 
198         // search artifactId
199         EasyMock.expect( archivaConfig.getConfiguration() ).andReturn( config ).times( 1, 2 );
200 
201         archivaConfigControl.replay();
202 
203         SearchResults results = search.search( "user", selectedRepos, "archiva-search", null, null );
204 
205         archivaConfigControl.verify();
206 
207         assertNotNull( results );
208         assertEquals( 3, results.getTotalHits() );
209 
210         SearchResultHit hit = results.getHits().get( 0 );
211         assertEquals( "org.apache.archiva", hit.getGroupId() );
212         assertEquals( "archiva-search", hit.getArtifactId() );
213         assertEquals( "1.0", hit.getVersions().get( 0 ) );
214 
215         //only 1 version of 1.0 is retrieved
216         assertEquals( 1, hit.getVersions().size() );
217     }
218 
219     @Test
220     public void testMultipleArtifactsSameVersionWithClassifier()
221         throws Exception
222     {
223         createIndexContainingMultipleArtifactsSameVersion( true );
224 
225         List<String> selectedRepos = new ArrayList<>();
226         selectedRepos.add( TEST_REPO_1 );
227 
228         // search artifactId
229         EasyMock.expect( archivaConfig.getConfiguration() ).andReturn( config ).times( 1, 2 );
230 
231         archivaConfigControl.replay();
232 
233         SearchFields searchFields = new SearchFields();
234         searchFields.setGroupId( "org.apache.archiva" );
235         searchFields.setArtifactId( "archiva-search" );
236         searchFields.setClassifier( "sources" );
237         searchFields.setRepositories( selectedRepos );
238 
239         SearchResults results = search.search( "user", searchFields, null );
240 
241         archivaConfigControl.verify();
242 
243         assertNotNull( results );
244         assertEquals( 1, results.getTotalHits() );
245 
246         SearchResultHit hit = results.getHits().get( 0 );
247         assertEquals( "org.apache.archiva", hit.getGroupId() );
248         assertEquals( "archiva-search", hit.getArtifactId() );
249         assertEquals( "1.0", hit.getVersions().get( 0 ) );
250 
251         //only 1 version of 1.0 is retrieved
252         assertEquals( 1, hit.getVersions().size() );
253     }
254 
255     // search for existing artifact using multiple keywords
256     @Test
257     public void testQuickSearchWithMultipleKeywords()
258         throws Exception
259     {
260         createSimpleIndex( false );
261 
262         List<String> selectedRepos = new ArrayList<>();
263         selectedRepos.add( TEST_REPO_1 );
264 
265         EasyMock.expect( archivaConfig.getConfiguration() ).andReturn( config ).times( 1, 2 );
266         archivaConfigControl.replay();
267 
268         SearchResults results = search.search( "user", selectedRepos, "archiva search", null, null );
269 
270         archivaConfigControl.verify();
271 
272         assertNotNull( results );
273         assertEquals( 1, results.getTotalHits() );
274     }
275 
276     @Test
277     public void testQuickSearchWithPagination()
278         throws Exception
279     {
280         createSimpleIndex( true );
281 
282         List<String> selectedRepos = new ArrayList<>();
283         selectedRepos.add( TEST_REPO_1 );
284 
285         // page 1
286         SearchResultLimits limits = new SearchResultLimits( 0 );
287         limits.setPageSize( 1 );
288 
289         EasyMock.expect( archivaConfig.getConfiguration() ).andReturn( config ).times( 1, 2 );
290 
291         archivaConfigControl.replay();
292 
293         SearchResults results = search.search( "user", selectedRepos, "org", limits, Collections.<String>emptyList() );
294 
295         archivaConfigControl.verify();
296 
297         assertNotNull( results );
298         assertEquals( 1, results.getHits().size() );
299         assertEquals( "total hits not 8 for page1 " + results, 8, results.getTotalHits() );
300         assertEquals( "returned hits not 1 for page1 " + results, 1, results.getReturnedHitsCount() );
301         assertEquals( limits, results.getLimits() );
302 
303         archivaConfigControl.reset();
304 
305         // page 2
306         limits = new SearchResultLimits( 1 );
307         limits.setPageSize( 1 );
308 
309         EasyMock.expect( archivaConfig.getConfiguration() ).andReturn( config ).times( 1, 2 );
310 
311         archivaConfigControl.replay();
312 
313         results = search.search( "user", selectedRepos, "org", limits, null );
314 
315         archivaConfigControl.verify();
316 
317         assertNotNull( results );
318 
319         assertEquals( "hits not 1", 1, results.getHits().size() );
320         assertEquals( "total hits not 8 for page 2 " + results, 8, results.getTotalHits() );
321         assertEquals( "returned hits not 1 for page2 " + results, 1, results.getReturnedHitsCount() );
322         assertEquals( limits, results.getLimits() );
323     }
324 
325     @Test
326     public void testArtifactFoundInMultipleRepositories()
327         throws Exception
328     {
329         createSimpleIndex( true );
330 
331         List<File> files = new ArrayList<>();
332         files.add( new File( FileUtil.getBasedir(), "src/test/" + TEST_REPO_2
333             + "/org/apache/archiva/archiva-search/1.0/archiva-search-1.0.jar" ) );
334         files.add( new File( FileUtil.getBasedir(), "src/test/" + TEST_REPO_2
335             + "/org/apache/archiva/archiva-search/1.1/archiva-search-1.1.jar" ) );
336         createIndex( TEST_REPO_2, files, false );
337 
338         List<String> selectedRepos = new ArrayList<>();
339         selectedRepos.add( TEST_REPO_1 );
340         selectedRepos.add( TEST_REPO_2 );
341 
342         config.addManagedRepository( createRepositoryConfig( TEST_REPO_2 ) );
343 
344         EasyMock.expect( archivaConfig.getConfiguration() ).andReturn( config ).times( 1, 5 );
345 
346         archivaConfigControl.replay();
347 
348         // wait lucene flush.....
349         Thread.sleep( 2000 );
350 
351         SearchResults results = search.search( "user", selectedRepos, "archiva-search", null, null );
352 
353         archivaConfigControl.verify();
354 
355         assertNotNull( results );
356 
357         SearchResultHit hit =
358             results.getSearchResultHit( SearchUtil.getHitId( "org.apache.archiva", "archiva-search", null, "jar" ) );
359         assertEquals( "org.apache.archiva", hit.getGroupId() );
360         assertEquals( "archiva-search", hit.getArtifactId() );
361         assertEquals( "not 2 version for hit " + hit + "::" + niceDisplay( results ), 2, hit.getVersions().size() );
362         assertTrue( hit.getVersions().contains( "1.0" ) );
363         assertTrue( hit.getVersions().contains( "1.1" ) );
364 
365         archivaConfigControl.reset();
366 
367         // TODO: [BROWSE] in artifact info from browse, display all the repositories where the artifact is found
368     }
369 
370     @Test
371     public void testNoMatchFound()
372         throws Exception
373     {
374         createSimpleIndex( false );
375 
376         List<String> selectedRepos = new ArrayList<>();
377         selectedRepos.add( TEST_REPO_1 );
378 
379         EasyMock.expect( archivaConfig.getConfiguration() ).andReturn( config ).times( 1, 2 );
380 
381         archivaConfigControl.replay();
382 
383         SearchResults results = search.search( "user", selectedRepos, "dfghdfkweriuasndsaie", null, null );
384 
385         archivaConfigControl.verify();
386 
387         assertNotNull( results );
388         assertEquals( 0, results.getTotalHits() );
389     }
390 
391     @Test
392     public void testNoIndexFound()
393         throws Exception
394     {
395         List<String> selectedRepos = new ArrayList<>();
396         selectedRepos.add( TEST_REPO_1 );
397 
398         EasyMock.expect( archivaConfig.getConfiguration() ).andReturn( config ).times( 1, 2 );
399 
400         archivaConfigControl.replay();
401 
402         SearchResults results = search.search( "user", selectedRepos, "org.apache.archiva", null, null );
403         assertNotNull( results );
404         assertEquals( 0, results.getTotalHits() );
405 
406         archivaConfigControl.verify();
407     }
408 
409     @Test
410     public void testRepositoryNotFound()
411         throws Exception
412     {
413         List<String> selectedRepos = new ArrayList<>();
414         selectedRepos.add( "non-existing-repo" );
415 
416         EasyMock.expect( archivaConfig.getConfiguration() ).andReturn( config ).times( 1, 2 );
417 
418         archivaConfigControl.replay();
419 
420         SearchResults results = search.search( "user", selectedRepos, "org.apache.archiva", null, null );
421         assertNotNull( results );
422         assertEquals( 0, results.getTotalHits() );
423 
424         archivaConfigControl.verify();
425     }
426 
427     @Test
428     public void testSearchWithinSearchResults()
429         throws Exception
430     {
431         createSimpleIndex( true );
432 
433         List<String> selectedRepos = new ArrayList<>();
434         selectedRepos.add( TEST_REPO_1 );
435 
436         List<String> previousSearchTerms = new ArrayList<>();
437         previousSearchTerms.add( "archiva-test" );
438 
439         EasyMock.expect( archivaConfig.getConfiguration() ).andReturn( config ).times( 1, 2 );
440 
441         archivaConfigControl.replay();
442 
443         SearchResults results = search.search( "user", selectedRepos, "1.0", null, previousSearchTerms );
444 
445         archivaConfigControl.verify();
446 
447         assertNotNull( results );
448         assertEquals( "total hints not 1", 1, results.getTotalHits() );
449 
450         SearchResultHit hit = results.getHits().get( 0 );
451         assertEquals( "org.apache.archiva", hit.getGroupId() );
452         assertEquals( "archiva-test", hit.getArtifactId() );
453         assertEquals( "versions not 1", 1, hit.getVersions().size() );
454         assertEquals( "1.0", hit.getVersions().get( 0 ) );
455     }
456 
457     // tests for advanced search
458     @Test
459     public void testAdvancedSearch()
460         throws Exception
461     {
462         List<File> files = new ArrayList<>();
463         files.add( new File( FileUtil.getBasedir(), "src/test/" + TEST_REPO_2
464             + "/org/apache/archiva/archiva-search/1.0/archiva-search-1.0.jar" ) );
465         files.add( new File( FileUtil.getBasedir(), "src/test/" + TEST_REPO_2
466             + "/org/apache/archiva/archiva-search/1.1/archiva-search-1.1.jar" ) );
467         createIndex( TEST_REPO_2, files, false );
468 
469         List<String> selectedRepos = new ArrayList<>();
470         selectedRepos.add( TEST_REPO_2 );
471 
472         SearchFields searchFields = new SearchFields();
473         searchFields.setGroupId( "org.apache.archiva" );
474         searchFields.setVersion( "1.0" );
475         searchFields.setRepositories( selectedRepos );
476 
477         EasyMock.expect( archivaConfig.getConfiguration() ).andReturn( config ).times( 1, 2 );
478 
479         archivaConfigControl.replay();
480 
481         SearchResults results = search.search( "user", searchFields, null );
482 
483         archivaConfigControl.verify();
484 
485         assertNotNull( results );
486         assertEquals( 1, results.getTotalHits() );
487 
488         SearchResultHit hit = results.getHits().get( 0 );
489         assertEquals( "org.apache.archiva", hit.getGroupId() );
490         assertEquals( "archiva-search", hit.getArtifactId() );
491         assertEquals( "1.0", hit.getVersions().get( 0 ) );
492     }
493 
494     @Test
495     public void testAdvancedSearchWithPagination()
496         throws Exception
497     {
498         createIndexContainingMoreArtifacts( false );
499 
500         List<String> selectedRepos = new ArrayList<>();
501         selectedRepos.add( TEST_REPO_1 );
502 
503         SearchFields searchFields = new SearchFields();
504         searchFields.setGroupId( "org.apache.archiva" );
505         searchFields.setRepositories( selectedRepos );
506 
507         // page 1
508 
509         SearchResultLimits limits = new SearchResultLimits( 0 );
510         limits.setPageSize( 1 );
511 
512         EasyMock.expect( archivaConfig.getConfiguration() ).andReturn( config ).times( 1, 2 );
513 
514         archivaConfigControl.replay();
515 
516         SearchResults results = search.search( "user", searchFields, limits );
517 
518         archivaConfigControl.verify();
519 
520         assertNotNull( results );
521         assertEquals( 4, results.getTotalHits() );
522         assertEquals( 1, results.getHits().size() );
523 
524         // page 2
525         archivaConfigControl.reset();
526 
527         limits = new SearchResultLimits( 1 );
528         limits.setPageSize( 1 );
529 
530         EasyMock.expect( archivaConfig.getConfiguration() ).andReturn( config ).times( 1, 2 );
531 
532         archivaConfigControl.replay();
533 
534         results = search.search( "user", searchFields, limits );
535 
536         archivaConfigControl.verify();
537 
538         assertNotNull( results );
539         assertEquals( 4, results.getTotalHits() );
540         assertEquals( 1, results.getHits().size() );
541     }
542 
543     // MRM-981 - artifactIds with numeric characters aren't found in advanced search
544     @Test
545     public void testAdvancedSearchArtifactIdHasNumericChar()
546         throws Exception
547     {
548         List<File> files = new ArrayList<>();
549         files.add( new File( FileUtil.getBasedir(),
550                              "src/test/" + TEST_REPO_1 + "/com/artifactid-numeric/1.0/artifactid-numeric-1.0.jar" ) );
551         files.add( new File( FileUtil.getBasedir(), "src/test/" + TEST_REPO_1
552             + "/com/artifactid-numeric123/1.0/artifactid-numeric123-1.0.jar" ) );
553         createIndex( TEST_REPO_1, files, true );
554 
555         List<String> selectedRepos = new ArrayList<>();
556         selectedRepos.add( TEST_REPO_1 );
557 
558         SearchFields searchFields = new SearchFields();
559         searchFields.setArtifactId( "artifactid-numeric" );
560         searchFields.setRepositories( selectedRepos );
561 
562         EasyMock.expect( archivaConfig.getConfiguration() ).andReturn( config ).times( 1, 2 );
563 
564         archivaConfigControl.replay();
565 
566         SearchResults results = search.search( "user", searchFields, null );
567 
568         archivaConfigControl.verify();
569 
570         assertNotNull( results );
571         assertEquals( 2, results.getTotalHits() );
572     }
573 
574     @Test
575     public void testAdvancedSearchNoRepositoriesConfigured()
576         throws Exception
577     {
578         SearchFields searchFields = new SearchFields();
579         searchFields.setArtifactId( "archiva" );
580         searchFields.setRepositories( null );
581 
582         try
583         {
584             search.search( "user", searchFields, null );
585             fail( "A RepositorySearchExcecption should have been thrown." );
586         }
587         catch ( RepositorySearchException e )
588         {
589             assertEquals( "Repositories cannot be null.", e.getMessage() );
590         }
591     }
592 
593     @Test
594     public void testAdvancedSearchSearchFieldsAreNull()
595         throws Exception
596     {
597         List<String> selectedRepos = new ArrayList<>();
598         selectedRepos.add( TEST_REPO_1 );
599 
600         SearchFields searchFields = new SearchFields();
601         searchFields.setRepositories( selectedRepos );
602 
603         try
604         {
605             EasyMock.expect( archivaConfig.getConfiguration() ).andReturn( config ).times( 1, 2 );
606 
607             archivaConfigControl.replay();
608 
609             search.search( "user", searchFields, null );
610 
611             archivaConfigControl.verify();
612 
613             fail( "A RepositorySearchExcecption should have been thrown." );
614         }
615         catch ( RepositorySearchException e )
616         {
617             assertEquals( "No search fields set.", e.getMessage() );
618         }
619     }
620 
621     @Test
622     public void testAdvancedSearchSearchFieldsAreBlank()
623         throws Exception
624     {
625         List<String> selectedRepos = new ArrayList<>();
626         selectedRepos.add( TEST_REPO_1 );
627 
628         SearchFields searchFields = new SearchFields();
629         searchFields.setGroupId( "" );
630         searchFields.setArtifactId( "" );
631         searchFields.setVersion( "" );
632         searchFields.setPackaging( "" );
633         searchFields.setClassName( "" );
634 
635         searchFields.setRepositories( selectedRepos );
636 
637         try
638         {
639             EasyMock.expect( archivaConfig.getConfiguration() ).andReturn( config ).times( 1, 2 );
640 
641             archivaConfigControl.replay();
642 
643             search.search( "user", searchFields, null );
644 
645             archivaConfigControl.verify();
646 
647             fail( "A RepositorySearchExcecption should have been thrown." );
648         }
649         catch ( RepositorySearchException e )
650         {
651             assertEquals( "No search fields set.", e.getMessage() );
652         }
653     }
654 
655     @Test
656     public void testAdvancedSearchAllSearchCriteriaSpecified()
657         throws Exception
658     {
659         createSimpleIndex( true );
660 
661         List<String> selectedRepos = new ArrayList<>();
662         selectedRepos.add( TEST_REPO_1 );
663 
664         SearchFields searchFields = new SearchFields();
665         searchFields.setGroupId( "org.apache.archiva" );
666         searchFields.setArtifactId( "archiva-test" );
667         searchFields.setVersion( "2.0" );
668         searchFields.setPackaging( "jar" );
669         searchFields.setClassName( "org.apache.archiva.test.App" );
670         searchFields.setRepositories( selectedRepos );
671 
672         EasyMock.expect( archivaConfig.getConfiguration() ).andReturn( config ).times( 1, 2 );
673 
674         archivaConfigControl.replay();
675 
676         SearchResults results = search.search( "user", searchFields, null );
677 
678         archivaConfigControl.verify();
679 
680         assertNotNull( results );
681 
682         assertEquals( "total hints not 1" + results, 1, results.getTotalHits() );
683 
684         SearchResultHit hit = results.getHits().get( 0 );
685         assertEquals( "org.apache.archiva", hit.getGroupId() );
686         assertEquals( "archiva-test", hit.getArtifactId() );
687         assertEquals( "version not 2.0", "2.0", hit.getVersions().get( 0 ) );
688     }
689 
690     @Test
691     public void testAdvancedSearchJarArtifacts()
692         throws Exception
693     {
694         createIndexContainingMoreArtifacts( true );
695 
696         List<String> selectedRepos = new ArrayList<>();
697         selectedRepos.add( TEST_REPO_1 );
698 
699         SearchFields searchFields = new SearchFields();
700         searchFields.setPackaging( "jar" );
701         searchFields.setRepositories( selectedRepos );
702 
703         EasyMock.expect( archivaConfig.getConfiguration() ).andReturn( config ).times( 1, 2 );
704 
705         archivaConfigControl.replay();
706 
707         SearchResults results = search.search( "user", searchFields, null );
708 
709         archivaConfigControl.verify();
710 
711         assertNotNull( results );
712         assertEquals( "not 8 but " + results.getTotalHits() + ":" + niceDisplay( results ), 8, results.getTotalHits() );
713     }
714 
715     @Test
716     public void testAdvancedSearchWithIncorrectPackaging()
717         throws Exception
718     {
719         createSimpleIndex( true );
720 
721         List<String> selectedRepos = new ArrayList<>();
722         selectedRepos.add( TEST_REPO_1 );
723 
724         SearchFields searchFields = new SearchFields();
725         searchFields.setGroupId( "org.apache.archiva" );
726         searchFields.setArtifactId( "archiva-test" );
727         searchFields.setVersion( "2.0" );
728         searchFields.setPackaging( "war" );
729         searchFields.setRepositories( selectedRepos );
730 
731         EasyMock.expect( archivaConfig.getConfiguration() ).andReturn( config ).times( 1, 2 );
732         archivaConfigControl.replay();
733 
734         SearchResults results = search.search( "user", searchFields, null );
735 
736         archivaConfigControl.verify();
737 
738         assertNotNull( results );
739         assertEquals( 0, results.getTotalHits() );
740     }
741 
742     @Test
743     public void testAdvancedSearchClassname()
744         throws Exception
745     {
746         createIndexContainingMoreArtifacts( true );
747 
748         List<String> selectedRepos = Arrays.asList( TEST_REPO_1 );
749 
750         SearchFields searchFields = new SearchFields();
751         searchFields.setClassName( "com.classname.search.App" );
752         searchFields.setRepositories( selectedRepos );
753 
754         EasyMock.expect( archivaConfig.getConfiguration() ).andReturn( config ).times( 1, 2 );
755 
756         archivaConfigControl.replay();
757 
758         SearchResults results = search.search( "user", searchFields, null );
759 
760         archivaConfigControl.verify();
761 
762         assertNotNull( results );
763         assertEquals( "totalHits not 1 results " + results, 1, results.getTotalHits() );
764 
765         SearchResultHit hit = results.getHits().get( 0 );
766         assertEquals( "groupId not com", "com", hit.getGroupId() );
767         assertEquals( "arttifactId not classname-search", "classname-search", hit.getArtifactId() );
768         assertEquals( " hits.version(0) not 1.0", "1.0", hit.getVersions().get( 0 ) );
769     }
770 
771     @Test
772     public void testAdvancedSearchNoIndexFound()
773         throws Exception
774     {
775         List<String> selectedRepos = new ArrayList<>();
776         selectedRepos.add( TEST_REPO_1 );
777 
778         SearchFields searchFields = new SearchFields();
779         searchFields.setGroupId( "org.apache.archiva" );
780         searchFields.setRepositories( selectedRepos );
781 
782         EasyMock.expect( archivaConfig.getConfiguration() ).andReturn( config ).times( 1, 2 );
783 
784         archivaConfigControl.replay();
785 
786         SearchResults results = search.search( "user", searchFields, null );
787 
788         archivaConfigControl.verify();
789 
790         assertNotNull( results );
791         assertEquals( 0, results.getTotalHits() );
792     }
793 
794     @Test
795     public void testAdvancedSearchClassNameInWar()
796         throws Exception
797     {
798         createIndexContainingMoreArtifacts( true );
799 
800         List<String> selectedRepos = Arrays.asList( TEST_REPO_1 );
801 
802         SearchFields searchFields = new SearchFields();
803         searchFields.setClassName( "SomeClass" );
804         searchFields.setRepositories( selectedRepos );
805 
806         EasyMock.expect( archivaConfig.getConfiguration() ).andReturn( config ).times( 1, 2 );
807 
808         archivaConfigControl.replay();
809 
810         SearchResults results = search.search( "user", searchFields, null );
811 
812         archivaConfigControl.verify();
813 
814         assertNotNull( results );
815         assertEquals( 1, results.getHits().size() );
816         assertEquals( "test-webapp", results.getHits().get( 0 ).getArtifactId() );
817     }
818 
819     @Test
820     public void getAllGroupIds()
821         throws Exception
822     {
823         createIndexContainingMoreArtifacts( true );
824 
825         List<String> selectedRepos = Arrays.asList( TEST_REPO_1 );
826 
827         EasyMock.expect( archivaConfig.getConfiguration() ).andReturn( config ).times( 0, 2 );
828 
829         archivaConfigControl.replay();
830 
831         Collection<String> groupIds = search.getAllGroupIds( "user", selectedRepos );
832 
833         archivaConfigControl.verify();
834 
835         log.info( "groupIds: {}", groupIds );
836 
837         assertEquals( 3, groupIds.size() );
838         assertTrue( groupIds.contains( "com" ) );
839         assertTrue( groupIds.contains( "org.apache.felix" ) );
840         assertTrue( groupIds.contains( "org.apache.archiva" ) );
841     }
842 
843     @Test
844     public void testSearchWithUnknownRepo()
845         throws Exception
846     {
847         createIndexContainingMoreArtifacts( true );
848 
849         List<String> selectedRepos = Arrays.asList( "foo" );
850 
851         SearchFields searchFields = new SearchFields();
852         searchFields.setClassName( "SomeClass" );
853         searchFields.setRepositories( selectedRepos );
854 
855         EasyMock.expect( archivaConfig.getConfiguration() ).andReturn( config ).times( 1, 2 );
856 
857         archivaConfigControl.replay();
858 
859         SearchResults results = search.search( "user", searchFields, null );
860 
861         archivaConfigControl.verify();
862 
863         assertNotNull( results );
864         assertEquals( 0, results.getHits().size() );
865     }
866 
867     @Test
868     public void nolimitedResult()
869         throws Exception
870     {
871 
872         File repo = new File( "target/repo-release" );
873         File indexDirectory = new File( repo, ".index" );
874         FileUtils.copyDirectoryStructure( new File( "src/test/repo-release" ), repo );
875 
876         createIndex( "repo-release", Collections.<File>emptyList(), false );
877 
878         nexusIndexer.addIndexingContext( REPO_RELEASE, REPO_RELEASE, repo, indexDirectory,
879                                          repo.toURI().toURL().toExternalForm(),
880                                          indexDirectory.toURI().toURL().toString(), search.getAllIndexCreators() );
881 
882         SearchResultLimits limits = new SearchResultLimits( SearchResultLimits.ALL_PAGES );
883         limits.setPageSize( 300 );
884 
885         EasyMock.expect( archivaConfig.getConfiguration() ).andReturn( config ).times( 1, 5 );
886 
887         archivaConfigControl.replay();
888 
889         SearchResults searchResults = search.search( null, Arrays.asList( REPO_RELEASE ), "org.example", limits,
890                                                      Collections.<String>emptyList() );
891 
892         log.info( "results: {}", searchResults.getHits().size() );
893 
894         assertEquals( 255, searchResults.getHits().size() );
895 
896         SearchFields searchFields = new SearchFields();
897         searchFields.setGroupId( "org.example" );
898         searchFields.setRepositories( Arrays.asList( REPO_RELEASE ) );
899 
900         searchResults = search.search( null, searchFields, limits );
901 
902         log.info( "results: {}", searchResults.getHits().size() );
903 
904         assertEquals( 255, searchResults.getHits().size() );
905 
906         archivaConfigControl.verify();
907     }
908 }