]> source.dussan.org Git - archiva.git/blob
3b411d15ecc92879bcaf97ce84b9525a7f3c958d
[archiva.git] /
1 package org.apache.maven.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.commons.io.FileUtils;
23 import org.apache.lucene.search.Hits;
24 import org.apache.lucene.search.MatchAllDocsQuery;
25 import org.apache.lucene.search.Query;
26 import org.apache.lucene.search.Searcher;
27 import org.apache.maven.archiva.configuration.ArchivaConfiguration;
28 import org.apache.maven.archiva.configuration.ManagedRepositoryConfiguration;
29 import org.apache.maven.archiva.indexer.MockConfiguration;
30 import org.apache.maven.archiva.indexer.RepositoryContentIndex;
31 import org.apache.maven.archiva.indexer.RepositoryContentIndexFactory;
32 import org.apache.maven.archiva.indexer.bytecode.BytecodeRecord;
33 import org.apache.maven.archiva.indexer.filecontent.FileContentRecord;
34 import org.apache.maven.archiva.indexer.hashcodes.HashcodesRecord;
35 import org.codehaus.plexus.spring.PlexusInSpringTestCase;
36
37 import java.io.File;
38 import java.util.ArrayList;
39 import java.util.Arrays;
40 import java.util.List;
41 import java.util.Map;
42
43 /**
44  * DefaultCrossRepositorySearchTest
45  *
46  * @version $Id$
47  */
48 public class DefaultCrossRepositorySearchTest    
49     extends PlexusInSpringTestCase
50 {
51     private static final String TEST_DEFAULT_REPOSITORY_NAME = "Test Default Repository";
52
53     private static final String TEST_DEFAULT_REPO_ID = "testDefaultRepo";
54
55     @Override
56     protected void setUp()
57         throws Exception
58     {
59         super.setUp();
60
61         RepositoryContentIndexFactory indexFactory =
62             (RepositoryContentIndexFactory) lookup( RepositoryContentIndexFactory.class
63                .getName(), "lucene" );
64
65         File repoDir = new File( getBasedir(), "src/test/managed-repository" );
66
67         assertTrue( "Default Test Repository should exist.", repoDir.exists() && repoDir.isDirectory() );
68
69         ManagedRepositoryConfiguration repository = createRepository( TEST_DEFAULT_REPO_ID, TEST_DEFAULT_REPOSITORY_NAME, repoDir );
70
71         File indexLocation = new File( "target/index-crossrepo-" + getName() + "/" );
72
73         MockConfiguration config = (MockConfiguration) lookup( ArchivaConfiguration.class.getName(), "mock" );
74
75         ManagedRepositoryConfiguration repoConfig = new ManagedRepositoryConfiguration();
76         repoConfig.setId( TEST_DEFAULT_REPO_ID );
77         repoConfig.setName( TEST_DEFAULT_REPOSITORY_NAME );
78         repoConfig.setLocation( repoDir.getAbsolutePath() );
79         repoConfig.setIndexDir( indexLocation.getAbsolutePath() );
80         repoConfig.setScanned( true );
81
82         if ( indexLocation.exists() )
83         {
84             FileUtils.deleteDirectory( indexLocation );
85         }
86
87         config.getConfiguration().addManagedRepository( repoConfig );
88
89         // Create the (empty) indexes.
90         RepositoryContentIndex indexHashcode = indexFactory.createHashcodeIndex( repository );
91         RepositoryContentIndex indexBytecode = indexFactory.createBytecodeIndex( repository );
92         RepositoryContentIndex indexContents = indexFactory.createFileContentIndex( repository );
93
94         // Now populate them.
95         Map<String, HashcodesRecord> hashcodesMap = new HashcodesIndexPopulator().populate( new File( getBasedir() ) );
96         indexHashcode.indexRecords( hashcodesMap.values() );
97         assertEquals( "Hashcode Key Count", hashcodesMap.size(), indexHashcode.getAllRecordKeys().size() );
98         assertRecordCount( indexHashcode, hashcodesMap.size() );
99
100         Map<String, BytecodeRecord> bytecodeMap = new BytecodeIndexPopulator().populate( new File( getBasedir() ) );
101         indexBytecode.indexRecords( bytecodeMap.values() );
102         assertEquals( "Bytecode Key Count", bytecodeMap.size(), indexBytecode.getAllRecordKeys().size() );
103         assertRecordCount( indexBytecode, bytecodeMap.size() );
104
105         Map<String, FileContentRecord> contentMap = new FileContentIndexPopulator().populate( new File( getBasedir() ) );
106         indexContents.indexRecords( contentMap.values() );
107         assertEquals( "File Content Key Count", contentMap.size(), indexContents.getAllRecordKeys().size() );
108         assertRecordCount( indexContents, contentMap.size() );
109     }
110
111     private void assertRecordCount( RepositoryContentIndex index, int expectedCount )
112         throws Exception
113     {
114         Query query = new MatchAllDocsQuery();
115         Searcher searcher = (Searcher) index.getSearchable();
116         Hits hits = searcher.search( query );
117         assertEquals( "Expected Record Count for " + index.getId(), expectedCount, hits.length() );
118     }
119
120     private CrossRepositorySearch lookupCrossRepositorySearch()
121         throws Exception
122     {
123         CrossRepositorySearch search =
124             (CrossRepositorySearch) lookup( CrossRepositorySearch.class.getName(), "default" );
125         assertNotNull( "CrossRepositorySearch:default should not be null.", search );
126         return search;
127     }
128
129     public void testSearchTerm_Org()
130         throws Exception
131     {        
132         CrossRepositorySearch search = lookupCrossRepositorySearch();
133
134         String expectedRepos[] = new String[] {
135             TEST_DEFAULT_REPO_ID
136         };
137         
138         String expectedResults[] = new String[] { 
139             "org","org2","org3","org4","org5","org6","org7"
140         };
141         
142         assertSearchResults( expectedRepos, expectedResults, search, "org", null, false );
143     }
144
145     public void testSearchInvalidTerm()
146         throws Exception
147     {        
148         CrossRepositorySearch search = lookupCrossRepositorySearch();
149
150         String expectedRepos[] = new String[] {
151             TEST_DEFAULT_REPO_ID
152         };
153         
154         String expectedResults[] = new String[] { 
155             // Nothing.
156         };
157         
158         assertSearchResults( expectedRepos, expectedResults, search, "monosodium", null, false );
159     }
160     
161     public void testSearchForClassesAndPackages()
162         throws Exception
163     {                
164         CrossRepositorySearch search = lookupCrossRepositorySearch();
165
166         String expectedRepos[] = new String[] {
167             TEST_DEFAULT_REPO_ID
168         };
169                 
170         String expectedResults[] = new String[] { 
171             "archiva-common-1.0.jar"
172         };
173         
174         // class with packagename search
175         assertSearchResults( expectedRepos, expectedResults, search, 
176                              "org.apache.maven.archiva.common.utils.BaseFile", null, true );
177         // class name search
178         assertSearchResults( expectedRepos, expectedResults, search, 
179                              "BaseFile", null, true );
180                 
181         String expectedMethodSearchResults[] = new String[] { 
182             "continuum-webapp-1.0.3-SNAPSHOT.war"
183         };
184         
185         // method search
186         assertSearchResults( expectedRepos, expectedMethodSearchResults, search,
187                              "org.apache.maven.continuum.web.action.BuildDefinitionAction.isBuildFresh", null, true );        
188     }
189     
190     public void testExecuteFilteredSearch()
191         throws Exception
192     {
193         CrossRepositorySearch search = lookupCrossRepositorySearch();
194
195         String expectedRepos[] = new String[] { TEST_DEFAULT_REPO_ID };
196
197         String expectedResults[] = new String[] { "org1", "org2", "org3", "org4", "org5", "org6", "org7", "org8" };
198
199         String secondExpectedResults[] = new String[] { "continuum-webapp" };
200
201         String thirdExpectedResults[] = new String[] { "archiva-common" };
202
203         // search for groupId
204         assertFilteredSearchResults( expectedRepos, expectedResults, search, "org", null, null, null, 30 );
205
206         // search for groupId and artifactId
207         assertFilteredSearchResults( expectedRepos, secondExpectedResults, search, "org.apache.maven",
208                                      "continuum-webapp", null, null, 30 );
209
210         // search for groupId , artifactId and version
211         assertFilteredSearchResults( expectedRepos, thirdExpectedResults, search, "org.apache.maven.archiva",
212                                      "archiva-common", "1.0", null, 30 );
213     }
214     
215     // MRM-981 - artifactIds with numeric characters aren't found in advanced search
216     public void testFilteredSearchArtifactIdHasNumericChar()
217         throws Exception
218     {
219         CrossRepositorySearch search = lookupCrossRepositorySearch();
220
221         String expectedRepos[] = new String[] { TEST_DEFAULT_REPO_ID };
222
223         String expectedResults[] = new String[] { "a-common5" };
224         
225         assertFilteredSearchResults( expectedRepos, expectedResults, search, null, "a-common5", null, null, 30 );
226         
227         assertFilteredSearchResults( expectedRepos, expectedResults, search, "a", "a-common5", null, null, 30 );
228         
229         assertFilteredSearchResults( expectedRepos, expectedResults, search, "a", "a-common5", "1.0", null, 30 );
230         
231         assertFilteredSearchResults( expectedRepos, expectedResults, search, "a", "a-common5", "1.0", "ACommonTestFile", 30 );
232                 
233         assertFilteredSearchResults( expectedRepos, expectedResults, search, "a", "a-common5", "1.0", "a.common5.package.", 30 );
234         
235         String noHitsExpectedResults[] = new String[] {};
236         
237         assertFilteredSearchResults( expectedRepos, noHitsExpectedResults, search, "org.apache.maven.archiva",
238                                      "a-common5", null, null, 30 );
239     }
240     
241     private void assertFilteredSearchResults ( String expectedRepos[], String expectedResults[], CrossRepositorySearch search, 
242                                                String groupId, String artifactId, String version, String className , int rowCount )
243     {
244         SearchResultLimits limits = new SearchResultLimits( 0 );
245         limits.setPageSize(  rowCount );
246         
247         List<String> selectedRepos = new ArrayList<String>();
248         selectedRepos.addAll( Arrays.asList( expectedRepos ) );
249         
250         SearchResults results = null;
251         
252         results = search.executeFilteredSearch( "guest" , selectedRepos, groupId, artifactId, version, className, limits );
253         
254         assertNotNull( "Search Results should not be null.", results );
255         assertEquals( "Repository Hits", expectedRepos.length, results.getRepositories().size() );
256         assertEquals( expectedRepos.length, 1);
257         assertEquals( TEST_DEFAULT_REPO_ID , selectedRepos.get( 0 ) );
258         assertEquals( "Search Result Hits", expectedResults.length, results.getHits().size() );
259     }
260     
261     private void assertSearchResults( String expectedRepos[], String expectedResults[], CrossRepositorySearch search,
262                                       String term, List<String> previousSearchTerms, boolean bytecode )
263         throws Exception
264     {
265         SearchResultLimits limits = new SearchResultLimits( 0 );
266         limits.setPageSize( 20 );
267         
268         List<String> selectedRepos = new ArrayList<String>();
269         selectedRepos.addAll( Arrays.asList( expectedRepos ) );
270        
271         SearchResults results = null;
272
273         if( previousSearchTerms == null )
274             {
275                 if( bytecode )
276             {
277                 results = search.searchForBytecode( "guest", selectedRepos, term, limits );
278             }
279             else
280             {
281                 results = search.searchForTerm( "guest", selectedRepos, term, limits );
282             }
283         }
284         else
285         {
286             results = search.searchForTerm( "guest", selectedRepos, term, limits, previousSearchTerms );
287         }
288
289         
290         assertNotNull( "Search Results should not be null.", results );
291         assertEquals( "Repository Hits", expectedRepos.length, results.getRepositories().size() );
292         
293         // TODO: test the repository ids returned.
294
295         assertEquals( "Search Result Hits", expectedResults.length, results.getHits().size() );
296         // TODO: test the order of hits.
297         // TODO: test the value of the hits.
298     }
299     
300     protected ManagedRepositoryConfiguration createRepository( String id, String name, File location )
301     {
302         ManagedRepositoryConfiguration repo = new ManagedRepositoryConfiguration();
303         repo.setId( id );
304         repo.setName( name );
305         repo.setLocation( location.getAbsolutePath() );
306         return repo;
307     }
308 }