diff --git a/vumi/transports/smpp/clientserver/client.py b/vumi/transports/smpp/clientserver/client.py index da336cd55..1dd44f33e 100644 --- a/vumi/transports/smpp/clientserver/client.py +++ b/vumi/transports/smpp/clientserver/client.py @@ -12,13 +12,20 @@ from smpp.pdu import unpack_pdu from smpp.pdu_builder import ( BindTransceiver, BindTransmitter, BindReceiver, DeliverSMResp, SubmitSM, - EnquireLink, EnquireLinkResp, QuerySM) + EnquireLink, EnquireLinkResp, QuerySM, PDU) from smpp.pdu_inspector import ( MultipartMessage, detect_multipart, multipart_key) from vumi import log +class UnbindResp(PDU): + # pdu_builder doesn't have one of these yet. + def __init__(self, sequence_number, **kwargs): + super(UnbindResp, self).__init__( + 'unbind_resp', 'ESME_ROK', sequence_number, **kwargs) + + def unpacked_pdu_opts(unpacked_pdu): pdu_opts = {} for opt in unpacked_pdu['body'].get('optional_parameters', []): @@ -218,6 +225,12 @@ def cancel_drop_connection_call(self): self._lose_conn.cancel() self._lose_conn = None + @inlineCallbacks + def handle_unbind(self, pdu): + yield self.send_pdu(UnbindResp( + sequence_number=pdu['header']['sequence_number'])) + self.transport.loseConnection() + @inlineCallbacks def handle_bind_transceiver_resp(self, pdu): if pdu['header']['command_status'] == 'ESME_ROK': diff --git a/vumi/transports/smpp/clientserver/tests/test_client.py b/vumi/transports/smpp/clientserver/tests/test_client.py index 01c0b4215..f7b5053f2 100644 --- a/vumi/transports/smpp/clientserver/tests/test_client.py +++ b/vumi/transports/smpp/clientserver/tests/test_client.py @@ -1,7 +1,7 @@ from twisted.trial import unittest from twisted.internet.task import Clock from twisted.internet.defer import inlineCallbacks, returnValue -from smpp.pdu_builder import DeliverSM, BindTransceiverResp +from smpp.pdu_builder import DeliverSM, BindTransceiverResp, Unbind from smpp.pdu import unpack_pdu from vumi.tests.utils import LogCatcher, PersistenceMixin @@ -169,6 +169,14 @@ def test_sequence_rollover(self): self.assertEqual(0xFFFF0001, (yield esme.get_next_seq())) self.assertEqual(1, (yield esme.get_next_seq())) + @inlineCallbacks + def test_unbind(self): + esme = yield self.get_esme() + + yield esme.handle_data(Unbind(1).get_bin()) + + self.assertEqual(False, esme.transport.connected) + class EsmeTransmitterMixin(EsmeGenericMixin): """Transmitter-side tests."""