package fr.gouv.vitam.worker.core.api; 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.anyObject; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import java.io.File; import java.util.ArrayList; import java.util.List; import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.Status; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PowerMockIgnore; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; import fr.gouv.vitam.common.PropertiesUtils; import fr.gouv.vitam.common.guid.GUIDFactory; import fr.gouv.vitam.processing.common.model.IOParameter; import fr.gouv.vitam.processing.common.model.ProcessingUri; import fr.gouv.vitam.processing.common.model.UriPrefix; import fr.gouv.vitam.worker.common.HandlerIO; import fr.gouv.vitam.worker.core.impl.HandlerIOImpl; import fr.gouv.vitam.workspace.api.exception.ContentAddressableStorageNotFoundException; import fr.gouv.vitam.workspace.client.WorkspaceClient; import fr.gouv.vitam.workspace.client.WorkspaceClientFactory; @RunWith(PowerMockRunner.class) @PowerMockIgnore("javax.net.ssl.*") @PrepareForTest({WorkspaceClientFactory.class}) public class HandlerIOTest { private WorkspaceClient workspaceClient; private WorkspaceClientFactory workspaceClientFactory; @Before public void setUp() { workspaceClient = mock(WorkspaceClient.class); PowerMockito.mockStatic(WorkspaceClientFactory.class); workspaceClientFactory = mock(WorkspaceClientFactory.class); PowerMockito.when(WorkspaceClientFactory.getInstance()).thenReturn(workspaceClientFactory); PowerMockito.when(WorkspaceClientFactory.getInstance().getClient()).thenReturn(workspaceClient); } @Test public void testHandlerIO() throws Exception { final HandlerIOImpl io = new HandlerIOImpl(GUIDFactory.newGUID().getId(), GUIDFactory.newGUID().getId()); assertTrue(io.checkHandlerIO(0, new ArrayList<>())); final File file = PropertiesUtils.getResourceFile("sip.xml"); final List<IOParameter> in = new ArrayList<>(); final ProcessingUri uri = new ProcessingUri(UriPrefix.MEMORY, "file"); in.add(new IOParameter().setUri(uri)); final List<IOParameter> out = new ArrayList<>(); out.add(new IOParameter().setUri(uri)); // First create a Memory out io.addOutIOParameters(out); assertEquals(0, io.getInput().size()); assertEquals(1, io.getOutput().size()); io.addOuputResult(0, file); assertEquals(io.getOutput().get(0), uri); assertEquals(io.getOutput(0), uri); // Now create a Memory in similar to out io.addInIOParameters(in); assertEquals(1, io.getInput().size()); assertEquals(io.getInput().get(0), file); assertEquals(io.getInput(0), file); final List<Class<?>> clasz = new ArrayList<>(); clasz.add(File.class); assertTrue(io.checkHandlerIO(1, clasz)); assertFalse(io.checkHandlerIO(1, new ArrayList<>())); assertFalse(io.checkHandlerIO(0, clasz)); // Now reset, leaving the HandlerIO empty io.reset(); assertTrue(io.checkHandlerIO(0, new ArrayList<>())); // After reset, adding again the very same In must give access to Memory items io.addInIOParameters(in); assertTrue(io.checkHandlerIO(0, clasz)); assertEquals(io.getInput().get(0), file); // After close, adding again the very same In must give no more access to Memory items io.close(); assertTrue(io.checkHandlerIO(0, new ArrayList<>())); io.addInIOParameters(in); assertFalse(io.checkHandlerIO(0, clasz)); assertNull(io.getInput(0)); } @Test public void testGetFileFromHandlerIO() throws Exception { when(workspaceClient.getObject(anyObject(), anyObject())) .thenReturn(Response.status(Status.OK).entity(PropertiesUtils.getResourceAsStream("sip.xml")).build()); try (final HandlerIO io = new HandlerIOImpl("containerName", "workerId")) { assertTrue(io.checkHandlerIO(0, new ArrayList<>())); final List<IOParameter> in = new ArrayList<>(); in.add(new IOParameter().setUri(new ProcessingUri(UriPrefix.WORKSPACE, "objectName")).setOptional(true)); final List<IOParameter> out = new ArrayList<>(); out.add(new IOParameter().setUri(new ProcessingUri(UriPrefix.WORKSPACE, "objectName"))); io.addInIOParameters(in); io.addOutIOParameters(out); final Object object = io.getInput(0); assertEquals(File.class, object.getClass()); io.addOuputResult(0, object, true); assertFalse(((File) object).exists()); } } @Test public void testConcurrentGetFileFromHandlerIO() throws Exception { when(workspaceClient.getObject(anyObject(), anyObject())) .thenReturn(Response.status(Status.OK).entity(PropertiesUtils.getResourceAsStream("sip.xml")).build()); final HandlerIOImpl io = new HandlerIOImpl("containerName", "workerId"); assertTrue(io.checkHandlerIO(0, new ArrayList<>())); final List<IOParameter> in = new ArrayList<>(); in.add(new IOParameter().setUri(new ProcessingUri(UriPrefix.WORKSPACE, "objectName")).setOptional(true)); final HandlerIOImpl io2 = new HandlerIOImpl("containerName", "workerId2"); assertTrue(io2.checkHandlerIO(0, new ArrayList<>())); io.addInIOParameters(in); final Object object = io.getInput(0); assertEquals(File.class, object.getClass()); assertTrue(((File) object).exists()); when(workspaceClient.getObject(anyObject(), anyObject())) .thenReturn(Response.status(Status.OK).entity(PropertiesUtils.getResourceAsStream("sip.xml")).build()); io2.addInIOParameters(in); final Object object2 = io2.getInput(0); assertEquals(File.class, object2.getClass()); assertTrue(((File) object2).exists()); io.close(); assertFalse(((File) object).exists()); assertTrue(((File) object2).exists()); io2.close(); assertFalse(((File) object2).exists()); } @Test(expected = IllegalArgumentException.class) public void testGetFileError() throws Exception { when(workspaceClient.getObject(anyObject(), anyObject())) .thenThrow(new ContentAddressableStorageNotFoundException("")); try (final HandlerIO io = new HandlerIOImpl("containerName", "workerId")) { assertTrue(io.checkHandlerIO(0, new ArrayList<>())); final List<IOParameter> in = new ArrayList<>(); in.add(new IOParameter().setUri(new ProcessingUri(UriPrefix.WORKSPACE, "objectName")).setOptional(false)); io.addInIOParameters(in); } } }