org.codehaus.plexus.archiver.zip.ZipArchiverTest.java Source code

Java tutorial

Introduction

Here is the source code for org.codehaus.plexus.archiver.zip.ZipArchiverTest.java

Source

package org.codehaus.plexus.archiver.zip;

/*
 * The MIT License
 *
 * Copyright (c) 2004, The Codehaus
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
 * of the Software, and to permit persons to whom the Software is furnished to do
 * so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 */

import org.apache.commons.compress.archivers.zip.ExtraFieldUtils;
import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
import org.apache.commons.compress.archivers.zip.ZipExtraField;
import org.apache.commons.compress.archivers.zip.ZipFile;
import org.apache.commons.compress.utils.BoundedInputStream;
import org.codehaus.plexus.archiver.Archiver;
import org.codehaus.plexus.archiver.ArchiverException;
import org.codehaus.plexus.archiver.BasePlexusArchiverTest;
import org.codehaus.plexus.archiver.UnArchiver;
import org.codehaus.plexus.archiver.UnixStat;
import org.codehaus.plexus.archiver.util.ArchiveEntryUtils;
import org.codehaus.plexus.archiver.util.DefaultArchivedFileSet;
import org.codehaus.plexus.archiver.util.DefaultFileSet;
import org.codehaus.plexus.archiver.util.Streams;
import org.codehaus.plexus.components.io.attributes.Java7FileAttributes;
import org.codehaus.plexus.components.io.attributes.PlexusIoResourceAttributeUtils;
import org.codehaus.plexus.components.io.attributes.PlexusIoResourceAttributes;
import org.codehaus.plexus.components.io.attributes.SimpleResourceAttributes;
import org.codehaus.plexus.components.io.functions.InputStreamTransformer;
import org.codehaus.plexus.components.io.resources.PlexusIoFileResourceCollection;
import org.codehaus.plexus.components.io.resources.PlexusIoResource;
import org.codehaus.plexus.components.io.resources.ResourceFactory;
import org.codehaus.plexus.logging.Logger;
import org.codehaus.plexus.logging.console.ConsoleLogger;
import org.codehaus.plexus.util.FileUtils;
import org.codehaus.plexus.util.IOUtil;
import org.codehaus.plexus.util.Os;

import javax.annotation.Nonnull;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
import java.util.Date;
import java.util.Enumeration;
import java.util.Map;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;

/**
 * @author Emmanuel Venisse
 * @version $Id$
 */
@SuppressWarnings("OctalInteger")
public class ZipArchiverTest extends BasePlexusArchiverTest {

    private Logger logger;

    public void setUp() throws Exception {
        super.setUp();

        logger = new ConsoleLogger(Logger.LEVEL_DEBUG, "test");
    }

    public void testImplicitPermissions() throws IOException {
        File zipFile = getTestFile("target/output/zip-with-implicit-dirmode.zip");

        ZipArchiver archiver = getZipArchiver(zipFile);

        archiver.setDefaultDirectoryMode(0777);
        archiver.setDirectoryMode(0641);
        archiver.setFileMode(0222);
        archiver.addFile(new File("pom.xml"), "fizz/buzz/pom.xml");
        archiver.setDefaultDirectoryMode(0530);
        archiver.setDirectoryMode(-1); // Not forced mode
        archiver.setFileMode(0111);
        archiver.addFile(new File("pom.xml"), "fazz/bazz/pam.xml");
        archiver.createArchive();

        assertTrue(zipFile.exists());
        ZipFile zf = new ZipFile(zipFile);
        ZipArchiveEntry fizz = zf.getEntry("fizz/");
        assertEquals(040641, fizz.getUnixMode());
        ZipArchiveEntry pom = zf.getEntry("fizz/buzz/pom.xml");
        assertEquals(0100222, pom.getUnixMode());

        ZipArchiveEntry fazz = zf.getEntry("fazz/");
        assertEquals(040530, fazz.getUnixMode());
        ZipArchiveEntry pam = zf.getEntry("fazz/bazz/pam.xml");
        assertEquals(0100111, pam.getUnixMode());
    }

    public void testOverddidenPermissions() throws IOException {
        File zipFile = getTestFile("target/output/zip-with-overriden-modes.zip");

        ZipArchiver archiver = getZipArchiver(zipFile);
        archiver.setDefaultDirectoryMode(0777);
        archiver.setDirectoryMode(0641);
        archiver.setFileMode(0777);
        archiver.addDirectory(new File("src/test/resources/symlinks/src"));
        archiver.createArchive();

        assertTrue(zipFile.exists());
        ZipFile zf = new ZipFile(zipFile);
        ZipArchiveEntry fizz = zf.getEntry("symDir");
        assertTrue(fizz.isUnixSymlink());
        ZipArchiveEntry symR = zf.getEntry("symR");
        assertTrue(symR.isUnixSymlink());
    }

    public void testCreateArchiveWithDetectedModes() throws Exception {

        String[] executablePaths = { "path/to/executable", "path/to/executable.bat" };

        String[] confPaths = { "path/to/etc/file", "path/to/etc/file2" };

        String[] logPaths = { "path/to/logs/log.txt" };

        int exeMode = 0777;
        int confMode = 0600;
        int logMode = 0640;

        if (Os.isFamily(Os.FAMILY_WINDOWS)) {
            StackTraceElement e = new Throwable().getStackTrace()[0];
            System.out
                    .println("Cannot execute test: " + e.getMethodName() + " on " + System.getProperty("os.name"));
            return;
        }

        File tmpDir = null;
        try {
            tmpDir = File.createTempFile("zip-with-chmod.", ".dir");
            tmpDir.delete();

            tmpDir.mkdirs();

            for (String executablePath : executablePaths) {
                writeFile(tmpDir, executablePath, exeMode);
            }

            for (String confPath : confPaths) {
                writeFile(tmpDir, confPath, confMode);
            }

            for (String logPath : logPaths) {
                writeFile(tmpDir, logPath, logMode);
            }

            {
                Map<String, PlexusIoResourceAttributes> attributesByPath = PlexusIoResourceAttributeUtils
                        .getFileAttributesByPath(tmpDir);
                for (String path : executablePaths) {
                    PlexusIoResourceAttributes attrs = attributesByPath.get(path);
                    if (attrs == null) {
                        attrs = attributesByPath.get(new File(tmpDir, path).getAbsolutePath());
                    }

                    assertNotNull(attrs);
                    assertEquals("Wrong mode for: " + path + "; expected: " + exeMode, exeMode,
                            attrs.getOctalMode());
                }

                for (String path : confPaths) {
                    PlexusIoResourceAttributes attrs = attributesByPath.get(path);
                    if (attrs == null) {
                        attrs = attributesByPath.get(new File(tmpDir, path).getAbsolutePath());
                    }

                    assertNotNull(attrs);
                    assertEquals("Wrong mode for: " + path + "; expected: " + confMode, confMode,
                            attrs.getOctalMode());
                }

                for (String path : logPaths) {
                    PlexusIoResourceAttributes attrs = attributesByPath.get(path);
                    if (attrs == null) {
                        attrs = attributesByPath.get(new File(tmpDir, path).getAbsolutePath());
                    }

                    assertNotNull(attrs);
                    assertEquals("Wrong mode for: " + path + "; expected: " + logMode, logMode,
                            attrs.getOctalMode());
                }
            }

            File zipFile = getTestFile("target/output/zip-with-modes.zip");

            ZipArchiver archiver = getZipArchiver(zipFile);

            archiver.addDirectory(tmpDir);
            archiver.createArchive();

            assertTrue(zipFile.exists());

            File zipFile2 = getTestFile("target/output/zip-with-modes-L2.zip");

            archiver = getZipArchiver();
            archiver.setDestFile(zipFile2);

            archiver.addArchivedFileSet(zipFile);
            archiver.createArchive();

            ZipFile zf = new ZipFile(zipFile2);

            for (String path : executablePaths) {
                ZipArchiveEntry ze = zf.getEntry(path);

                int mode = ze.getUnixMode() & UnixStat.PERM_MASK;

                assertEquals("Wrong mode for: " + path + "; expected: " + exeMode, exeMode, mode);
            }

            for (String path : confPaths) {
                ZipArchiveEntry ze = zf.getEntry(path);

                int mode = ze.getUnixMode() & UnixStat.PERM_MASK;

                assertEquals("Wrong mode for: " + path + "; expected: " + confMode, confMode, mode);
            }

            for (String path : logPaths) {
                ZipArchiveEntry ze = zf.getEntry(path);

                int mode = ze.getUnixMode() & UnixStat.PERM_MASK;

                assertEquals("Wrong mode for: " + path + "; expected: " + logMode, logMode, mode);
            }
        } finally {
            if (tmpDir != null && tmpDir.exists()) {
                try {
                    FileUtils.forceDelete(tmpDir);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    private ZipArchiver getZipArchiver() {
        try {
            return (ZipArchiver) lookup(Archiver.ROLE, "zip");
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    private ZipArchiver getZipArchiver(File destFile) {
        final ZipArchiver zipArchiver = getZipArchiver();
        zipArchiver.setDestFile(destFile);
        return zipArchiver;
    }

    private ZipUnArchiver getZipUnArchiver(File testJar) throws Exception {
        ZipUnArchiver zu = (ZipUnArchiver) lookup(UnArchiver.ROLE, "zip");
        zu.setSourceFile(testJar);
        return zu;
    }

    private void writeFile(File dir, String fname, int mode) throws IOException, ArchiverException {
        File file = new File(dir, fname);
        FileWriter writer = null;

        try {
            if (file.getParentFile() != null) {
                file.getParentFile().mkdirs();
            }

            writer = new FileWriter(file);
            writer.write("This is a test file.");
        } finally {
            IOUtil.close(writer);
        }

        ArchiveEntryUtils.chmod(file, mode, logger, false);
    }

    public void testCreateArchive() throws Exception {
        ZipArchiver archiver = newArchiver("archive1.zip");

        createArchive(archiver);
    }

    public void testAddArchivedFileSet() throws Exception {
        File toBeAdded = new File("src/test/resources/test.zip");
        DefaultArchivedFileSet sfd = DefaultArchivedFileSet.archivedFileSet(toBeAdded);
        File zipFIle = getTestFile("target/output/withZip.zip");
        final ZipArchiver zipArchiver = getZipArchiver(zipFIle);
        InputStreamTransformer is = new InputStreamTransformer() {
            @Nonnull
            public InputStream transform(@Nonnull PlexusIoResource resource, @Nonnull InputStream inputStream)
                    throws IOException {
                return new BoundedInputStream(inputStream, 3);
            }
        };
        sfd.setStreamTransformer(is);
        zipArchiver.addArchivedFileSet(sfd);
        zipArchiver.createArchive();

        final ZipUnArchiver zipUnArchiver = getZipUnArchiver(zipFIle);
        File destFile = new File("target/output/withZip");
        destFile.mkdirs();
        zipUnArchiver.setDestFile(destFile);
        zipUnArchiver.extract();
        File a3byteFile = new File(destFile,
                "Users/kristian/lsrc/plexus/plexus-archiver/src/main/java/org/codehaus/plexus/archiver/zip/ZipArchiver.java");
        assertTrue(a3byteFile.exists());
        assertTrue(a3byteFile.length() == 3);
    }

    public void testCreateArchiveWithStreamTransformer() throws IOException {
        InputStreamTransformer is = new InputStreamTransformer() {
            @Nonnull
            public InputStream transform(@Nonnull PlexusIoResource resource, @Nonnull InputStream inputStream)
                    throws IOException {
                return new BoundedInputStream(inputStream, 3);
            }
        };

        final ZipArchiver zipArchiver = getZipArchiver(getTestFile("target/output/all3bytes.zip"));
        File zipFIle = new File("src/test/resources/test.zip");
        DefaultArchivedFileSet afs = new DefaultArchivedFileSet(zipFIle);
        afs.setStreamTransformer(is);
        afs.setPrefix("azip/");
        zipArchiver.addArchivedFileSet(afs);

        DefaultFileSet dfs = new DefaultFileSet(new File("src/test/resources/mjar179"));
        dfs.setStreamTransformer(is);
        dfs.setPrefix("mj179/");
        zipArchiver.addFileSet(dfs);

        PlexusIoFileResourceCollection files = new PlexusIoFileResourceCollection();
        files.setBaseDir(new File("src/test/resources"));
        files.setStreamTransformer(is);
        files.setPrefix("plexus/");
        zipArchiver.addResources(files);

        zipArchiver.createArchive();

    }

    private ZipArchiver newArchiver(String name) throws Exception {
        ZipArchiver archiver = getZipArchiver(getTestFile("target/output/" + name));

        archiver.setFileMode(0640);
        archiver.addFile(getTestFile("src/test/resources/manifests/manifest1.mf"), "one.txt");
        archiver.addFile(getTestFile("src/test/resources/manifests/manifest2.mf"), "two.txt", 0664);

        // reset default file mode for files included from now on
        archiver.setFileMode(0400);
        archiver.setDirectoryMode(0777);
        archiver.addDirectory(getTestFile("src/test/resources/world-writable/"), "worldwritable/");

        archiver.setDirectoryMode(0070);
        archiver.addDirectory(getTestFile("src/test/resources/group-writable/"), "groupwritable/");

        archiver.setDirectoryMode(0500);
        archiver.setFileMode(0400);
        archiver.addDirectory(getTestFile("src"));

        return archiver;
    }

    private void fileModeAssert(int expected, int actual) {
        assertEquals(Integer.toString(expected, 8), Integer.toString(actual, 8));
    }

    private void createArchive(ZipArchiver archiver) throws ArchiverException, IOException {
        archiver.createArchive();

        ZipFile zf = new ZipFile(archiver.getDestFile());

        Enumeration e = zf.getEntries();

        while (e.hasMoreElements()) {
            ZipArchiveEntry ze = (ZipArchiveEntry) e.nextElement();
            if (ze.isDirectory()) {
                if (ze.getName().startsWith("worldwritable")) {
                    fileModeAssert(0777, UnixStat.PERM_MASK & ze.getUnixMode());
                } else if (ze.getName().startsWith("groupwritable")) {
                    fileModeAssert(0070, UnixStat.PERM_MASK & ze.getUnixMode());
                } else {
                    fileModeAssert(0500, UnixStat.PERM_MASK & ze.getUnixMode());
                }
            } else {
                if (ze.getName().equals("one.txt")) {
                    fileModeAssert(0640, UnixStat.PERM_MASK & ze.getUnixMode());
                } else if (ze.getName().equals("two.txt")) {
                    fileModeAssert(0664, UnixStat.PERM_MASK & ze.getUnixMode());
                } else if (ze.isUnixSymlink()) {
                    //         assertEquals( ze.getName(), 0500, UnixStat.PERM_MASK & ze.getUnixMode() );
                } else {
                    fileModeAssert(0400, UnixStat.PERM_MASK & ze.getUnixMode());
                }
            }

        }
    }

    public void testSymlinkZip() throws Exception {
        final File zipFile = getTestFile("target/output/pasymlinks.zip");
        final ZipArchiver zipArchiver = getZipArchiver(zipFile);
        PlexusIoFileResourceCollection files = new PlexusIoFileResourceCollection();
        files.setFollowingSymLinks(false);
        files.setBaseDir(new File("src/test/resources/symlinks"));
        files.setPrefix("plexus/");
        zipArchiver.addResources(files);
        zipArchiver.createArchive();
        final File output = getTestFile("target/output/unzipped");
        output.mkdirs();
        final ZipUnArchiver zipUnArchiver = getZipUnArchiver(zipFile);
        zipUnArchiver.setDestFile(output);
        zipUnArchiver.extract();
        File symDir = new File("target/output/unzipped/plexus/src/symDir");
        PlexusIoResourceAttributes fa = Java7FileAttributes.uncached(symDir);
        assertTrue(fa.isSymbolicLink());
    }

    @SuppressWarnings("ResultOfMethodCallIgnored")
    public void testSymlinkFileSet() throws Exception {
        final File zipFile = getTestFile("target/output/pasymlinks-fileset.zip");
        final ZipArchiver zipArchiver = getZipArchiver(zipFile);
        final DefaultFileSet fs = new DefaultFileSet();
        fs.setPrefix("bzz/");
        fs.setDirectory(new File("src/test/resources/symlinks/src"));
        zipArchiver.addFileSet(fs);
        zipArchiver.createArchive();
        final File output = getTestFile("target/output/unzipped/symlFs");
        output.mkdirs();
        final ZipUnArchiver zipUnArchiver = getZipUnArchiver(zipFile);
        zipUnArchiver.setDestFile(output);
        zipUnArchiver.extract();
        File symDir = new File(output, "bzz/symDir");
        PlexusIoResourceAttributes fa = Java7FileAttributes.uncached(symDir);
        assertTrue(fa.isSymbolicLink());
    }

    public void testSymlinkArchivedFileSet() throws Exception {
        final File zipFile = getTestFile("src/test/resources/symlinks/symlinks.zip");
        final File zipFile2 = getTestFile("target/output/pasymlinks-archivedFileset.zip");
        final ZipArchiver zipArchiver = getZipArchiver(zipFile2);
        zipArchiver.addArchivedFileSet(zipFile);
        zipArchiver.createArchive();

        final ZipFile cmp1 = new ZipFile(zipFile);
        final ZipFile cmp2 = new ZipFile(zipFile2);
        ArchiveFileComparator.assertEquals(cmp1, cmp2, "");
    }

    /*
     */

    public void testForced() throws Exception {
        ZipArchiver archiver = newArchiver("archive2.zip");

        assertTrue(archiver.isForced());
        File f = archiver.getDestFile();
        if (f.exists()) {
            FileUtils.fileDelete(f.getPath());
        }
        assertFalse(f.exists());
        createArchive(archiver);
        long l1 = f.lastModified();
        assertTrue(f.exists());

        archiver = newArchiver("archive2.zip");
        waitUntilNewTimestamp(archiver.getDestFile(), l1);
        createArchive(archiver);
        long l2 = f.lastModified();
        assertTrue(f.exists());
        assertTrue(l2 > l1);

        archiver = newArchiver("archive2.zip");
        assertTrue(archiver.isSupportingForced());
        archiver.setForced(false);
        assertFalse(archiver.isForced());

        createArchive(archiver);
        long l3 = f.lastModified();
        assertTrue(f.exists());
        assertEquals(l2, l3);
    }

    // Used to investigate extrafields
    public void testLookAtExtraZipFields_from_macos() throws IOException {
        InputStream fis = Streams.fileInputStream(new File("src/test/resources/zip-timestamp/macOsZipFile.zip"));
        ZipInputStream zis = new ZipInputStream(fis);
        final java.util.zip.ZipEntry evenEntry = zis.getNextEntry();
        final ZipExtraField[] parse = ExtraFieldUtils.parse(evenEntry.getExtra());
        System.out.println(Arrays.asList(parse));
        final java.util.zip.ZipEntry oddEntry = zis.getNextEntry();

        System.out.println(Arrays.asList(ExtraFieldUtils.parse(oddEntry.getExtra())));

        System.out.println("oddEntry.getTime() = " + new Date(oddEntry.getTime()).toString());
        System.out.println("oddEntry.getName() = " + oddEntry.getName());
        System.out.println("new String(oddEntry.getExtra()) = " + new String(oddEntry.getExtra()));
        System.out.println("evenEntry.getName() = " + evenEntry.getName());
        System.out.println("evenEntry.getTime() = " + new Date(evenEntry.getTime()).toString());
        System.out.println("new String(evenEntry.getExtra()) = " + new String(evenEntry.getExtra()));

    }

    // Used to investigate date roundtrip behaviour across zip versions
    public void testZipStuff() throws IOException {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ZipOutputStream zos = new ZipOutputStream(baos);
        // name the file inside the zip  file
        final File oddFile = new File("src/test/resources/zip-timestamp/file-with-odd-time.txt");
        final File evenFile = new File("src/test/resources/zip-timestamp/file-with-even-time.txt");
        final ZipEntry oddZe = new ZipEntry(oddFile.getName());
        oddZe.setTime(oddFile.lastModified());
        zos.putNextEntry(oddZe);
        final ZipEntry evenZe = new ZipEntry(evenFile.getName());
        evenZe.setTime(evenFile.lastModified());
        zos.putNextEntry(evenZe);
        zos.close();

        ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
        ZipInputStream zipInputStream = new ZipInputStream(bais);
        final java.util.zip.ZipEntry oddEntry = zipInputStream.getNextEntry();
        System.out.println("oddEntry.getTime() = " + new Date(oddEntry.getTime()).toString());
        System.out.println("oddEntry.getName() = " + oddEntry.getName());
        final java.util.zip.ZipEntry evenEntry = zipInputStream.getNextEntry();
        System.out.println("evenEntry.getName() = " + evenEntry.getName());
        System.out.println("evenEntry.getTime() = " + new Date(evenEntry.getTime()).toString());
    }

    public void notestJustThatOne() throws Exception {
        final File srcDir = new File("src");
        String[] inc = { "test/java/org/codehaus/plexus/archiver/zip/ZipShortTest.java" };
        final File zipFile = new File("target/output/zz1.zip");

        final File zipFile2 = new File("target/output/zz2.zip");
        ZipArchiver zipArchiver2 = getZipArchiver(zipFile2);

        // Bugbug: This does not work on 1.8....?
        zipArchiver2.addArchivedFileSet(zipFile);
        FileUtils.removePath(zipFile2.getPath());
        zipArchiver2.createArchive();
    }

    public void testCreateResourceCollection() throws Exception {
        final File srcDir = new File("src");
        final File zipFile = new File("target/output/src.zip");
        ZipArchiver zipArchiver = getZipArchiver(zipFile);
        zipArchiver.addDirectory(srcDir, null, FileUtils.getDefaultExcludes());
        zipArchiver.setEncoding("UTF-8");
        FileUtils.removePath(zipFile.getPath());
        zipArchiver.createArchive();

        final File zipFile2 = new File("target/output/src2.zip");
        ZipArchiver zipArchiver2 = getZipArchiver(zipFile2);
        zipArchiver2.addArchivedFileSet(zipFile, "prfx/");
        zipArchiver2.setEncoding("UTF-8");
        FileUtils.removePath(zipFile2.getPath());
        zipArchiver2.createArchive();

        final ZipFile cmp1 = new ZipFile(zipFile);
        final ZipFile cmp2 = new ZipFile(zipFile2);
        ArchiveFileComparator.assertEquals(cmp1, cmp2, "prfx/");
        cmp1.close();
        cmp2.close();
    }

    public void testDefaultUTF8() throws IOException {
        final ZipArchiver zipArchiver = getZipArchiver(new File("target/output/utf8-default.zip"));
        zipArchiver.addDirectory(new File("src/test/resources/miscUtf8"));
        zipArchiver.createArchive();
    }

    public void testDefaultUTF8withUTF8() throws IOException {
        final ZipArchiver zipArchiver = getZipArchiver(new File("target/output/utf8-with_utf.zip"));
        zipArchiver.setEncoding("UTF-8");
        zipArchiver.addDirectory(new File("src/test/resources/miscUtf8"));
        zipArchiver.createArchive();
    }

    public void testForcedFileModes() throws IOException {
        File step1file = new File("target/output/forced-file-mode.zip");
        {
            final ZipArchiver zipArchiver = getZipArchiver(step1file);
            zipArchiver.setFileMode(0077);
            zipArchiver.setDirectoryMode(0007);
            PlexusIoResourceAttributes attrs = new SimpleResourceAttributes(123, "fred", 22, "filntstones", 0111);
            PlexusIoResource resource = ResourceFactory
                    .createResource(new File("src/test/resources/folders/File.txt"), "Test.txt", null, attrs);
            zipArchiver.addResource(resource, "Test2.txt", 0707);
            PlexusIoFileResourceCollection files = new PlexusIoFileResourceCollection();
            files.setBaseDir(new File("src/test/resources/folders"));
            files.setPrefix("sixsixsix/");
            zipArchiver.addResources(files);

            zipArchiver.createArchive();

            ZipFile zf = new ZipFile(step1file);
            fileModeAssert(040007, zf.getEntry("sixsixsix/a/").getUnixMode());
            fileModeAssert(0100077, zf.getEntry("sixsixsix/b/FileInB.txt").getUnixMode());
            fileModeAssert(0100707, zf.getEntry("Test2.txt").getUnixMode());
            zf.close();
        }

        File Step2file = new File("target/output/forced-file-mode-from-zip.zip");
        {
            final ZipArchiver za2 = getZipArchiver(Step2file);
            za2.setFileMode(0666);
            za2.setDirectoryMode(0676);

            PlexusIoZipFileResourceCollection zipSrc = new PlexusIoZipFileResourceCollection();
            zipSrc.setFile(step1file);
            zipSrc.setPrefix("zz/");
            za2.addResources(zipSrc);
            za2.createArchive();
            ZipFile zf = new ZipFile(Step2file);
            fileModeAssert(040676, zf.getEntry("zz/sixsixsix/a/").getUnixMode());
            fileModeAssert(0100666, zf.getEntry("zz/Test2.txt").getUnixMode());
            zf.close();
        }

        File step3file = new File("target/output/forced-file-mode-from-zip2.zip");
        {
            final ZipArchiver za2 = getZipArchiver(step3file);
            za2.setFileMode(0666);
            za2.setDirectoryMode(0676);

            PlexusArchiverZipFileResourceCollection zipSrc = new PlexusArchiverZipFileResourceCollection();
            zipSrc.setFile(step1file);
            zipSrc.setPrefix("zz/");
            za2.addResources(zipSrc);
            za2.createArchive();
            ZipFile zf = new ZipFile(Step2file);
            fileModeAssert(040676, zf.getEntry("zz/sixsixsix/a/").getUnixMode());
            fileModeAssert(0100666, zf.getEntry("zz/Test2.txt").getUnixMode());
            zf.close();
        }
    }
}