blob: 7e2751e5fba78669ea816387e41a9133e482eebe [file] [log] [blame]
package org.apache.maven.index;
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import java.io.File;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.MultiFields;
import org.apache.lucene.search.Query;
import org.apache.lucene.util.Bits;
import org.apache.maven.index.search.grouping.GAGrouping;
public abstract class AbstractRepoNexusIndexerTest
extends AbstractNexusIndexerTest
{
protected File repo = new File( getBasedir(), "src/test/repo" );
public void testRootGroups()
throws Exception
{
Set<String> rootGroups = context.getRootGroups();
assertEquals( rootGroups.toString(), 12, rootGroups.size() );
assertGroup( 1, "com.adobe", context );
assertGroup( 1, "com.adobe.flexunit", context );
assertGroup( 2, "qdox", context );
assertGroup( 1, "proptest", context );
assertGroup( 3, "junit", context );
assertGroup( 13, "commons-logging", context );
assertGroup( 1, "regexp", context );
assertGroup( 2, "commons-cli", context );
assertGroup( 22, "org", context );
assertGroup( 10, "org.slf4j", context );
assertGroup( 4, "org.testng", context );
assertGroup( 5, "org.apache", context );
assertGroup( 1, "org.apache.directory", context );
assertGroup( 1, "org.apache.directory.server", context );
assertGroup( 3, "org.apache.maven", context );
assertGroup( 3, "org.apache.maven.plugins", context );
assertGroup( 0, "org.apache.maven.plugins.maven-core-it-plugin", context );
}
public void testSearchFlatPaged()
throws Exception
{
FlatSearchRequest request =
new FlatSearchRequest( nexusIndexer.constructQuery( MAVEN.GROUP_ID, "org", SearchType.SCORED ) );
// See MINDEXER-22
// Flat search is not pageable
// request.setStart( 0 );
request.setCount( 50 );
FlatSearchResponse response = nexusIndexer.searchFlat( request );
assertEquals( response.getResults().toString(), 22, response.getTotalHits() );
}
public void testSearchFlat()
throws Exception
{
Query q = nexusIndexer.constructQuery( MAVEN.GROUP_ID, "qdox", SearchType.SCORED );
FlatSearchResponse response = nexusIndexer.searchFlat( new FlatSearchRequest( q ) );
Collection<ArtifactInfo> r = response.getResults();
assertEquals( 2, r.size() );
List<ArtifactInfo> list = new ArrayList<ArtifactInfo>( r );
assertEquals( 2, list.size() );
{
ArtifactInfo ai = list.get( 0 );
assertEquals( "1.6.1", ai.getVersion() );
}
{
ArtifactInfo ai = list.get( 1 );
assertEquals( "1.5", ai.getVersion() );
assertEquals( "test", ai.getRepository() );
}
}
public void testSearchGrouped()
throws Exception
{
// ----------------------------------------------------------------------------
//
// ----------------------------------------------------------------------------
Query q = nexusIndexer.constructQuery( MAVEN.GROUP_ID, "qdox", SearchType.SCORED );
GroupedSearchResponse response = nexusIndexer.searchGrouped( new GroupedSearchRequest( q, new GAGrouping() ) );
Map<String, ArtifactInfoGroup> r = response.getResults();
assertEquals( 1, r.size() );
ArtifactInfoGroup ig = r.values().iterator().next();
assertEquals( "qdox : qdox", ig.getGroupKey() );
assertEquals( 2, ig.getArtifactInfos().size() );
List<ArtifactInfo> list = new ArrayList<ArtifactInfo>( ig.getArtifactInfos() );
assertEquals( 2, list.size() );
ArtifactInfo ai = list.get( 0 );
assertEquals( "1.6.1", ai.getVersion() );
ai = list.get( 1 );
assertEquals( "1.5", ai.getVersion() );
assertEquals( "test", ai.getRepository() );
}
public void testSearchGroupedProblematicNames()
throws Exception
{
{
// "-" in the name
Query q = nexusIndexer.constructQuery( MAVEN.ARTIFACT_ID, "commons-logg*", SearchType.SCORED );
GroupedSearchRequest request = new GroupedSearchRequest( q, new GAGrouping() );
GroupedSearchResponse response = nexusIndexer.searchGrouped( request );
Map<String, ArtifactInfoGroup> r = response.getResults();
assertEquals( r.toString(), 1, r.size() );
ArtifactInfoGroup ig = r.values().iterator().next();
assertEquals( "commons-logging : commons-logging", ig.getGroupKey() );
assertEquals( ig.getArtifactInfos().toString(), 13, ig.getArtifactInfos().size() );
}
{
// "-" in the name
// New in 4.0! constructquery do throw error on wrong input! I left in old call and checking it fails,
// and then added "new" call with proper query syntax!
Query q;
try
{
q = nexusIndexer.constructQuery( MAVEN.ARTIFACT_ID, "*logging", SearchType.SCORED );
fail( "Input is invalid, query cannot start with *!" );
}
catch ( IllegalArgumentException e )
{
// good, now let's do it again with good input:
q = nexusIndexer.constructQuery( MAVEN.ARTIFACT_ID, "logging", SearchType.SCORED );
}
GroupedSearchRequest request = new GroupedSearchRequest( q, new GAGrouping() );
GroupedSearchResponse response = nexusIndexer.searchGrouped( request );
Map<String, ArtifactInfoGroup> r = response.getResults();
assertEquals( r.toString(), 1, r.size() );
ArtifactInfoGroup ig = r.values().iterator().next();
assertEquals( "commons-logging : commons-logging", ig.getGroupKey() );
assertEquals( ig.getArtifactInfos().toString(), 13, ig.getArtifactInfos().size() );
}
{
// "-" in the name
// New in 4.0! constructquery do throw error on wrong input! I left in old call and checking it fails,
// and then added "new" call with proper query syntax!
Query q;
try
{
q = nexusIndexer.constructQuery( MAVEN.ARTIFACT_ID, "*-logging", SearchType.SCORED );
fail( "Input is invalid, query cannot start with *!" );
}
catch ( IllegalArgumentException e )
{
// good, now let's do it again with good input:
// Note: since queries are really parsed now, the leading "-" is wrong too
q = nexusIndexer.constructQuery( MAVEN.ARTIFACT_ID, "logging", SearchType.SCORED );
}
GroupedSearchRequest request = new GroupedSearchRequest( q, new GAGrouping() );
GroupedSearchResponse response = nexusIndexer.searchGrouped( request );
Map<String, ArtifactInfoGroup> r = response.getResults();
assertEquals( r.toString(), 1, r.size() );
ArtifactInfoGroup ig = r.values().iterator().next();
assertEquals( "commons-logging : commons-logging", ig.getGroupKey() );
assertEquals( ig.getArtifactInfos().toString(), 13, ig.getArtifactInfos().size() );
}
{
// "-" in the name
Query q = nexusIndexer.constructQuery( MAVEN.ARTIFACT_ID, "comm*-logg*", SearchType.SCORED );
GroupedSearchRequest request = new GroupedSearchRequest( q, new GAGrouping() );
GroupedSearchResponse response = nexusIndexer.searchGrouped( request );
Map<String, ArtifactInfoGroup> r = response.getResults();
assertEquals( r.toString(), 1, r.size() );
ArtifactInfoGroup ig = r.values().iterator().next();
assertEquals( "commons-logging : commons-logging", ig.getGroupKey() );
assertEquals( ig.getArtifactInfos().toString(), 13, ig.getArtifactInfos().size() );
}
{
// "-" in the name
Query q;
try
{
q = nexusIndexer.constructQuery( MAVEN.ARTIFACT_ID, "*mmons-log*", SearchType.SCORED );
fail( "Input is invalid, query cannot start with *!" );
}
catch ( IllegalArgumentException e )
{
// good, now let's do it again with good input:
// NOTE: without crappy prefix search (that caused zillion other problems, original input does not work)
q = nexusIndexer.constructQuery( MAVEN.ARTIFACT_ID, "commons-log*", SearchType.SCORED );
}
GroupedSearchRequest request = new GroupedSearchRequest( q, new GAGrouping() );
GroupedSearchResponse response = nexusIndexer.searchGrouped( request );
Map<String, ArtifactInfoGroup> r = response.getResults();
assertEquals( r.toString(), 1, r.size() );
ArtifactInfoGroup ig = r.values().iterator().next();
assertEquals( "commons-logging : commons-logging", ig.getGroupKey() );
assertEquals( ig.getArtifactInfos().toString(), 13, ig.getArtifactInfos().size() );
}
{
// "-" in the name
Query q = nexusIndexer.constructQuery( MAVEN.ARTIFACT_ID, "commons-", SearchType.SCORED );
GroupedSearchRequest request = new GroupedSearchRequest( q, new GAGrouping() );
GroupedSearchResponse response = nexusIndexer.searchGrouped( request );
Map<String, ArtifactInfoGroup> r = response.getResults();
assertEquals( r.toString(), 2, r.size() );
Iterator<ArtifactInfoGroup> it = r.values().iterator();
ArtifactInfoGroup ig1 = it.next();
assertEquals( "commons-cli : commons-cli", ig1.getGroupKey() );
assertEquals( ig1.getArtifactInfos().toString(), 2, ig1.getArtifactInfos().size() );
ArtifactInfoGroup ig2 = it.next();
assertEquals( "commons-logging : commons-logging", ig2.getGroupKey() );
assertEquals( ig2.getArtifactInfos().toString(), 13, ig2.getArtifactInfos().size() );
}
{
Query q = nexusIndexer.constructQuery( MAVEN.ARTIFACT_ID, "logging-commons", SearchType.SCORED );
GroupedSearchRequest request = new GroupedSearchRequest( q, new GAGrouping() );
GroupedSearchResponse response = nexusIndexer.searchGrouped( request );
Map<String, ArtifactInfoGroup> r = response.getResults();
// since 4.0 we do handle this
// assertEquals( r.toString(), 0, r.size() );
assertEquals( r.toString(), 1, r.size() );
}
{
// numbers and "-" in the name
Query q;
try
{
q = nexusIndexer.constructQuery( MAVEN.ARTIFACT_ID, "*slf4*", SearchType.SCORED );
fail( "Input is invalid, query cannot start with *!" );
}
catch ( IllegalArgumentException e )
{
// good, now let's do it again with good input:
q = nexusIndexer.constructQuery( MAVEN.ARTIFACT_ID, "slf4*", SearchType.SCORED );
}
GroupedSearchRequest request = new GroupedSearchRequest( q, new GAGrouping() );
GroupedSearchResponse response = nexusIndexer.searchGrouped( request );
Map<String, ArtifactInfoGroup> r = response.getResults();
assertEquals( r.toString(), 3, r.size() );
Iterator<ArtifactInfoGroup> it = r.values().iterator();
ArtifactInfoGroup ig1 = it.next();
assertEquals( ig1.getArtifactInfos().toString(), 2, ig1.getArtifactInfos().size() );
assertEquals( "org.slf4j : jcl104-over-slf4j", ig1.getGroupKey() );
ArtifactInfoGroup ig2 = it.next();
assertEquals( ig2.getArtifactInfos().toString(), 4, ig2.getArtifactInfos().size() );
assertEquals( "org.slf4j : slf4j-api", ig2.getGroupKey() );
ArtifactInfoGroup ig3 = it.next();
assertEquals( ig3.getArtifactInfos().toString(), 4, ig3.getArtifactInfos().size() );
assertEquals( "org.slf4j : slf4j-log4j12", ig3.getGroupKey() );
}
{
// numbers and "-" in the name
Query q = nexusIndexer.constructQuery( MAVEN.ARTIFACT_ID, "jcl104-over-slf4*", SearchType.SCORED );
GroupedSearchRequest request = new GroupedSearchRequest( q, new GAGrouping() );
GroupedSearchResponse response = nexusIndexer.searchGrouped( request );
Map<String, ArtifactInfoGroup> r = response.getResults();
assertEquals( r.toString(), 1, r.size() );
ArtifactInfoGroup ig = r.values().iterator().next();
assertEquals( ig.getArtifactInfos().toString(), 2, ig.getArtifactInfos().size() );
assertEquals( "org.slf4j : jcl104-over-slf4j", ig.getGroupKey() );
}
}
// public void testConstructQuery()
// {
// Query q = nexusIndexer.constructQuery( MAVEN.ARTIFACT_ID, "jcl104-over-slf4*" );
//
// assertEquals( "+a:jcl104 +a:over +a:slf4*", q.toString() );
//
// }
public void testIdentify()
throws Exception
{
Collection<ArtifactInfo> ais = nexusIndexer.identify( MAVEN.SHA1, "4d2db265eddf1576cb9d896abc90c7ba46b48d87" );
assertEquals( 1, ais.size() );
ArtifactInfo ai = ais.iterator().next();
assertNotNull( ai );
assertEquals( "qdox", ai.getGroupId() );
assertEquals( "qdox", ai.getArtifactId() );
assertEquals( "1.5", ai.getVersion() );
// Using a file
File artifact = new File( repo, "qdox/qdox/1.5/qdox-1.5.jar" );
ais = nexusIndexer.identify( artifact );
assertEquals( 1, ais.size() );
ai = ais.iterator().next();
assertNotNull( "Can't identify qdox-1.5.jar", ai );
assertEquals( "qdox", ai.getGroupId() );
assertEquals( "qdox", ai.getArtifactId() );
assertEquals( "1.5", ai.getVersion() );
}
// Paging is currently disabled
// See MINDEXER-22
// Flat search is not pageable
// public void donttestPaging()
// throws Exception
// {
// // we have 22 artifact for this search
// int total = 22;
//
// int pageSize = 4;
//
// Query q = nexusIndexer.constructQuery( MAVEN.GROUP_ID, "org", SearchType.SCORED );
//
// FlatSearchRequest req = new FlatSearchRequest( q );
//
// // have page size of 4, that will make us 4 pages
// req.setCount( pageSize );
//
// List<ArtifactInfo> constructedPageList = new ArrayList<ArtifactInfo>();
//
// int offset = 0;
//
// while ( true )
// {
// req.setStart( offset );
//
// FlatSearchResponse resp = nexusIndexer.searchFlat( req );
//
// Collection<ArtifactInfo> p = resp.getResults();
//
// assertEquals( p.toString(), total, resp.getTotalHits() );
//
// assertEquals( Math.min( pageSize, total - offset ), p.size() );
//
// constructedPageList.addAll( p );
//
// offset += pageSize;
//
// if ( offset > total )
// {
// break;
// }
// }
//
// //
// FlatSearchResponse response = nexusIndexer.searchFlat( new FlatSearchRequest( q ) );
// Collection<ArtifactInfo> onePage = response.getResults();
//
// List<ArtifactInfo> onePageList = new ArrayList<ArtifactInfo>( onePage );
//
// // onePage and constructedPage should hold equal elems in the same order
// assertTrue( resultsAreEqual( onePageList, constructedPageList ) );
// }
public void testPurge()
throws Exception
{
// we have 14 artifact for this search
Query q = nexusIndexer.constructQuery( MAVEN.GROUP_ID, "org", SearchType.SCORED );
FlatSearchRequest request = new FlatSearchRequest( q );
FlatSearchResponse response1 = nexusIndexer.searchFlat( request );
Collection<ArtifactInfo> p1 = response1.getResults();
assertEquals( 22, p1.size() );
context.purge();
FlatSearchResponse response2 = nexusIndexer.searchFlat( request );
Collection<ArtifactInfo> p2 = response2.getResults();
assertEquals( 0, p2.size() );
}
protected boolean resultsAreEqual( List<ArtifactInfo> left, List<ArtifactInfo> right )
{
assertEquals( left.size(), right.size() );
for ( int i = 0; i < left.size(); i++ )
{
if ( ArtifactInfo.VERSION_COMPARATOR.compare( left.get( i ), right.get( i ) ) != 0 )
{
// TODO: we are FAKING here!
// return false;
}
}
return true;
}
public void testPackaging()
throws Exception
{
IndexReader reader = context.acquireIndexSearcher().getIndexReader();
Bits liveDocs = MultiFields.getLiveDocs(reader);
for ( int i = 0; i < reader.maxDoc(); i++ )
{
if (liveDocs == null || liveDocs.get(i) )
{
Document document = reader.document( i );
String uinfo = document.get( ArtifactInfo.UINFO );
if ( uinfo != null )
{
String info = document.get( ArtifactInfo.INFO );
assertFalse( "Bad:" + info, info.startsWith( "null" ) );
}
}
}
// {
// Query query = new TermQuery( new Term( MAVEN.PACKAGING, "jar" ) );
// FlatSearchResponse response = nexusIndexer.searchFlat(new FlatSearchRequest(query));
// assertEquals(response.getResults().toString(), 22, response.getTotalHits());
// }
{
Query query = nexusIndexer.constructQuery( MAVEN.PACKAGING, "tar.gz", SearchType.EXACT );
FlatSearchResponse response = nexusIndexer.searchFlat( new FlatSearchRequest( query ) );
assertEquals( response.getResults().toString(), 1, response.getTotalHits() );
ArtifactInfo ai = response.getResults().iterator().next();
assertEquals( "tar.gz", ai.getPackaging() );
assertEquals( "tar.gz", ai.getFileExtension() );
}
{
Query query = nexusIndexer.constructQuery( MAVEN.PACKAGING, "zip", SearchType.EXACT );
FlatSearchResponse response = nexusIndexer.searchFlat( new FlatSearchRequest( query ) );
assertEquals( response.getResults().toString(), 1, response.getTotalHits() );
ArtifactInfo ai = response.getResults().iterator().next();
assertEquals( "zip", ai.getPackaging() );
assertEquals( "zip", ai.getFileExtension() );
}
}
}