diff --git a/restcomm/restcomm.dao/src/main/java/org/restcomm/connect/dao/entities/SmsMessageFilter.java b/restcomm/restcomm.dao/src/main/java/org/restcomm/connect/dao/entities/SmsMessageFilter.java index 29fb9579ed..c644c7e983 100644 --- a/restcomm/restcomm.dao/src/main/java/org/restcomm/connect/dao/entities/SmsMessageFilter.java +++ b/restcomm/restcomm.dao/src/main/java/org/restcomm/connect/dao/entities/SmsMessageFilter.java @@ -35,7 +35,7 @@ @Immutable public class SmsMessageFilter { - private static final DateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd"); + public static final DateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd"); private String accountSid; private List accountSidSet; // if not-null we need the cdrs that belong to several accounts diff --git a/restcomm/restcomm.sms/src/test/java/org/restcomm/connect/sms/smpp/SmppMessageHandlerTest.java b/restcomm/restcomm.sms/src/test/java/org/restcomm/connect/sms/smpp/SmppMessageHandlerTest.java index 6ea789e5a5..ab5424206e 100644 --- a/restcomm/restcomm.sms/src/test/java/org/restcomm/connect/sms/smpp/SmppMessageHandlerTest.java +++ b/restcomm/restcomm.sms/src/test/java/org/restcomm/connect/sms/smpp/SmppMessageHandlerTest.java @@ -19,8 +19,14 @@ */ package org.restcomm.connect.sms.smpp; +import java.text.ParseException; import java.util.ArrayList; +import java.util.Arrays; +import java.util.Calendar; +import java.util.Collections; +import java.util.Date; import java.util.List; +import java.util.concurrent.TimeUnit; import akka.actor.Actor; import akka.actor.ActorRef; @@ -35,6 +41,8 @@ import com.cloudhopper.smpp.pdu.PduResponse; import com.cloudhopper.smpp.pdu.SubmitSmResp; import org.apache.commons.configuration.Configuration; +import org.joda.time.DateTime; +import org.joda.time.format.DateTimeFormatter; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Ignore; @@ -50,6 +58,7 @@ import org.restcomm.connect.dao.SmsMessagesDao; import org.restcomm.connect.dao.entities.IncomingPhoneNumber; import org.restcomm.connect.dao.entities.SmsMessage; +import org.restcomm.connect.dao.entities.SmsMessageFilter; import org.restcomm.connect.monitoringservice.MonitoringService; import org.restcomm.connect.sms.smpp.dlr.spi.DLRPayload; @@ -128,7 +137,7 @@ public void testRemover() { } @Test - public void testOnReceiveDlrPayload() { + public void testOnReceiveDlrPayload() throws ParseException { new JavaTestKit(system) { { // given @@ -137,10 +146,14 @@ public void testOnReceiveDlrPayload() { final DLRPayload dlrPayload = new DLRPayload(); dlrPayload.setId("12345"); - dlrPayload.setStat(SmsMessage.Status.QUEUED); + dlrPayload.setStat(SmsMessage.Status.UNDELIVERED); final SmsMessagesDao smsMessagesDao = mock(SmsMessagesDao.class); - final SmsMessage smsMessage = SmsMessage.builder().setSid(Sid.generate(Sid.Type.SMS_MESSAGE)).setSmppMessageId(dlrPayload.getId()).setStatus(SmsMessage.Status.SENDING).build(); + final SmsMessage smsMessage1 = SmsMessage.builder().setSid(Sid.generate(Sid.Type.SMS_MESSAGE)).setSmppMessageId(dlrPayload.getId()).setStatus(SmsMessage.Status.SENDING).build(); + final SmsMessage smsMessage2 = SmsMessage.builder().setSid(Sid.generate(Sid.Type.SMS_MESSAGE)).setSmppMessageId(dlrPayload.getId()).setStatus(SmsMessage.Status.SENDING).build(); + final SmsMessage smsMessage3 = SmsMessage.builder().setSid(Sid.generate(Sid.Type.SMS_MESSAGE)).setSmppMessageId(dlrPayload.getId()).setStatus(SmsMessage.Status.SENDING).build(); + + final List messages = Arrays.asList(smsMessage1, smsMessage2, smsMessage3); when(servletContext.getAttribute(DaoManager.class.getName())).thenReturn(daoManager); when(servletContext.getAttribute(Configuration.class.getName())).thenReturn(mock(Configuration.class)); @@ -149,7 +162,7 @@ public void testOnReceiveDlrPayload() { when(servletContext.getAttribute(NumberSelectorService.class.getName())).thenReturn(mock(NumberSelectorService.class)); when(daoManager.getSmsMessagesDao()).thenReturn(smsMessagesDao); - when(smsMessagesDao.getSmsMessageBySmppMessageId(dlrPayload.getId())).thenReturn(smsMessage); + when(smsMessagesDao.getSmsMessages(any(SmsMessageFilter.class))).thenReturn(messages); final ActorRef messageHandler = system.actorOf(Props.apply(new Creator() { @Override @@ -162,17 +175,30 @@ public Actor create() throws Exception { messageHandler.tell(dlrPayload, getRef()); // then + final ArgumentCaptor filterCaptor = ArgumentCaptor.forClass(SmsMessageFilter.class); + verify(smsMessagesDao, timeout(50)).getSmsMessages(filterCaptor.capture()); + + final SmsMessageFilter filter = filterCaptor.getValue(); + assertEquals(dlrPayload.getId(), filter.getSmppMessageId()); + + final Date endDate = SmsMessageFilter.DATE_FORMAT.parse(filter.getEndTime()); + assertEquals(3, TimeUnit.DAYS.convert(new Date().getTime() - endDate.getTime(), TimeUnit.MILLISECONDS)); + final ArgumentCaptor smsCaptor = ArgumentCaptor.forClass(SmsMessage.class); - verify(smsMessagesDao, timeout(50)).updateSmsMessage(smsCaptor.capture()); - assertNotNull(smsCaptor.getValue()); - assertNull(smsCaptor.getValue().getSmppMessageId()); - assertEquals(dlrPayload.getStat(), smsCaptor.getValue().getStatus()); + verify(smsMessagesDao, timeout(50).times(3)).updateSmsMessage(smsCaptor.capture()); + final List capturedSms = smsCaptor.getAllValues(); + assertNull(capturedSms.get(0).getSmppMessageId()); + assertEquals(dlrPayload.getStat(), capturedSms.get(0).getStatus()); + assertNull(capturedSms.get(1).getSmppMessageId()); + assertEquals(SmsMessage.Status.SENT, capturedSms.get(1).getStatus()); + assertNull(capturedSms.get(2).getSmppMessageId()); + assertEquals(SmsMessage.Status.SENT, capturedSms.get(2).getStatus()); } }; } @Test - public void testOnReceiveDlrPayloadForUnknownSms() { + public void testOnReceiveDlrPayloadForUnknownSms() throws ParseException { new JavaTestKit(system) { { // given @@ -189,8 +215,10 @@ public void testOnReceiveDlrPayloadForUnknownSms() { when(servletContext.getAttribute(MonitoringService.class.getName())).thenReturn(mock(ActorRef.class)); when(servletContext.getAttribute(NumberSelectorService.class.getName())).thenReturn(mock(NumberSelectorService.class)); + final List messages = Collections.emptyList(); + when(daoManager.getSmsMessagesDao()).thenReturn(smsMessagesDao); - when(smsMessagesDao.getSmsMessageBySmppMessageId(dlrPayload.getId())).thenReturn(null); + when(smsMessagesDao.getSmsMessages(any(SmsMessageFilter.class))).thenReturn(messages); final ActorRef messageHandler = system.actorOf(Props.apply(new Creator() { @Override @@ -203,6 +231,15 @@ public Actor create() throws Exception { messageHandler.tell(dlrPayload, getRef()); // then + final ArgumentCaptor filterCaptor = ArgumentCaptor.forClass(SmsMessageFilter.class); + verify(smsMessagesDao, timeout(50)).getSmsMessages(filterCaptor.capture()); + + final SmsMessageFilter filter = filterCaptor.getValue(); + assertEquals(dlrPayload.getId(), filter.getSmppMessageId()); + + final Date endDate = SmsMessageFilter.DATE_FORMAT.parse(filter.getEndTime()); + assertEquals(3, TimeUnit.DAYS.convert(new Date().getTime() - endDate.getTime(), TimeUnit.MILLISECONDS)); + verify(smsMessagesDao, never()).updateSmsMessage(any(SmsMessage.class)); } };