package org.codehaus.plexus.archiver.jar; /* * Copyright 2006 The Apache Software Foundation * * Licensed 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.InputStream; import org.apache.commons.compress.archivers.zip.ZipArchiveEntry; import org.codehaus.plexus.PlexusTestCase; import org.codehaus.plexus.archiver.Archiver; import static org.codehaus.plexus.archiver.util.Streams.bufferedInputStream; /** * @author Richard van der Hoff <richardv@mxtelecom.com> * @version $Id$ */ public class IndexTest extends PlexusTestCase { public void testCreateArchiveWithIndexedJars() throws Exception { /* create a dummy jar */ JarArchiver archiver1 = (JarArchiver) lookup( Archiver.ROLE, "jar" ); archiver1.addFile( getTestFile( "src/test/resources/manifests/manifest1.mf" ), "one.txt" ); archiver1.setDestFile( getTestFile( "target/output/archive1.jar" ) ); archiver1.createArchive(); /* now create another jar, with an index, and whose manifest includes a Class-Path entry for the first jar. */ Manifest m = new Manifest(); Manifest.Attribute classpathAttr = new Manifest.Attribute( "Class-Path", "archive1.jar" ); m.addConfiguredAttribute( classpathAttr ); JarArchiver archiver2 = (JarArchiver) lookup( Archiver.ROLE, "jar" ); archiver2.addFile( getTestFile( "src/test/resources/manifests/manifest2.mf" ), "two.txt" ); archiver2.setIndex(true); archiver2.addConfiguredIndexJars(archiver1.getDestFile()); archiver2.setDestFile( getTestFile( "target/output/archive2.jar" ) ); archiver2.addConfiguredManifest(m); archiver2.createArchive(); // read the index file back and check it looks like it ought to org.apache.commons.compress.archivers.zip.ZipFile zf = new org.apache.commons.compress.archivers.zip.ZipFile( archiver2.getDestFile() ); ZipArchiveEntry indexEntry = zf.getEntry("META-INF/INDEX.LIST"); assertNotNull(indexEntry); InputStream bis = bufferedInputStream( zf.getInputStream( indexEntry ) ); byte buf[] = new byte[1024]; int i = bis.read(buf); String res = new String(buf,0,i); assertEquals("JarIndex-Version: 1.0\n\narchive2.jar\ntwo.txt\n\narchive1.jar\none.txt\n\n", res.replaceAll("\r\n", "\n")); } /** * this is pretty much a duplicate of testCreateArchiveWithIndexedJars(), but adds some extra * tests for files in META-INF */ public void testCreateArchiveWithIndexedJarsAndMetaInf() throws Exception { /* create a dummy jar */ JarArchiver archiver1 = (JarArchiver) lookup( Archiver.ROLE, "jar" ); archiver1.addFile( getTestFile( "src/test/resources/manifests/manifest1.mf" ), "one.txt" ); // add a file in the META-INF directory, as this previously didn't make it into the index archiver1.addFile( getTestFile( "src/test/resources/manifests/manifest2.mf" ), "META-INF/foo" ); archiver1.setDestFile( getTestFile( "target/output/archive1.jar" ) ); archiver1.createArchive(); /* create another dummy jar, with an index but nothing else in META-INF. Also checks non-leaf files. */ JarArchiver archiver3 = (JarArchiver) lookup( Archiver.ROLE, "jar" ); archiver3.addFile( getTestFile( "src/test/resources/manifests/manifest1.mf" ), "org/apache/maven/one.txt" ); archiver3.addFile( getTestFile( "src/test/resources/manifests/manifest2.mf" ), "META-INF/INDEX.LIST" ); archiver3.setDestFile( getTestFile( "target/output/archive3.jar" ) ); archiver3.createArchive(); /* now create another jar, with an index, and whose manifest includes a Class-Path entry for the first two jars. */ Manifest m = new Manifest(); Manifest.Attribute classpathAttr = new Manifest.Attribute( "Class-Path", "archive1.jar archive3.jar" ); m.addConfiguredAttribute( classpathAttr ); JarArchiver archiver2 = (JarArchiver) lookup( Archiver.ROLE, "jar" ); archiver2.addFile( getTestFile( "src/test/resources/manifests/manifest2.mf" ), "two.txt" ); archiver2.setIndex(true); archiver2.addConfiguredIndexJars(archiver1.getDestFile()); archiver2.addConfiguredIndexJars(archiver3.getDestFile()); archiver2.setDestFile( getTestFile( "target/output/archive2.jar" ) ); archiver2.addConfiguredManifest(m); archiver2.createArchive(); // read the index file back and check it looks like it ought to org.apache.commons.compress.archivers.zip.ZipFile zf = new org.apache.commons.compress.archivers.zip.ZipFile( archiver2.getDestFile() ); ZipArchiveEntry indexEntry = zf.getEntry("META-INF/INDEX.LIST"); assertNotNull(indexEntry); InputStream bis = bufferedInputStream( zf.getInputStream( indexEntry ) ); byte buf[] = new byte[1024]; int i = bis.read(buf); String res = new String(buf,0,i); //System.out.println(res); assertEquals("JarIndex-Version: 1.0\n\n" + "archive2.jar\ntwo.txt\n\n" + "archive1.jar\nMETA-INF\none.txt\n\n" + "archive3.jar\norg\norg/apache\norg/apache/maven\n\n", res.replaceAll("\r\n", "\n")); } }