From e34b3b73598840e7b00a1be3389902f2aa03a50c Mon Sep 17 00:00:00 2001 From: Rudi Giesler Date: Thu, 11 May 2017 11:36:58 +0200 Subject: [PATCH] Make multipart reference rollover configurable --- vumi/transports/smpp/processors/default.py | 6 +++ vumi/transports/smpp/smpp_service.py | 6 ++- .../smpp/tests/test_smpp_service.py | 38 ++++++++++++++++++- 3 files changed, 47 insertions(+), 3 deletions(-) diff --git a/vumi/transports/smpp/processors/default.py b/vumi/transports/smpp/processors/default.py index 853524b44..35bde38ce 100644 --- a/vumi/transports/smpp/processors/default.py +++ b/vumi/transports/smpp/processors/default.py @@ -470,6 +470,10 @@ class SubmitShortMessageProcessorConfig(Config): "If `True`, messages longer than 140 bytes will be sent as a series " "of smaller messages with the user data headers. Default is `False`.", default=False, static=True) + multipart_sar_reference_rollover = ConfigInt( + "The maximum value to set for the reference number of a multi part " + "SMS. When this value is reached, the number will rollover to 0.", + default=0xFFFF, static=True) def post_validate(self): long_message_params = ( @@ -543,6 +547,8 @@ def send_short_message(self, service, vumi_message_id, destination_addr, return service.submit_sm_long(**kwargs) elif self.config.send_multipart_sar: + kwargs['reference_rollover'] = ( + self.config.multipart_sar_reference_rollover) return service.submit_csm_sar(**kwargs) elif self.config.send_multipart_udh: diff --git a/vumi/transports/smpp/smpp_service.py b/vumi/transports/smpp/smpp_service.py index f35b1325a..4186d555c 100644 --- a/vumi/transports/smpp/smpp_service.py +++ b/vumi/transports/smpp/smpp_service.py @@ -312,7 +312,9 @@ def csm_split_message(self, message): return split_msg @inlineCallbacks - def submit_csm_sar(self, vumi_message_id, destination_addr, **pdu_params): + def submit_csm_sar( + self, vumi_message_id, destination_addr, reference_rollover=0xFFFF, + **pdu_params): """ Submit a concatenated SMS to the SMSC using the optional SAR parameter names in the various PDUS. @@ -339,7 +341,7 @@ def submit_csm_sar(self, vumi_message_id, destination_addr, **pdu_params): pdu_params = pdu_params.copy() optional_parameters.update({ # Reference number must be between 00 & FFFF - 'sar_msg_ref_num': (ref_num % 0xFFFF), + 'sar_msg_ref_num': (ref_num & reference_rollover), 'sar_total_segments': len(split_msg), 'sar_segment_seqnum': i + 1, }) diff --git a/vumi/transports/smpp/tests/test_smpp_service.py b/vumi/transports/smpp/tests/test_smpp_service.py index c3ae2ebd0..8937852ec 100644 --- a/vumi/transports/smpp/tests/test_smpp_service.py +++ b/vumi/transports/smpp/tests/test_smpp_service.py @@ -335,7 +335,43 @@ def test_submit_csm_sar_ref_num_limit(self): self.assertEqual(4, pdu_opts['sar_total_segments']) self.assertEqual(long_message, ''.join(msg_parts)) - self.assertEqual([2, 2, 2, 2], msg_refs) + 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) + + @inlineCallbacks + 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=0xFF) + 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)