Exemplo n.º 1
0
    def test_delivery_failover_route(self):
        """#467: Will ensure a failover route will deliver the message"""

        yield self.connect('127.0.0.1', self.pbPort)
        # Connect to SMSC
        source_connector = Connector(id_generator())
        wrong_port = self.AckServer.getHost().port + 1000
        route = FailoverMORoute([TransparentFilter()], [
            HttpConnector(id_generator(),
                          'http://127.0.0.1:%s/send' % wrong_port, 'POST'),
            HttpConnector(
                id_generator(), 'http://127.0.0.1:%s/send' %
                self.AckServer.getHost().port, 'POST')
        ])
        yield self.prepareRoutingsAndStartConnector(source_connector, route)

        # Send a data_sm from the SMSC
        pdu = DataSM(
            source_addr='1234',
            destination_addr='4567',
            message_payload='any content',
        )
        yield self.triggerDataSmFromSMSC([pdu])

        # Run tests
        # Test callback in router
        self.assertEqual(self.pbRoot_f.deliver_sm_callback.call_count, 1)
        # Destination connector must receive the message one time (no retries)
        self.assertEqual(self.AckServerResource.render_POST.call_count, 1)

        # Disconnector from SMSC
        yield self.stopConnector(source_connector)
Exemplo n.º 2
0
    def test_unordered_long_content_delivery_HttpConnector(self):
        yield self.connect('127.0.0.1', self.pbPort)
        # Connect to SMSC
        source_connector = Connector(id_generator())
        yield self.prepareRoutingsAndStartConnector(source_connector)

        # Send a deliver_sm from the SMSC
        basePdu = DeliverSM(
            source_addr='1234',
            destination_addr='4567',
            short_message='',
            sar_total_segments=3,
            sar_msg_ref_num=int(id_generator(size=2, chars=string.digits)),
        )
        pdu_part1 = copy.deepcopy(basePdu)
        pdu_part2 = copy.deepcopy(basePdu)
        pdu_part3 = copy.deepcopy(basePdu)
        pdu_part1.params[
            'short_message'] = b'__1st_part_with_153_char________________________________________________________________________________________________________________________________.'
        pdu_part1.params['sar_segment_seqnum'] = 1
        pdu_part2.params[
            'short_message'] = b'__2nd_part_with_153_char________________________________________________________________________________________________________________________________.'
        pdu_part2.params['sar_segment_seqnum'] = 2
        pdu_part3.params['short_message'] = b'__3rd_part_end.'
        pdu_part3.params['sar_segment_seqnum'] = 3
        yield self.triggerDeliverSmFromSMSC([pdu_part2, pdu_part1, pdu_part3])

        # Run tests
        # Destination connector must receive the message one time (no retries)
        self.assertEqual(self.AckServerResource.render_POST.call_count, 1)
        # Assert received args
        receivedHttpReq = self.AckServerResource.last_request.args
        self.assertEqual(len(receivedHttpReq), 8)
        self.assertEqual(receivedHttpReq[b'from'],
                         [basePdu.params['source_addr']])
        self.assertEqual(receivedHttpReq[b'to'],
                         [basePdu.params['destination_addr']])
        self.assertEqual(receivedHttpReq[b'content'], [
            pdu_part1.params['short_message'] +
            pdu_part2.params['short_message'] +
            pdu_part3.params['short_message']
        ])
        self.assertEqual(receivedHttpReq[b'binary'], [
            binascii.hexlify(pdu_part1.params['short_message'] +
                             pdu_part2.params['short_message'] +
                             pdu_part3.params['short_message'])
        ])
        self.assertEqual(receivedHttpReq[b'origin-connector'],
                         [source_connector.cid.encode()])

        # Disconnector from SMSC
        yield self.stopConnector(source_connector)
Exemplo n.º 3
0
    def test_delivery_HttpConnector(self):
        yield self.connect('127.0.0.1', self.pbPort)
        # Connect to SMSC
        source_connector = Connector(id_generator())
        yield self.prepareRoutingsAndStartConnector(source_connector)

        # Send a data_sm from the SMSC
        pdu = DataSM(
            source_addr='1234',
            destination_addr='4567',
            message_payload='any content',
        )
        yield self.triggerDataSmFromSMSC([pdu])

        # Run tests
        # Test callback in router
        self.assertEqual(self.pbRoot_f.deliver_sm_callback.call_count, 1)
        # Destination connector must receive the message one time (no retries)
        self.assertEqual(self.AckServerResource.render_POST.call_count, 1)
        # Assert received args
        receivedHttpReq = self.AckServerResource.last_request.args
        self.assertEqual(len(receivedHttpReq), 7)
        self.assertEqual(receivedHttpReq[b'from'], [pdu.params['source_addr']])
        self.assertEqual(receivedHttpReq[b'to'],
                         [pdu.params['destination_addr']])
        self.assertEqual(receivedHttpReq[b'content'],
                         [pdu.params['message_payload']])
        self.assertEqual(receivedHttpReq[b'origin-connector'],
                         [source_connector.cid.encode()])

        # Disconnector from SMSC
        yield self.stopConnector(source_connector)
Exemplo n.º 4
0
    def test_delivery_HttpConnector_message_payload_when_short_message_empty(
            self):
        """Related to #470
        Consider 'message_payload' when 'short_message' is empty"""
        yield self.connect('127.0.0.1', self.pbPort)
        # Connect to SMSC
        source_connector = Connector(id_generator())
        yield self.prepareRoutingsAndStartConnector(source_connector)

        # Send a deliver_sm from the SMSC
        assert_content = b'Some content'
        pdu = DeliverSM(source_addr='1234',
                        destination_addr='4567',
                        short_message='',
                        message_payload=assert_content)
        yield self.triggerDeliverSmFromSMSC([pdu])

        # Run tests
        # Test callback in router
        self.assertEqual(self.pbRoot_f.deliver_sm_callback.call_count, 1)
        # Destination connector must receive the message one time (no retries)
        self.assertEqual(self.AckServerResource.render_POST.call_count, 1)
        # Assert received args
        receivedHttpReq = self.AckServerResource.last_request.args
        self.assertEqual(len(receivedHttpReq), 8)
        self.assertEqual(receivedHttpReq[b'content'], [assert_content])
        self.assertEqual(receivedHttpReq[b'binary'],
                         [binascii.hexlify(assert_content)])

        # Disconnector from SMSC
        yield self.stopConnector(source_connector)
Exemplo n.º 5
0
    def provision_user_connector(self, add_route=True):
        # provision user
        g1 = Group(1)
        yield self.group_add(g1)
        self.c1 = SmppClientConnector(id_generator())
        u1_password = '******'
        self.u1 = User(1, g1, 'username', u1_password)
        yield self.user_add(self.u1)

        # provision route
        if add_route:
            yield self.mtroute_add(DefaultRoute(self.c1), 0)
Exemplo n.º 6
0
    def setUp(self):
        SMPPClientTestCases.setUp(self)

        # Provision a user and default route into RouterPB
        # Add throughput limit on user
        self.foo = User('u1', Group('test'), 'username', 'password')
        self.foo.mt_credential.setQuota('smpps_throughput', 2)
        self.c1 = SmppClientConnector(id_generator())
        self.defaultroute = DefaultRoute(self.c1)
        self.provision_user_defaultroute(user=self.foo,
                                         defaultroute=self.defaultroute)

        self.stats = SMPPServerStatsCollector().get(cid=self.smpps_config.id)
Exemplo n.º 7
0
    def setUp(self):
        # Initiating config objects without any filename
        # will lead to setting defaults and that's what we
        # need to run the tests
        self.routerpb_config = RouterPBConfig()

        # Instanciate RouterPB but will not launch a server
        # we only need the instance to access its .users attribute
        # for authentication
        self.routerpb_factory = RouterPB(self.routerpb_config,
                                         persistenceTimer=False)

        # Provision a user and default route into RouterPB
        self.foo = User('u1', Group('test'), 'username', 'password')
        self.c1 = SmppClientConnector(id_generator())
        self.defaultroute = DefaultRoute(self.c1)
        self.provision_user_defaultroute(user=self.foo,
                                         defaultroute=self.defaultroute)
Exemplo n.º 8
0
    def prepareRoutingsAndStartConnector(self,
                                         connector,
                                         route=None,
                                         route_order=1):
        self.AckServerResource.render_POST = Mock(
            wraps=self.AckServerResource.render_POST)

        # Prepare for routing
        connector.port = self.SMSCPort.getHost().port

        # Set the route
        if route is None:
            c2_destination = HttpConnector(
                id_generator(),
                'http://127.0.0.1:%s/send' % self.AckServer.getHost().port,
                'POST')
            yield self.moroute_add(DefaultRoute(c2_destination), 0)
        else:
            yield self.moroute_add(route, route_order)

        # Now we'll create the connector 1 from which we'll receive DataSM PDUs before
        # throwing to http
        yield self.SMPPClientManagerPBProxy.connect('127.0.0.1',
                                                    self.CManagerPort)
        c1Config = SMPPClientConfig(id=connector.cid, port=connector.port)
        yield self.SMPPClientManagerPBProxy.add(c1Config)

        # Start the connector
        yield self.SMPPClientManagerPBProxy.start(connector.cid)
        # Wait for 'BOUND_TRX' state
        while True:
            ssRet = yield self.SMPPClientManagerPBProxy.session_state(
                connector.cid)
            if ssRet == 'BOUND_TRX':
                break
            else:
                yield waitFor(0.2)
Exemplo n.º 9
0
    def test_long_content_delivery_UDH_SmppsConnector(self):
        yield self.connect('127.0.0.1', self.pbPort)
        yield self.prepareRoutingsAndStartConnector()

        # Bind
        yield self.smppc_factory.connectAndBind()

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

        # Build a UDH
        baseUdh = []
        baseUdh.append(struct.pack('!B', 5))  # Length of User Data Header
        baseUdh.append(
            struct.pack('!B', 0)
        )  # Information Element Identifier, equal to 00 (Concatenated short messages, 8-bit reference number)
        baseUdh.append(
            struct.pack('!B', 3)
        )  # Length of the header, excluding the first two fields; equal to 03
        baseUdh.append(
            struct.pack('!B',
                        int(id_generator(size=2,
                                         chars=string.digits))))  # msg_ref_num
        baseUdh.append(struct.pack('!B', 3))  # total_segments

        # Send a data_sm from the SMSC
        basePdu = DataSM(
            source_addr='1234',
            destination_addr='4567',
            message_payload='',
            esm_class=EsmClass(EsmClassMode.DEFAULT, EsmClassType.DEFAULT,
                               [EsmClassGsmFeatures.UDHI_INDICATOR_SET]),
        )
        pdu_part1 = copy.deepcopy(basePdu)
        udh_part1 = copy.deepcopy(baseUdh)
        pdu_part2 = copy.deepcopy(basePdu)
        udh_part2 = copy.deepcopy(baseUdh)
        pdu_part3 = copy.deepcopy(basePdu)
        udh_part3 = copy.deepcopy(baseUdh)
        udh_part1.append(struct.pack('!B', 1))  # segment_seqnum
        pdu_part1.params[
            'more_messages_to_send'] = MoreMessagesToSend.MORE_MESSAGES
        pdu_part1.params['message_payload'] = b''.join(
            udh_part1
        ) + b'__1st_part_with_153_char________________________________________________________________________________________________________________________________.'
        udh_part2.append(struct.pack('!B', 2))  # segment_seqnum
        pdu_part2.params[
            'more_messages_to_send'] = MoreMessagesToSend.MORE_MESSAGES
        pdu_part2.params['message_payload'] = b''.join(
            udh_part2
        ) + b'__2nd_part_with_153_char________________________________________________________________________________________________________________________________.'
        udh_part3.append(struct.pack('!B', 3))  # segment_seqnum
        pdu_part3.params[
            'more_messages_to_send'] = MoreMessagesToSend.NO_MORE_MESSAGES
        pdu_part3.params['message_payload'] = b''.join(
            udh_part3) + b'__3rd_part_end.'
        yield self.triggerDataSmFromSMSC([pdu_part1, pdu_part2, pdu_part3])

        # Run tests
        self.assertEqual(
            self.smppc_factory.lastProto.PDUDataRequestReceived.call_count, 3)
        # First received pdu
        received_pdu_1 = self.smppc_factory.lastProto.PDUDataRequestReceived.call_args_list[
            0][0][0]
        self.assertEqual(received_pdu_1.seqNum, 1)
        self.assertEqual(received_pdu_1.id, CommandId.data_sm)
        self.assertEqual(received_pdu_1.params['source_addr'],
                         basePdu.params['source_addr'])
        self.assertEqual(received_pdu_1.params['destination_addr'],
                         basePdu.params['destination_addr'])
        self.assertEqual(received_pdu_1.params['esm_class'],
                         basePdu.params['esm_class'])
        self.assertEqual(received_pdu_1.params['message_payload'][6:],
                         pdu_part1.params['message_payload'][6:])
        # Second received pdu
        received_pdu_2 = self.smppc_factory.lastProto.PDUDataRequestReceived.call_args_list[
            1][0][0]
        self.assertEqual(received_pdu_2.seqNum, 2)
        self.assertEqual(received_pdu_2.id, CommandId.data_sm)
        self.assertEqual(received_pdu_2.params['source_addr'],
                         basePdu.params['source_addr'])
        self.assertEqual(received_pdu_2.params['destination_addr'],
                         basePdu.params['destination_addr'])
        self.assertEqual(received_pdu_2.params['esm_class'],
                         basePdu.params['esm_class'])
        self.assertEqual(received_pdu_2.params['message_payload'][6:],
                         pdu_part2.params['message_payload'][6:])
        # Third received pdu
        received_pdu_3 = self.smppc_factory.lastProto.PDUDataRequestReceived.call_args_list[
            2][0][0]
        self.assertEqual(received_pdu_3.seqNum, 3)
        self.assertEqual(received_pdu_3.id, CommandId.data_sm)
        self.assertEqual(received_pdu_3.params['source_addr'],
                         basePdu.params['source_addr'])
        self.assertEqual(received_pdu_3.params['destination_addr'],
                         basePdu.params['destination_addr'])
        self.assertEqual(received_pdu_3.params['esm_class'],
                         basePdu.params['esm_class'])
        self.assertEqual(received_pdu_3.params['message_payload'][6:],
                         pdu_part3.params['message_payload'][6:])

        # Unbind and disconnect
        yield self.smppc_factory.smpp.unbindAndDisconnect()
        yield self.stopSmppClientConnectors()
Exemplo n.º 10
0
    def test_long_content_delivery_SAR_SmppsConnector(self):
        yield self.connect('127.0.0.1', self.pbPort)
        yield self.prepareRoutingsAndStartConnector()

        # Bind
        yield self.smppc_factory.connectAndBind()

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

        # Send a data_sm from the SMSC
        basePdu = DataSM(
            source_addr='1234',
            destination_addr='4567',
            message_payload='',
            sar_total_segments=3,
            sar_msg_ref_num=int(id_generator(size=2, chars=string.digits)),
        )
        pdu_part1 = copy.deepcopy(basePdu)
        pdu_part2 = copy.deepcopy(basePdu)
        pdu_part3 = copy.deepcopy(basePdu)
        pdu_part1.params[
            'message_payload'] = b'__1st_part_with_153_char________________________________________________________________________________________________________________________________.'
        pdu_part1.params['sar_segment_seqnum'] = 1
        pdu_part2.params[
            'message_payload'] = b'__2nd_part_with_153_char________________________________________________________________________________________________________________________________.'
        pdu_part2.params['sar_segment_seqnum'] = 2
        pdu_part3.params['message_payload'] = b'__3rd_part_end.'
        pdu_part3.params['sar_segment_seqnum'] = 3
        yield self.triggerDataSmFromSMSC([pdu_part1, pdu_part2, pdu_part3])

        # Run tests
        self.assertEqual(
            self.smppc_factory.lastProto.PDUDataRequestReceived.call_count, 3)
        # First received pdu
        received_pdu_1 = self.smppc_factory.lastProto.PDUDataRequestReceived.call_args_list[
            0][0][0]
        self.assertEqual(received_pdu_1.seqNum, 1)
        self.assertEqual(received_pdu_1.id, CommandId.data_sm)
        self.assertEqual(received_pdu_1.params['source_addr'],
                         basePdu.params['source_addr'])
        self.assertEqual(received_pdu_1.params['destination_addr'],
                         basePdu.params['destination_addr'])
        self.assertEqual(received_pdu_1.params['message_payload'],
                         pdu_part1.params['message_payload'])
        self.assertEqual(received_pdu_1.params['sar_segment_seqnum'],
                         pdu_part1.params['sar_segment_seqnum'])
        # Second received pdu
        received_pdu_2 = self.smppc_factory.lastProto.PDUDataRequestReceived.call_args_list[
            1][0][0]
        self.assertEqual(received_pdu_2.seqNum, 2)
        self.assertEqual(received_pdu_2.id, CommandId.data_sm)
        self.assertEqual(received_pdu_2.params['source_addr'],
                         basePdu.params['source_addr'])
        self.assertEqual(received_pdu_2.params['destination_addr'],
                         basePdu.params['destination_addr'])
        self.assertEqual(received_pdu_2.params['message_payload'],
                         pdu_part2.params['message_payload'])
        self.assertEqual(received_pdu_2.params['sar_segment_seqnum'],
                         pdu_part2.params['sar_segment_seqnum'])
        self.assertNotEqual(received_pdu_2.params['message_payload'],
                            received_pdu_1.params['message_payload'])
        self.assertNotEqual(received_pdu_2.params['sar_segment_seqnum'],
                            received_pdu_1.params['sar_segment_seqnum'])
        # Third received pdu
        received_pdu_3 = self.smppc_factory.lastProto.PDUDataRequestReceived.call_args_list[
            2][0][0]
        self.assertEqual(received_pdu_3.seqNum, 3)
        self.assertEqual(received_pdu_3.id, CommandId.data_sm)
        self.assertEqual(received_pdu_3.params['source_addr'],
                         basePdu.params['source_addr'])
        self.assertEqual(received_pdu_3.params['destination_addr'],
                         basePdu.params['destination_addr'])
        self.assertEqual(received_pdu_3.params['message_payload'],
                         pdu_part3.params['message_payload'])
        self.assertEqual(received_pdu_3.params['sar_segment_seqnum'],
                         pdu_part3.params['sar_segment_seqnum'])
        self.assertNotEqual(received_pdu_3.params['message_payload'],
                            received_pdu_2.params['message_payload'])
        self.assertNotEqual(received_pdu_3.params['sar_segment_seqnum'],
                            received_pdu_2.params['sar_segment_seqnum'])

        # Unbind and disconnect
        yield self.smppc_factory.smpp.unbindAndDisconnect()
        yield self.stopSmppClientConnectors()
Exemplo n.º 11
0
    def test_long_content_delivery_UDH_HttpConnector(self):
        yield self.connect('127.0.0.1', self.pbPort)
        # Connect to SMSC
        source_connector = Connector(id_generator())
        yield self.prepareRoutingsAndStartConnector(source_connector)

        # Build a UDH
        baseUdh = []
        baseUdh.append(struct.pack('!B', 5))  # Length of User Data Header
        baseUdh.append(
            struct.pack('!B', 0)
        )  # Information Element Identifier, equal to 00 (Concatenated short messages, 8-bit reference number)
        baseUdh.append(
            struct.pack('!B', 3)
        )  # Length of the header, excluding the first two fields; equal to 03
        baseUdh.append(
            struct.pack('!B',
                        int(id_generator(size=2,
                                         chars=string.digits))))  # msg_ref_num
        baseUdh.append(struct.pack('!B', 3))  # total_segments

        # Send a data_sm from the SMSC
        basePdu = DataSM(
            source_addr='1234',
            destination_addr='4567',
            message_payload='',
            esm_class=EsmClass(EsmClassMode.DEFAULT, EsmClassType.DEFAULT,
                               [EsmClassGsmFeatures.UDHI_INDICATOR_SET]),
        )
        pdu_part1 = copy.deepcopy(basePdu)
        udh_part1 = copy.deepcopy(baseUdh)
        pdu_part2 = copy.deepcopy(basePdu)
        udh_part2 = copy.deepcopy(baseUdh)
        pdu_part3 = copy.deepcopy(basePdu)
        udh_part3 = copy.deepcopy(baseUdh)
        udh_part1.append(struct.pack('!B', 1))  # segment_seqnum
        pdu_part1.params[
            'more_messages_to_send'] = MoreMessagesToSend.MORE_MESSAGES
        pdu_part1.params['message_payload'] = b''.join(
            udh_part1
        ) + b'__1st_part_with_153_char________________________________________________________________________________________________________________________________.'
        udh_part2.append(struct.pack('!B', 2))  # segment_seqnum
        pdu_part2.params[
            'more_messages_to_send'] = MoreMessagesToSend.MORE_MESSAGES
        pdu_part2.params['message_payload'] = b''.join(
            udh_part2
        ) + b'__2nd_part_with_153_char________________________________________________________________________________________________________________________________.'
        udh_part3.append(struct.pack('!B', 3))  # segment_seqnum
        pdu_part3.params[
            'more_messages_to_send'] = MoreMessagesToSend.NO_MORE_MESSAGES
        pdu_part3.params['message_payload'] = b''.join(
            udh_part3) + b'__3rd_part_end.'
        yield self.triggerDataSmFromSMSC([pdu_part1, pdu_part2, pdu_part3])

        # Run tests
        # Destination connector must receive the message one time (no retries)
        self.assertEqual(self.AckServerResource.render_POST.call_count, 1)
        # Assert received args
        receivedHttpReq = self.AckServerResource.last_request.args
        self.assertEqual(len(receivedHttpReq), 7)
        self.assertEqual(receivedHttpReq[b'from'],
                         [basePdu.params['source_addr']])
        self.assertEqual(receivedHttpReq[b'to'],
                         [basePdu.params['destination_addr']])
        self.assertEqual(receivedHttpReq[b'content'], [
            pdu_part1.params['message_payload'][6:] +
            pdu_part2.params['message_payload'][6:] +
            pdu_part3.params['message_payload'][6:]
        ])
        self.assertEqual(receivedHttpReq[b'origin-connector'],
                         [source_connector.cid.encode()])

        # Disconnector from SMSC
        yield self.stopConnector(source_connector)