diff --git a/restcomm/restcomm.application/src/main/webapp/WEB-INF/scripts/mariadb/sql/sms-messages.xml b/restcomm/restcomm.application/src/main/webapp/WEB-INF/scripts/mariadb/sql/sms-messages.xml index 1f3e89dcd6..478217ef57 100644 --- a/restcomm/restcomm.application/src/main/webapp/WEB-INF/scripts/mariadb/sql/sms-messages.xml +++ b/restcomm/restcomm.application/src/main/webapp/WEB-INF/scripts/mariadb/sql/sms-messages.xml @@ -126,10 +126,8 @@ LIMIT #{limit} OFFSET #{offset} - SELECT * FROM "restcomm_sms_messages" AS "restcomm_sms_messages" WHERE "smpp_message_id" = #{smppMessageId} - AND "date_created" >= #{startDate} - ORDER BY "date_created" DESC diff --git a/restcomm/restcomm.application/src/main/webapp/WEB-INF/sql/sms-messages.xml b/restcomm/restcomm.application/src/main/webapp/WEB-INF/sql/sms-messages.xml index e526ec6a83..20f6aa75e4 100644 --- a/restcomm/restcomm.application/src/main/webapp/WEB-INF/sql/sms-messages.xml +++ b/restcomm/restcomm.application/src/main/webapp/WEB-INF/sql/sms-messages.xml @@ -125,11 +125,10 @@ order by "date_created" LIMIT #{limit} OFFSET #{offset} - SELECT * FROM "restcomm_sms_messages" AS "restcomm_sms_messages" WHERE "smpp_message_id" = #{smppMessageId} - AND "date_created" >= #{startDate} - ORDER BY "date_created" DESC diff --git a/restcomm/restcomm.dao/src/main/java/org/restcomm/connect/dao/SmsMessagesDao.java b/restcomm/restcomm.dao/src/main/java/org/restcomm/connect/dao/SmsMessagesDao.java index 0d0021d2b1..0fe75ca8c2 100644 --- a/restcomm/restcomm.dao/src/main/java/org/restcomm/connect/dao/SmsMessagesDao.java +++ b/restcomm/restcomm.dao/src/main/java/org/restcomm/connect/dao/SmsMessagesDao.java @@ -55,5 +55,5 @@ public interface SmsMessagesDao { Integer getTotalSmsMessage(SmsMessageFilter filter); List getSmsMessages(SmsMessageFilter filter); - List findBySmppMessageIdAndDateCreatedGreaterOrEqualThanOrderedByDateCreatedDesc(String smppMessageId, DateTime startDate); + List findBySmppMessageId(String smppMessageId); } diff --git a/restcomm/restcomm.dao/src/main/java/org/restcomm/connect/dao/mybatis/MybatisSmsMessagesDao.java b/restcomm/restcomm.dao/src/main/java/org/restcomm/connect/dao/mybatis/MybatisSmsMessagesDao.java index 03c669ba8c..2ffe43f25b 100644 --- a/restcomm/restcomm.dao/src/main/java/org/restcomm/connect/dao/mybatis/MybatisSmsMessagesDao.java +++ b/restcomm/restcomm.dao/src/main/java/org/restcomm/connect/dao/mybatis/MybatisSmsMessagesDao.java @@ -22,8 +22,6 @@ import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.joda.time.DateTime; -import org.joda.time.format.DateTimeFormat; -import org.joda.time.format.DateTimeFormatter; import org.restcomm.connect.commons.annotations.concurrency.ThreadSafe; import org.restcomm.connect.commons.dao.Sid; import org.restcomm.connect.dao.SmsMessagesDao; @@ -198,19 +196,16 @@ public int getSmsMessagesPerAccountLastPerMinute(String accountSid) throws Parse } @Override - public List findBySmppMessageIdAndDateCreatedGreaterOrEqualThanOrderedByDateCreatedDesc(String smppMessageId, DateTime startDate) { - final DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss"); + public List findBySmppMessageId(String smppMessageId) { final Map parameters = new HashMap<>(2); parameters.put("smppMessageId", smppMessageId); - parameters.put("startDate", formatter.print(startDate.withTime(0, 0, 0, 0))); - final SqlSession session = this.sessions.openSession(); try { - final List> results = session.selectList(namespace + "findBySmppMessageIdAndDateCreatedGreaterOrEqualThanOrderedByDateCreatedDesc", parameters); + final List> results = session.selectList(namespace + "findBySmppMessageId", parameters); final List messages = new ArrayList<>(results.size()); - for (Map result: results) { + for (Map result : results) { messages.add(toSmsMessage(result)); } return messages; diff --git a/restcomm/restcomm.dao/src/main/resources/org/restcomm/connect/dao/mybatis/sms-messages.xml b/restcomm/restcomm.dao/src/main/resources/org/restcomm/connect/dao/mybatis/sms-messages.xml index 837f4f19d0..fe2161e1ea 100644 --- a/restcomm/restcomm.dao/src/main/resources/org/restcomm/connect/dao/mybatis/sms-messages.xml +++ b/restcomm/restcomm.dao/src/main/resources/org/restcomm/connect/dao/mybatis/sms-messages.xml @@ -127,11 +127,9 @@ LIMIT #{limit} OFFSET #{offset} - SELECT * FROM "restcomm_sms_messages" AS "restcomm_sms_messages" WHERE "smpp_message_id" = #{smppMessageId} - AND "date_created" >= #{startDate} - ORDER BY "date_created" DESC diff --git a/restcomm/restcomm.dao/src/test/java/org/restcomm/connect/dao/mybatis/SmsMessagesDaoTest.java b/restcomm/restcomm.dao/src/test/java/org/restcomm/connect/dao/mybatis/SmsMessagesDaoTest.java index 780eb15a84..97f4ab74e9 100644 --- a/restcomm/restcomm.dao/src/test/java/org/restcomm/connect/dao/mybatis/SmsMessagesDaoTest.java +++ b/restcomm/restcomm.dao/src/test/java/org/restcomm/connect/dao/mybatis/SmsMessagesDaoTest.java @@ -116,9 +116,9 @@ public void createReadUpdateDelete() { // Validate that the CDR was removed. assertTrue(messages.getSmsMessage(sid) == null); } - + private SmsMessage createSms() { - return createSms(Sid.generate(Sid.Type.ACCOUNT), SmsMessage.Direction.OUTBOUND_API, 0, DateTime.now()); + return createSms(Sid.generate(Sid.Type.ACCOUNT), SmsMessage.Direction.OUTBOUND_API, 0, DateTime.now()); } private SmsMessage createSms(Sid account, SmsMessage.Direction direction, int index, DateTime date) { @@ -134,7 +134,7 @@ private SmsMessage createSms(Sid account, SmsMessage.Direction direction, int in .setApiVersion("2012-04-24") .setRecipient("+12223334444") .setSender("+17778889999") - .setBody("Hello World - "+index) + .setBody("Hello World - " + index) .setStatus(SmsMessage.Status.SENDING) .setDirection(direction) .setPrice(new BigDecimal("0.00")) @@ -154,22 +154,22 @@ public void testGetSmsMessagesLastMinute() throws InterruptedException, ParseExc SmsMessage message = createSms(account, SmsMessage.Direction.OUTBOUND_API, i, oneMinuteAgo); // Create a new sms message in the data store. messages.addSmsMessage(message); - logger.info("Created message: "+message); + logger.info("Created message: " + message); } for (int i = 0; i < 2; i++) { SmsMessage message = createSms(account, SmsMessage.Direction.OUTBOUND_CALL, i, oneMinuteAgo); // Create a new sms message in the data store. messages.addSmsMessage(message); - logger.info("Created message: "+message); + logger.info("Created message: " + message); } for (int i = 0; i < 2; i++) { SmsMessage message = createSms(account, SmsMessage.Direction.OUTBOUND_REPLY, i, oneMinuteAgo); // Create a new sms message in the data store. messages.addSmsMessage(message); - logger.info("Created message: "+message); + logger.info("Created message: " + message); } int lastMessages = messages.getSmsMessagesPerAccountLastPerMinute(account.toString()); - logger.info("SMS Messages last minutes: "+lastMessages); + logger.info("SMS Messages last minutes: " + lastMessages); assertEquals(6, lastMessages); Thread.sleep(5000); DateTime oneMinuteLater = DateTime.now(); @@ -177,10 +177,10 @@ public void testGetSmsMessagesLastMinute() throws InterruptedException, ParseExc SmsMessage message = createSms(account, SmsMessage.Direction.OUTBOUND_CALL, i, oneMinuteLater); // Create a new sms message in the data store. messages.addSmsMessage(message); - logger.info("Created message: "+message); + logger.info("Created message: " + message); } lastMessages = messages.getSmsMessagesPerAccountLastPerMinute(account.toString()); - logger.info("SMS Messages last minutes: "+lastMessages); + logger.info("SMS Messages last minutes: " + lastMessages); assertEquals(3, lastMessages); messages.removeSmsMessages(account); } @@ -217,20 +217,20 @@ public void testReadDeleteByAccount() { } @Test - public void testUpdateSmsMessageDateSentAndStatusAndGetBySmppMsgId(){ - final DateTime dateSent = DateTime.now(); - final SmsMessage.Status status = SmsMessage.Status.SENT; - final String smppMessageId = "0000058049"; + public void testUpdateSmsMessageDateSentAndStatusAndGetBySmppMsgId() { + final DateTime dateSent = DateTime.now(); + final SmsMessage.Status status = SmsMessage.Status.SENT; + final String smppMessageId = "0000058049"; - // add a new msg - SmsMessage smsMessage = createSms(); - final SmsMessagesDao messages = manager.getSmsMessagesDao(); + // add a new msg + SmsMessage smsMessage = createSms(); + final SmsMessagesDao messages = manager.getSmsMessagesDao(); messages.addSmsMessage(smsMessage); //set status and dateSent - smsMessage = smsMessage.setStatus(status).setDateSent(dateSent).setSmppMessageId(smppMessageId); - messages.updateSmsMessage(smsMessage); - + smsMessage = smsMessage.setStatus(status).setDateSent(dateSent).setSmppMessageId(smppMessageId); + messages.updateSmsMessage(smsMessage); + //get SmsMessage By SmppMessageId SmsMessage resultantSmsMessage = messages.getSmsMessageBySmppMessageId(smppMessageId); @@ -271,13 +271,14 @@ public void testFindBySmppMessageIdAndDateCreatedGreaterOrEqualThanOrderedByDate smsMessagesDao.addSmsMessage(smsMessage6); smsMessagesDao.addSmsMessage(smsMessage7); - final List messages = smsMessagesDao.findBySmppMessageIdAndDateCreatedGreaterOrEqualThanOrderedByDateCreatedDesc(smppMessageId, threeDaysAgo); + final List messages = smsMessagesDao.findBySmppMessageId(smppMessageId); + // then try { - assertEquals(3, messages.size()); - assertEquals(smsMessage6.getSid(), messages.get(0).getSid()); - assertEquals(smsMessage5.getSid(), messages.get(1).getSid()); - assertEquals(smsMessage3.getSid(), messages.get(2).getSid()); + assertEquals(5, messages.size()); + for (SmsMessage message: messages) { + assertEquals(smppMessageId, message.getSmppMessageId()); + } } finally { smsMessagesDao.removeSmsMessages(accountSid); } diff --git a/restcomm/restcomm.sms/src/main/java/org/restcomm/connect/sms/smpp/SmppMessageHandler.java b/restcomm/restcomm.sms/src/main/java/org/restcomm/connect/sms/smpp/SmppMessageHandler.java index b4846be004..8ee9054312 100644 --- a/restcomm/restcomm.sms/src/main/java/org/restcomm/connect/sms/smpp/SmppMessageHandler.java +++ b/restcomm/restcomm.sms/src/main/java/org/restcomm/connect/sms/smpp/SmppMessageHandler.java @@ -149,24 +149,15 @@ public void onReceive(Object message) throws Exception { logger.debug("DLR Received for SMPP Message " + deliveryReceipt.getId() + " with status " + deliveryStatus); } - // Find all messages correlated with SMPP Message ID in last three days - final List smsMessages = this.storage.getSmsMessagesDao().findBySmppMessageIdAndDateCreatedGreaterOrEqualThanOrderedByDateCreatedDesc(smppMessageId, DateTime.now().minusDays(3)); - - // Update status of messages and remove correlation with SMPP Message ID - // IMPORTANT: First message in the results list is considered the real target of the DLR - // BS-232: Other "pending" messages that might share correlation with same SMPP Message ID will have their status forcefully updated to SENT - final int smsCount = smsMessages.size(); - if (smsCount == 0) { - logger.warning("responseMessageId=" + deliveryReceipt.getId() + " was never received! "); - } else { - for (int index = 0; index < smsCount; index++) { - final SmsMessage.Status status = (index > 0) ? SmsMessage.Status.SENT : deliveryStatus; - this.storage.getSmsMessagesDao().updateSmsMessage(smsMessages.get(index).setSmppMessageId(null).setStatus(status)); + // Find message bound to the SMPP Message ID + // NOTE: We ensure there is only one message bound to any SmppMessageId at this point because uniqueness is enforced on submit_response event + final SmsMessage sms = this.storage.getSmsMessagesDao().getSmsMessageBySmppMessageId(smppMessageId); - if (index > 0) { - logger.warning("Correlation between SmsMessage " + smsMessages.get(index).getSid() + " and SMPP Message " + smppMessageId + " expired. Status forcefully set to " + status); - } - } + // Update status of message and remove correlation with SMPP Message ID + if (sms == null) { + logger.warning("responseMessageId=" + smppMessageId + " was never received!"); + } else { + this.storage.getSmsMessagesDao().updateSmsMessage(sms.setSmppMessageId(null).setStatus(deliveryStatus)); } } else if (message instanceof CreateSmsSession) { IExtensionCreateSmsSessionRequest ier = (CreateSmsSession) message; @@ -187,43 +178,41 @@ public void onReceive(Object message) throws Exception { final ActorRef session = destroySmsSession.session(); context.stop(session); } else if (message instanceof PduAsyncResponse) { - - PduAsyncResponse pduAsyncResponse = (PduAsyncResponse) message; - + final PduAsyncResponse pduAsyncResponse = (PduAsyncResponse) message; if (pduAsyncResponse instanceof DefaultPduAsyncResponse && pduAsyncResponse.getResponse() instanceof SubmitSmResp) { - SubmitSmResp submitSmResp = (SubmitSmResp) pduAsyncResponse.getResponse(); + final SubmitSmResp submitSmResp = (SubmitSmResp) pduAsyncResponse.getResponse(); if (logger.isInfoEnabled()) { logger.info(" ********** SmppMessageHandler received SubmitSmResp: " + submitSmResp + "SubmitSmResp Status:" + submitSmResp.getCommandStatus()); } - String smppMessageId = submitSmResp.getMessageId(); - - Object ref = pduAsyncResponse.getRequest().getReferenceObject(); + final String smppMessageId = submitSmResp.getMessageId(); + final Object ref = pduAsyncResponse.getRequest().getReferenceObject(); if (ref != null && ref instanceof Sid) { // BS-230: Ensure there is no other message sharing same SMPP Message ID - SmsMessage existingMessage = this.storage.getSmsMessagesDao().getSmsMessageBySmppMessageId(smppMessageId); - if (existingMessage != null) { - // Cut correlation between SMS and SMPP Message ID and update message to a final state - existingMessage = existingMessage.setSmppMessageId(null); - logger.warning("Correlation between SmsMessage " + existingMessage.getSid() + " and SMPP Message " + smppMessageId + " expired."); - this.storage.getSmsMessagesDao().updateSmsMessage(existingMessage); + final List smsMessages = this.storage.getSmsMessagesDao().findBySmppMessageId(smppMessageId); + + // Delete correlation between messages and SMPP Message ID + for (SmsMessage smsMessage : smsMessages) { + this.storage.getSmsMessagesDao().updateSmsMessage(smsMessage.setSmppMessageId(null)); + logger.warning("Correlation between SmsMessage " + smsMessage.getSid() + " and SMPP Message " + smppMessageId + " expired."); } - Sid sid = (Sid) ref; - SmsMessage smsMessage = storage.getSmsMessagesDao().getSmsMessage(sid); - if (submitSmResp.getCommandStatus() != 0) { - logger.warning(String.format("SubmitSmResp Failure! Message could not be sent Status Code %s Result Messages: %s", submitSmResp.getCommandStatus(), submitSmResp.getResultMessage())); - smsMessage = smsMessage.setSmppMessageId(smppMessageId).setStatus(SmsMessage.Status.FAILED); - } else { - //update smppMessageId as well as status to SENT and date sent + // Update status of target message + SmsMessage smsMessage = storage.getSmsMessagesDao().getSmsMessage((Sid) ref); + if (submitSmResp.getCommandStatus() == SmppConstants.STATUS_OK) { + // Successful reponse: update smppMessageId as well as status to SENT and date sent smsMessage = smsMessage.setSmppMessageId(smppMessageId).setStatus(SmsMessage.Status.SENT).setDateSent(DateTime.now()); + } else { + // Failure response: set status to FAILED and do not correlate to any smppMessageId + logger.warning(String.format("SubmitSmResp Failure! Message could not be sent Status Code %s Result Messages: %s", submitSmResp.getCommandStatus(), submitSmResp.getResultMessage())); + smsMessage = smsMessage.setSmppMessageId(null).setStatus(SmsMessage.Status.FAILED); } storage.getSmsMessagesDao().updateSmsMessage(smsMessage); } else { logger.warning("PduAsyncResponse reference is null or not Sid"); } - } else { + } else if (logger.isInfoEnabled()) { logger.info("PduAsyncResponse not SubmitSmResp " + pduAsyncResponse.getClass().toString()); } } 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 e1ec6f76e3..a996425c44 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 @@ -30,7 +30,6 @@ import com.cloudhopper.smpp.pdu.PduRequest; import com.cloudhopper.smpp.pdu.SubmitSmResp; import org.apache.commons.configuration.Configuration; -import org.joda.time.DateTime; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; @@ -50,9 +49,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; -import java.util.Date; import java.util.List; -import java.util.concurrent.TimeUnit; import static org.junit.Assert.*; import static org.mockito.Mockito.*; @@ -141,11 +138,7 @@ public void testOnReceiveDlrPayload() throws ParseException { dlrPayload.setStat(SmsMessage.Status.UNDELIVERED); final SmsMessagesDao smsMessagesDao = mock(SmsMessagesDao.class); - 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); + final SmsMessage message = SmsMessage.builder().setSid(Sid.generate(Sid.Type.SMS_MESSAGE)).setSmppMessageId(dlrPayload.getId()).setStatus(SmsMessage.Status.SENT).build(); when(servletContext.getAttribute(DaoManager.class.getName())).thenReturn(daoManager); when(servletContext.getAttribute(Configuration.class.getName())).thenReturn(mock(Configuration.class)); @@ -154,7 +147,7 @@ public void testOnReceiveDlrPayload() throws ParseException { when(servletContext.getAttribute(NumberSelectorService.class.getName())).thenReturn(mock(NumberSelectorService.class)); when(daoManager.getSmsMessagesDao()).thenReturn(smsMessagesDao); - when(smsMessagesDao.findBySmppMessageIdAndDateCreatedGreaterOrEqualThanOrderedByDateCreatedDesc(eq(dlrPayload.getId()), any(DateTime.class))).thenReturn(messages); + when(smsMessagesDao.getSmsMessageBySmppMessageId(dlrPayload.getId())).thenReturn(message); final ActorRef messageHandler = system.actorOf(Props.apply(new Creator() { @Override @@ -167,19 +160,12 @@ public Actor create() throws Exception { messageHandler.tell(dlrPayload, getRef()); // then - final ArgumentCaptor dateCaptor = ArgumentCaptor.forClass(DateTime.class); - verify(smsMessagesDao, timeout(50)).findBySmppMessageIdAndDateCreatedGreaterOrEqualThanOrderedByDateCreatedDesc(eq(dlrPayload.getId()), dateCaptor.capture()); - assertEquals(3, TimeUnit.DAYS.convert(new Date().getTime() - dateCaptor.getValue().toDate().getTime(), TimeUnit.MILLISECONDS)); + verify(smsMessagesDao, timeout(50)).getSmsMessageBySmppMessageId(dlrPayload.getId()); final ArgumentCaptor smsCaptor = ArgumentCaptor.forClass(SmsMessage.class); - 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()); + verify(smsMessagesDao, timeout(50)).updateSmsMessage(smsCaptor.capture()); + assertNull(smsCaptor.getValue().getSmppMessageId()); + assertEquals(dlrPayload.getStat(), smsCaptor.getValue().getStatus()); } }; } @@ -202,10 +188,8 @@ public void testOnReceiveDlrPayloadForUnknownSms() throws ParseException { 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.findBySmppMessageIdAndDateCreatedGreaterOrEqualThanOrderedByDateCreatedDesc(eq(dlrPayload.getId()), any(DateTime.class))).thenReturn(messages); + when(smsMessagesDao.getSmsMessageBySmppMessageId(dlrPayload.getId())).thenReturn(null); final ActorRef messageHandler = system.actorOf(Props.apply(new Creator() { @Override @@ -218,10 +202,7 @@ public Actor create() throws Exception { messageHandler.tell(dlrPayload, getRef()); // then - final ArgumentCaptor dateCaptor = ArgumentCaptor.forClass(DateTime.class); - verify(smsMessagesDao, timeout(50)).findBySmppMessageIdAndDateCreatedGreaterOrEqualThanOrderedByDateCreatedDesc(eq(dlrPayload.getId()), dateCaptor.capture()); - assertEquals(3, TimeUnit.DAYS.convert(new Date().getTime() - dateCaptor.getValue().toDate().getTime(), TimeUnit.MILLISECONDS)); - + verify(smsMessagesDao, timeout(50)).getSmsMessageBySmppMessageId(dlrPayload.getId()); verify(smsMessagesDao, never()).updateSmsMessage(any(SmsMessage.class)); } }; @@ -259,6 +240,13 @@ public void testOnReceivePduAsyncResponseWithExistingSmppMessageCorrelation() { when(smsMessagesDao.getSmsMessageBySmppMessageId(smppMessageId)).thenReturn(existingSmsMessage); when(smsMessagesDao.getSmsMessage(smsMessage.getSid())).thenReturn(smsMessage); + final SmsMessage smsMessageWithSmppMessageId1 = SmsMessage.builder().setSid(Sid.generate(Sid.Type.SMS_MESSAGE)).setSmppMessageId(smppMessageId).setStatus(SmsMessage.Status.SENT).build(); + final SmsMessage smsMessageWithSmppMessageId2 = SmsMessage.builder().setSid(Sid.generate(Sid.Type.SMS_MESSAGE)).setSmppMessageId(smppMessageId).setStatus(SmsMessage.Status.SENT).build(); + final SmsMessage smsMessageWithSmppMessageId3 = SmsMessage.builder().setSid(Sid.generate(Sid.Type.SMS_MESSAGE)).setSmppMessageId(smppMessageId).setStatus(SmsMessage.Status.SENT).build(); + final List messages = Arrays.asList(smsMessageWithSmppMessageId1, smsMessageWithSmppMessageId2, smsMessageWithSmppMessageId3); + + when(smsMessagesDao.findBySmppMessageId(smppMessageId)).thenReturn(messages); + final ActorRef messageHandler = system.actorOf(Props.apply(new Creator() { @Override public Actor create() throws Exception { @@ -271,14 +259,21 @@ public Actor create() throws Exception { // then final ArgumentCaptor smsCaptor = ArgumentCaptor.forClass(SmsMessage.class); - verify(smsMessagesDao, timeout(50).times(2)).updateSmsMessage(smsCaptor.capture()); + verify(smsMessagesDao, timeout(50).times(4)).updateSmsMessage(smsCaptor.capture()); final List capturedSms = smsCaptor.getAllValues(); - assertEquals(2, capturedSms.size()); assertNull(capturedSms.get(0).getSmppMessageId()); - assertEquals(SmsMessage.Status.QUEUED, capturedSms.get(0).getStatus()); - assertEquals(smppMessageId, capturedSms.get(1).getSmppMessageId()); + assertEquals(SmsMessage.Status.SENT, 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()); + + assertEquals(smsMessage.getSid(), capturedSms.get(3).getSid()); + assertEquals(smppMessageId, capturedSms.get(3).getSmppMessageId()); + assertEquals(SmsMessage.Status.SENT, capturedSms.get(3).getStatus()); } }; }