def test_multipart_sar_reference_rollover(self): """ If the multipart_sar_reference_rollover config value is set, then for multipart messages, the reference should rollover at that value. """ config = { 'system_id': 'foo', 'password': '******', 'twisted_endpoint': self.fake_smsc.endpoint, 'submit_short_message_processor_config': { 'send_multipart_sar': True, 'multipart_sar_reference_rollover': 0xFF, }, } transport = yield self.get_transport(config) transport.service.sequence_generator.redis.set( 'smpp_last_sequence_number', 0xFF) yield transport.submit_sm_processor.send_short_message( transport.service, 'test-id', '+1234', 'test message ' * 20, optional_parameters={}) pdus = yield self.fake_smsc.await_pdus(2) msg_refs = [unpacked_pdu_opts(p)['sar_msg_ref_num'] for p in pdus] self.assertEqual(msg_refs, [1, 1])
def test_submit_csm_sar_ref_num_custom_limit(self): """ The SAR reference number is set correctly when the generated reference number is larger than the configured limit. """ service = yield self.get_service({'send_multipart_sar': True}) yield self.fake_smsc.bind() # forward until we go past 0xFF yield self.set_sequence_number(service, 0x100) long_message = 'This is a long message.' * 20 seq_nums = yield service.submit_csm_sar('abc123', 'dest_addr', short_message=long_message, reference_rollover=0x100) pdus = yield self.fake_smsc.await_pdus(4) msg_parts = [] msg_refs = [] for i, sm in enumerate(pdus): pdu_opts = unpacked_pdu_opts(sm) mandatory_parameters = sm['body']['mandatory_parameters'] self.assertEqual('submit_sm', sm['header']['command_id']) msg_parts.append(mandatory_parameters['short_message']) self.assertTrue(len(mandatory_parameters['short_message']) <= 130) msg_refs.append(pdu_opts['sar_msg_ref_num']) self.assertEqual(i + 1, pdu_opts['sar_segment_seqnum']) self.assertEqual(4, pdu_opts['sar_total_segments']) self.assertEqual(long_message, ''.join(msg_parts)) self.assertEqual([1, 1, 1, 1], msg_refs) stored_ids = yield self.lookup_message_ids(service, seq_nums) self.assertEqual(['abc123'] * len(seq_nums), stored_ids)
def test_submit_csm_sar(self): """ A long message can be sent in multiple PDUs with SAR fields set to instruct the SMSC to build user data headers. """ service = yield self.get_service({'send_multipart_sar': True}) yield self.fake_smsc.bind() long_message = 'This is a long message.' * 20 seq_nums = yield service.submit_csm_sar('abc123', 'dest_addr', short_message=long_message) pdus = yield self.fake_smsc.await_pdus(4) # seq no 1 == bind_transceiver, 2 == enquire_link, 3 == sar_msg_ref_num self.assertEqual([4, 5, 6, 7], seq_nums) msg_parts = [] msg_refs = [] for i, sm in enumerate(pdus): pdu_opts = unpacked_pdu_opts(sm) mandatory_parameters = sm['body']['mandatory_parameters'] self.assertEqual('submit_sm', sm['header']['command_id']) msg_parts.append(mandatory_parameters['short_message']) self.assertTrue(len(mandatory_parameters['short_message']) <= 130) msg_refs.append(pdu_opts['sar_msg_ref_num']) self.assertEqual(i + 1, pdu_opts['sar_segment_seqnum']) self.assertEqual(4, pdu_opts['sar_total_segments']) self.assertEqual(long_message, ''.join(msg_parts)) self.assertEqual([3, 3, 3, 3], msg_refs) stored_ids = yield self.lookup_message_ids(service, seq_nums) self.assertEqual(['abc123'] * len(seq_nums), stored_ids)
def test_submit_csm_sar_ref_num_limit(self): """ The SAR reference number is set correctly when the generated reference number is larger than 0xFFFF. """ service = yield self.get_service({'send_multipart_sar': True}) yield self.fake_smsc.bind() # forward until we go past 0xFFFF yield self.set_sequence_number(service, 0x10000) long_message = 'This is a long message.' * 20 seq_nums = yield service.submit_csm_sar( 'abc123', 'dest_addr', short_message=long_message) pdus = yield self.fake_smsc.await_pdus(4) msg_parts = [] msg_refs = [] for i, sm in enumerate(pdus): pdu_opts = unpacked_pdu_opts(sm) mandatory_parameters = sm['body']['mandatory_parameters'] self.assertEqual('submit_sm', sm['header']['command_id']) msg_parts.append(mandatory_parameters['short_message']) self.assertTrue(len(mandatory_parameters['short_message']) <= 130) msg_refs.append(pdu_opts['sar_msg_ref_num']) self.assertEqual(i + 1, pdu_opts['sar_segment_seqnum']) self.assertEqual(4, pdu_opts['sar_total_segments']) self.assertEqual(long_message, ''.join(msg_parts)) self.assertEqual([2, 2, 2, 2], msg_refs) stored_ids = yield self.lookup_message_ids(service, seq_nums) self.assertEqual(['abc123'] * len(seq_nums), stored_ids)
def test_submit_csm_sar(self): """ A long message can be sent in multiple PDUs with SAR fields set to instruct the SMSC to build user data headers. """ service = yield self.get_service({'send_multipart_sar': True}) yield self.fake_smsc.bind() long_message = 'This is a long message.' * 20 seq_nums = yield service.submit_csm_sar( 'abc123', 'dest_addr', short_message=long_message) pdus = yield self.fake_smsc.await_pdus(4) # seq no 1 == bind_transceiver, 2 == enquire_link, 3 == sar_msg_ref_num self.assertEqual([4, 5, 6, 7], seq_nums) msg_parts = [] msg_refs = [] for i, sm in enumerate(pdus): pdu_opts = unpacked_pdu_opts(sm) mandatory_parameters = sm['body']['mandatory_parameters'] self.assertEqual('submit_sm', sm['header']['command_id']) msg_parts.append(mandatory_parameters['short_message']) self.assertTrue(len(mandatory_parameters['short_message']) <= 130) msg_refs.append(pdu_opts['sar_msg_ref_num']) self.assertEqual(i + 1, pdu_opts['sar_segment_seqnum']) self.assertEqual(4, pdu_opts['sar_total_segments']) self.assertEqual(long_message, ''.join(msg_parts)) self.assertEqual([3, 3, 3, 3], msg_refs) stored_ids = yield self.lookup_message_ids(service, seq_nums) self.assertEqual(['abc123'] * len(seq_nums), stored_ids)
def test_submit_csm_sar_single_part(self): """ If the content fits in a single message, all the multipart madness is avoided. """ service = yield self.get_service({'send_multipart_sar': True}) yield self.fake_smsc.bind() content = 'a' * 160 seq_numbers = yield service.submit_csm_sar( 'abc123', 'dest_addr', short_message=content) self.assertEqual(len(seq_numbers), 1) submit_sm_pdu = yield self.fake_smsc.await_pdu() self.assertEqual(command_id(submit_sm_pdu), 'submit_sm') self.assertEqual(short_message(submit_sm_pdu), content) self.assertEqual(unpacked_pdu_opts(submit_sm_pdu), {})
def test_submit_csm_sar_single_part(self): """ If the content fits in a single message, all the multipart madness is avoided. """ service = yield self.get_service({'send_multipart_sar': True}) yield self.fake_smsc.bind() content = 'a' * 160 seq_numbers = yield service.submit_csm_sar('abc123', 'dest_addr', short_message=content) self.assertEqual(len(seq_numbers), 1) submit_sm_pdu = yield self.fake_smsc.await_pdu() self.assertEqual(command_id(submit_sm_pdu), 'submit_sm') self.assertEqual(short_message(submit_sm_pdu), content) self.assertEqual(unpacked_pdu_opts(submit_sm_pdu), {})
def test_submit_sm_long(self): """ A long message can be sent in a single PDU using the optional `message_payload` PDU field. """ service = yield self.get_service() yield self.fake_smsc.bind() long_message = 'This is a long message.' * 20 seq_nums = yield service.submit_sm_long('abc123', 'dest_addr', long_message) submit_sm = yield self.fake_smsc.await_pdu() pdu_opts = unpacked_pdu_opts(submit_sm) self.assertEqual('submit_sm', submit_sm['header']['command_id']) self.assertEqual( None, submit_sm['body']['mandatory_parameters']['short_message']) self.assertEqual(''.join('%02x' % ord(c) for c in long_message), pdu_opts['message_payload']) stored_ids = yield self.lookup_message_ids(service, seq_nums) self.assertEqual(['abc123'], stored_ids)
def test_submit_sm_long(self): """ A long message can be sent in a single PDU using the optional `message_payload` PDU field. """ service = yield self.get_service() yield self.fake_smsc.bind() long_message = 'This is a long message.' * 20 seq_nums = yield service.submit_sm_long( 'abc123', 'dest_addr', long_message) submit_sm = yield self.fake_smsc.await_pdu() pdu_opts = unpacked_pdu_opts(submit_sm) self.assertEqual('submit_sm', submit_sm['header']['command_id']) self.assertEqual( None, submit_sm['body']['mandatory_parameters']['short_message']) self.assertEqual(''.join('%02x' % ord(c) for c in long_message), pdu_opts['message_payload']) stored_ids = yield self.lookup_message_ids(service, seq_nums) self.assertEqual(['abc123'], stored_ids)