package org.gbif.occurrence.download.service; import org.gbif.api.model.occurrence.Download; import org.gbif.api.model.occurrence.Download.Status; import org.gbif.api.model.occurrence.DownloadFormat; import org.gbif.api.model.occurrence.DownloadRequest; import org.gbif.api.model.occurrence.predicate.EqualsPredicate; import org.gbif.api.model.occurrence.predicate.Predicate; import org.gbif.api.model.occurrence.search.OccurrenceSearchParameter; import org.gbif.api.service.registry.OccurrenceDownloadService; import java.util.Date; import java.util.List; import javax.mail.MessagingException; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import org.apache.oozie.client.OozieClient; import org.apache.oozie.client.OozieClientException; import org.apache.oozie.client.WorkflowJob; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Matchers; import org.powermock.api.mockito.mockpolicies.Slf4jMockPolicy; import org.powermock.core.classloader.annotations.MockPolicy; import org.powermock.core.classloader.annotations.PowerMockIgnore; import org.powermock.modules.junit4.PowerMockRunner; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import static org.mockito.Matchers.anyString; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.reset; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; @MockPolicy(Slf4jMockPolicy.class) @PowerMockIgnore({"javax.management.*", "javax.xml.*", "org.xml.*", "com.sun.org.apache.xerces.*", "org.w3c.dom.*"}) @RunWith(PowerMockRunner.class) public class CallbackServiceTest { private static final String DOWNLOAD_ID = "0000092-120518122602221"; private static final String JOB_ID = DOWNLOAD_ID + "-oozie-oozi-W"; private static final String KILLED = "KILLED"; private static final String FAILED = "FAILED"; private static final String SUCCEEDED = "SUCCEEDED"; private static final String RUNNING = "RUNNING"; private static final Predicate DEFAULT_TEST_PREDICATE = new EqualsPredicate(OccurrenceSearchParameter.CATALOG_NUMBER, "bar"); private static final String TEST_USER = "admin"; private static final List<String> EMAILS = Lists.newArrayList("tests@gbif.org"); private OozieClient oozieClient; private CallbackService service; private OccurrenceDownloadService occurrenceDownloadService; private DownloadEmailUtils downloadEmailUtils; private DownloadLimitsService downloadLimitsService; /** * Creates a mock download object. */ private static Download mockDownload() { DownloadRequest downloadRequest = new DownloadRequest(DEFAULT_TEST_PREDICATE, TEST_USER, EMAILS, true, DownloadFormat.DWCA); Download download = new Download(); download.setRequest(downloadRequest); download.setKey(DOWNLOAD_ID); download.setDownloadLink(JOB_ID + ".zip"); download.setCreated(new Date()); download.setModified(new Date()); download.setStatus(Status.PREPARING); return download; } @Before public void setup() { downloadEmailUtils = mock(DownloadEmailUtils.class); occurrenceDownloadService = mock(OccurrenceDownloadService.class); downloadLimitsService= mock(DownloadLimitsService.class); when(downloadLimitsService.isInDownloadLimits(Matchers.any(String.class))).thenReturn(true); when(occurrenceDownloadService.get(anyString())).thenReturn(mockDownload()); oozieClient = mock(OozieClient.class); service = new DownloadRequestServiceImpl(oozieClient, Maps.<String, String>newHashMap(), "http://localhost:8080/", "", occurrenceDownloadService, downloadEmailUtils,downloadLimitsService); } @Test public void testIgnoreRunningJobs() { service.processCallback(JOB_ID, RUNNING); verifyNoMoreInteractions(oozieClient); } @Test(expected = IllegalArgumentException.class) public void testIgnoreWrongStatuses() { service.processCallback(JOB_ID, "INVALID"); verifyNoMoreInteractions(downloadEmailUtils); } @Test public void testNotificationSent() throws OozieClientException, MessagingException { WorkflowJob job = mock(WorkflowJob.class); when(oozieClient.getJobInfo(JOB_ID)).thenReturn(job); when(job.getId()).thenReturn(JOB_ID); when(job.getCreatedTime()).thenReturn(new Date()); when(job.getConf()) .thenReturn( "<configuration>" + "<property><name>" + Constants.USER_PROPERTY + "</name>" + "<value>test</value></property>" + "<property><name>" + Constants.NOTIFICATION_PROPERTY + "</name>" + "<value>test@gbif.org</value></property>" + "<property><name>" + Constants.FILTER_PROPERTY + "</name>" + "<value>{\"type\":\"equals\",\"key\":\"DATASET_KEY\",\"value\":\"8575f23e-f762-11e1-a439-00145eb45e9a\"}</value></property>" + "</configuration>"); service.processCallback(JOB_ID, SUCCEEDED); } @Test public void testNotifyAdminForFailedJobs() { Logger logger = LoggerFactory.getLogger(CallbackService.class); service.processCallback(JOB_ID, KILLED); verify(logger).error(eq(Constants.NOTIFY_ADMIN), anyString(), eq(JOB_ID), eq(KILLED)); reset(logger); service.processCallback(JOB_ID, FAILED); verify(logger).error(eq(Constants.NOTIFY_ADMIN), anyString(), eq(JOB_ID), eq(FAILED)); reset(logger); } }