package hudson.util.io; import static org.junit.Assert.assertEquals; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.util.logging.Level; import java.util.logging.Logger; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.jvnet.hudson.test.Issue; public class ZipArchiverTest { private static final Logger LOGGER = Logger.getLogger(ZipArchiverTest.class.getName()); private File tmpDir; @Before public void setUp() { try { // initialize temp directory tmpDir = File.createTempFile("temp", ".dir"); tmpDir.delete(); tmpDir.mkdir(); } catch (IOException e) { fail("unable to create temp directory", e); } } @After public void tearDown() { deleteDir(tmpDir); } @Issue("JENKINS-9942") @Test public void backwardsSlashesOnWindows() { // create foo/bar/baz/Test.txt File tmpFile = null; try { File baz = new File(new File(new File(tmpDir, "foo"), "bar"), "baz"); baz.mkdirs(); tmpFile = new File(baz, "Test.txt"); tmpFile.createNewFile(); } catch (IOException e) { fail("unable to prepare source directory for zipping", e); } // a file to store the zip archive in File zipFile = null; // create zip from tmpDir ZipArchiver archiver = null; try { zipFile = File.createTempFile("test", ".zip"); archiver = new ZipArchiver(new FileOutputStream(zipFile)); archiver.visit(tmpFile, "foo\\bar\\baz\\Test.txt"); } catch (Exception e) { fail("exception driving ZipArchiver", e); } finally { if (archiver != null) { try { archiver.close(); } catch (IOException e) { // ignored } } } // examine zip contents and assert that none of the entry names (paths) have // back-slashes ("\") String zipEntryName = null; ZipFile zipFileVerify = null; try { zipFileVerify = new ZipFile(zipFile); zipEntryName = ((ZipEntry) zipFileVerify.entries().nextElement()).getName(); } catch (Exception e) { fail("failure enumerating zip entries", e); } finally { if (zipFileVerify != null) { try { zipFileVerify.close(); } catch (IOException e) { // ignored } } } assertEquals("foo/bar/baz/Test.txt", zipEntryName); } /** * Convenience method for failing with a cause. * * @param msg the failure description * @param cause the root cause of the failure */ private final void fail(final String msg, final Throwable cause) { LOGGER.log(Level.SEVERE, msg, cause); Assert.fail(msg); } /** * Recursively deletes a directory and all of its children. * * @param f the File (neƩ, directory) to delete */ private final void deleteDir(final File f) { for (File c : f.listFiles()) { if (c.isDirectory()) { deleteDir(c); } else { c.delete(); } } f.delete(); } }