/* * Copyright (c) 2014 EMC Corporation * All Rights Reserved */ package com.emc.storageos.management.backup.util; import com.emc.storageos.management.backup.FileUtil; import org.apache.commons.io.FileUtils; import org.junit.AfterClass; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.File; import java.io.IOException; import java.util.UUID; import java.util.zip.Deflater; public class ZipUtilTest { private static final Logger log = LoggerFactory.getLogger(ZipUtilTest.class); private static final int DEFAULT_FILE_SIZE = 1024; private static final int DEFAULT_DIRECTORY_NUM = 3; private static final String TEST_FOLDER = "zipTestFolder"; private static File testDir; @BeforeClass public static void setUp() throws IOException { // Suppress Sonar violation of Lazy initialization of static fields should be synchronized // Junit test will be called in single thread by default, it's safe to ignore this violation testDir = new File(TEST_FOLDER); // NOSONAR ("squid:S2444") tearDown(); if (testDir.exists()) { FileUtils.deleteDirectory(testDir); } Assert.assertTrue(testDir.mkdir()); } private enum DirectoryLevel { EMPTY, FULL, MIX } private long execute(int comressionLevel, DirectoryLevel directoryLevel) throws IOException { // 1. Prepare directory and file String zipName = directoryLevel.toString() + "-" + UUID.randomUUID().toString(); File zipDir = new File(testDir, zipName); if (zipDir.exists()) { FileUtils.deleteDirectory(zipDir); } Assert.assertTrue(zipDir.mkdir()); File prepareFile = FileUtil.createRandomFile(testDir, zipName + ".txt", DEFAULT_FILE_SIZE); long checksum = FileUtils.checksumCRC32(prepareFile); for (int i = 0; i < DEFAULT_DIRECTORY_NUM; i++) { File folder = new File(zipDir, TEST_FOLDER + "-" + i); Assert.assertTrue(folder.mkdir()); if ((directoryLevel.equals(DirectoryLevel.FULL)) || (directoryLevel.equals(DirectoryLevel.MIX) && (i <= DEFAULT_DIRECTORY_NUM / 2))) { FileUtils.copyFile(prepareFile, new File(folder, prepareFile.getName())); } } // 2. pack directory to zip file File targetZip = new File(testDir, zipName + ".zip"); if (targetZip.exists()) { Assert.assertTrue(targetZip.delete()); } Assert.assertFalse(targetZip.exists()); ZipUtil.pack(zipDir, targetZip, comressionLevel); Assert.assertTrue(targetZip.exists()); // 3. unpack zip file FileUtils.deleteDirectory(zipDir); Assert.assertFalse(zipDir.exists()); File tmpFolder = new File(testDir, UUID.randomUUID().toString()); if (!tmpFolder.exists()) { Assert.assertTrue(tmpFolder.mkdir()); } ZipUtil.unpack(targetZip, tmpFolder); File[] folders = tmpFolder.listFiles(); for (File folder : FileUtil.toSafeArray(folders)) { Assert.assertTrue(folder.exists()); Assert.assertTrue(folder.isDirectory()); File[] files = folder.listFiles(); for (File subFolder : FileUtil.toSafeArray(files)) { Assert.assertTrue(subFolder.isDirectory()); File[] tmpFiles = subFolder.listFiles(); for (File tmpFile : FileUtil.toSafeArray(tmpFiles)) { Assert.assertTrue(tmpFile.isFile()); Assert.assertEquals(checksum, FileUtils.checksumCRC32(tmpFile)); } } } FileUtils.deleteDirectory(tmpFolder); return targetZip.length(); } @Test public void testZipWithDefaultLevel() throws IOException { long zipSize = execute(Deflater.DEFAULT_COMPRESSION, DirectoryLevel.FULL); log.info("Compress Level: default\tSize: {}", zipSize); } @Test public void testZipWithEmptyDirectory() throws IOException { execute(Deflater.DEFAULT_COMPRESSION, DirectoryLevel.EMPTY); } @Test public void testZipWithMixedDirectory() throws IOException { execute(Deflater.DEFAULT_COMPRESSION, DirectoryLevel.MIX); } @Test public void testZipWithAllLevels() throws IOException { // NO_COMPRESSION = 0; // BEST_SPEED = 1; // BEST_COMPRESSION = 9; // DEFAULT_COMPRESSION = -1; for (int i = 0; i < 10; i++) { long zipSize = execute(i, DirectoryLevel.FULL); log.info("Compress Level: {}\tSize: {}", i, zipSize); } } @AfterClass public static void tearDown() throws IOException { if (testDir != null && testDir.exists()) { FileUtils.deleteDirectory(testDir); } } }