From 48c12532ae73be96822e36b6e5e9e94a25448ec2 Mon Sep 17 00:00:00 2001 From: Rudi Giesler Date: Fri, 6 Jan 2017 13:21:55 +0200 Subject: [PATCH 1/4] Cast keys of data_coding_override config dict to ints --- vumi/transports/smpp/processors/default.py | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/vumi/transports/smpp/processors/default.py b/vumi/transports/smpp/processors/default.py index b04768fca..853524b44 100644 --- a/vumi/transports/smpp/processors/default.py +++ b/vumi/transports/smpp/processors/default.py @@ -7,6 +7,7 @@ from vumi.config import ( Config, ConfigDict, ConfigRegex, ConfigText, ConfigInt, ConfigBool) +from vumi.errors import ConfigError from vumi.message import TransportUserMessage from vumi.transports.smpp.iprocessors import ( IDeliveryReportProcessor, IDeliverShortMessageProcessor, @@ -209,8 +210,9 @@ class DeliverShortMessageProcessorConfig(Config): "setting the default encoding (0), adding additional undefined " "encodings (such as 4 or 8) or overriding encodings in cases where " "the SMSC is violating the spec (which happens a lot). Keys should " - "be integers, values should be strings containing valid Python " - "character encoding names.", default={}, static=True) + "be something that can be cast to an integer, values should be strings" + "containing valid Python character encoding names.", + default={}, static=True) allow_empty_messages = ConfigBool( "If True, send on empty messages as an empty unicode string. " @@ -268,7 +270,15 @@ def __init__(self, transport, config): 9: 'shift_jis', 10: 'iso2022_jp' } - self.data_coding_map.update(self.config.data_coding_overrides) + try: + self.data_coding_map.update({ + int(key): value for key, value in + self.config.data_coding_overrides.items()}) + except ValueError as e: + raise ConfigError( + "data_coding_overrides keys must be castable to ints. " + "{}".format(e.message)) + self.allow_empty_messages = self.config.allow_empty_messages def dcs_decode(self, obj, data_coding): From 29c64817da44ed30b895638a84eea27a267b5f0c Mon Sep 17 00:00:00 2001 From: Rudi Giesler Date: Fri, 6 Jan 2017 13:22:12 +0200 Subject: [PATCH 2/4] Don't fail teardown if transport does start up properly --- vumi/transports/smpp/smpp_transport.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/vumi/transports/smpp/smpp_transport.py b/vumi/transports/smpp/smpp_transport.py index cdda9e0ac..c1a2cdfb3 100644 --- a/vumi/transports/smpp/smpp_transport.py +++ b/vumi/transports/smpp/smpp_transport.py @@ -252,6 +252,8 @@ class SmppTransceiverTransport(Transport): bind_type = 'TRX' clock = reactor start_message_consumer = False + service = None + redis = None @property def throttled(self): @@ -293,7 +295,8 @@ def start_service(self): def teardown_transport(self): if self.service: yield self.service.stopService() - yield self.redis._close() + if self.redis: + yield self.redis._close() def _check_address_valid(self, message, field): try: From 5a46850ca94fd73170799906c65835abd4029603 Mon Sep 17 00:00:00 2001 From: Rudi Giesler Date: Fri, 6 Jan 2017 13:22:44 +0200 Subject: [PATCH 3/4] Add tests for default processor data_coding_override config value --- .../smpp/processors/tests/test_default.py | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 vumi/transports/smpp/processors/tests/test_default.py diff --git a/vumi/transports/smpp/processors/tests/test_default.py b/vumi/transports/smpp/processors/tests/test_default.py new file mode 100644 index 000000000..7e606b34b --- /dev/null +++ b/vumi/transports/smpp/processors/tests/test_default.py @@ -0,0 +1,59 @@ +from twisted.internet.defer import inlineCallbacks + +from vumi.errors import ConfigError +from vumi.tests.helpers import VumiTestCase +from vumi.transports.tests.helpers import TransportHelper +from vumi.transports.smpp.smpp_transport import SmppTransceiverTransport +from vumi.transports.smpp.tests.fake_smsc import FakeSMSC + + +class DefaultProcessorTestCase(VumiTestCase): + def setUp(self): + self.fake_smsc = FakeSMSC() + self.tx_helper = self.add_helper( + TransportHelper(SmppTransceiverTransport)) + + @inlineCallbacks + def test_data_coding_override_keys_ints(self): + """ + If the keys of the data coding overrides config dictionary are not + integers, they should be cast to integers. + """ + config = { + 'system_id': 'foo', + 'password': 'bar', + 'twisted_endpoint': self.fake_smsc.endpoint, + 'deliver_short_message_processor_config': { + 'data_coding_overrides': { + '0': 'utf-8' + }, + }, + } + transport = yield self.tx_helper.get_transport(config) + self.assertEqual( + transport.deliver_sm_processor.data_coding_map.get(0), 'utf-8') + + @inlineCallbacks + def test_data_coding_override_keys_invalid(self): + """ + If the keys of the data coding overrides config dictionary can not be + cast to integers, a config error with an appropriate message should + be raised. + """ + config = { + 'system_id': 'foo', + 'password': 'bar', + 'twisted_endpoint': self.fake_smsc.endpoint, + 'deliver_short_message_processor_config': { + 'data_coding_overrides': { + 'not-an-int': 'utf-8' + }, + }, + } + with self.assertRaises(ConfigError) as e: + yield self.tx_helper.get_transport(config) + self.assertEqual( + e.exception.message, + "data_coding_overrides keys must be castable to ints. " + "invalid literal for int() with base 10: 'not-an-int'" + ) From 8b4086d6d332b3de6f59a517c2a0bd414d834a96 Mon Sep 17 00:00:00 2001 From: Rudi Giesler Date: Mon, 9 Jan 2017 17:33:41 +0200 Subject: [PATCH 4/4] change from assertRaises to try catch for older twisted --- .../smpp/processors/tests/test_default.py | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/vumi/transports/smpp/processors/tests/test_default.py b/vumi/transports/smpp/processors/tests/test_default.py index 7e606b34b..98330ccad 100644 --- a/vumi/transports/smpp/processors/tests/test_default.py +++ b/vumi/transports/smpp/processors/tests/test_default.py @@ -1,4 +1,5 @@ from twisted.internet.defer import inlineCallbacks +from twisted.trial.unittest import FailTest from vumi.errors import ConfigError from vumi.tests.helpers import VumiTestCase @@ -50,10 +51,13 @@ def test_data_coding_override_keys_invalid(self): }, }, } - with self.assertRaises(ConfigError) as e: + try: yield self.tx_helper.get_transport(config) - self.assertEqual( - e.exception.message, - "data_coding_overrides keys must be castable to ints. " - "invalid literal for int() with base 10: 'not-an-int'" - ) + except ConfigError as e: + self.assertEqual( + str(e), + "data_coding_overrides keys must be castable to ints. " + "invalid literal for int() with base 10: 'not-an-int'" + ) + else: + raise FailTest("Expected ConfigError to be raised")