]> source.dussan.org Git - archiva.git/blob
94967ed813fde499988bf47d02de0ddd937c67ff
[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 java.io.File;
23 import java.io.IOException;
24 import java.util.ArrayList;
25 import java.util.List;
26
27 import org.apache.commons.io.FileUtils;
28 import org.apache.maven.archiva.configuration.ArchivaConfiguration;
29 import org.apache.maven.archiva.configuration.Configuration;
30 import org.apache.maven.archiva.configuration.ManagedRepositoryConfiguration;
31 import org.apache.maven.archiva.indexer.search.SearchResultHit;
32 import org.apache.maven.archiva.indexer.search.SearchResultLimits;
33 import org.apache.maven.archiva.indexer.search.SearchResults;
34 import org.codehaus.plexus.spring.PlexusInSpringTestCase;
35 import org.easymock.MockControl;
36 import org.sonatype.nexus.index.ArtifactContext;
37 import org.sonatype.nexus.index.ArtifactContextProducer;
38 import org.sonatype.nexus.index.NexusIndexer;
39 import org.sonatype.nexus.index.context.IndexingContext;
40 import org.sonatype.nexus.index.context.UnsupportedExistingLuceneIndexException;
41 import org.sonatype.nexus.index.creator.IndexerEngine;
42
43 public class NexusRepositorySearchTest
44     extends PlexusInSpringTestCase
45 {
46     private RepositorySearch search;
47
48     private ArchivaConfiguration archivaConfig;
49
50     private NexusIndexer indexer;
51
52     private IndexingContext context;
53
54     private IndexerEngine indexerEngine;
55
56     private ArtifactContextProducer artifactContextProducer;
57
58     private MockControl archivaConfigControl;
59
60     private Configuration config;
61
62     private final static String TEST_REPO_1 = "nexus-search-test-repo";
63
64     private final static String TEST_REPO_2 = "nexus-search-test-repo-2";
65
66     @Override
67     protected void setUp()
68         throws Exception
69     {
70         super.setUp();
71
72         indexer = (NexusIndexer) lookup( NexusIndexer.class );
73
74         archivaConfigControl = MockControl.createControl( ArchivaConfiguration.class );
75
76         archivaConfig = (ArchivaConfiguration) archivaConfigControl.getMock();
77
78         search = new NexusRepositorySearch( indexer, archivaConfig );
79
80         indexerEngine = (IndexerEngine) lookup( IndexerEngine.class );
81
82         artifactContextProducer = (ArtifactContextProducer) lookup( ArtifactContextProducer.class );
83
84         config = new Configuration();
85         config.addManagedRepository( createRepositoryConfig( TEST_REPO_1 ) );
86
87         List<File> files = new ArrayList<File>();
88         files.add( new File( getBasedir(), "/target/test-classes/" + TEST_REPO_1 +
89             "/org/apache/archiva/archiva-search/1.0/archiva-search-1.0.jar" ) );
90         files.add( new File( getBasedir(), "/target/test-classes/" + TEST_REPO_1 +
91             "/org/apache/archiva/archiva-test/1.0/archiva-test-1.0.jar" ) );
92         files.add( new File( getBasedir(), "/target/test-classes/" + TEST_REPO_1 +
93             "/org/apache/archiva/archiva-test/2.0/archiva-test-2.0.jar" ) );
94
95         createIndex( TEST_REPO_1, files );
96     }
97
98     private ManagedRepositoryConfiguration createRepositoryConfig( String repository )
99     {
100         ManagedRepositoryConfiguration repositoryConfig = new ManagedRepositoryConfiguration();
101         repositoryConfig.setId( repository );
102         repositoryConfig.setLocation( getBasedir() + "/target/test-classes/" + repository );
103         repositoryConfig.setLayout( "default" );
104         repositoryConfig.setName( repository );
105         repositoryConfig.setScanned( true );
106         repositoryConfig.setSnapshots( false );
107         repositoryConfig.setReleases( true );
108
109         return repositoryConfig;
110     }
111
112     @Override
113     protected void tearDown()
114         throws Exception
115     {
116         FileUtils.deleteDirectory( new File( getBasedir(), "/target/test-classes/" + TEST_REPO_1 + "/.indexer" ) );
117         assertFalse( new File( getBasedir(), "/target/test-classes/" + TEST_REPO_1 + "/.indexer" ).exists() );
118
119         super.tearDown();
120     }
121
122     private void createIndex( String repository, List<File> filesToBeIndexed )
123         throws IOException, UnsupportedExistingLuceneIndexException
124     {
125         context =
126             indexer.addIndexingContext( repository, repository, new File( getBasedir(), "/target/test-classes/" +
127                 repository ), new File( getBasedir(), "/target/test-classes/" + repository + "/.indexer" ), null, null,
128                                         NexusIndexer.FULL_INDEX );
129         context.setSearchable( true );
130
131         indexerEngine.beginIndexing( context );
132
133         for ( File artifactFile : filesToBeIndexed )
134         {
135             ArtifactContext ac = artifactContextProducer.getArtifactContext( context, artifactFile );
136             indexerEngine.index( context, ac );
137         }
138
139         indexerEngine.endIndexing( context );
140         indexer.removeIndexingContext( context, false );
141         
142         assertTrue( new File( getBasedir(), "/target/test-classes/" + repository + "/.indexer" ).exists() );
143     }
144
145     public void testQuickSearch()
146         throws Exception
147     {   
148         List<String> selectedRepos = new ArrayList<String>();
149         selectedRepos.add( TEST_REPO_1 );
150
151         // search artifactId
152         archivaConfigControl.expectAndReturn( archivaConfig.getConfiguration(), config );
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         assertEquals( 1, results.getTotalHits() );
162
163         SearchResultHit hit = results.getHits().get( 0 );
164         assertEquals( "org.apache.archiva", hit.getGroupId() );
165         assertEquals( "archiva-search", hit.getArtifactId() );
166         assertEquals( "1.0", hit.getVersions().get( 0 ) );
167         
168         archivaConfigControl.reset();
169
170         // search groupId
171         archivaConfigControl.expectAndReturn( archivaConfig.getConfiguration(), config );
172
173         archivaConfigControl.replay();
174
175         results = search.search( "user", selectedRepos, "org.apache.archiva", null, null );
176
177         archivaConfigControl.verify();
178
179         assertNotNull( results );
180         assertEquals( 2, results.getTotalHits() );
181
182         //TODO: search for class & package names
183     }
184
185     public void testQuickSearchWithPagination()
186         throws Exception
187     {   
188         List<String> selectedRepos = new ArrayList<String>();
189         selectedRepos.add( TEST_REPO_1 );
190
191         // page 1
192         SearchResultLimits limits = new SearchResultLimits( 0 );
193         limits.setPageSize( 1 );
194
195         archivaConfigControl.expectAndReturn( archivaConfig.getConfiguration(), config );
196
197         archivaConfigControl.replay();
198
199         SearchResults results = search.search( "user", selectedRepos, "org", limits, null );
200
201         archivaConfigControl.verify();
202
203         assertNotNull( results );
204         assertEquals( 1, results.getHits().size() );
205         assertEquals( 2, results.getTotalHits() );
206
207         archivaConfigControl.reset();
208
209         // page 2
210         limits = new SearchResultLimits( 1 );
211         limits.setPageSize( 1 );
212
213         archivaConfigControl.expectAndReturn( archivaConfig.getConfiguration(), config );
214
215         archivaConfigControl.replay();
216
217         results = search.search( "user", selectedRepos, "org", limits, null );
218
219         archivaConfigControl.verify();
220
221         assertNotNull( results );
222         assertEquals( 1, results.getHits().size() );
223         assertEquals( 2, results.getTotalHits() );
224     }
225
226     public void testArtifactFoundInMultipleRepositories()
227         throws Exception
228     {
229         List<File> files = new ArrayList<File>();
230         files.add( new File( getBasedir(), "/target/test-classes/" + TEST_REPO_2 +
231             "/org/apache/archiva/archiva-search/1.0/archiva-search-1.0.jar" ) );
232         files.add( new File( getBasedir(), "/target/test-classes/" + TEST_REPO_2 +
233             "/org/apache/archiva/archiva-search/1.1/archiva-search-1.1.jar" ) );
234         createIndex( TEST_REPO_2, files );
235
236         List<String> selectedRepos = new ArrayList<String>();
237         selectedRepos.add( TEST_REPO_1 );
238         selectedRepos.add( TEST_REPO_2 );
239
240         config.addManagedRepository( createRepositoryConfig( TEST_REPO_2 ) );
241
242         archivaConfigControl.expectAndReturn( archivaConfig.getConfiguration(), config, 2 );
243
244         archivaConfigControl.replay();
245
246         SearchResults results = search.search( "user", selectedRepos, "archiva-search", null, null );
247
248         archivaConfigControl.verify();
249
250         assertNotNull( results );
251         assertEquals( 1, results.getTotalHits() );
252
253         SearchResultHit hit = results.getHits().get( 0 );
254         assertEquals( "org.apache.archiva", hit.getGroupId() );
255         assertEquals( "archiva-search", hit.getArtifactId() );
256         assertEquals( 2, hit.getVersions().size() );
257         assertTrue( hit.getVersions().contains( "1.0" ) );
258         assertTrue( hit.getVersions().contains( "1.1" ) );
259
260         archivaConfigControl.reset();
261
262         FileUtils.deleteDirectory( new File( getBasedir(), "/target/test-classes/" + TEST_REPO_2 + "/.indexer" ) );
263         assertFalse( new File( getBasedir(), "/target/test-classes/" + TEST_REPO_2 + "/.indexer" ).exists() );
264
265         // TODO: [BROWSE] in artifact info from browse, display all the repositories where the artifact is found
266     }
267
268     public void testNoMatchFound()
269         throws Exception
270     {
271         List<String> selectedRepos = new ArrayList<String>();
272         selectedRepos.add( TEST_REPO_1 );
273         
274         archivaConfigControl.expectAndReturn( archivaConfig.getConfiguration(), config );
275
276         archivaConfigControl.replay();
277
278         SearchResults results = search.search( "user", selectedRepos, "dfghdfkweriuasndsaie", null, null );
279
280         archivaConfigControl.verify();
281
282         assertNotNull( results );
283         assertEquals( 0, results.getTotalHits() );
284     }
285
286     public void testNoIndexFound()
287         throws Exception
288     {
289         List<String> selectedRepos = new ArrayList<String>();
290         selectedRepos.add( "non-existing-repo" );
291         
292         archivaConfigControl.expectAndReturn( archivaConfig.getConfiguration(), config );
293
294         archivaConfigControl.replay();
295
296         SearchResults results = search.search( "user", selectedRepos, "org.apache.archiva", null, null );
297         assertNotNull( results );
298         assertEquals( 0, results.getTotalHits() );
299         
300         archivaConfigControl.verify();            
301     }
302
303     public void testSearchWithinSearchResults()
304         throws Exception
305     {
306         List<String> selectedRepos = new ArrayList<String>();
307         selectedRepos.add( TEST_REPO_1 );
308         
309         List<String> previousSearchTerms = new ArrayList<String>();
310         previousSearchTerms.add( "archiva-test" );
311         
312         archivaConfigControl.expectAndReturn( archivaConfig.getConfiguration(), config );
313
314         archivaConfigControl.replay();
315
316         SearchResults results = search.search( "user", selectedRepos, "1.0", null, previousSearchTerms );
317
318         archivaConfigControl.verify();
319
320         assertNotNull( results );
321         assertEquals( 1, results.getTotalHits() );
322         
323         SearchResultHit hit = results.getHits().get( 0 );
324         assertEquals( "org.apache.archiva", hit.getGroupId() );
325         assertEquals( "archiva-test", hit.getArtifactId() );
326         assertEquals( 1, hit.getVersions().size() );
327         assertEquals( "1.0", hit.getVersions().get( 0 ) );
328     }
329
330     public void testAdvancedSearch()
331         throws Exception
332     {
333         List<File> files = new ArrayList<File>();
334         files.add( new File( getBasedir(), "/target/test-classes/" + TEST_REPO_2 +
335             "/org/apache/archiva/archiva-search/1.0/archiva-search-1.0.jar" ) );
336         files.add( new File( getBasedir(), "/target/test-classes/" + TEST_REPO_2 +
337             "/org/apache/archiva/archiva-search/1.1/archiva-search-1.1.jar" ) );
338         createIndex( TEST_REPO_2, files );
339
340         List<String> selectedRepos = new ArrayList<String>();
341         selectedRepos.add( TEST_REPO_1 );
342         selectedRepos.add( TEST_REPO_2 );
343
344         config.addManagedRepository( createRepositoryConfig( TEST_REPO_2 ) );
345         
346         SearchFields searchFields = new SearchFields();
347         searchFields.setGroupId( "org.apache.archiva" );
348         searchFields.setVersion( "1.0" );
349         searchFields.setRepositories( selectedRepos );        
350         
351         archivaConfigControl.expectAndReturn( archivaConfig.getConfiguration(), config, 2 );
352
353         archivaConfigControl.replay();
354
355         SearchResults results = search.search( "user", searchFields, null );
356
357         archivaConfigControl.verify();
358
359         assertNotNull( results );
360         assertEquals( 2, results.getTotalHits() );
361         
362         FileUtils.deleteDirectory( new File( getBasedir(), "/target/test-classes/" + TEST_REPO_2 + "/.indexer" ) );
363         assertFalse( new File( getBasedir(), "/target/test-classes/" + TEST_REPO_2 + "/.indexer" ).exists() );
364     }
365     
366     public void testAdvancedSearchWithPagination()
367         throws Exception
368     {
369         List<File> files = new ArrayList<File>();
370         files.add( new File( getBasedir(), "/target/test-classes/" + TEST_REPO_2 +
371             "/org/apache/archiva/archiva-search/1.0/archiva-search-1.0.jar" ) );
372         files.add( new File( getBasedir(), "/target/test-classes/" + TEST_REPO_2 +
373             "/org/apache/archiva/archiva-search/1.1/archiva-search-1.1.jar" ) );
374         createIndex( TEST_REPO_2, files );
375
376         List<String> selectedRepos = new ArrayList<String>();
377         selectedRepos.add( TEST_REPO_1 );
378         selectedRepos.add( TEST_REPO_2 );
379
380         config.addManagedRepository( createRepositoryConfig( TEST_REPO_2 ) );
381         
382         SearchFields searchFields = new SearchFields();
383         searchFields.setGroupId( "org.apache.archiva" );
384         searchFields.setVersion( "1.0" );
385         searchFields.setRepositories( selectedRepos );        
386         
387         // page 1
388         
389         SearchResultLimits limits = new SearchResultLimits( 0 );
390         limits.setPageSize( 1 );
391         
392         archivaConfigControl.expectAndReturn( archivaConfig.getConfiguration(), config, 2 );
393
394         archivaConfigControl.replay();
395
396         SearchResults results = search.search( "user", searchFields, limits );
397
398         archivaConfigControl.verify();
399
400         assertNotNull( results );
401         assertEquals( 2, results.getTotalHits() );
402         assertEquals( 1, results.getHits().size() );
403         
404         // page 2
405         archivaConfigControl.reset();
406         
407         limits = new SearchResultLimits( 1 );
408         limits.setPageSize( 1 );
409         
410         archivaConfigControl.expectAndReturn( archivaConfig.getConfiguration(), config, 2 );
411
412         archivaConfigControl.replay();
413
414         results = search.search( "user", searchFields, limits );
415
416         archivaConfigControl.verify();
417
418         assertNotNull( results );
419         assertEquals( 2, results.getTotalHits() );
420         assertEquals( 1, results.getHits().size() );
421         
422         FileUtils.deleteDirectory( new File( getBasedir(), "/target/test-classes/" + TEST_REPO_2 + "/.indexer" ) );
423         assertFalse( new File( getBasedir(), "/target/test-classes/" + TEST_REPO_2 + "/.indexer" ).exists() );
424     }
425
426 }