Beispiel #1
0
    def test_using_failover_route_type(self):
        dcs = [SmppServerSystemIdConnector('ghi'),SmppServerSystemIdConnector('ijk')]
        c = RoutedDeliverSmContent(self.body, self.msgid, self.scid, dcs, 'failover')

        self.assertEquals(pickle.loads(c.body), self.body)
        self.assertEquals(c['message-id'], self.msgid)
        self.assertEquals(c['headers']['src-connector-id'], self.scid)
        self.assertEquals(c['headers']['route-type'], 'failover')

        _dcs = pickle.loads(c['headers']['dst-connectors'])
        self.assertEquals(_dcs[0].cid, dcs[0].cid)
        self.assertEquals(len(_dcs), len(dcs))
    def test_throwing_smpps_without_smppsFactory(self):
        self.deliverSmThrower.ackMessage = mock.Mock(
            wraps=self.deliverSmThrower.ackMessage)
        self.deliverSmThrower.rejectMessage = mock.Mock(
            wraps=self.deliverSmThrower.rejectMessage)
        self.deliverSmThrower.rejectAndRequeueMessage = mock.Mock(
            wraps=self.deliverSmThrower.rejectAndRequeueMessage)
        self.deliverSmThrower.smpp_deliver_sm_callback = mock.Mock(
            wraps=self.deliverSmThrower.smpp_deliver_sm_callback)

        # Remove smpps from self.DLRThrower
        self.deliverSmThrower.smppsFactory = None

        routedConnector = SmppServerSystemIdConnector('username')
        yield self.publishRoutedDeliverSmContent(self.routingKey,
                                                 self.testDeliverSMPdu, '1',
                                                 'src', routedConnector)

        yield waitFor(5)

        # Run tests
        self.assertEqual(
            self.deliverSmThrower.smpp_deliver_sm_callback.call_count, 1)
        self.assertEqual(self.deliverSmThrower.ackMessage.call_count, 0)
        self.assertEqual(self.deliverSmThrower.rejectMessage.call_count, 1)
        self.assertEqual(
            self.deliverSmThrower.rejectAndRequeueMessage.call_count, 0)
    def test_throwing_smpps_with_no_deliverers(self):
        self.deliverSmThrower.ackMessage = mock.Mock(
            wraps=self.deliverSmThrower.ackMessage)
        self.deliverSmThrower.rejectMessage = mock.Mock(
            wraps=self.deliverSmThrower.rejectMessage)
        self.deliverSmThrower.rejectAndRequeueMessage = mock.Mock(
            wraps=self.deliverSmThrower.rejectAndRequeueMessage)
        self.deliverSmThrower.smpp_deliver_sm_callback = mock.Mock(
            wraps=self.deliverSmThrower.smpp_deliver_sm_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()

        routedConnector = SmppServerSystemIdConnector('username')
        yield self.publishRoutedDeliverSmContent(self.routingKey,
                                                 self.testDeliverSMPdu, '1',
                                                 'src', routedConnector)

        yield waitFor(5)

        # Run tests
        self.assertEqual(
            self.deliverSmThrower.smpp_deliver_sm_callback.call_count, 2)
        self.assertEqual(self.deliverSmThrower.ackMessage.call_count, 0)
        self.assertEqual(self.deliverSmThrower.rejectMessage.call_count, 2)
        self.assertEqual(
            self.deliverSmThrower.rejectAndRequeueMessage.call_count, 1)

        # Unbind & Disconnect
        yield self.smppc_factory.smpp.unbindAndDisconnect()
        yield self.stopSmppClientConnectors()
    def test_throwing_smpps_to_bound_connection(self):
        self.deliverSmThrower.ackMessage = mock.Mock(
            wraps=self.deliverSmThrower.ackMessage)
        self.deliverSmThrower.rejectMessage = mock.Mock(
            wraps=self.deliverSmThrower.rejectMessage)
        self.deliverSmThrower.smpp_deliver_sm_callback = mock.Mock(
            wraps=self.deliverSmThrower.smpp_deliver_sm_callback)

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

        routedConnector = SmppServerSystemIdConnector('username')
        yield self.publishRoutedDeliverSmContent(self.routingKey,
                                                 self.testDeliverSMPdu, '1',
                                                 'src', routedConnector)

        yield waitFor(1)

        # Run tests
        self.assertEqual(
            self.deliverSmThrower.smpp_deliver_sm_callback.call_count, 1)
        self.assertEqual(self.deliverSmThrower.ackMessage.call_count, 1)
        self.assertEqual(self.deliverSmThrower.rejectMessage.call_count, 0)

        # Unbind & Disconnect
        yield self.smppc_factory.smpp.unbindAndDisconnect()
        yield self.stopSmppClientConnectors()
    def test_using_SmppServerSystemIdConnector_dc(self):
        dc = SmppServerSystemIdConnector('ghi')
        c = RoutedDeliverSmContent(self.body, self.msgid, self.scid, dc)

        self.assertEquals(pickle.loads(c.body), self.body)
        self.assertEquals(c['message-id'], self.msgid)
        self.assertEquals(c['headers']['src-connector-id'], self.scid)
        self.assertEquals(c['headers']['dst-connector-id'], dc.cid)

        dc = pickle.loads(c['headers']['dst-connector'])
        self.assertEquals(dc.cid, dc.cid)
Beispiel #6
0
    def test_using_SmppServerSystemIdConnector_dc(self):
        dcs = [SmppServerSystemIdConnector('ghi')]
        c = RoutedDeliverSmContent(self.body, self.msgid, self.scid, dcs)

        self.assertEquals(pickle.loads(c.body), self.body)
        self.assertEquals(c['message-id'], self.msgid)
        self.assertEquals(c['headers']['src-connector-id'], self.scid)
        self.assertEquals(c['headers']['route-type'], 'simple')

        _dcs = pickle.loads(c['headers']['dst-connectors'])
        self.assertEquals(_dcs[0].cid, dcs[0].cid)
    def test_throwing_smpps_to_not_bound_connection(self):
        self.deliverSmThrower.ackMessage = mock.Mock(
            wraps=self.deliverSmThrower.ackMessage)
        self.deliverSmThrower.rejectMessage = mock.Mock(
            wraps=self.deliverSmThrower.rejectMessage)
        self.deliverSmThrower.rejectAndRequeueMessage = mock.Mock(
            wraps=self.deliverSmThrower.rejectAndRequeueMessage)
        self.deliverSmThrower.smpp_deliver_sm_callback = mock.Mock(
            wraps=self.deliverSmThrower.smpp_deliver_sm_callback)

        routedConnector = SmppServerSystemIdConnector('username')
        yield self.publishRoutedDeliverSmContent(self.routingKey,
                                                 self.testDeliverSMPdu, '1',
                                                 'src', routedConnector)

        yield waitFor(5)

        # Run tests
        self.assertEqual(
            self.deliverSmThrower.smpp_deliver_sm_callback.call_count, 2)
        self.assertEqual(self.deliverSmThrower.ackMessage.call_count, 0)
        self.assertEqual(self.deliverSmThrower.rejectMessage.call_count, 2)
        self.assertEqual(
            self.deliverSmThrower.rejectAndRequeueMessage.call_count, 1)
Beispiel #8
0
                # Validate connector
                if cmd == 'connector':
                    try:
                        ctype, cid = validate_typed_connector_id(arg)
                        if ctype == 'http':
                            if cid not in self.protocol.managers[
                                    'httpccm'].httpccs:
                                raise Exception('Unknown http cid: %s' % (cid))

                            # Pass ready HttpConnector instance
                            arg = self.protocol.managers['httpccm'].httpccs[
                                cid]
                        elif ctype == 'smpps':
                            # Make instance of SmppServerSystemIdConnector
                            arg = SmppServerSystemIdConnector(cid)
                        else:
                            raise NotImplementedError("Not implemented yet !")
                    except Exception, e:
                        return self.protocol.sendData(str(e))

                # Validate connectors
                if cmd == 'connectors':
                    CIDs = arg.split(';')
                    if len(CIDs) == 1:
                        return self.protocol.sendData(
                            '%s option value must contain a minimum of 2 connector IDs separated with ";".'
                            % (cmd))

                    arg = []
                    for typed_cid in CIDs:
Beispiel #9
0
                    else:
                        arg = int(arg)

                # Validate connector
                if cmd == 'connector':
                    try:
                        ctype, cid = validate_typed_connector_id(arg)
                        if ctype == 'http':
                            if cid not in  self.protocol.managers['httpccm'].httpccs:
                                raise Exception('Unknown http cid: %s' % (cid))

                            # Pass ready HttpConnector instance
                            arg = self.protocol.managers['httpccm'].httpccs[cid]
                        elif ctype == 'smpps':
                            # Make instance of SmppServerSystemIdConnector
                            arg = SmppServerSystemIdConnector(cid)
                        else:
                            raise NotImplementedError("Not implemented yet !")
                    except Exception, e:
                        return self.protocol.sendData(str(e))

                # Validate connectors
                if cmd == 'connectors':
                    CIDs = arg.split(';')
                    if len(CIDs) == 1:
                        return self.protocol.sendData('%s option value must contain a minimum of 2 connector IDs separated with ";".' % (cmd))

                    arg = []
                    for typed_cid in CIDs:
                        try:
                            ctype, cid = validate_typed_connector_id(typed_cid)
Beispiel #10
0
    def parse_args_and_call_with_instance(self, *args, **kwargs):
        cmd = args[0]
        arg = args[1]

        # Empty line
        if cmd is None:
            return self.protocol.sendData()
        # Initiate a route from jasmin.routing.Routes with sessBuffer content
        if cmd == 'ok':
            # Remove route_class and route_args from self.sessBuffer before checking options
            # as these 2 options are not user-typed
            if len(self.sessBuffer) - 2 < len(self.protocol.sessionCompletitions):
                return self.protocol.sendData('You must set these options before saving: %s' % ', '.join(
                    self.protocol.sessionCompletitions))

            route = {}
            for key, value in self.sessBuffer.iteritems():
                if key not in ['order', 'type', 'route_class', 'route_args']:
                    route[key] = value
            try:
                # Instanciate a Route
                RouteInstance = self.sessBuffer['route_class'](**route)

                # Hand the instance to fCallback
                return fCallback(self, self.sessBuffer['order'], RouteInstance)
            except Exception as e:
                return self.protocol.sendData('Error: %s' % str(e))
        else:
            # Unknown key
            ra = []
            if 'route_args' in self.sessBuffer:
                ra = self.sessBuffer['route_args']
            if cmd not in MORouteKeyMap and cmd not in ra:
                return self.protocol.sendData('Unknown Route key: %s' % cmd)

            # IF we got the type, check if it's a correct one
            if cmd == 'type':
                _type = None
                for route in MOROUTES:
                    if arg.lower() == route.lower():
                        _type = route
                        break

                if _type is None:
                    return self.protocol.sendData(
                        'Unknown MO Route type:%s, available types: %s' % (arg, ', '.join(MOROUTES)))
                elif _type == 'DefaultRoute':
                    self.sessBuffer['order'] = 0

                # Before setting a new route class, remove any previous route
                # sessBuffer keys
                if 'order' in self.sessBuffer:
                    self.sessBuffer = {'order': self.sessBuffer['order']}
                else:
                    self.sessBuffer = {}

                self.sessBuffer['type'] = _type
                # Route class name must be already imported from jasmin.routing.Routes
                # in order to get it from globals()
                self.sessBuffer['route_class'] = globals()[_type]

                # Show Route help and save Route args
                RouteClassArgs = inspect.getargspec(self.sessBuffer['route_class'].__init__).args
                if 'self' in RouteClassArgs:
                    # Remove 'self' from args
                    RouteClassArgs.remove('self')
                if 'rate' in RouteClassArgs:
                    # MO Routes are not rated
                    RouteClassArgs.remove('rate')
                self.sessBuffer['route_args'] = RouteClassArgs

                if len(RouteClassArgs) > 0:
                    # Update completitions
                    self.protocol.sessionCompletitions = MORouteKeyMap.keys() + RouteClassArgs

                    return self.protocol.sendData(
                        '%s arguments:\n%s' % (self.sessBuffer['route_class'], ', '.join(RouteClassArgs)))
            else:
                # DefaultRoute's order is always zero
                if cmd == 'order':
                    if (arg != '0' and 'type' in self.sessBuffer
                        and self.sessBuffer['type'] == 'DefaultRoute'):
                        self.sessBuffer['order'] = 0
                        return self.protocol.sendData('Route order forced to 0 since it is a DefaultRoute')
                    elif (arg == '0' and 'type' in self.sessBuffer and
                                  self.sessBuffer['type'] != 'DefaultRoute'):
                        return self.protocol.sendData(
                            'This route order (0) is reserved for DefaultRoute only')
                    elif not arg.isdigit() or int(arg) < 0:
                        return self.protocol.sendData('Route order must be a positive integer')
                    else:
                        arg = int(arg)

                # Validate connector
                if cmd == 'connector':
                    try:
                        ctype, cid = validate_typed_connector_id(arg)
                        if ctype == 'http':
                            if cid not in self.protocol.managers['httpccm'].httpccs:
                                raise Exception('Unknown http cid: %s' % (cid))

                            # Pass ready HttpConnector instance
                            arg = self.protocol.managers['httpccm'].httpccs[cid]
                        elif ctype == 'smpps':
                            # Make instance of SmppServerSystemIdConnector
                            arg = SmppServerSystemIdConnector(cid)
                        else:
                            raise NotImplementedError("Not implemented yet !")
                    except Exception as e:
                        return self.protocol.sendData(str(e))

                # Validate connectors
                if cmd == 'connectors':
                    CIDs = arg.split(';')
                    if len(CIDs) == 1:
                        return self.protocol.sendData(
                            '%s option value must contain a minimum of 2 connector IDs separated with ";".' % (cmd))

                    arg = []
                    for typed_cid in CIDs:
                        try:
                            ctype, cid = validate_typed_connector_id(typed_cid)
                            if ctype == 'http':
                                if cid not in self.protocol.managers['httpccm'].httpccs:
                                    raise Exception('Unknown http cid: %s' % (cid))

                                # Pass ready HttpConnector instance
                                arg.append(self.protocol.managers['httpccm'].httpccs[cid])
                            elif ctype == 'smpps':
                                # Make instance of SmppServerSystemIdConnector
                                arg.append(SmppServerSystemIdConnector(cid))
                            else:
                                raise NotImplementedError("Not implemented yet !")
                        except Exception as e:
                            return self.protocol.sendData(str(e))

                # Validate filters
                if cmd == 'filters':
                    FIDs = arg.split(';')

                    arg = []
                    for fid in FIDs:
                        if fid not in self.protocol.managers['filter'].filters:
                            return self.protocol.sendData('Unknown fid: %s' % (fid))
                        else:
                            _Filter = self.protocol.managers['filter'].filters[fid]

                            if _Filter.__class__.__name__ not in MOFILTERS:
                                return self.protocol.sendData(
                                    '%s#%s is not a valid filter for MORoute (not in MOFILTERS)' % (
                                        _Filter.__class__.__name__, fid))
                            else:
                                arg.append(_Filter)

                # Buffer key for later Route initiating
                if cmd not in ra:
                    RouteKey = MORouteKeyMap[cmd]
                else:
                    RouteKey = cmd
                self.sessBuffer[RouteKey] = arg

            return self.protocol.sendData()
Beispiel #11
0
    def parse_args_and_call_with_instance(self, *args, **kwargs):
        cmd = args[0]
        arg = args[1]

        # Empty line
        if cmd is None:
            return self.protocol.sendData()
        # Initiate a route from jasmin.routing.Routes with sessBuffer content
        if cmd == 'ok':
            # Remove route_class and route_args from self.sessBuffer before checking options
            # as these 2 options are not user-typed
            if len(self.sessBuffer) - 2 < len(
                    self.protocol.sessionCompletitions):
                return self.protocol.sendData(
                    'You must set these options before saving: %s' %
                    ', '.join(self.protocol.sessionCompletitions))

            route = {}
            for key, value in self.sessBuffer.items():
                if key not in ['order', 'type', 'route_class', 'route_args']:
                    route[key] = value
            try:
                # Instanciate a Route
                RouteInstance = self.sessBuffer['route_class'](**route)

                # Hand the instance to fCallback
                return fCallback(self, self.sessBuffer['order'], RouteInstance)
            except Exception as e:
                return self.protocol.sendData('Error: %s' % str(e))
        else:
            # Unknown key
            ra = []
            if 'route_args' in self.sessBuffer:
                ra = self.sessBuffer['route_args']
            if cmd not in MORouteKeyMap and cmd not in ra:
                return self.protocol.sendData('Unknown Route key: %s' % cmd)

            # IF we got the type, check if it's a correct one
            if cmd == 'type':
                _type = None
                for route in MOROUTES:
                    if arg.lower() == route.lower():
                        _type = route
                        break

                if _type is None:
                    return self.protocol.sendData(
                        'Unknown MO Route type:%s, available types: %s' %
                        (arg, ', '.join(MOROUTES)))
                elif _type == 'DefaultRoute':
                    self.sessBuffer['order'] = 0

                # Before setting a new route class, remove any previous route
                # sessBuffer keys
                if 'order' in self.sessBuffer:
                    self.sessBuffer = {'order': self.sessBuffer['order']}
                else:
                    self.sessBuffer = {}

                self.sessBuffer['type'] = _type
                # Route class name must be already imported from jasmin.routing.Routes
                # in order to get it from globals()
                self.sessBuffer['route_class'] = globals()[_type]

                # Show Route help and save Route args
                RouteClassArgs = inspect.getargspec(
                    self.sessBuffer['route_class'].__init__).args
                if 'self' in RouteClassArgs:
                    # Remove 'self' from args
                    RouteClassArgs.remove('self')
                if 'rate' in RouteClassArgs:
                    # MO Routes are not rated
                    RouteClassArgs.remove('rate')
                self.sessBuffer['route_args'] = RouteClassArgs

                if len(RouteClassArgs) > 0:
                    # Update completitions
                    self.protocol.sessionCompletitions = list(
                        MORouteKeyMap) + RouteClassArgs

                    return self.protocol.sendData(
                        '%s arguments:\n%s' % (self.sessBuffer['route_class'],
                                               ', '.join(RouteClassArgs)))
            else:
                # DefaultRoute's order is always zero
                if cmd == 'order':
                    if (arg != '0' and 'type' in self.sessBuffer
                            and self.sessBuffer['type'] == 'DefaultRoute'):
                        self.sessBuffer['order'] = 0
                        return self.protocol.sendData(
                            'Route order forced to 0 since it is a DefaultRoute'
                        )
                    elif (arg == '0' and 'type' in self.sessBuffer
                          and self.sessBuffer['type'] != 'DefaultRoute'):
                        return self.protocol.sendData(
                            'This route order (0) is reserved for DefaultRoute only'
                        )
                    elif not arg.isdigit() or int(arg) < 0:
                        return self.protocol.sendData(
                            'Route order must be a positive integer')
                    else:
                        arg = int(arg)

                # Validate connector
                if cmd == 'connector':
                    try:
                        ctype, cid = validate_typed_connector_id(arg)
                        if ctype == 'http':
                            if cid not in self.protocol.managers[
                                    'httpccm'].httpccs:
                                raise Exception('Unknown http cid: %s' % (cid))

                            # Pass ready HttpConnector instance
                            arg = self.protocol.managers['httpccm'].httpccs[
                                cid]
                        elif ctype == 'smpps':
                            # Make instance of SmppServerSystemIdConnector
                            arg = SmppServerSystemIdConnector(cid)
                        else:
                            raise NotImplementedError("Not implemented yet !")
                    except Exception as e:
                        return self.protocol.sendData(str(e))

                # Validate connectors
                if cmd == 'connectors':
                    CIDs = arg.split(';')
                    if len(CIDs) == 1:
                        return self.protocol.sendData(
                            '%s option value must contain a minimum of 2 connector IDs separated with ";".'
                            % (cmd))

                    arg = []
                    for typed_cid in CIDs:
                        try:
                            ctype, cid = validate_typed_connector_id(typed_cid)
                            if ctype == 'http':
                                if cid not in self.protocol.managers[
                                        'httpccm'].httpccs:
                                    raise Exception('Unknown http cid: %s' %
                                                    (cid))

                                # Pass ready HttpConnector instance
                                arg.append(self.protocol.managers['httpccm'].
                                           httpccs[cid])
                            elif ctype == 'smpps':
                                # Make instance of SmppServerSystemIdConnector
                                arg.append(SmppServerSystemIdConnector(cid))
                            else:
                                raise NotImplementedError(
                                    "Not implemented yet !")
                        except Exception as e:
                            return self.protocol.sendData(str(e))

                # Validate filters
                if cmd == 'filters':
                    FIDs = arg.split(';')

                    arg = []
                    for fid in FIDs:
                        if fid not in self.protocol.managers['filter'].filters:
                            return self.protocol.sendData('Unknown fid: %s' %
                                                          (fid))
                        else:
                            _Filter = self.protocol.managers['filter'].filters[
                                fid]

                            if _Filter.__class__.__name__ not in MOFILTERS:
                                return self.protocol.sendData(
                                    '%s#%s is not a valid filter for MORoute (not in MOFILTERS)'
                                    % (_Filter.__class__.__name__, fid))
                            else:
                                arg.append(_Filter)

                # Buffer key for later Route initiating
                if cmd not in ra:
                    RouteKey = MORouteKeyMap[cmd]
                else:
                    RouteKey = cmd
                self.sessBuffer[RouteKey] = arg

            return self.protocol.sendData()