def setUp(self): yield super(EsmeToSmscTestCase, self).setUp() delivery_report_regex = "id:(?P<id>\S{,65})" \ " +sub:(?P<sub>.{1,3})" \ " +dlvrd:(?P<dlvrd>.{1,3})" \ " +submit date:(?P<submit_date>\d*)" \ " +done date:(?P<done_date>\d*)" \ " +stat:(?P<stat>[0-9,A-Z]{1,7})" \ " +err:(?P<err>.{1,3})" \ " +[Tt]ext:(?P<text>.{,20}).*" \ self.config = { "system_id": "VumiTestSMSC", "password": "******", "host": "localhost", "port": 0, "redis": {}, "transport_name": self.transport_name, "transport_type": "smpp", "delivery_report_regex": delivery_report_regex, "smsc_delivery_report_string": ( 'id:%s sub:1 dlvrd:1 submit date:%s done date:%s ' 'stat:0 err:0 text:If a general electio'), } self.service = SmppService(None, config=self.config) yield self.service.startWorker() self.service.factory.protocol = SmscTestServer self.config['port'] = self.service.listening.getHost().port self.transport = yield self.get_transport(self.config, start=False) self.transport.r_server = FakeRedis() self.expected_delivery_status = 'delivered' # stat:0 means delivered
def setUp(self): yield super(EsmeToSmscTestCase, self).setUp() self.config = { "system_id": "VumiTestSMSC", "password": "******", "host": "localhost", "port": 0, "redis": {}, "transport_name": self.transport_name, "transport_type": "smpp", } self.service = SmppService(None, config=self.config) yield self.service.startWorker() self.service.factory.protocol = SmscTestServer self.config['port'] = self.service.listening.getHost().port self.transport = yield self.get_transport(self.config, start=False) self.transport.r_server = FakeRedis() self.expected_delivery_status = 'delivered'
class EsmeToSmscTestCase(TransportTestCase): transport_name = "esme_testing_transport" transport_class = MockSmppTransport def assert_pdu_header(self, expected, actual, field): self.assertEqual(expected['pdu']['header'][field], actual['pdu']['header'][field]) def assert_server_pdu(self, expected, actual): self.assertEqual(expected['direction'], actual['direction']) self.assert_pdu_header(expected, actual, 'sequence_number') self.assert_pdu_header(expected, actual, 'command_status') self.assert_pdu_header(expected, actual, 'command_id') @inlineCallbacks def setUp(self): yield super(EsmeToSmscTestCase, self).setUp() self.config = { "system_id": "VumiTestSMSC", "password": "******", "host": "localhost", "port": 0, "redis": {}, "transport_name": self.transport_name, "transport_type": "smpp", } self.service = SmppService(None, config=self.config) yield self.service.startWorker() self.service.factory.protocol = SmscTestServer self.config['port'] = self.service.listening.getHost().port self.transport = yield self.get_transport(self.config, start=False) self.transport.r_server = FakeRedis() self.expected_delivery_status = 'delivered' @inlineCallbacks def startTransport(self): self.transport._block_till_bind = defer.Deferred() yield self.transport.startWorker() @inlineCallbacks def tearDown(self): from twisted.internet.base import DelayedCall DelayedCall.debug = True yield super(EsmeToSmscTestCase, self).tearDown() self.transport.r_server.teardown() self.transport.factory.stopTrying() self.transport.factory.esme.transport.loseConnection() yield self.service.listening.stopListening() yield self.service.listening.loseConnection() @inlineCallbacks def test_handshake_submit_and_deliver(self): # 1111111111111111111111111111111111111111111111111 expected_pdus_1 = [ mk_expected_pdu("inbound", 1, "bind_transceiver"), mk_expected_pdu("outbound", 1, "bind_transceiver_resp"), mk_expected_pdu("inbound", 2, "enquire_link"), mk_expected_pdu("outbound", 2, "enquire_link_resp"), ] # 2222222222222222222222222222222222222222222222222 expected_pdus_2 = [ mk_expected_pdu("inbound", 3, "submit_sm"), mk_expected_pdu("outbound", 3, "submit_sm_resp"), # the delivery report mk_expected_pdu("outbound", 1, "deliver_sm"), mk_expected_pdu("inbound", 1, "deliver_sm_resp"), ] # 3333333333333333333333333333333333333333333333333 expected_pdus_3 = [ # a sms delivered by the smsc mk_expected_pdu("outbound", 555, "deliver_sm"), mk_expected_pdu("inbound", 555, "deliver_sm_resp"), ] ## Startup yield self.startTransport() yield self.transport._block_till_bind # First we make sure the Client binds to the Server # and enquire_link pdu's are exchanged as expected pdu_queue = self.service.factory.smsc.pdu_queue for expected_message in expected_pdus_1: actual_message = yield pdu_queue.get() self.assert_server_pdu(expected_message, actual_message) # Next the Client submits a SMS to the Server # and recieves an ack and a delivery_report msg = TransportUserMessage( to_addr="2772222222", from_addr="2772000000", content='hello world', transport_name=self.transport_name, transport_type='smpp', transport_metadata={}, rkey='%s.outbound' % self.transport_name, timestamp='0', ) yield self.dispatch(msg) for expected_message in expected_pdus_2: actual_message = yield pdu_queue.get() self.assert_server_pdu(expected_message, actual_message) # We need the user_message_id to check the ack user_message_id = msg.payload["message_id"] dispatched_events = self.get_dispatched_events() ack = dispatched_events[0].payload delv = dispatched_events[1].payload self.assertEqual(ack['message_type'], 'event') self.assertEqual(ack['event_type'], 'ack') self.assertEqual(ack['transport_name'], self.transport_name) self.assertEqual(ack['user_message_id'], user_message_id) # We need the sent_message_id to check the delivery_report sent_message_id = ack['sent_message_id'] self.assertEqual(delv['message_type'], 'event') self.assertEqual(delv['event_type'], 'delivery_report') self.assertEqual(delv['transport_name'], self.transport_name) self.assertEqual(delv['user_message_id'], sent_message_id) self.assertEqual(delv['delivery_status'], self.expected_delivery_status) # Finally the Server delivers a SMS to the Client pdu = DeliverSM(555, short_message="SMS from server", destination_addr="2772222222", source_addr="2772000000", ) self.service.factory.smsc.send_pdu(pdu) for expected_message in expected_pdus_3: actual_message = yield pdu_queue.get() self.assert_server_pdu(expected_message, actual_message) dispatched_messages = self.get_dispatched_messages() mess = dispatched_messages[0].payload self.assertEqual(mess['message_type'], 'user_message') self.assertEqual(mess['transport_name'], self.transport_name) self.assertEqual(mess['content'], "SMS from server") dispatched_failures = self.get_dispatched_failures() self.assertEqual(dispatched_failures, []) def send_out_of_order_multipart(self, smsc, to_addr, from_addr): destination_addr = to_addr source_addr = from_addr sequence_number = 1 short_message1 = "\x05\x00\x03\xff\x03\x01back" pdu1 = DeliverSM(sequence_number, short_message=short_message1, destination_addr=destination_addr, source_addr=source_addr) sequence_number = 2 short_message2 = "\x05\x00\x03\xff\x03\x02 at" pdu2 = DeliverSM(sequence_number, short_message=short_message2, destination_addr=destination_addr, source_addr=source_addr) sequence_number = 3 short_message3 = "\x05\x00\x03\xff\x03\x03 you" pdu3 = DeliverSM(sequence_number, short_message=short_message3, destination_addr=destination_addr, source_addr=source_addr) smsc.send_pdu(pdu2) smsc.send_pdu(pdu3) smsc.send_pdu(pdu1) @inlineCallbacks def test_submit_and_deliver(self): self._block_till_bind = defer.Deferred() # Startup yield self.startTransport() yield self.transport._block_till_bind # Next the Client submits a SMS to the Server # and recieves an ack and a delivery_report msg = TransportUserMessage( to_addr="2772222222", from_addr="2772000000", content='hello world', transport_name=self.transport_name, transport_type='smpp', transport_metadata={}, rkey='%s.outbound' % self.transport_name, timestamp='0', ) yield self.dispatch(msg) # We need the user_message_id to check the ack user_message_id = msg.payload["message_id"] wait_for_events = self._amqp.wait_messages( "vumi", "%s.event" % self.transport_name, 2, ) yield wait_for_events dispatched_events = self.get_dispatched_events() ack = dispatched_events[0].payload delv = dispatched_events[1].payload self.assertEqual(ack['message_type'], 'event') self.assertEqual(ack['event_type'], 'ack') self.assertEqual(ack['transport_name'], self.transport_name) self.assertEqual(ack['user_message_id'], user_message_id) # We need the sent_message_id to check the delivery_report sent_message_id = ack['sent_message_id'] self.assertEqual(delv['message_type'], 'event') self.assertEqual(delv['event_type'], 'delivery_report') self.assertEqual(delv['transport_name'], self.transport_name) self.assertEqual(delv['user_message_id'], sent_message_id) self.assertEqual(delv['delivery_status'], self.expected_delivery_status) # Finally the Server delivers a SMS to the Client pdu = DeliverSM(555, short_message="SMS from server", destination_addr="2772222222", source_addr="2772000000", ) self.service.factory.smsc.send_pdu(pdu) # Have the server fire of an out-of-order multipart sms self.send_out_of_order_multipart(self.service.factory.smsc, to_addr="2772222222", from_addr="2772000000") wait_for_inbound = self._amqp.wait_messages( "vumi", "%s.inbound" % self.transport_name, 2, ) yield wait_for_inbound dispatched_messages = self.get_dispatched_messages() mess = dispatched_messages[0].payload multipart = dispatched_messages[1].payload self.assertEqual(mess['message_type'], 'user_message') self.assertEqual(mess['transport_name'], self.transport_name) self.assertEqual(mess['content'], "SMS from server") # Check the incomming multipart is re-assembled correctly self.assertEqual(multipart['message_type'], 'user_message') self.assertEqual(multipart['transport_name'], self.transport_name) self.assertEqual(multipart['content'], "back at you") dispatched_failures = self.get_dispatched_failures() self.assertEqual(dispatched_failures, [])