gov.nih.nci.caarray.application.project.FileUploadUtilsTest.java Source code

Java tutorial

Introduction

Here is the source code for gov.nih.nci.caarray.application.project.FileUploadUtilsTest.java

Source

//======================================================================================
// Copyright 5AM Solutions Inc, Yale University
//
// Distributed under the OSI-approved BSD 3-Clause License.
// See http://ncip.github.com/caarray/LICENSE.txt for details.
//======================================================================================
package gov.nih.nci.caarray.application.project;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import gov.nih.nci.caarray.application.file.InvalidFileException;
import gov.nih.nci.caarray.application.fileaccess.FileAccessServiceStub;
import gov.nih.nci.caarray.dataStorage.DataStorageFacade;
import gov.nih.nci.caarray.domain.file.CaArrayFile;
import gov.nih.nci.caarray.domain.file.FileStatus;
import gov.nih.nci.caarray.domain.project.Project;
import gov.nih.nci.caarray.util.j2ee.ServiceLocatorStub;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
import java.util.List;

import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipOutputStream;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;

import com.google.common.collect.Lists;

public class FileUploadUtilsTest {

    @Mock
    private ProjectManagementServiceStub mockProjectManagementService;
    @Mock
    protected FileAccessServiceStub mockFileAccessService;
    @Mock
    private DataStorageFacade mockStorageFacade;

    private static final String NON_ZIP_EXTENSION = ".idf";

    private FileUploadUtils uploadUtils = new FileUploadUtils(null);
    CaArrayFile existingFile = new CaArrayFile();

    Project project = new Project();
    List<FileWrapper> fileWrappers = Lists.newArrayList();

    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);
        final ServiceLocatorStub stub = ServiceLocatorStub.registerEmptyLocator();
        stub.addLookup(ProjectManagementService.JNDI_NAME, this.mockProjectManagementService);
        stub.addLookup(FileAccessServiceStub.JNDI_NAME, this.mockFileAccessService);

        uploadUtils = new FileUploadUtils(mockStorageFacade);
        project.getExperiment().setPublicIdentifier("publicId");
        existingFile.setFileStatus(FileStatus.UPLOADED);
        existingFile.setName("testfile1.cel");
        existingFile.setProject(project);
        project.getFiles().add(existingFile);
    }

    @Test
    public void testUploadFiles_NonZip() throws Exception {
        File file = File.createTempFile("tmp", NON_ZIP_EXTENSION);
        addFileUpload(file, false);

        FileProcessingResult result = uploadUtils.uploadFiles(project, fileWrappers);
        assertEquals(1, result.getCount());
        assertTrue(result.getSuccessfullyProcessedFiles().contains(file.getName()));
        assertTrue(result.getConflictingFiles().isEmpty());
    }

    private void addFileUpload(File file, boolean unpack) {
        FileWrapper fileWrapper = new FileWrapper();
        fileWrapper.setFile(file);
        fileWrapper.setFileName(file.getName());
        fileWrapper.setCompressed(unpack);
        fileWrapper.setTotalFileSize(file.length());
        fileWrappers.add(fileWrapper);
    }

    @Test
    public void testUploadFiles_NonZipUnpack() throws Exception {
        File file = File.createTempFile("tmp", NON_ZIP_EXTENSION);
        addFileUpload(file, true);

        try {
            uploadUtils.uploadFiles(project, fileWrappers);
            fail("An InvalidFileException should have been thrown!");
        } catch (InvalidFileException e) {
            assertEquals(FileUploadUtils.UNPACKING_ERROR_KEY, e.getResourceKey());
            assertEquals(FileUploadUtils.INVALID_ZIP_MESSAGE, e.getMessage());
        }
    }

    @Test
    public void testUploadFiles_ZipNoUnpack() throws Exception {
        File file = File.createTempFile("tmp", FileUploadUtils.VALID_ZIP_EXTENSION);
        addFileUpload(file, false);

        FileProcessingResult result = uploadUtils.uploadFiles(project, fileWrappers);
        assertEquals(1, result.getCount());
        assertTrue(result.getSuccessfullyProcessedFiles().contains(file.getName()));
        assertTrue(result.getConflictingFiles().isEmpty());
    }

    @Test
    public void testUploadFiles_ZipUnpack() throws Exception {
        File zipFile = File.createTempFile("tmp", FileUploadUtils.VALID_ZIP_EXTENSION);
        File contentFile = File.createTempFile("tmp", NON_ZIP_EXTENSION);
        addFilesToZip(zipFile, contentFile);

        addFileUpload(zipFile, true);

        FileProcessingResult result = uploadUtils.uploadFiles(project, fileWrappers);
        assertEquals(1, result.getCount());
        assertTrue(result.getSuccessfullyProcessedFiles().contains(contentFile.getName()));
        assertTrue(result.getConflictingFiles().isEmpty());
    }

    private void addFilesToZip(File zipFile, File... files) throws IOException {
        ZipOutputStream zipOut = new ZipOutputStream(zipFile);

        try {
            for (File file : files) {
                ZipEntry entry = null;
                if (file.isDirectory()) {
                    entry = new ZipEntry(file.getPath() + System.getProperty("file.separator"));
                } else {
                    entry = new ZipEntry(file.getName());
                }
                zipOut.putNextEntry(entry);
            }
        } finally {
            IOUtils.closeQuietly(zipOut);
        }

    }

    @Test
    public void testUploadFiles_MultiZipNoUnpack() throws Exception {
        File file = File.createTempFile("tmp", FileUploadUtils.VALID_ZIP_EXTENSION);
        File file2 = File.createTempFile("tmp", FileUploadUtils.VALID_ZIP_EXTENSION);
        addFileUpload(file, false);
        addFileUpload(file2, false);

        FileProcessingResult result = uploadUtils.uploadFiles(project, fileWrappers);
        assertEquals(2, result.getCount());
        assertTrue(result.getSuccessfullyProcessedFiles()
                .containsAll(Lists.newArrayList(file.getName(), file2.getName())));
        assertTrue(result.getConflictingFiles().isEmpty());
    }

    @Test
    public void testUploadFiles_MultiZipUnpack() throws Exception {
        File zipFile1 = File.createTempFile("tmp", FileUploadUtils.VALID_ZIP_EXTENSION);
        File contentFile = File.createTempFile("tmp", NON_ZIP_EXTENSION);
        File contentFile2 = File.createTempFile("tmp", NON_ZIP_EXTENSION);
        addFilesToZip(zipFile1, contentFile, contentFile2);
        File zipFile2 = File.createTempFile("tmp", FileUploadUtils.VALID_ZIP_EXTENSION);
        File contentFile3 = File.createTempFile("tmp", NON_ZIP_EXTENSION);
        addFilesToZip(zipFile2, contentFile3);
        addFileUpload(zipFile1, true);
        addFileUpload(zipFile2, true);

        FileProcessingResult result = uploadUtils.uploadFiles(project, fileWrappers);
        assertEquals(3, result.getCount());
        assertTrue(result.getSuccessfullyProcessedFiles().containsAll(
                Lists.newArrayList(contentFile.getName(), contentFile2.getName(), contentFile3.getName())));
        assertTrue(result.getConflictingFiles().isEmpty());
    }

    @Test
    public void testUploadFiles_MultiZipUnpackConflicts() throws Exception {
        File zipFile1 = File.createTempFile("tmp", FileUploadUtils.VALID_ZIP_EXTENSION);
        File contentFile = File.createTempFile("tmp", NON_ZIP_EXTENSION);
        File contentFile2 = File.createTempFile("tmp", NON_ZIP_EXTENSION);
        addFilesToZip(zipFile1, contentFile, contentFile2);
        File zipFile2 = File.createTempFile("tmp", FileUploadUtils.VALID_ZIP_EXTENSION);
        File contentFile3 = File.createTempFile("tmp", NON_ZIP_EXTENSION);
        addFilesToZip(zipFile2, contentFile3);
        addFileUpload(zipFile1, true);
        addFileUpload(zipFile2, true);

        existingFile.setName(contentFile.getName());

        FileProcessingResult result = uploadUtils.uploadFiles(project, fileWrappers);
        assertEquals(2, result.getCount());
        assertTrue(result.getSuccessfullyProcessedFiles()
                .containsAll(Lists.newArrayList(contentFile2.getName(), contentFile3.getName())));
        assertTrue(result.getConflictingFiles().contains(contentFile.getName()));
    }

    @Test
    public void testUploadFiles_MultiZipMixedUnpack() throws Exception {
        File zipFile1 = File.createTempFile("tmp", FileUploadUtils.VALID_ZIP_EXTENSION);
        File contentFile = File.createTempFile("tmp", NON_ZIP_EXTENSION);
        File contentFile2 = File.createTempFile("tmp", NON_ZIP_EXTENSION);
        addFilesToZip(zipFile1, contentFile, contentFile2);
        File zipFile2 = File.createTempFile("tmp", FileUploadUtils.VALID_ZIP_EXTENSION);
        File contentFile3 = File.createTempFile("tmp", NON_ZIP_EXTENSION);
        File zipFile3 = File.createTempFile("tmp", FileUploadUtils.VALID_ZIP_EXTENSION);
        addFilesToZip(zipFile2, contentFile3);
        addFileUpload(zipFile1, true);
        addFileUpload(zipFile2, true);
        addFileUpload(zipFile3, false);

        FileProcessingResult result = uploadUtils.uploadFiles(project, fileWrappers);
        assertEquals(4, result.getCount());
        assertTrue(result.getSuccessfullyProcessedFiles().containsAll(Lists.newArrayList(contentFile.getName(),
                contentFile2.getName(), contentFile3.getName(), zipFile3.getName())));
        assertTrue(result.getConflictingFiles().isEmpty());
    }

    @Test
    public void testUploadFiles_MultiNonZip() throws Exception {
        File file = File.createTempFile("tmp", NON_ZIP_EXTENSION);
        File file2 = File.createTempFile("tmp", NON_ZIP_EXTENSION);
        addFileUpload(file, false);
        addFileUpload(file2, false);

        FileProcessingResult result = uploadUtils.uploadFiles(project, fileWrappers);
        assertEquals(2, result.getCount());
        assertTrue(result.getSuccessfullyProcessedFiles()
                .containsAll(Lists.newArrayList(file.getName(), file2.getName())));
        assertTrue(result.getConflictingFiles().isEmpty());
    }

    @Test
    public void testUploadFiles_MultiNonZipConflicts() throws Exception {
        File file1 = File.createTempFile("tmp", NON_ZIP_EXTENSION);
        File file2 = File.createTempFile("tmp", NON_ZIP_EXTENSION);
        addFileUpload(file1, false);
        addFileUpload(file2, false);

        existingFile.setName(file1.getName());

        FileProcessingResult result = uploadUtils.uploadFiles(project, fileWrappers);
        assertEquals(1, result.getCount());
        assertTrue(result.getSuccessfullyProcessedFiles().containsAll(Lists.newArrayList(file2.getName())));
        assertTrue(result.getConflictingFiles().contains(file1.getName()));
    }

    @Test
    public void testUploadFiles_MixedZipNonZipNoUnpack() throws Exception {
        File file = File.createTempFile("tmp", NON_ZIP_EXTENSION);
        File zipFile = File.createTempFile("tmp", FileUploadUtils.VALID_ZIP_EXTENSION);
        File file2 = File.createTempFile("tmp", NON_ZIP_EXTENSION);
        addFileUpload(file, false);
        addFileUpload(zipFile, false);
        addFileUpload(file2, false);

        FileProcessingResult result = uploadUtils.uploadFiles(project, fileWrappers);
        assertEquals(3, result.getCount());
        assertTrue(result.getSuccessfullyProcessedFiles()
                .containsAll(Lists.newArrayList(file.getName(), file2.getName(), zipFile.getName())));
        assertTrue(result.getConflictingFiles().isEmpty());
    }

    @Test
    public void testUploadFiles_MixedZipNonZipUnpack() throws Exception {
        File file = File.createTempFile("tmp", NON_ZIP_EXTENSION);
        File file2 = File.createTempFile("tmp", NON_ZIP_EXTENSION);
        File zipFile = File.createTempFile("tmp", FileUploadUtils.VALID_ZIP_EXTENSION);
        File contentFile = File.createTempFile("tmp", NON_ZIP_EXTENSION);
        File contentFile2 = File.createTempFile("tmp", NON_ZIP_EXTENSION);
        addFilesToZip(zipFile, contentFile, contentFile2);
        addFileUpload(file, false);
        addFileUpload(zipFile, true);
        addFileUpload(file2, false);

        FileProcessingResult result = uploadUtils.uploadFiles(project, fileWrappers);
        assertEquals(4, result.getCount());
        assertTrue(result.getSuccessfullyProcessedFiles().containsAll(Lists.newArrayList(file.getName(),
                file2.getName(), contentFile.getName(), contentFile2.getName())));
        assertTrue(result.getConflictingFiles().isEmpty());
    }

    @Test
    public void testUploadFiles_MixedZipNonZipMixedUnpack() throws Exception {
        File file = File.createTempFile("tmp", NON_ZIP_EXTENSION);
        File file2 = File.createTempFile("tmp", NON_ZIP_EXTENSION);
        File zipFile = File.createTempFile("tmp", FileUploadUtils.VALID_ZIP_EXTENSION);
        File contentFile = File.createTempFile("tmp", NON_ZIP_EXTENSION);
        File contentFile2 = File.createTempFile("tmp", NON_ZIP_EXTENSION);
        addFilesToZip(zipFile, contentFile, contentFile2);
        File zipFile2 = File.createTempFile("tmp", FileUploadUtils.VALID_ZIP_EXTENSION);
        addFilesToZip(zipFile2, File.createTempFile("tmp", NON_ZIP_EXTENSION),
                File.createTempFile("tmp", NON_ZIP_EXTENSION));
        addFileUpload(file, false);
        addFileUpload(zipFile, true);
        addFileUpload(file2, false);
        addFileUpload(zipFile2, false);

        FileProcessingResult result = uploadUtils.uploadFiles(project, fileWrappers);
        List<String> expectedUploadedFiles = Lists.newArrayList(file.getName(), file2.getName(),
                contentFile.getName(), contentFile2.getName(), zipFile2.getName());
        assertEquals(expectedUploadedFiles.size(), result.getCount());
        assertTrue(
                "Expected: " + expectedUploadedFiles + " But found :"
                        + result.getSuccessfullyProcessedFiles().toString(),
                result.getSuccessfullyProcessedFiles().containsAll(expectedUploadedFiles));
        assertTrue(result.getConflictingFiles().isEmpty());
    }

    @Test
    public void testUploadFiles_MixedZipNonZipUnpackDuplicateInZip() throws Exception {
        doMixedZipNonZipUnpackDuplicateTest(false);
    }

    private void doMixedZipNonZipUnpackDuplicateTest(boolean zipFirst) throws Exception {
        File file = File.createTempFile("tmp", NON_ZIP_EXTENSION);
        File file2 = File.createTempFile("tmp", NON_ZIP_EXTENSION);
        File zipFile = File.createTempFile("tmp", FileUploadUtils.VALID_ZIP_EXTENSION);
        File contentFile = File.createTempFile("tmp", NON_ZIP_EXTENSION);
        addFilesToZip(zipFile, contentFile, file);
        if (zipFirst) {
            addFileUpload(zipFile, true);
            addFileUpload(file, false);
        } else {
            addFileUpload(file, false);
            addFileUpload(zipFile, true);
        }
        addFileUpload(file2, false);

        FileProcessingResult result = uploadUtils.uploadFiles(project, fileWrappers);
        List<String> expectedUploadedFiles = Lists.newArrayList(file.getName(), file2.getName(),
                contentFile.getName());
        assertEquals(expectedUploadedFiles.size(), result.getCount());
        assertTrue(
                "Expected: " + expectedUploadedFiles + " But found :"
                        + result.getSuccessfullyProcessedFiles().toString(),
                result.getSuccessfullyProcessedFiles().containsAll(expectedUploadedFiles));
        assertTrue(result.getConflictingFiles().contains(file.getName()));
    }

    @Test
    public void testUploadFiles_MixedZipNonZipUnpackDuplicateOutOfZip() throws Exception {
        doMixedZipNonZipUnpackDuplicateTest(true);
    }

    @Test
    public void testUploadFiles_ManagementServiceError() throws Exception {
        File zipFile = File.createTempFile("tmp", FileUploadUtils.VALID_ZIP_EXTENSION);
        File contentFile = File.createTempFile("tmp", NON_ZIP_EXTENSION);
        addFilesToZip(zipFile, contentFile);
        addFileUpload(zipFile, true);

        when(mockProjectManagementService.addFile(eq(project), any(InputStream.class), anyString()))
                .thenThrow(new IllegalStateException("Hooray for failures!"));

        try {
            uploadUtils.uploadFiles(project, fileWrappers);
            fail("An InvalidFileException should have been thrown!");
        } catch (InvalidFileException e) {
            assertTrue(e.getCause() instanceof InvalidFileException);
            InvalidFileException cause = (InvalidFileException) e.getCause();
            assertEquals(FileUploadUtils.ADDING_FILE_ERROR_KEY, cause.getResourceKey());
            assertEquals(cause.getMessage(), FileUploadUtils.ADDING_FILE_ERROR_MESSAGE, cause.getMessage());
        }
    }

    @Test
    public void testUploadFiles_DirectoryInZip() throws Exception {
        File zipFile = File.createTempFile("tmp", FileUploadUtils.VALID_ZIP_EXTENSION);
        File contentFile = File.createTempFile("tmp", NON_ZIP_EXTENSION);
        File tempDir = new File(contentFile.getParent());
        addFilesToZip(zipFile, contentFile);
        addFilesToZip(zipFile, tempDir);
        addFileUpload(zipFile, true);

        try {
            uploadUtils.uploadFiles(project, fileWrappers);
            fail("An InvalidFileException should have been thrown!");
        } catch (InvalidFileException e) {
            assertTrue(e.getCause() instanceof InvalidFileException);
            InvalidFileException cause = (InvalidFileException) e.getCause();
            assertEquals(FileUploadUtils.DIRECTORIES_NOT_SUPPORTED_KEY, cause.getResourceKey());
            assertEquals(cause.getMessage(), FileUploadUtils.DIRECTORIES_NOT_SUPPORTED_MESSAGE, cause.getMessage());
        }
    }

    @Test
    public void testUnpackFiles_SingleZip() throws Exception {
        CaArrayFile mockFile = mock(CaArrayFile.class);
        when(mockStorageFacade.openInputStream(any(URI.class), eq(false)))
                .thenReturn(FileUtils.openInputStream(File.createTempFile("aaa", "bbb")));

        uploadUtils.unpackFiles(project, Lists.newArrayList(mockFile));
        verify(mockStorageFacade).openInputStream(any(URI.class), eq(false));
    }

    @Test
    public void testUnpackFiles_MultipleZips() throws Exception {
        CaArrayFile mockFile = mock(CaArrayFile.class);
        CaArrayFile mockFile2 = mock(CaArrayFile.class);
        when(mockStorageFacade.openInputStream(any(URI.class), eq(false))).thenAnswer(new Answer<InputStream>() {
            @Override
            public InputStream answer(InvocationOnMock invocation) throws Throwable {
                return FileUtils.openInputStream(File.createTempFile("aaa", "bbb"));
            }

        });

        uploadUtils.unpackFiles(project, Lists.newArrayList(mockFile, mockFile2));
        verify(mockStorageFacade, times(2)).openInputStream(any(URI.class), eq(false));
    }

    @Test
    public void testUnpackFiles_IOException() throws Exception {
        CaArrayFile mockFile = mock(CaArrayFile.class);
        InputStream input = FileUtils.openInputStream(File.createTempFile("aaa", "bbb"));
        IOUtils.closeQuietly(input);
        when(mockStorageFacade.openInputStream(any(URI.class), eq(false))).thenReturn(input);

        try {
            uploadUtils.unpackFiles(project, Lists.newArrayList(mockFile));
            fail("An InvalidFileException should have been thrown!");
        } catch (InvalidFileException e) {
            assertTrue(e.getCause() instanceof IOException);
        }
    }
}