1 package org.apache.maven.archiva.indexer.search;
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
12 * http://www.apache.org/licenses/LICENSE-2.0
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
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;
38 import java.util.ArrayList;
39 import java.util.Arrays;
40 import java.util.List;
44 * DefaultCrossRepositorySearchTest
46 * @author <a href="mailto:joakime@apache.org">Joakim Erdfelt</a>
49 public class DefaultCrossRepositorySearchTest
50 extends PlexusInSpringTestCase
52 private static final String TEST_DEFAULT_REPOSITORY_NAME = "Test Default Repository";
54 private static final String TEST_DEFAULT_REPO_ID = "testDefaultRepo";
57 protected void setUp()
62 RepositoryContentIndexFactory indexFactory =
63 (RepositoryContentIndexFactory) lookup( RepositoryContentIndexFactory.class
64 .getName(), "lucene" );
66 File repoDir = new File( getBasedir(), "src/test/managed-repository" );
68 assertTrue( "Default Test Repository should exist.", repoDir.exists() && repoDir.isDirectory() );
70 ManagedRepositoryConfiguration repository = createRepository( TEST_DEFAULT_REPO_ID, TEST_DEFAULT_REPOSITORY_NAME, repoDir );
72 File indexLocation = new File( "target/index-crossrepo-" + getName() + "/" );
74 MockConfiguration config = (MockConfiguration) lookup( ArchivaConfiguration.class.getName(), "mock" );
76 ManagedRepositoryConfiguration repoConfig = new ManagedRepositoryConfiguration();
77 repoConfig.setId( TEST_DEFAULT_REPO_ID );
78 repoConfig.setName( TEST_DEFAULT_REPOSITORY_NAME );
79 repoConfig.setLocation( repoDir.getAbsolutePath() );
80 repoConfig.setIndexDir( indexLocation.getAbsolutePath() );
81 repoConfig.setScanned( true );
83 if ( indexLocation.exists() )
85 FileUtils.deleteDirectory( indexLocation );
88 config.getConfiguration().addManagedRepository( repoConfig );
90 // Create the (empty) indexes.
91 RepositoryContentIndex indexHashcode = indexFactory.createHashcodeIndex( repository );
92 RepositoryContentIndex indexBytecode = indexFactory.createBytecodeIndex( repository );
93 RepositoryContentIndex indexContents = indexFactory.createFileContentIndex( repository );
96 Map<String, HashcodesRecord> hashcodesMap = new HashcodesIndexPopulator().populate( new File( getBasedir() ) );
97 indexHashcode.indexRecords( hashcodesMap.values() );
98 assertEquals( "Hashcode Key Count", hashcodesMap.size(), indexHashcode.getAllRecordKeys().size() );
99 assertRecordCount( indexHashcode, hashcodesMap.size() );
101 Map<String, BytecodeRecord> bytecodeMap = new BytecodeIndexPopulator().populate( new File( getBasedir() ) );
102 indexBytecode.indexRecords( bytecodeMap.values() );
103 assertEquals( "Bytecode Key Count", bytecodeMap.size(), indexBytecode.getAllRecordKeys().size() );
104 assertRecordCount( indexBytecode, bytecodeMap.size() );
106 Map<String, FileContentRecord> contentMap = new FileContentIndexPopulator().populate( new File( getBasedir() ) );
107 indexContents.indexRecords( contentMap.values() );
108 assertEquals( "File Content Key Count", contentMap.size(), indexContents.getAllRecordKeys().size() );
109 assertRecordCount( indexContents, contentMap.size() );
112 private void assertRecordCount( RepositoryContentIndex index, int expectedCount )
115 Query query = new MatchAllDocsQuery();
116 Searcher searcher = (Searcher) index.getSearchable();
117 Hits hits = searcher.search( query );
118 assertEquals( "Expected Record Count for " + index.getId(), expectedCount, hits.length() );
121 private CrossRepositorySearch lookupCrossRepositorySearch()
124 CrossRepositorySearch search =
125 (CrossRepositorySearch) lookup( CrossRepositorySearch.class.getName(), "default" );
126 assertNotNull( "CrossRepositorySearch:default should not be null.", search );
130 public void testSearchTerm_Org()
133 CrossRepositorySearch search = lookupCrossRepositorySearch();
135 String expectedRepos[] = new String[] {
139 String expectedResults[] = new String[] {
140 "org","org2","org3","org4","org5","org6","org7"
143 assertSearchResults( expectedRepos, expectedResults, search, "org", null, false );
146 public void testSearchTerm_Junit()
149 CrossRepositorySearch search = lookupCrossRepositorySearch();
151 String expectedRepos[] = new String[] {
155 String expectedResults[] = new String[] {
156 "junit","junit2","junit3"
159 assertSearchResults( expectedRepos, expectedResults, search, "junit", null, false );
162 public void testSearchInvalidTerm()
165 CrossRepositorySearch search = lookupCrossRepositorySearch();
167 String expectedRepos[] = new String[] {
171 String expectedResults[] = new String[] {
175 assertSearchResults( expectedRepos, expectedResults, search, "monosodium", null, false );
178 public void testSearchWithinSearchResults()
181 CrossRepositorySearch search = lookupCrossRepositorySearch();
183 String expectedRepos[] = new String[] {
187 String expectedResults[] = new String[] {
188 "org","org2","org3","org4","org5","org6","org7"
192 assertSearchResults( expectedRepos, expectedResults, search, "org", null, false );
194 List<String> previousSearchTerms = new ArrayList<String>();
195 previousSearchTerms.add( "org" );
196 String secondSearchExpectedResults[] = new String[] {
197 "org.apache.maven.archiva.record", "org.apache.maven.archiva.record2",
198 "org.apache.maven.archiva.record3", "org.apache.maven.archiva.record4",
199 "org.apache.maven.archiva.record5", "org.apache.maven.archiva.record6",
200 "org.apache.maven.archiva.record7"
204 assertSearchResults( expectedRepos, secondSearchExpectedResults, search, "org.apache.maven.archiva.record",
205 previousSearchTerms, false );
207 previousSearchTerms.add( "org.apache.maven.archiva.record" );
208 String thirdSearchExpectedResults[] = new String[] {
209 "junit", "junit2", "junit3"
213 assertSearchResults( expectedRepos, thirdSearchExpectedResults, search, "junit", previousSearchTerms, false );
216 public void testSearchForClassesAndPackages()
219 CrossRepositorySearch search = lookupCrossRepositorySearch();
221 String expectedRepos[] = new String[] {
225 String expectedResults[] = new String[] {
226 "archiva-common-1.0.jar"
229 // class with packagename search
230 assertSearchResults( expectedRepos, expectedResults, search,
231 "org.apache.maven.archiva.common.utils.BaseFile", null, true );
233 assertSearchResults( expectedRepos, expectedResults, search,
234 "BaseFile", null, true );
236 String expectedMethodSearchResults[] = new String[] {
237 "continuum-webapp-1.0.3-SNAPSHOT.war"
241 assertSearchResults( expectedRepos, expectedMethodSearchResults, search,
242 "org.apache.maven.continuum.web.action.BuildDefinitionAction.isBuildFresh", null, true );
245 public void testExecuteFilteredSearch()
248 CrossRepositorySearch search = lookupCrossRepositorySearch();
250 String expectedRepos[] = new String[] { TEST_DEFAULT_REPO_ID };
252 String expectedResults[] = new String[] { "org1", "org2", "org3", "org4", "org5", "org6", "org7", "org8" };
254 String secondExpectedResults[] = new String[] { "continuum-webapp" };
256 String thirdExpectedResults[] = new String[] { "archiva-common" };
258 // search for groupId
259 assertFilteredSearchResults( expectedRepos, expectedResults, search, "org", null, null, null, 30 );
261 // search for groupId and artifactId
262 assertFilteredSearchResults( expectedRepos, secondExpectedResults, search, "org.apache.maven",
263 "continuum-webapp", null, null, 30 );
265 // search for groupId , artifactId and version
266 assertFilteredSearchResults( expectedRepos, thirdExpectedResults, search, "org.apache.maven.archiva",
267 "archiva-common", "1.0", null, 30 );
270 private void assertFilteredSearchResults ( String expectedRepos[], String expectedResults[], CrossRepositorySearch search,
271 String groupId, String artifactId, String version, String className , int rowCount )
273 SearchResultLimits limits = new SearchResultLimits( 0 );
274 limits.setPageSize( rowCount );
276 List<String> selectedRepos = new ArrayList<String>();
277 selectedRepos.addAll( Arrays.asList( expectedRepos ) );
279 SearchResults results = null;
281 results = search.executeFilteredSearch( "guest" , selectedRepos, groupId, artifactId, version, className, limits );
283 assertNotNull( "Search Results should not be null.", results );
284 assertEquals( "Repository Hits", expectedRepos.length, results.getRepositories().size() );
285 assertEquals( expectedRepos.length, 1);
286 assertEquals( TEST_DEFAULT_REPO_ID , selectedRepos.get( 0 ) );
287 assertEquals( "Search Result Hits", expectedResults.length, results.getHits().size() );
290 private void assertSearchResults( String expectedRepos[], String expectedResults[], CrossRepositorySearch search,
291 String term, List<String> previousSearchTerms, boolean bytecode )
294 SearchResultLimits limits = new SearchResultLimits( 0 );
295 limits.setPageSize( 20 );
297 List<String> selectedRepos = new ArrayList<String>();
298 selectedRepos.addAll( Arrays.asList( expectedRepos ) );
300 SearchResults results = null;
302 if( previousSearchTerms == null )
306 results = search.searchForBytecode( "guest", selectedRepos, term, limits );
310 results = search.searchForTerm( "guest", selectedRepos, term, limits );
315 results = search.searchForTerm( "guest", selectedRepos, term, limits, previousSearchTerms );
319 assertNotNull( "Search Results should not be null.", results );
320 assertEquals( "Repository Hits", expectedRepos.length, results.getRepositories().size() );
322 // TODO: test the repository ids returned.
324 assertEquals( "Search Result Hits", expectedResults.length, results.getHits().size() );
325 // TODO: test the order of hits.
326 // TODO: test the value of the hits.
329 protected ManagedRepositoryConfiguration createRepository( String id, String name, File location )
331 ManagedRepositoryConfiguration repo = new ManagedRepositoryConfiguration();
333 repo.setName( name );
334 repo.setLocation( location.getAbsolutePath() );