package org.apache.maven.index.packer; /* * 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.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.util.Arrays; import java.util.List; import junit.framework.Assert; import org.apache.lucene.document.Document; import org.apache.lucene.search.IndexSearcher; import org.apache.maven.index.AbstractNexusIndexerTest; import org.apache.maven.index.ArtifactInfo; import org.apache.maven.index.NexusIndexer; import org.apache.maven.index.context.IndexingContext; import org.apache.maven.index.context.MergedIndexingContext; import org.apache.maven.index.packer.IndexPackingRequest.IndexFormat; import org.apache.maven.index.updater.IndexDataReader; import org.codehaus.plexus.util.StringUtils; public class NEXUS4149TransferFormatTest extends AbstractNexusIndexerTest { protected File reposBase = new File( getBasedir(), "src/test/nexus-4149" ); protected File idxsBase = new File( getBasedir(), "target/index/nexus-4149" ); @Override protected void setUp() throws Exception { super.setUp(); } @Override protected void prepareNexusIndexer( NexusIndexer nexusIndexer ) throws Exception { IndexingContext ctx1 = nexusIndexer.addIndexingContext( "repo1", "repo1", new File( reposBase, "repo1" ), new File( idxsBase, "repo1" ), null, null, MIN_CREATORS ); nexusIndexer.scan( ctx1 ); IndexingContext ctx2 = nexusIndexer.addIndexingContext( "repo2", "repo2", new File( reposBase, "repo2" ), new File( idxsBase, "repo2" ), null, null, MIN_CREATORS ); nexusIndexer.scan( ctx2 ); IndexingContext ctx3 = nexusIndexer.addIndexingContext( "repo3", "repo3", new File( reposBase, "repo3" ), new File( idxsBase, "repo3" ), null, null, MIN_CREATORS ); nexusIndexer.scan( ctx3 ); IndexingContext ctx4 = nexusIndexer.addIndexingContext( "repo4", "repo4", new File( reposBase, "repo4" ), new File( idxsBase, "repo4" ), null, null, MIN_CREATORS ); nexusIndexer.scan( ctx4 ); context = nexusIndexer.addMergedIndexingContext( "ctx", "ctx", new File( reposBase, "merged" ), new File( idxsBase, "merged" ), false, Arrays.asList( ctx1, ctx2, ctx3, ctx4 ) ); context.getIndexDirectoryFile().mkdirs(); } @Override protected void unprepareNexusIndexer( NexusIndexer nexusIndexer ) throws Exception { // remove the merged nexusIndexer.removeIndexingContext( context, true ); // remove members MergedIndexingContext mctx = (MergedIndexingContext) context; for ( IndexingContext member : mctx.getMembers() ) { nexusIndexer.removeIndexingContext( member, true ); } } @Override public void testDirectory() throws IOException { // we use no directory } public void testMembersAndMergedRootGroups() throws Exception { MergedIndexingContext mctx = (MergedIndexingContext) context; for ( IndexingContext member : mctx.getMembers() ) { Assert.assertEquals( "Members should have one root group!", 1, member.getRootGroups().size() ); } Assert.assertEquals( "Merged should have one root multiply members count!", mctx.getMembers().size(), mctx.getRootGroups().size() ); } public void testTransportFile() throws Exception { File packTargetDir = new File( getBasedir(), "target/nexus-4149/packed" ); IndexPacker packer = lookup( IndexPacker.class ); final IndexSearcher indexSearcher = context.acquireIndexSearcher(); try { IndexPackingRequest request = new IndexPackingRequest( context, indexSearcher.getIndexReader(), packTargetDir ); request.setCreateIncrementalChunks( false ); request.setFormats( Arrays.asList( IndexFormat.FORMAT_V1 ) ); packer.packIndex( request ); } finally { context.releaseIndexSearcher( indexSearcher ); } // read it up and verify, but stay "low level", directly consume the GZ file and count InputStream fis = new BufferedInputStream( new FileInputStream( new File( packTargetDir, "nexus-maven-repository-index.gz" ) ) ); IndexDataReader reader = new IndexDataReader( fis ); try { // read header and neglect it reader.readHeader(); // read docs int totalDocs = 0; int specialDocs = 0; int artifactDocs = 0; String allGroups = null; String rootGroups = null; Document doc; while ( ( doc = reader.readDocument() ) != null ) { totalDocs++; if ( doc.getField( "DESCRIPTOR" ) != null || doc.getField( ArtifactInfo.ALL_GROUPS ) != null || doc.getField( ArtifactInfo.ROOT_GROUPS ) != null ) { specialDocs++; if ( doc.get( ArtifactInfo.ALL_GROUPS ) != null ) { allGroups = doc.get( ArtifactInfo.ALL_GROUPS_LIST ); } if ( doc.get( ArtifactInfo.ROOT_GROUPS ) != null ) { rootGroups = doc.get( ArtifactInfo.ROOT_GROUPS_LIST ); } } else { artifactDocs++; } } Assert.assertNotNull( "Group transport file should contain allGroups!", allGroups ); Assert.assertNotNull( "Group transport file should contain rootGroups!", rootGroups ); checkListOfStringDoesNotContainEmptyString( ArtifactInfo.str2lst( allGroups ) ); checkListOfStringDoesNotContainEmptyString( ArtifactInfo.str2lst( rootGroups ) ); Assert.assertEquals( 15, totalDocs ); // 1 descriptor + 1 allGroups + 1 rootGroups Assert.assertEquals( 3, specialDocs ); // repo1 has 1 artifact, repo2 has 1 artifact and repo3 has 10 artifact Assert.assertEquals( 12, artifactDocs ); } finally { fis.close(); } } protected void checkListOfStringDoesNotContainEmptyString( List<String> lst ) { if ( lst != null ) { for ( String str : lst ) { if ( StringUtils.isBlank( str ) ) { throw new IllegalArgumentException( "List " + lst + " contains empty string!" ); } } } } }