def test_delivery_HttpConnector(self): yield self.connect('127.0.0.1', self.pbPort) # Connect to SMSC source_connector = Connector(id_generator()) yield self.prepareRoutingsAndStartConnector(source_connector) # Send a data_sm from the SMSC pdu = DataSM( source_addr='1234', destination_addr='4567', message_payload='any content', ) yield self.triggerDataSmFromSMSC([pdu]) # Run tests # Test callback in router self.assertEquals(self.pbRoot_f.deliver_sm_callback.call_count, 1) # Destination connector must receive the message one time (no retries) self.assertEqual(self.AckServerResource.render_GET.call_count, 1) # Assert received args receivedHttpReq = self.AckServerResource.last_request.args self.assertEqual(len(receivedHttpReq), 6) self.assertEqual(receivedHttpReq['from'], [pdu.params['source_addr']]) self.assertEqual(receivedHttpReq['to'], [pdu.params['destination_addr']]) self.assertEqual(receivedHttpReq['content'], [pdu.params['message_payload']]) self.assertEqual(receivedHttpReq['origin-connector'], [source_connector.cid]) # Disconnector from SMSC yield self.stopConnector(source_connector)
def test_delivery_failover_route(self): """#467: Will ensure a failover route will deliver the message""" yield self.connect('127.0.0.1', self.pbPort) # Connect to SMSC source_connector = Connector(id_generator()) wrong_port = self.AckServer.getHost().port + 1000 route = FailoverMORoute([TransparentFilter()], [ HttpConnector(id_generator(), 'http://127.0.0.1:%s/send' % wrong_port), HttpConnector( id_generator(), 'http://127.0.0.1:%s/send' % self.AckServer.getHost().port) ]) yield self.prepareRoutingsAndStartConnector(source_connector, route) # Send a data_sm from the SMSC pdu = DataSM( source_addr='1234', destination_addr='4567', message_payload='any content', ) yield self.triggerDataSmFromSMSC([pdu]) # Run tests # Test callback in router self.assertEquals(self.pbRoot_f.deliver_sm_callback.call_count, 1) # Destination connector must receive the message one time (no retries) self.assertEqual(self.AckServerResource.render_GET.call_count, 1) # Disconnector from SMSC yield self.stopConnector(source_connector)
def setUp(self, interceptorpb_client=None): yield HappySMSCTestCase.setUp(self) self.encoder = pdu_encoding.PDUEncoder() # SMPPServerConfig init self.smpps_config = SMPPServerConfig() # Portal init _portal = portal.Portal(SmppsRealm(self.smpps_config.id, self.pbRoot_f)) _portal.registerChecker(RouterAuthChecker(self.pbRoot_f)) # Install mocks self.clientManager_f.perspective_submit_sm = mock.Mock( wraps=self.clientManager_f.perspective_submit_sm) # SMPPServerFactory init self.smpps_factory = LastProtoSMPPServerFactory( self.smpps_config, auth_portal=_portal, RouterPB=self.pbRoot_f, SMPPClientManagerPB=self.clientManager_f, interceptorpb_client=interceptorpb_client) self.smpps_port = reactor.listenTCP(self.smpps_config.port, self.smpps_factory) # Init protocol for testing self.smpps_proto = self.smpps_factory.buildProtocol(('127.0.0.1', 0)) self.smpps_tr = proto_helpers.StringTransport() self.smpps_proto.makeConnection(self.smpps_tr) # Add SMPPs factory to DLRThrower self.DLRThrower.addSmpps(self.smpps_factory) # Install mocks self.smpps_proto.sendPDU = mock.Mock(wraps=self.smpps_proto.sendPDU) # PDUs used for tests self.SubmitSmPDU = SubmitSM( source_addr='1234', destination_addr='4567', short_message='hello !', seqNum=1, ) self.DeliverSmPDU = DeliverSM( source_addr='4567', destination_addr='1234', short_message='any content', seqNum=1, ) self.DataSmPDU = DataSM( source_addr='4567', destination_addr='1234', message_payload='any content', seqNum=1, )
def test_take_message_state_from_tlv_first(self): """Related to #427 When message_state is provided in short_message and in TLV param, consider the latter""" pdu = DataSM( source_addr='24206155423', destination_addr='JOOKIES', message_state=MessageState.ACCEPTED, receipted_message_id='5000', short_message= 'id:5000 submit date:201506201641 done date:201506201641 stat:DELIVRD err:000', ) isDlr = self.opFactory.isDeliveryReceipt(pdu) self.assertEquals(isDlr['stat'], 'ACCEPTD')
def test_unordered_long_content_delivery_HttpConnector(self): yield self.connect('127.0.0.1', self.pbPort) # Connect to SMSC source_connector = Connector(id_generator()) yield self.prepareRoutingsAndStartConnector(source_connector) # Send a data_sm from the SMSC basePdu = DataSM( source_addr='1234', destination_addr='4567', message_payload='', sar_total_segments=3, sar_msg_ref_num=int(id_generator(size=2, chars=string.digits)), ) pdu_part1 = copy.deepcopy(basePdu) pdu_part2 = copy.deepcopy(basePdu) pdu_part3 = copy.deepcopy(basePdu) pdu_part1.params[ 'message_payload'] = '__1st_part_with_153_char________________________________________________________________________________________________________________________________.' pdu_part1.params['sar_segment_seqnum'] = 1 pdu_part2.params[ 'message_payload'] = '__2nd_part_with_153_char________________________________________________________________________________________________________________________________.' pdu_part2.params['sar_segment_seqnum'] = 2 pdu_part3.params['message_payload'] = '__3rd_part_end.' pdu_part3.params['sar_segment_seqnum'] = 3 yield self.triggerDataSmFromSMSC([pdu_part1, pdu_part3, pdu_part2]) # Run tests # Destination connector must receive the message one time (no retries) self.assertEqual(self.AckServerResource.render_GET.call_count, 1) # Assert received args receivedHttpReq = self.AckServerResource.last_request.args self.assertEqual(len(receivedHttpReq), 6) self.assertEqual(receivedHttpReq['from'], [basePdu.params['source_addr']]) self.assertEqual(receivedHttpReq['to'], [basePdu.params['destination_addr']]) self.assertEqual(receivedHttpReq['content'], [ pdu_part1.params['message_payload'] + pdu_part2.params['message_payload'] + pdu_part3.params['message_payload'] ]) self.assertEqual(receivedHttpReq['origin-connector'], [source_connector.cid]) # Disconnector from SMSC yield self.stopConnector(source_connector)
def test_is_delivery_mmg_data_sm_92(self): """Related to #92, this is a Sicap's MMG data_sm receipt""" pdu = DataSM( source_addr='21698700177', destination_addr='JOOKIES', message_state=MessageState.DELIVERED, receipted_message_id='362d9701', ) isDlr = self.opFactory.isDeliveryReceipt(pdu) self.assertTrue(isDlr is not None) self.assertEquals(isDlr['id'], '362d9701') self.assertEquals(isDlr['sub'], 'ND') self.assertEquals(isDlr['dlvrd'], 'ND') self.assertEquals(isDlr['sdate'], 'ND') self.assertEquals(isDlr['ddate'], 'ND') self.assertEquals(isDlr['stat'], 'DELIVRD') self.assertEquals(isDlr['err'], 'ND') self.assertEquals(isDlr['text'], '')
def getReceipt(self, dlr_pdu, msgid, source_addr, destination_addr, message_status, sub_date): "Will build a DataSm or a DeliverSm (depending on dlr_pdu) containing a receipt data" sm_message_stat = message_status # Prepare message_state if message_status[:5] == 'ESME_': if message_status == 'ESME_ROK': message_state = MessageState.ACCEPTED sm_message_stat = 'ACCEPTD' err = 0 else: message_state = MessageState.UNDELIVERABLE sm_message_stat = 'UNDELIV' err = 10 elif message_status == 'UNDELIV': message_state = MessageState.UNDELIVERABLE err = 10 elif message_status == 'REJECTD': message_state = MessageState.REJECTED err = 20 elif message_status == 'DELIVRD': err = 0 message_state = MessageState.DELIVERED elif message_status == 'EXPIRED': err = 30 message_state = MessageState.EXPIRED elif message_status == 'DELETED': err = 40 message_state = MessageState.DELETED elif message_status == 'ACCEPTD': err = 0 message_state = MessageState.ACCEPTED elif message_status == 'UNKNOWN': err = 50 message_state = MessageState.UNKNOWN else: raise UnknownMessageStatusError('Unknow message_status: %s' % message_status) # Build pdu if dlr_pdu == 'deliver_sm': short_message = r"id:%s submit date:%s done date:%s stat:%s err:%03d" % ( msgid, parser.parse(sub_date).strftime("%Y%m%d%H%M"), datetime.datetime.now().strftime("%Y%m%d%H%M"), sm_message_stat, err, ) # Build DeliverSM pdu pdu = DeliverSM( source_addr=destination_addr, destination_addr=source_addr, esm_class=EsmClass(EsmClassMode.DEFAULT, EsmClassType.SMSC_DELIVERY_RECEIPT), receipted_message_id=msgid, short_message=short_message, message_state=message_state, ) else: # Build DataSM pdu pdu = DataSM( source_addr=destination_addr, destination_addr=source_addr, esm_class=EsmClass(EsmClassMode.DEFAULT, EsmClassType.SMSC_DELIVERY_RECEIPT), receipted_message_id=msgid, message_state=message_state, ) return pdu
def test_long_content_delivery_UDH_SmppsConnector(self): yield self.connect('127.0.0.1', self.pbPort) yield self.prepareRoutingsAndStartConnector() # Bind yield self.smppc_factory.connectAndBind() # Install mocks self.smppc_factory.lastProto.PDUDataRequestReceived = mock.Mock( wraps=self.smppc_factory.lastProto.PDUDataRequestReceived) # Build a UDH baseUdh = [] baseUdh.append(struct.pack('!B', 5)) # Length of User Data Header baseUdh.append( struct.pack('!B', 0) ) # Information Element Identifier, equal to 00 (Concatenated short messages, 8-bit reference number) baseUdh.append( struct.pack('!B', 3) ) # Length of the header, excluding the first two fields; equal to 03 baseUdh.append( struct.pack('!B', int(id_generator(size=2, chars=string.digits)))) # msg_ref_num baseUdh.append(struct.pack('!B', 3)) # total_segments # Send a data_sm from the SMSC basePdu = DataSM( source_addr='1234', destination_addr='4567', message_payload='', esm_class=EsmClass(EsmClassMode.DEFAULT, EsmClassType.DEFAULT, [EsmClassGsmFeatures.UDHI_INDICATOR_SET]), ) pdu_part1 = copy.deepcopy(basePdu) udh_part1 = copy.deepcopy(baseUdh) pdu_part2 = copy.deepcopy(basePdu) udh_part2 = copy.deepcopy(baseUdh) pdu_part3 = copy.deepcopy(basePdu) udh_part3 = copy.deepcopy(baseUdh) udh_part1.append(struct.pack('!B', 1)) # segment_seqnum pdu_part1.params[ 'more_messages_to_send'] = MoreMessagesToSend.MORE_MESSAGES pdu_part1.params['message_payload'] = ''.join( udh_part1 ) + '__1st_part_with_153_char________________________________________________________________________________________________________________________________.' udh_part2.append(struct.pack('!B', 2)) # segment_seqnum pdu_part2.params[ 'more_messages_to_send'] = MoreMessagesToSend.MORE_MESSAGES pdu_part2.params['message_payload'] = ''.join( udh_part2 ) + '__2nd_part_with_153_char________________________________________________________________________________________________________________________________.' udh_part3.append(struct.pack('!B', 3)) # segment_seqnum pdu_part3.params[ 'more_messages_to_send'] = MoreMessagesToSend.NO_MORE_MESSAGES pdu_part3.params['message_payload'] = ''.join( udh_part3) + '__3rd_part_end.' yield self.triggerDataSmFromSMSC([pdu_part1, pdu_part2, pdu_part3]) # Run tests self.assertEqual( self.smppc_factory.lastProto.PDUDataRequestReceived.call_count, 3) # First received pdu received_pdu_1 = self.smppc_factory.lastProto.PDUDataRequestReceived.call_args_list[ 0][0][0] self.assertEqual(received_pdu_1.seqNum, 1) self.assertEqual(received_pdu_1.id, pdu_types.CommandId.data_sm) self.assertEqual(received_pdu_1.params['source_addr'], basePdu.params['source_addr']) self.assertEqual(received_pdu_1.params['destination_addr'], basePdu.params['destination_addr']) self.assertEqual(received_pdu_1.params['esm_class'], basePdu.params['esm_class']) self.assertEqual(received_pdu_1.params['message_payload'][6:], pdu_part1.params['message_payload'][6:]) # Second received pdu received_pdu_2 = self.smppc_factory.lastProto.PDUDataRequestReceived.call_args_list[ 1][0][0] self.assertEqual(received_pdu_2.seqNum, 2) self.assertEqual(received_pdu_2.id, pdu_types.CommandId.data_sm) self.assertEqual(received_pdu_2.params['source_addr'], basePdu.params['source_addr']) self.assertEqual(received_pdu_2.params['destination_addr'], basePdu.params['destination_addr']) self.assertEqual(received_pdu_2.params['esm_class'], basePdu.params['esm_class']) self.assertEqual(received_pdu_2.params['message_payload'][6:], pdu_part2.params['message_payload'][6:]) # Third received pdu received_pdu_3 = self.smppc_factory.lastProto.PDUDataRequestReceived.call_args_list[ 2][0][0] self.assertEqual(received_pdu_3.seqNum, 3) self.assertEqual(received_pdu_3.id, pdu_types.CommandId.data_sm) self.assertEqual(received_pdu_3.params['source_addr'], basePdu.params['source_addr']) self.assertEqual(received_pdu_3.params['destination_addr'], basePdu.params['destination_addr']) self.assertEqual(received_pdu_3.params['esm_class'], basePdu.params['esm_class']) self.assertEqual(received_pdu_3.params['message_payload'][6:], pdu_part3.params['message_payload'][6:]) # Unbind and disconnect yield self.smppc_factory.smpp.unbindAndDisconnect() yield self.stopSmppClientConnectors()
def test_long_content_delivery_SAR_SmppsConnector(self): yield self.connect('127.0.0.1', self.pbPort) yield self.prepareRoutingsAndStartConnector() # Bind yield self.smppc_factory.connectAndBind() # Install mocks self.smppc_factory.lastProto.PDUDataRequestReceived = mock.Mock( wraps=self.smppc_factory.lastProto.PDUDataRequestReceived) # Send a data_sm from the SMSC basePdu = DataSM( source_addr='1234', destination_addr='4567', message_payload='', sar_total_segments=3, sar_msg_ref_num=int(id_generator(size=2, chars=string.digits)), ) pdu_part1 = copy.deepcopy(basePdu) pdu_part2 = copy.deepcopy(basePdu) pdu_part3 = copy.deepcopy(basePdu) pdu_part1.params[ 'message_payload'] = '__1st_part_with_153_char________________________________________________________________________________________________________________________________.' pdu_part1.params['sar_segment_seqnum'] = 1 pdu_part2.params[ 'message_payload'] = '__2nd_part_with_153_char________________________________________________________________________________________________________________________________.' pdu_part2.params['sar_segment_seqnum'] = 2 pdu_part3.params['message_payload'] = '__3rd_part_end.' pdu_part3.params['sar_segment_seqnum'] = 3 yield self.triggerDataSmFromSMSC([pdu_part1, pdu_part2, pdu_part3]) # Run tests self.assertEqual( self.smppc_factory.lastProto.PDUDataRequestReceived.call_count, 3) # First received pdu received_pdu_1 = self.smppc_factory.lastProto.PDUDataRequestReceived.call_args_list[ 0][0][0] self.assertEqual(received_pdu_1.seqNum, 1) self.assertEqual(received_pdu_1.id, pdu_types.CommandId.data_sm) self.assertEqual(received_pdu_1.params['source_addr'], basePdu.params['source_addr']) self.assertEqual(received_pdu_1.params['destination_addr'], basePdu.params['destination_addr']) self.assertEqual(received_pdu_1.params['message_payload'], pdu_part1.params['message_payload']) self.assertEqual(received_pdu_1.params['sar_segment_seqnum'], pdu_part1.params['sar_segment_seqnum']) # Second received pdu received_pdu_2 = self.smppc_factory.lastProto.PDUDataRequestReceived.call_args_list[ 1][0][0] self.assertEqual(received_pdu_2.seqNum, 2) self.assertEqual(received_pdu_2.id, pdu_types.CommandId.data_sm) self.assertEqual(received_pdu_2.params['source_addr'], basePdu.params['source_addr']) self.assertEqual(received_pdu_2.params['destination_addr'], basePdu.params['destination_addr']) self.assertEqual(received_pdu_2.params['message_payload'], pdu_part2.params['message_payload']) self.assertEqual(received_pdu_2.params['sar_segment_seqnum'], pdu_part2.params['sar_segment_seqnum']) self.assertNotEqual(received_pdu_2.params['message_payload'], received_pdu_1.params['message_payload']) self.assertNotEqual(received_pdu_2.params['sar_segment_seqnum'], received_pdu_1.params['sar_segment_seqnum']) # Third received pdu received_pdu_3 = self.smppc_factory.lastProto.PDUDataRequestReceived.call_args_list[ 2][0][0] self.assertEqual(received_pdu_3.seqNum, 3) self.assertEqual(received_pdu_3.id, pdu_types.CommandId.data_sm) self.assertEqual(received_pdu_3.params['source_addr'], basePdu.params['source_addr']) self.assertEqual(received_pdu_3.params['destination_addr'], basePdu.params['destination_addr']) self.assertEqual(received_pdu_3.params['message_payload'], pdu_part3.params['message_payload']) self.assertEqual(received_pdu_3.params['sar_segment_seqnum'], pdu_part3.params['sar_segment_seqnum']) self.assertNotEqual(received_pdu_3.params['message_payload'], received_pdu_2.params['message_payload']) self.assertNotEqual(received_pdu_3.params['sar_segment_seqnum'], received_pdu_2.params['sar_segment_seqnum']) # Unbind and disconnect yield self.smppc_factory.smpp.unbindAndDisconnect() yield self.stopSmppClientConnectors()
def test_long_content_delivery_UDH_HttpConnector(self): yield self.connect('127.0.0.1', self.pbPort) # Connect to SMSC source_connector = Connector(id_generator()) yield self.prepareRoutingsAndStartConnector(source_connector) # Build a UDH baseUdh = [] baseUdh.append(struct.pack('!B', 5)) # Length of User Data Header baseUdh.append( struct.pack('!B', 0) ) # Information Element Identifier, equal to 00 (Concatenated short messages, 8-bit reference number) baseUdh.append( struct.pack('!B', 3) ) # Length of the header, excluding the first two fields; equal to 03 baseUdh.append( struct.pack('!B', int(id_generator(size=2, chars=string.digits)))) # msg_ref_num baseUdh.append(struct.pack('!B', 3)) # total_segments # Send a data_sm from the SMSC basePdu = DataSM( source_addr='1234', destination_addr='4567', message_payload='', esm_class=EsmClass(EsmClassMode.DEFAULT, EsmClassType.DEFAULT, [EsmClassGsmFeatures.UDHI_INDICATOR_SET]), ) pdu_part1 = copy.deepcopy(basePdu) udh_part1 = copy.deepcopy(baseUdh) pdu_part2 = copy.deepcopy(basePdu) udh_part2 = copy.deepcopy(baseUdh) pdu_part3 = copy.deepcopy(basePdu) udh_part3 = copy.deepcopy(baseUdh) udh_part1.append(struct.pack('!B', 1)) # segment_seqnum pdu_part1.params[ 'more_messages_to_send'] = MoreMessagesToSend.MORE_MESSAGES pdu_part1.params['message_payload'] = ''.join( udh_part1 ) + '__1st_part_with_153_char________________________________________________________________________________________________________________________________.' udh_part2.append(struct.pack('!B', 2)) # segment_seqnum pdu_part2.params[ 'more_messages_to_send'] = MoreMessagesToSend.MORE_MESSAGES pdu_part2.params['message_payload'] = ''.join( udh_part2 ) + '__2nd_part_with_153_char________________________________________________________________________________________________________________________________.' udh_part3.append(struct.pack('!B', 3)) # segment_seqnum pdu_part3.params[ 'more_messages_to_send'] = MoreMessagesToSend.NO_MORE_MESSAGES pdu_part3.params['message_payload'] = ''.join( udh_part3) + '__3rd_part_end.' yield self.triggerDataSmFromSMSC([pdu_part1, pdu_part2, pdu_part3]) # Run tests # Destination connector must receive the message one time (no retries) self.assertEqual(self.AckServerResource.render_GET.call_count, 1) # Assert received args receivedHttpReq = self.AckServerResource.last_request.args self.assertEqual(len(receivedHttpReq), 6) self.assertEqual(receivedHttpReq['from'], [basePdu.params['source_addr']]) self.assertEqual(receivedHttpReq['to'], [basePdu.params['destination_addr']]) self.assertEqual(receivedHttpReq['content'], [ pdu_part1.params['message_payload'][6:] + pdu_part2.params['message_payload'][6:] + pdu_part3.params['message_payload'][6:] ]) self.assertEqual(receivedHttpReq['origin-connector'], [source_connector.cid]) # Disconnector from SMSC yield self.stopConnector(source_connector)
def getReceipt(self, msgid, source_addr, destination_addr, message_status): "Will build a DataSm containing a receipt data" # Build pdu pdu = DataSM( source_addr = source_addr, destination_addr = destination_addr, esm_class = EsmClass(EsmClassMode.DEFAULT, EsmClassType.SMSC_DELIVERY_RECEIPT), receipted_message_id = msgid, ) # Set pdu.message_state if message_status[:5] == 'ESME_': # It is a receipt catched from a submit_sm_resp if message_status == 'ESME_ROK': pdu.params['message_state'] = MessageState.ACCEPTED else: pdu.params['message_state'] = MessageState.UNDELIVERABLE elif message_status == 'UNDELIV': # It is a receipt catched from a deliver_sm pdu.params['message_state'] = MessageState.UNDELIVERABLE elif message_status == 'REJECTD': # It is a receipt catched from a deliver_sm pdu.params['message_state'] = MessageState.REJECTED elif message_status == 'DELIVRD': # It is a receipt catched from a deliver_sm pdu.params['message_state'] = MessageState.DELIVERED elif message_status == 'EXPIRED': # It is a receipt catched from a deliver_sm pdu.params['message_state'] = MessageState.EXPIRED elif message_status == 'DELETED': # It is a receipt catched from a deliver_sm pdu.params['message_state'] = MessageState.DELETED elif message_status == 'ACCEPTD': # It is a receipt catched from a deliver_sm pdu.params['message_state'] = MessageState.ACCEPTED elif message_status == 'UNKNOWN': # It is a receipt catched from a deliver_sm pdu.params['message_state'] = MessageState.UNKNOWN else: raise UnknownMessageStatusError('Unknow message_status: %s' % message_status) return pdu