/* ############################################################################### # # # Copyright (C) 2011-2016 OpenMEAP, Inc. # # Credits to Jonathan Schang & Rob Thacher # # # # Released under the LGPLv3 # # # # OpenMEAP is free software: you can redistribute it and/or modify # # it under the terms of the GNU Lesser General Public License as published # # by the Free Software Foundation, either version 3 of the License, or # # (at your option) any later version. # # # # OpenMEAP is distributed in the hope that it will be useful, # # but WITHOUT ANY WARRANTY; without even the implied warranty of # # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # # GNU Lesser General Public License for more details. # # # # You should have received a copy of the GNU Lesser General Public License # # along with OpenMEAP. If not, see <http://www.gnu.org/licenses/>. # # # ############################################################################### */ package com.openmeap.file; import java.io.BufferedOutputStream; import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.zip.ZipFile; import junit.framework.Assert; import org.apache.commons.io.FileUtils; import org.apache.commons.transaction.file.FileResourceManager; import org.apache.log4j.Level; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.openmeap.constants.FormConstants; import com.openmeap.util.SLF4JLoggerFacade; import com.openmeap.util.Utils; /** * Verify the functionality of the FileOperationManagerImpl. * * @author schang */ public class FileOperationManagerImplTest { private Logger logger = LoggerFactory.getLogger(FileOperationManagerImplTest.class); private static FileOperationManagerImpl mgr; private static String STOREDIR = "FileOperationManagerTest-storeDir"; private static String WORKDIR = "FileOperationManagerTest-workDir"; private static String TEST_FILE = "test.txt"; private static String TEST_TEXT = "This is test text."; /** * Creates the working/store directories, sets up the logger, and creates the FileOperationManager. * @throws IOException */ @BeforeClass public static void setUp() throws IOException { org.apache.log4j.BasicConfigurator.configure(); org.apache.log4j.Logger.getLogger("org.apache.commons").setLevel(Level.OFF); org.apache.log4j.Logger.getLogger("Locking").setLevel(Level.OFF); org.apache.log4j.Logger.getLogger("com.openmeap").setLevel(Level.TRACE); new File(STOREDIR).mkdir(); new File(WORKDIR).mkdir(); File f = new File(STOREDIR+File.separator+TEST_FILE); OutputStream stream = new BufferedOutputStream(new FileOutputStream(f)); InputStream inputStream = new ByteArrayInputStream(TEST_TEXT.getBytes()); try { Utils.pipeInputStreamIntoOutputStream(inputStream, stream); } finally { if(stream!=null) { stream.close(); } } mgr = new FileOperationManagerImpl(); FileResourceManager resMgr = new FileResourceManager( STOREDIR, WORKDIR, false, new SLF4JLoggerFacade(LoggerFactory.getLogger("org.apache.commons.transaction.file"))); mgr.setFileResourceManager(resMgr); } /** * Deletes the working and store directories * @throws IOException */ @AfterClass public static void tearDown() throws IOException { FileUtils.deleteDirectory(new File(WORKDIR)); FileUtils.deleteDirectory(new File(STOREDIR)); } /** * Verifies successful file copy. * @throws FileOperationException * @throws IOException */ @Test public void testCopy() throws FileOperationException, IOException { createSubDir(); FileUtils.deleteDirectory(new File(STOREDIR+File.separator+"sub")); } /** * Verifies directory deletion. * @throws FileOperationException * @throws IOException */ @Test public void testDeleteDir() throws FileOperationException, IOException { createSubDir(); mgr.begin(); mgr.deleteDir("sub"); mgr.commit(); File f = new File(STOREDIR+File.separator+"sub"); Assert.assertTrue(!f.exists()); } /** * Validates that a zip file can be extracted and at a prefix location within the store. * @throws FileOperationException * @throws IOException */ @Test public void testUnzip() throws FileOperationException, IOException { mgr.begin(); mgr.unzipFile(new ZipFile(this.getClass().getResource("zipped.zip").getFile()), ""); mgr.commit(); Assert.assertTrue(new File(STOREDIR+File.separator+"zipped/alpha.txt").exists()); Assert.assertTrue(new File(STOREDIR+File.separator+"zipped/quick-fox.txt").exists()); mgr.begin(); mgr.unzipFile(new ZipFile(this.getClass().getResource("zipped.zip").getFile()), "prefix"); mgr.commit(); Assert.assertTrue(new File(STOREDIR+File.separator+"prefix/zipped/alpha.txt").exists()); Assert.assertTrue(new File(STOREDIR+File.separator+"prefix/zipped/quick-fox.txt").exists()); } private void createSubDir() throws FileOperationException, IOException { String[] targets = { "sub/test.txt", "sub/1/test.txt", "sub/1/2/test.txt", "sub/2/test.txt" }; mgr.begin(); for(String target:targets) { mgr.copy(TEST_FILE,target); } InputStream is = mgr.read(targets[0]); String expected = TEST_TEXT; String actual = Utils.readInputStream(is, FormConstants.CHAR_ENC_DEFAULT); Assert.assertEquals(expected, actual.trim()); mgr.commit(); for(String target:targets) { Assert.assertTrue(new File(STOREDIR+File.separator+target).exists()); } } }