package eu.europeana.cloud.service.dps.rest; import eu.europeana.cloud.mcs.driver.DataSetServiceClient; import eu.europeana.cloud.mcs.driver.FileServiceClient; import eu.europeana.cloud.mcs.driver.RecordServiceClient; import eu.europeana.cloud.service.dps.ApplicationContextUtils; import eu.europeana.cloud.service.dps.DpsTask; import eu.europeana.cloud.service.dps.PluginParameterKeys; import eu.europeana.cloud.service.dps.service.utils.TopologyManager; import eu.europeana.cloud.service.dps.storm.utils.CassandraTaskInfoDAO; import eu.europeana.cloud.service.dps.utils.files.counter.FilesCounterFactory; import eu.europeana.cloud.service.mcs.exception.MCSException; import org.glassfish.jersey.test.JerseyTest; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.security.acls.model.*; import org.springframework.security.acls.model.Permission; import javax.ws.rs.Path; import javax.ws.rs.client.Entity; import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.Application; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import java.util.Arrays; import java.util.Collections; import java.util.Date; import java.util.HashMap; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyBoolean; import static org.mockito.Matchers.anyInt; import static org.mockito.Mockito.*; public class TopologyTasksResourceTest extends JerseyTest { private TopologyManager topologyManager; private MutableAclService mutableAclService; private WebTarget webTarget; private RecordServiceClient recordServiceClient; private ApplicationContext context; private DataSetServiceClient dataSetServiceClient; private FileServiceClient fileServiceClient; private CassandraTaskInfoDAO taskDAO; private FilesCounterFactory filesCounterFactory; @Override protected Application configure() { return new JerseyConfig().property("contextConfigLocation", "classpath:spiedDpsTestContext.xml"); } @Before public void init() { ApplicationContext applicationContext = ApplicationContextUtils.getApplicationContext(); topologyManager = applicationContext.getBean(TopologyManager.class); mutableAclService = applicationContext.getBean(MutableAclService.class); recordServiceClient = applicationContext.getBean(RecordServiceClient.class); filesCounterFactory = applicationContext.getBean(FilesCounterFactory.class); context = applicationContext.getBean(ApplicationContext.class); dataSetServiceClient = applicationContext.getBean(DataSetServiceClient.class); fileServiceClient = applicationContext.getBean(FileServiceClient.class); taskDAO = applicationContext.getBean(CassandraTaskInfoDAO.class); webTarget = target(TopologyTasksResource.class.getAnnotation(Path.class).value()); } @Test public void shouldProperlySendTask() throws MCSException { //given DpsTask task = new DpsTask("icTask"); task.addDataEntry(DpsTask.FILE_URLS, Arrays.asList("http://127.0.0.1:8080/mcs/records/FUWQ4WMUGIGEHVA3X7FY5PA3DR5Q4B2C4TWKNILLS6EM4SJNTVEQ/representations/TIFF/versions/86318b00-6377-11e5-a1c6-90e6ba2d09ef/files/sampleFileName.txt")); task.addParameter(PluginParameterKeys.MIME_TYPE, "image/tiff"); task.addParameter(PluginParameterKeys.OUTPUT_MIME_TYPE, "image/jp2"); String topologyName = "ic_topology"; prepareMocks(topologyName); //when WebTarget enrichedWebTarget = webTarget.resolveTemplate("topologyName", topologyName); //then Response sendTaskResponse = enrichedWebTarget.request().post(Entity.entity(task, MediaType.APPLICATION_JSON_TYPE)); try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } assertThat(sendTaskResponse.getStatus(), is(Response.Status.CREATED.getStatusCode())); } @Test public void shouldProperlySendTaskWithDatsetEntry() throws MCSException { //given DpsTask task = new DpsTask("icTask"); task.addDataEntry(DpsTask.DATASET_URLS, Arrays.asList("http://127.0.0.1:8080/mcs/data-providers/stormTestTopologyProvider/data-sets/tiffDataSets")); task.addParameter(PluginParameterKeys.OUTPUT_MIME_TYPE, "image/jp2"); task.addParameter(PluginParameterKeys.MIME_TYPE, "image/tiff"); String topologyName = "ic_topology"; prepareMocks(topologyName); //when WebTarget enrichedWebTarget = webTarget.resolveTemplate("topologyName", topologyName); //then Response sendTaskResponse = enrichedWebTarget.request().post(Entity.entity(task, MediaType.APPLICATION_JSON_TYPE)); try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } assertThat(sendTaskResponse.getStatus(), is(Response.Status.CREATED.getStatusCode())); } @Test public void shouldThrowDpsTaskValidationExceptionOnSendTask() throws MCSException { //given DpsTask task = new DpsTask("icTask"); task.addDataEntry(DpsTask.FILE_URLS, Arrays.asList("http://127.0.0.1:8080/mcs/records/FUWQ4WMUGIGEHVA3X7FY5PA3DR5Q4B2C4TWKNILLS6EM4SJNTVEQ/representations/TIFF/versions/86318b00-6377-11e5-a1c6-90e6ba2d09ef/files/sampleFileName.txt")); String topologyName = "ic_topology"; prepareMocks(topologyName); //when WebTarget enrichedWebTarget = webTarget.resolveTemplate("topologyName", topologyName); //then Response sendTaskResponse = enrichedWebTarget.request().post(Entity.entity(task, MediaType.APPLICATION_JSON_TYPE)); assertThat(sendTaskResponse.getStatus(), is(Response.Status.BAD_REQUEST.getStatusCode())); } private void prepareMocks(String topologyName) throws MCSException { //Mock security HashMap<String, String> user = new HashMap<>(); user.put(topologyName, "Smith"); MutableAcl mutableAcl = mock(MutableAcl.class); //Mock when(topologyManager.containsTopology(topologyName)).thenReturn(true); when(mutableAcl.getEntries()).thenReturn(Collections.EMPTY_LIST); doNothing().when(mutableAcl).insertAce(anyInt(), any(Permission.class), any(Sid.class), anyBoolean()); doNothing().when(taskDAO).insert(anyLong(), anyString(), anyInt(), anyString(), anyString(), isA(Date.class)); when(mutableAclService.readAclById(any(ObjectIdentity.class))).thenReturn(mutableAcl); when(context.getBean(RecordServiceClient.class)).thenReturn(recordServiceClient); when(context.getBean(FileServiceClient.class)).thenReturn(fileServiceClient); when(context.getBean(DataSetServiceClient.class)).thenReturn(dataSetServiceClient); doNothing().when(recordServiceClient).useAuthorizationHeader(anyString()); doNothing().when(dataSetServiceClient).useAuthorizationHeader(anyString()); doNothing().when(recordServiceClient).grantPermissionsToVersion(anyString(), anyString(), anyString(), anyString(), any(eu.europeana.cloud.common.model.Permission.class)); } }