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