def test_submit_sm_resp_explicit(self): """ FakeSMSC can respond to a SubmitSM PDU that is explicitly passed in. """ fake_smsc = FakeSMSC() client = self.successResultOf(self.connect(fake_smsc)) self.assertEqual(client.received, b"") # No params. submit_sm_resp_d = fake_smsc.submit_sm_resp(SubmitSM(123).obj) self.assertNoResult(submit_sm_resp_d) client.handle_pdu_d.callback(None) self.successResultOf(submit_sm_resp_d) resp = SubmitSMResp(123, message_id="id123", command_status="ESME_ROK") self.assertEqual(client.pdus_handled, [resp.obj]) client.pdus_handled[:] = [] # Explicit message_id. submit_sm_resp_d = fake_smsc.submit_sm_resp(SubmitSM(124).obj, message_id="foo") yield client.write(SubmitSM(124).get_bin()) self.assertNoResult(submit_sm_resp_d) client.handle_pdu_d.callback(None) self.successResultOf(submit_sm_resp_d) resp = SubmitSMResp(124, message_id="foo", command_status="ESME_ROK") self.assertEqual(client.pdus_handled, [resp.obj])
def submit_sm(self, **kwargs): if self.state in ['BOUND_TX', 'BOUND_TRX']: print dict(self.defaults, **kwargs) pdu = SubmitSM( self.sequence_number, **dict(self.defaults, **kwargs)) self.conn.send(pdu.get_bin()) self.sequence_number += 1 self.__recv()
def submit_sm(self, **kwargs): if self.state in ['BOUND_TX', 'BOUND_TRX']: sequence_number = self.get_seq() pdu = SubmitSM(sequence_number, **dict(self.defaults, **kwargs)) self.get_next_seq() self.send_pdu(pdu) self.push_unacked(sequence_number) return sequence_number return 0
def test_pdu_cache_persistence(self): """ A cached PDU has an appropriate TTL and can be deleted. """ service = yield self.get_service() message_stash = service.message_stash config = service.get_config() pdu = SubmitSM(1337, short_message="foo") yield message_stash.cache_pdu("vumi0", pdu) ttl = yield message_stash.redis.ttl(pdu_key(1337)) self.assertTrue(0 < ttl <= config.submit_sm_expiry) pdu_data = yield message_stash.get_cached_pdu(1337) self.assertEqual(pdu_data.vumi_message_id, "vumi0") self.assertEqual(pdu_data.pdu.get_hex(), pdu.get_hex()) yield message_stash.delete_cached_pdu(1337) deleted_pdu_data = yield message_stash.get_cached_pdu(1337) self.assertEqual(deleted_pdu_data, None)
def _submit_sm(self, **pdu_params): sequence_number = yield self.get_next_seq() message = pdu_params['short_message'] sar_params = pdu_params.pop('sar_params', None) message_type = pdu_params.pop('message_type', 'sms') continue_session = pdu_params.pop('continue_session', True) session_info = pdu_params.pop('session_info', None) pdu = SubmitSM(sequence_number, **pdu_params) if message_type == 'ussd': update_ussd_pdu(pdu, continue_session, session_info) if self.config.send_long_messages and len(message) > 254: pdu.add_message_payload(''.join('%02x' % ord(c) for c in message)) if sar_params: pdu.set_sar_msg_ref_num(sar_params['msg_ref_num']) pdu.set_sar_total_segments(sar_params['total_segments']) pdu.set_sar_segment_seqnum(sar_params['segment_seqnum']) self.send_pdu(pdu) yield self.push_unacked(sequence_number) returnValue(sequence_number)
def submit_sm(self, vumi_message_id, destination_addr, source_addr='', esm_class=0, protocol_id=0, priority_flag=0, schedule_delivery_time='', validity_period='', replace_if_present=0, data_coding=0, sm_default_msg_id=0, sm_length=0, short_message='', optional_parameters=None, **configured_parameters): """ Put a `submit_sm` command on the wire. :param str source_addr: Address of SME which originated this message. If unknown leave blank. :param str destination_addr: Destination address of this short message. For mobile terminated messages, this is the directory number of the recipient MS. :param str service_type: The service_type parameter can be used to indicate the SMS Application service associated with the message. If unknown leave blank. :param int source_addr_ton: Type of Number for source address. :param int source_addr_npi: Numbering Plan Indicator for source address. :param int dest_addr_ton: Type of Number for destination. :param int dest_addr_npi: Numbering Plan Indicator for destination. :param int esm_class: Indicates Message Mode & Message Type. :param int protocol_id: Protocol Identifier. Network specific field. :param int priority_flag: Designates the priority level of the message. :param str schedule_delivery_time: The short message is to be scheduled by the SMSC for delivery. Leave blank for immediate delivery. :param str validity_period: The validity period of this message. Leave blank for SMSC default. :param int registered_delivery: Indicator to signify if an SMSC delivery receipt or an SME acknowledgement is required. :param int replace_if_present: Flag indicating if submitted message should replace an existing message. :param int data_coding: Defines the encoding scheme of the short message user data. :param int sm_default_msg_id: Indicates the short message to send from a list of pre- defined ('canned') short messages stored on the SMSC. Leave blank if not using an SMSC canned message. :param int sm_length: Length in octets of the short_message user data. This is automatically calculated and set during PDU encoding, no need to specify. :param int short_message: Up to 254 octets of short message user data. The exact physical limit for short_message size may vary according to the underlying network. Applications which need to send messages longer than 254 octets should use the message_payload parameter. In this case the sm_length field should be set to zero. :param dict optional_parameters: keys and values to be embedded in the PDU as tag-length-values. Refer to the SMPP specification and your SMSCs instructions on what valid and suitable keys and values are. :returns: list of 1 sequence number (int) for consistency with other submit_sm calls. :rtype: list """ configured_param_values = { 'service_type': self.config.service_type, 'source_addr_ton': self.config.source_addr_ton, 'source_addr_npi': self.config.source_addr_npi, 'dest_addr_ton': self.config.dest_addr_ton, 'dest_addr_npi': self.config.dest_addr_npi, 'registered_delivery': self.config.registered_delivery, } configured_param_values.update(configured_parameters) sequence_number = yield self.sequence_generator.next() pdu = SubmitSM(sequence_number=sequence_number, source_addr=source_addr, destination_addr=destination_addr, esm_class=esm_class, protocol_id=protocol_id, priority_flag=priority_flag, schedule_delivery_time=schedule_delivery_time, validity_period=validity_period, replace_if_present=replace_if_present, data_coding=data_coding, sm_default_msg_id=sm_default_msg_id, sm_length=sm_length, short_message=short_message, **configured_param_values) if optional_parameters: for key, value in optional_parameters.items(): pdu.add_optional_parameter(key, value) yield self.vumi_transport.message_stash.set_sequence_number_message_id( sequence_number, vumi_message_id) self.send_pdu(pdu) returnValue([sequence_number])
def submit_sm(self, vumi_message_id, destination_addr, source_addr='', esm_class=0, protocol_id=0, priority_flag=0, schedule_delivery_time='', validity_period='', replace_if_present=0, data_coding=0, sm_default_msg_id=0, sm_length=0, short_message='', optional_parameters=None, **configured_parameters ): """ Put a `submit_sm` command on the wire. :param str source_addr: Address of SME which originated this message. If unknown leave blank. :param str destination_addr: Destination address of this short message. For mobile terminated messages, this is the directory number of the recipient MS. :param str service_type: The service_type parameter can be used to indicate the SMS Application service associated with the message. If unknown leave blank. :param int source_addr_ton: Type of Number for source address. :param int source_addr_npi: Numbering Plan Indicator for source address. :param int dest_addr_ton: Type of Number for destination. :param int dest_addr_npi: Numbering Plan Indicator for destination. :param int esm_class: Indicates Message Mode & Message Type. :param int protocol_id: Protocol Identifier. Network specific field. :param int priority_flag: Designates the priority level of the message. :param str schedule_delivery_time: The short message is to be scheduled by the SMSC for delivery. Leave blank for immediate delivery. :param str validity_period: The validity period of this message. Leave blank for SMSC default. :param int registered_delivery: Indicator to signify if an SMSC delivery receipt or an SME acknowledgement is required. :param int replace_if_present: Flag indicating if submitted message should replace an existing message. :param int data_coding: Defines the encoding scheme of the short message user data. :param int sm_default_msg_id: Indicates the short message to send from a list of pre- defined ('canned') short messages stored on the SMSC. Leave blank if not using an SMSC canned message. :param int sm_length: Length in octets of the short_message user data. This is automatically calculated and set during PDU encoding, no need to specify. :param int short_message: Up to 254 octets of short message user data. The exact physical limit for short_message size may vary according to the underlying network. Applications which need to send messages longer than 254 octets should use the message_payload parameter. In this case the sm_length field should be set to zero. :param dict optional_parameters: keys and values to be embedded in the PDU as tag-length-values. Refer to the SMPP specification and your SMSCs instructions on what valid and suitable keys and values are. :returns: list of 1 sequence number (int) for consistency with other submit_sm calls. :rtype: list """ configured_param_values = { 'service_type': self.config.service_type, 'source_addr_ton': self.config.source_addr_ton, 'source_addr_npi': self.config.source_addr_npi, 'dest_addr_ton': self.config.dest_addr_ton, 'dest_addr_npi': self.config.dest_addr_npi, 'registered_delivery': self.config.registered_delivery, } configured_param_values.update(configured_parameters) sequence_number = yield self.sequence_generator.next() pdu = SubmitSM( sequence_number=sequence_number, source_addr=source_addr, destination_addr=destination_addr, esm_class=esm_class, protocol_id=protocol_id, priority_flag=priority_flag, schedule_delivery_time=schedule_delivery_time, validity_period=validity_period, replace_if_present=replace_if_present, data_coding=data_coding, sm_default_msg_id=sm_default_msg_id, sm_length=sm_length, short_message=short_message, **configured_param_values) if optional_parameters: for key, value in optional_parameters.items(): pdu.add_optional_parameter(key, value) yield self.send_submit_sm(vumi_message_id, pdu) returnValue([sequence_number])