package org.gbif.ipt.action.manage; import org.gbif.ipt.config.AppConfig; import org.gbif.ipt.config.DataDir; import org.gbif.ipt.model.Resource; import org.gbif.ipt.service.DeletionNotAllowedException; import org.gbif.ipt.service.admin.RegistrationManager; import org.gbif.ipt.service.admin.VocabulariesManager; import org.gbif.ipt.service.manage.ResourceManager; import org.gbif.ipt.struts2.SimpleTextProvider; import org.gbif.utils.file.FileUtils; import java.io.File; import java.io.IOException; import java.util.Date; import org.apache.log4j.Logger; import org.junit.Before; import org.junit.Test; import org.mockito.Mockito; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; public class CreateResourceActionTest { private static final Logger LOG = Logger.getLogger(CreateResourceActionTest.class); private static final String SHORTNAME = "bugs"; private CreateResourceAction action; private static final File RESOURCES_DIRECTORY = getResourceDirectory(); @Before public void setup() throws IOException, DeletionNotAllowedException { // mock DataDir returning temp file (needed during import stage) DataDir mockDataDir = mock(DataDir.class); when(mockDataDir.tmpFile(anyString(), anyString())).thenReturn(FileUtils.createTempDir()); // mock DataDir returning resources directory when(mockDataDir.dataFile(anyString())).thenReturn(RESOURCES_DIRECTORY); // mock resource manager that returns resource with shortname "bugs" Resource res = new Resource(); res.setShortname(SHORTNAME); ResourceManager mockResourceManager = mock(ResourceManager.class); when(mockResourceManager.get(SHORTNAME)).thenReturn(res); // mock resource manager that deletes resource directory "bugs" Mockito.doAnswer(new Answer() { public Object answer(InvocationOnMock invocation) { return org.apache.commons.io.FileUtils.deleteQuietly(new File(RESOURCES_DIRECTORY, SHORTNAME)); } }) .when(mockResourceManager).delete(res, true); // mock action action = new CreateResourceAction(mock(SimpleTextProvider.class), mock(AppConfig.class), mock(RegistrationManager.class), mockResourceManager, mockDataDir, mock(VocabulariesManager.class)); } /** * Trigger an ImportException calling save() while creating a new resource. Verify the right result happens * and the action error is stored. */ @Test public void testSaveImportException() throws IOException { action.setFile(File.createTempFile("archive", "zip")); action.setShortname("otherShortname"); action.setFileFileName("archive.zip"); String result = action.save(); assertEquals("input", result); // ImportException logged in ActionError assertEquals(1, action.getActionErrors().size()); } @Test public void testCleanupResourceFolder() throws IOException, InterruptedException { Date start = new Date(); long startTimeInMs = start.getTime() - 5000; LOG.info("Start in milliseconds: " + startTimeInMs); DataDir dataDir = action.getDataDir(); File resourcesDirectory = dataDir.dataFile(DataDir.RESOURCES_DIR); File resourceDirectory = new File(resourcesDirectory, SHORTNAME); resourceDirectory.mkdir(); assertTrue(resourceDirectory.exists()); File sources = new File (resourceDirectory, "sources"); sources.mkdir(); assertTrue(sources.exists()); assertEquals(1, resourceDirectory.listFiles().length); File occurrences = new File (sources, "occurrences.txt"); occurrences.createNewFile(); assertTrue(occurrences.exists()); LOG.info("Resource directory last modified: " + resourceDirectory.lastModified()); assertTrue(resourceDirectory.lastModified() > startTimeInMs); action.cleanupResourceFolder(SHORTNAME, startTimeInMs); assertFalse(resourceDirectory.exists()); assertFalse(sources.exists()); assertFalse(occurrences.exists()); assertNull(resourceDirectory.listFiles()); } private static File getResourceDirectory() { File f = null; try { f = FileUtils.createTempDir(); } catch (IOException e) { e.printStackTrace(); } return f; } }