def setUp(self):
        yield SMPPClientTestCases.setUp(self)

        # Init SMPPServerPB
        SMPPServerPBConfigInstance = SMPPServerPBConfig()
        SMPPServerPBInstance = SMPPServerPB(SMPPServerPBConfigInstance)
        SMPPServerPBInstance.addSmpps(self.smpps_factory)

        p = portal.Portal(JasminPBRealm(SMPPServerPBInstance))
        c = InMemoryUsernamePasswordDatabaseDontUse()
        c.addUser('smppsadmin', md5('smppspwd'.encode('ascii')).digest())
        p.registerChecker(c)
        jPBPortalRoot = JasminPBPortalRoot(p)
        self.SMPPServerPBInstanceServer = reactor.listenTCP(SMPPServerPBConfigInstance.port,
                                                            pb.PBServerFactory(jPBPortalRoot))

        # Init SMPPServerPBClient and connect it to SMPPServerPB
        SMPPServerPBClientConfigInstance = SMPPServerPBClientConfig()
        self.SMPPServerPBProxyInstance = SMPPServerPBProxy()
        yield self.SMPPServerPBProxyInstance.connect(
            SMPPServerPBClientConfigInstance.host,
            SMPPServerPBClientConfigInstance.port,
            SMPPServerPBClientConfigInstance.username,
            SMPPServerPBClientConfigInstance.password,
            retry=False)

        # Lower the timeout config to pass the timeout tests quickly
        self.DLRThrower.config.timeout = 2
        self.DLRThrower.config.retry_delay = 1
        self.DLRThrower.config.max_retries = 2

        # Most important thing:
        # Swap default direct smpps access to perspectivebroker smpps access:
        self.DLRThrower.addSmpps(self.SMPPServerPBProxyInstance)
    def setUp(self):
        yield SMPPClientTestCases.setUp(self)

        # Init SMPPServerPB
        SMPPServerPBConfigInstance = SMPPServerPBConfig()
        SMPPServerPBInstance = SMPPServerPB(SMPPServerPBConfigInstance)
        SMPPServerPBInstance.addSmpps(self.smpps_factory)

        p = portal.Portal(JasminPBRealm(SMPPServerPBInstance))
        c = InMemoryUsernamePasswordDatabaseDontUse()
        c.addUser('smppsadmin', md5('smppspwd').digest())
        p.registerChecker(c)
        jPBPortalRoot = JasminPBPortalRoot(p)
        self.SMPPServerPBInstanceServer = reactor.listenTCP(SMPPServerPBConfigInstance.port,
                                                            pb.PBServerFactory(jPBPortalRoot))

        # Init SMPPServerPBClient and connect it to SMPPServerPB
        SMPPServerPBClientConfigInstance = SMPPServerPBClientConfig()
        self.SMPPServerPBProxyInstance = SMPPServerPBProxy()
        yield self.SMPPServerPBProxyInstance.connect(
            SMPPServerPBClientConfigInstance.host,
            SMPPServerPBClientConfigInstance.port,
            SMPPServerPBClientConfigInstance.username,
            SMPPServerPBClientConfigInstance.password,
            retry=False)

        # Lower the timeout config to pass the timeout tests quickly
        self.DLRThrower.config.timeout = 2
        self.DLRThrower.config.retry_delay = 1
        self.DLRThrower.config.max_retries = 2

        # Most important thing:
        # Swap default direct smpps access to perspectivebroker smpps access:
        self.DLRThrower.addSmpps(self.SMPPServerPBProxyInstance)
示例#3
0
    def startSMPPServerPBClient(self):
        """Start SMPPServerPB client"""

        SMPPServerPBClientConfigInstance = SMPPServerPBClientConfig(
            self.options['config'])
        self.components['smpps-pb-client'] = SMPPServerPBProxy()

        return self.components['smpps-pb-client'].connect(
            SMPPServerPBClientConfigInstance.host,
            SMPPServerPBClientConfigInstance.port,
            SMPPServerPBClientConfigInstance.username,
            SMPPServerPBClientConfigInstance.password,
            retry=True)
class SMPPDLRThrowerTestCases(RouterPBProxy, SMPPClientTestCases, SubmitSmTestCaseTools):
    @defer.inlineCallbacks
    def setUp(self):
        yield SMPPClientTestCases.setUp(self)

        # Init SMPPServerPB
        SMPPServerPBConfigInstance = SMPPServerPBConfig()
        SMPPServerPBInstance = SMPPServerPB(SMPPServerPBConfigInstance)
        SMPPServerPBInstance.addSmpps(self.smpps_factory)

        p = portal.Portal(JasminPBRealm(SMPPServerPBInstance))
        c = InMemoryUsernamePasswordDatabaseDontUse()
        c.addUser('smppsadmin', md5('smppspwd').digest())
        p.registerChecker(c)
        jPBPortalRoot = JasminPBPortalRoot(p)
        self.SMPPServerPBInstanceServer = reactor.listenTCP(SMPPServerPBConfigInstance.port,
                                                            pb.PBServerFactory(jPBPortalRoot))

        # Init SMPPServerPBClient and connect it to SMPPServerPB
        SMPPServerPBClientConfigInstance = SMPPServerPBClientConfig()
        self.SMPPServerPBProxyInstance = SMPPServerPBProxy()
        yield self.SMPPServerPBProxyInstance.connect(
            SMPPServerPBClientConfigInstance.host,
            SMPPServerPBClientConfigInstance.port,
            SMPPServerPBClientConfigInstance.username,
            SMPPServerPBClientConfigInstance.password,
            retry=False)

        # Lower the timeout config to pass the timeout tests quickly
        self.DLRThrower.config.timeout = 2
        self.DLRThrower.config.retry_delay = 1
        self.DLRThrower.config.max_retries = 2

        # Most important thing:
        # Swap default direct smpps access to perspectivebroker smpps access:
        self.DLRThrower.addSmpps(self.SMPPServerPBProxyInstance)

    @defer.inlineCallbacks
    def tearDown(self):
        yield SMPPClientTestCases.tearDown(self)
        yield self.SMPPServerPBProxyInstance.disconnect()
        yield self.SMPPServerPBInstanceServer.stopListening()

    @defer.inlineCallbacks
    def publishDLRContentForSmppapi(self, message_status, msgid, system_id, source_addr, destination_addr,
                                    sub_date=None,
                                    source_addr_ton='UNKNOWN', source_addr_npi='UNKNOWN',
                                    dest_addr_ton='UNKNOWN', dest_addr_npi='UNKNOWN'):
        if sub_date is None:
            sub_date = datetime.datetime.now()

        content = DLRContentForSmpps(message_status, msgid, system_id, source_addr, destination_addr, sub_date,
                                     source_addr_ton, source_addr_npi, dest_addr_ton, dest_addr_npi)
        yield self.amqpBroker.publish(exchange='messaging', routing_key='dlr_thrower.smpps', content=content)

    @defer.inlineCallbacks
    def test_throwing_smpps_to_bound_connection_as_deliver_sm(self):
        self.DLRThrower.config.dlr_pdu = 'deliver_sm'

        self.DLRThrower.ackMessage = mock.Mock(wraps=self.DLRThrower.ackMessage)
        self.DLRThrower.rejectMessage = mock.Mock(wraps=self.DLRThrower.rejectMessage)
        self.DLRThrower.smpp_dlr_callback = mock.Mock(wraps=self.DLRThrower.smpp_dlr_callback)

        # Bind
        yield self.connect('127.0.0.1', self.pbPort)
        yield self.prepareRoutingsAndStartConnector()
        yield self.smppc_factory.connectAndBind()

        # Install mocks
        self.smppc_factory.lastProto.PDUDataRequestReceived = mock.Mock(
            wraps=self.smppc_factory.lastProto.PDUDataRequestReceived)

        sub_date = datetime.datetime.now()
        yield self.publishDLRContentForSmppapi('ESME_ROK', 'MSGID', 'username', '999', '000', sub_date)

        yield waitFor(1)

        # Run tests
        self.assertEqual(self.smppc_factory.lastProto.PDUDataRequestReceived.call_count, 1)
        # the received pdu must be a DeliverSM
        received_pdu_1 = self.smppc_factory.lastProto.PDUDataRequestReceived.call_args_list[0][0][0]
        self.assertEqual(received_pdu_1.id, pdu_types.CommandId.deliver_sm)
        self.assertEqual(received_pdu_1.params['source_addr'], '000')
        self.assertEqual(received_pdu_1.params['destination_addr'], '999')
        self.assertEqual(received_pdu_1.params['receipted_message_id'], 'MSGID')
        self.assertEqual(str(received_pdu_1.params['message_state']), 'ACCEPTED')
        self.assertEqual(received_pdu_1.params['short_message'],
                         'id:MSGID submit date:%s done date:%s stat:ACCEPTD err:000' % (
                             sub_date.strftime("%Y%m%d%H%M"),
                             sub_date.strftime("%Y%m%d%H%M"),
                         ))

        # Unbind & Disconnect
        yield self.smppc_factory.smpp.unbindAndDisconnect()
        yield self.stopSmppClientConnectors()

    @defer.inlineCallbacks
    def test_throwing_smpps_to_bound_connection(self):
        self.DLRThrower.ackMessage = mock.Mock(wraps=self.DLRThrower.ackMessage)
        self.DLRThrower.rejectMessage = mock.Mock(wraps=self.DLRThrower.rejectMessage)
        self.DLRThrower.smpp_dlr_callback = mock.Mock(wraps=self.DLRThrower.smpp_dlr_callback)

        # Bind
        yield self.connect('127.0.0.1', self.pbPort)
        yield self.prepareRoutingsAndStartConnector()
        yield self.smppc_factory.connectAndBind()

        yield self.publishDLRContentForSmppapi('ESME_ROK', 'MSGID', 'username', '999', '000')

        yield waitFor(1)

        # Run tests
        self.assertEqual(self.DLRThrower.smpp_dlr_callback.call_count, 1)
        self.assertEqual(self.DLRThrower.ackMessage.call_count, 1)
        self.assertEqual(self.DLRThrower.rejectMessage.call_count, 0)

        # Unbind & Disconnect
        yield self.smppc_factory.smpp.unbindAndDisconnect()
        yield self.stopSmppClientConnectors()

    @defer.inlineCallbacks
    def test_throwing_smpps_to_not_bound_connection(self):
        self.DLRThrower.ackMessage = mock.Mock(wraps=self.DLRThrower.ackMessage)
        self.DLRThrower.rejectMessage = mock.Mock(wraps=self.DLRThrower.rejectMessage)
        self.DLRThrower.rejectAndRequeueMessage = mock.Mock(wraps=self.DLRThrower.rejectAndRequeueMessage)
        self.DLRThrower.smpp_dlr_callback = mock.Mock(wraps=self.DLRThrower.smpp_dlr_callback)

        yield self.publishDLRContentForSmppapi('ESME_ROK', 'MSGID', 'username', '999', '000')

        yield waitFor(3)

        # Run tests
        self.assertEqual(self.DLRThrower.smpp_dlr_callback.call_count, 3)
        self.assertEqual(self.DLRThrower.ackMessage.call_count, 0)
        self.assertEqual(self.DLRThrower.rejectMessage.call_count, 3)
        self.assertEqual(self.DLRThrower.rejectAndRequeueMessage.call_count, 2)

    @defer.inlineCallbacks
    def test_throwing_smpps_with_no_deliverers(self):
        self.DLRThrower.ackMessage = mock.Mock(wraps=self.DLRThrower.ackMessage)
        self.DLRThrower.rejectMessage = mock.Mock(wraps=self.DLRThrower.rejectMessage)
        self.DLRThrower.rejectAndRequeueMessage = mock.Mock(wraps=self.DLRThrower.rejectAndRequeueMessage)
        self.DLRThrower.smpp_dlr_callback = mock.Mock(wraps=self.DLRThrower.smpp_dlr_callback)

        # Bind (as a transmitter so we get no deliverers for DLR)
        yield self.connect('127.0.0.1', self.pbPort)
        yield self.prepareRoutingsAndStartConnector()
        self.smppc_config.bindOperation = 'transmitter'
        yield self.smppc_factory.connectAndBind()

        yield self.publishDLRContentForSmppapi('ESME_ROK', 'MSGID', 'username', '999', '000')

        yield waitFor(3)

        # Run tests
        self.assertEqual(self.DLRThrower.smpp_dlr_callback.call_count, 3)
        self.assertEqual(self.DLRThrower.ackMessage.call_count, 0)
        self.assertEqual(self.DLRThrower.rejectMessage.call_count, 3)
        self.assertEqual(self.DLRThrower.rejectAndRequeueMessage.call_count, 2)

        # Unbind & Disconnect
        yield self.smppc_factory.smpp.unbindAndDisconnect()
        yield self.stopSmppClientConnectors()

    @defer.inlineCallbacks
    def test_throwing_smpps_without_smppsFactory(self):
        self.DLRThrower.ackMessage = mock.Mock(wraps=self.DLRThrower.ackMessage)
        self.DLRThrower.rejectMessage = mock.Mock(wraps=self.DLRThrower.rejectMessage)
        self.DLRThrower.rejectAndRequeueMessage = mock.Mock(wraps=self.DLRThrower.rejectAndRequeueMessage)
        self.DLRThrower.smpp_dlr_callback = mock.Mock(wraps=self.DLRThrower.smpp_dlr_callback)

        # Remove smpps from self.DLRThrower
        self.DLRThrower.smpps = None
        self.DLRThrower.smpps_access = None

        yield self.publishDLRContentForSmppapi('ESME_ROK', 'MSGID', 'username', '999', '000')

        yield waitFor(1)

        # Run tests
        self.assertEqual(self.DLRThrower.smpp_dlr_callback.call_count, 1)
        self.assertEqual(self.DLRThrower.ackMessage.call_count, 0)
        self.assertEqual(self.DLRThrower.rejectMessage.call_count, 1)
        self.assertEqual(self.DLRThrower.rejectAndRequeueMessage.call_count, 0)
class SMPPDLRThrowerTestCases(RouterPBProxy, SMPPClientTestCases, SubmitSmTestCaseTools):
    @defer.inlineCallbacks
    def setUp(self):
        yield SMPPClientTestCases.setUp(self)

        # Init SMPPServerPB
        SMPPServerPBConfigInstance = SMPPServerPBConfig()
        SMPPServerPBInstance = SMPPServerPB(SMPPServerPBConfigInstance)
        SMPPServerPBInstance.addSmpps(self.smpps_factory)

        p = portal.Portal(JasminPBRealm(SMPPServerPBInstance))
        c = InMemoryUsernamePasswordDatabaseDontUse()
        c.addUser('smppsadmin', md5('smppspwd'.encode('ascii')).digest())
        p.registerChecker(c)
        jPBPortalRoot = JasminPBPortalRoot(p)
        self.SMPPServerPBInstanceServer = reactor.listenTCP(SMPPServerPBConfigInstance.port,
                                                            pb.PBServerFactory(jPBPortalRoot))

        # Init SMPPServerPBClient and connect it to SMPPServerPB
        SMPPServerPBClientConfigInstance = SMPPServerPBClientConfig()
        self.SMPPServerPBProxyInstance = SMPPServerPBProxy()
        yield self.SMPPServerPBProxyInstance.connect(
            SMPPServerPBClientConfigInstance.host,
            SMPPServerPBClientConfigInstance.port,
            SMPPServerPBClientConfigInstance.username,
            SMPPServerPBClientConfigInstance.password,
            retry=False)

        # Lower the timeout config to pass the timeout tests quickly
        self.DLRThrower.config.timeout = 2
        self.DLRThrower.config.retry_delay = 1
        self.DLRThrower.config.max_retries = 2

        # Most important thing:
        # Swap default direct smpps access to perspectivebroker smpps access:
        self.DLRThrower.addSmpps(self.SMPPServerPBProxyInstance)

    @defer.inlineCallbacks
    def tearDown(self):
        yield SMPPClientTestCases.tearDown(self)
        yield self.SMPPServerPBProxyInstance.disconnect()
        yield self.SMPPServerPBInstanceServer.stopListening()

    @defer.inlineCallbacks
    def publishDLRContentForSmppapi(self, message_status, msgid, system_id, source_addr, destination_addr,
                                    sub_date=None,
                                    source_addr_ton='UNKNOWN', source_addr_npi='UNKNOWN',
                                    dest_addr_ton='UNKNOWN', dest_addr_npi='UNKNOWN'):
        if sub_date is None:
            sub_date = datetime.datetime.now()

        content = DLRContentForSmpps(message_status, msgid, system_id, source_addr, destination_addr, sub_date,
                                     source_addr_ton, source_addr_npi, dest_addr_ton, dest_addr_npi)
        yield self.amqpBroker.publish(exchange='messaging', routing_key='dlr_thrower.smpps', content=content)

    @defer.inlineCallbacks
    def test_throwing_smpps_to_bound_connection_as_deliver_sm(self):
        self.DLRThrower.config.dlr_pdu = 'deliver_sm'

        self.DLRThrower.ackMessage = Mock(wraps=self.DLRThrower.ackMessage)
        self.DLRThrower.rejectMessage = Mock(wraps=self.DLRThrower.rejectMessage)
        self.DLRThrower.smpp_dlr_callback = Mock(wraps=self.DLRThrower.smpp_dlr_callback)

        # Bind
        yield self.connect('127.0.0.1', self.pbPort)
        yield self.prepareRoutingsAndStartConnector()
        yield self.smppc_factory.connectAndBind()

        # Install mocks
        self.smppc_factory.lastProto.PDUDataRequestReceived = Mock(
            wraps=self.smppc_factory.lastProto.PDUDataRequestReceived)

        sub_date = datetime.datetime.now()
        yield self.publishDLRContentForSmppapi('ESME_ROK', 'MSGID', 'username', '999', '000', sub_date)

        yield waitFor(1)

        # Run tests
        self.assertEqual(self.smppc_factory.lastProto.PDUDataRequestReceived.call_count, 1)
        # the received pdu must be a DeliverSM
        received_pdu_1 = self.smppc_factory.lastProto.PDUDataRequestReceived.call_args_list[0][0][0]
        self.assertEqual(received_pdu_1.id, CommandId.deliver_sm)
        self.assertEqual(received_pdu_1.params['source_addr'], b'000')
        self.assertEqual(received_pdu_1.params['destination_addr'], b'999')
        self.assertEqual(received_pdu_1.params['receipted_message_id'], b'MSGID')
        self.assertEqual(received_pdu_1.params['message_state'], MessageState.ACCEPTED)
        self.assertEqual(received_pdu_1.params['short_message'],
                         ('id:MSGID submit date:%s done date:%s stat:ACCEPTD err:99' % (
                             sub_date.strftime("%y%m%d%H%M"),
                             sub_date.strftime("%y%m%d%H%M"),
                         )).encode())

        # Unbind & Disconnect
        yield self.smppc_factory.smpp.unbindAndDisconnect()
        yield self.stopSmppClientConnectors()

    @defer.inlineCallbacks
    def test_throwing_smpps_to_bound_connection(self):
        self.DLRThrower.ackMessage = Mock(wraps=self.DLRThrower.ackMessage)
        self.DLRThrower.rejectMessage = Mock(wraps=self.DLRThrower.rejectMessage)
        self.DLRThrower.smpp_dlr_callback = Mock(wraps=self.DLRThrower.smpp_dlr_callback)

        # Bind
        yield self.connect('127.0.0.1', self.pbPort)
        yield self.prepareRoutingsAndStartConnector()
        yield self.smppc_factory.connectAndBind()

        yield self.publishDLRContentForSmppapi('ESME_ROK', 'MSGID', 'username', '999', '000')

        yield waitFor(1)

        # Run tests
        self.assertEqual(self.DLRThrower.smpp_dlr_callback.call_count, 1)
        self.assertEqual(self.DLRThrower.ackMessage.call_count, 1)
        self.assertEqual(self.DLRThrower.rejectMessage.call_count, 0)

        # Unbind & Disconnect
        yield self.smppc_factory.smpp.unbindAndDisconnect()
        yield self.stopSmppClientConnectors()

    @defer.inlineCallbacks
    def test_throwing_smpps_to_not_bound_connection(self):
        self.DLRThrower.ackMessage = Mock(wraps=self.DLRThrower.ackMessage)
        self.DLRThrower.rejectMessage = Mock(wraps=self.DLRThrower.rejectMessage)
        self.DLRThrower.rejectAndRequeueMessage = Mock(wraps=self.DLRThrower.rejectAndRequeueMessage)
        self.DLRThrower.smpp_dlr_callback = Mock(wraps=self.DLRThrower.smpp_dlr_callback)

        yield self.publishDLRContentForSmppapi('ESME_ROK', 'MSGID', 'username', '999', '000')

        yield waitFor(3)

        # Run tests
        self.assertEqual(self.DLRThrower.smpp_dlr_callback.call_count, 3)
        self.assertEqual(self.DLRThrower.ackMessage.call_count, 0)
        self.assertEqual(self.DLRThrower.rejectMessage.call_count, 3)
        self.assertEqual(self.DLRThrower.rejectAndRequeueMessage.call_count, 2)

    @defer.inlineCallbacks
    def test_throwing_smpps_with_no_deliverers(self):
        self.DLRThrower.ackMessage = Mock(wraps=self.DLRThrower.ackMessage)
        self.DLRThrower.rejectMessage = Mock(wraps=self.DLRThrower.rejectMessage)
        self.DLRThrower.rejectAndRequeueMessage = Mock(wraps=self.DLRThrower.rejectAndRequeueMessage)
        self.DLRThrower.smpp_dlr_callback = Mock(wraps=self.DLRThrower.smpp_dlr_callback)

        # Bind (as a transmitter so we get no deliverers for DLR)
        yield self.connect('127.0.0.1', self.pbPort)
        yield self.prepareRoutingsAndStartConnector()
        self.smppc_config.bindOperation = 'transmitter'
        yield self.smppc_factory.connectAndBind()

        yield self.publishDLRContentForSmppapi('ESME_ROK', 'MSGID', 'username', '999', '000')

        yield waitFor(3)

        # Run tests
        self.assertEqual(self.DLRThrower.smpp_dlr_callback.call_count, 3)
        self.assertEqual(self.DLRThrower.ackMessage.call_count, 0)
        self.assertEqual(self.DLRThrower.rejectMessage.call_count, 3)
        self.assertEqual(self.DLRThrower.rejectAndRequeueMessage.call_count, 2)

        # Unbind & Disconnect
        yield self.smppc_factory.smpp.unbindAndDisconnect()
        yield self.stopSmppClientConnectors()

    @defer.inlineCallbacks
    def test_throwing_smpps_without_smppsFactory(self):
        self.DLRThrower.ackMessage = Mock(wraps=self.DLRThrower.ackMessage)
        self.DLRThrower.rejectMessage = Mock(wraps=self.DLRThrower.rejectMessage)
        self.DLRThrower.rejectAndRequeueMessage = Mock(wraps=self.DLRThrower.rejectAndRequeueMessage)
        self.DLRThrower.smpp_dlr_callback = Mock(wraps=self.DLRThrower.smpp_dlr_callback)

        # Remove smpps from self.DLRThrower
        self.DLRThrower.smpps = None
        self.DLRThrower.smpps_access = None

        yield self.publishDLRContentForSmppapi('ESME_ROK', 'MSGID', 'username', '999', '000')

        yield waitFor(1)

        # Run tests
        self.assertEqual(self.DLRThrower.smpp_dlr_callback.call_count, 1)
        self.assertEqual(self.DLRThrower.ackMessage.call_count, 0)
        self.assertEqual(self.DLRThrower.rejectMessage.call_count, 1)
        self.assertEqual(self.DLRThrower.rejectAndRequeueMessage.call_count, 0)