Пример #1
0
 def setup_method(self):
     self.factory = CardinalBotFactory(
         network='irc.testnet.test',
         server_password='******',
         server_commands=['AUTH password', 'MODE +b foobar'],
         channels=['#channel1', '#channel2'],
         nickname='Cardinal|unit-test',
         password='******',
         username='******',
         realname='Mr. Cardinal',
         plugins=['plugin1', 'plugin2'],
         blacklist=[
             {'urls': '#finance'},
         ],
         storage='/path/to/storage',
     )
Пример #2
0
    def test_constructor(self):
        network = 'IrC.TeStNeT.TeSt'
        server_password = '******'
        server_commands = ['AUTH password', 'MODE +b foobar']
        channels = ['#channel1', '#channel2']
        nickname = 'Cardinal|unit-test'
        password = '******'
        username = '******'
        realname = 'Mr. Cardinal'
        plugins = ['plugin1', 'plugin2']
        blacklist = [
            {
                'urls': '#finance'
            },
        ]
        storage = '/path/to/storage'

        factory = CardinalBotFactory(
            network,
            server_password,
            server_commands,
            channels,
            nickname,
            password,
            username,
            realname,
            plugins,
            blacklist,
            storage,
        )

        assert isinstance(factory.logger, logging.Logger)

        # Check that signal handler got registered
        assert signal.getsignal(signal.SIGINT) == factory._sigint

        # Defaults that aren't passed in
        assert self.factory.cardinal is None
        assert self.factory.disconnect is False
        assert isinstance(self.factory.booted, datetime)
        assert self.factory.last_reconnection_wait is None

        assert factory.network == network.lower()
        assert factory.server_commands == server_commands
        assert factory.server_password == server_password
        assert factory.password == password
        assert factory.channels == channels
        assert factory.nickname == nickname
        assert factory.username == username
        assert factory.realname == realname
        assert factory.plugins == plugins
        assert factory.blacklist == blacklist
        assert factory.storage_path == storage
Пример #3
0
    def test_constructor_args_non_default(self):
        server_password = '******'
        channels = ['#channel1', '#channel2']
        nickname = 'Cardinal|unit-test'
        password = '******'
        username = '******'
        realname = 'Mr. Cardinal'
        plugins = ['plugin1', 'plugin2']
        blacklist = [
            {
                'urls': '#finance'
            },
        ]
        storage = '/path/to/storage'

        factory = CardinalBotFactory(
            'IrC.TeStNeT.TeSt',
            server_password,
            channels,
            nickname,
            password,
            username,
            realname,
            plugins,
            blacklist,
            storage,
        )

        assert factory.network == 'irc.testnet.test'
        assert factory.server_password == server_password
        assert factory.password == password
        assert factory.channels == channels
        assert factory.nickname == nickname
        assert factory.username == username
        assert factory.realname == realname
        assert factory.plugins == plugins
        assert factory.blacklist == blacklist
        assert factory.storage_path == storage
Пример #4
0
            os.path.join(storage_path, 'database'),
            os.path.join(storage_path, 'logs'),
        ]

        for directory in directories:
            if not os.path.exists(directory):
                logger.info(
                    "Storage directory %s does not exist, creating it..",
                    directory)

                os.makedirs(directory)

    # Instance a new factory, and connect with/without SSL
    logger.debug("Instantiating CardinalBotFactory")
    factory = CardinalBotFactory(config['network'], config['server_password'],
                                 config['channels'], config['nickname'],
                                 config['password'], config['plugins'],
                                 storage_path)

    if not config['ssl']:
        logger.info("Connecting over plaintext to %s:%d" %
                    (config['network'], config['port']))

        reactor.connectTCP(config['network'], config['port'], factory)
    else:
        logger.info("Connecting over SSL to %s:%d" %
                    (config['network'], config['port']))

        # For SSL, we need to import the SSL module from Twisted
        from twisted.internet import ssl
        reactor.connectSSL(config['network'], config['port'], factory,
                           ssl.ClientContextFactory())
Пример #5
0
class TestCardinalBotFactory(object):
    def setup_method(self):
        self.factory = CardinalBotFactory(
            network='irc.testnet.test',
            server_password='******',
            server_commands=['AUTH password', 'MODE +b foobar'],
            channels=['#channel1', '#channel2'],
            nickname='Cardinal|unit-test',
            password='******',
            username='******',
            realname='Mr. Cardinal',
            plugins=['plugin1', 'plugin2'],
            blacklist=[
                {
                    'urls': '#finance'
                },
            ],
            storage='/path/to/storage',
        )

    def teardown_method(self, method):
        # remove signal handler set by the factory
        signal.signal(signal.SIGINT, signal.SIG_DFL)
        del self.factory

    def test_class_properties(self):
        assert CardinalBotFactory.protocol is CardinalBot
        assert CardinalBotFactory.MINIMUM_RECONNECTION_WAIT == 10
        assert CardinalBotFactory.MAXIMUM_RECONNECTION_WAIT == 300

    def test_constructor(self):
        network = 'IrC.TeStNeT.TeSt'
        server_password = '******'
        server_commands = ['AUTH password', 'MODE +b foobar']
        channels = ['#channel1', '#channel2']
        nickname = 'Cardinal|unit-test'
        password = '******'
        username = '******'
        realname = 'Mr. Cardinal'
        plugins = ['plugin1', 'plugin2']
        blacklist = [
            {
                'urls': '#finance'
            },
        ]
        storage = '/path/to/storage'

        factory = CardinalBotFactory(
            network,
            server_password,
            server_commands,
            channels,
            nickname,
            password,
            username,
            realname,
            plugins,
            blacklist,
            storage,
        )

        assert isinstance(factory.logger, logging.Logger)

        # Check that signal handler got registered
        assert signal.getsignal(signal.SIGINT) == factory._sigint

        # Defaults that aren't passed in
        assert self.factory.cardinal is None
        assert self.factory.disconnect is False
        assert isinstance(self.factory.booted, datetime)
        assert self.factory.last_reconnection_wait is None

        assert factory.network == network.lower()
        assert factory.server_commands == server_commands
        assert factory.server_password == server_password
        assert factory.password == password
        assert factory.channels == channels
        assert factory.nickname == nickname
        assert factory.username == username
        assert factory.realname == realname
        assert factory.plugins == plugins
        assert factory.blacklist == blacklist
        assert factory.storage_path == storage

    def test_sigint_handler(self):
        mock_cardinal = Mock(spec=CardinalBot)
        self.factory.cardinal = mock_cardinal

        assert self.factory.disconnect is False

        os.kill(os.getpid(), signal.SIGINT)

        assert self.factory.disconnect is True
        mock_cardinal.quit.assert_called_once_with('Received SIGINT.')

    def test_sigint_handler_without_cardinal(self):
        assert self.factory.disconnect is False

        os.kill(os.getpid(), signal.SIGINT)

        assert self.factory.disconnect is True

    def test_reconnection(self):
        assert self.factory.disconnect is False

        clock = Clock()
        mock_connector = Mock()
        self.factory._reactor = clock

        self.factory.clientConnectionLost(mock_connector,
                                          'Called by unit test')

        assert self.factory.last_reconnection_wait == \
            CardinalBotFactory.MINIMUM_RECONNECTION_WAIT
        clock.advance(self.factory.last_reconnection_wait)

        mock_connector.connect.assert_called_once()

    def test_initial_connection_failed(self):
        assert self.factory.disconnect is False
        assert self.factory.last_reconnection_wait is None

        clock = Clock()
        mock_connector = Mock()
        self.factory._reactor = clock

        self.factory.clientConnectionFailed(mock_connector,
                                            'Called by unit test')

        assert self.factory.last_reconnection_wait == \
            CardinalBotFactory.MINIMUM_RECONNECTION_WAIT
        clock.advance(self.factory.last_reconnection_wait)

        mock_connector.connect.assert_called_once()

    def test_reconnection_failed(self):
        assert self.factory.disconnect is False
        self.factory.last_reconnection_wait = \
            CardinalBotFactory.MINIMUM_RECONNECTION_WAIT

        clock = Clock()
        mock_connector = Mock()
        self.factory._reactor = clock

        self.factory.clientConnectionFailed(mock_connector,
                                            'Called by unit test')

        # time should have doubled
        assert self.factory.last_reconnection_wait == \
            CardinalBotFactory.MINIMUM_RECONNECTION_WAIT * 2

        # make sure it's not called on original time
        clock.advance(self.factory.MINIMUM_RECONNECTION_WAIT)
        assert not mock_connector.connect.called

        # advance it one more time and it should be
        clock.advance(self.factory.MINIMUM_RECONNECTION_WAIT)
        mock_connector.connect.assert_called_once()

    def test_reconnection_failed_max_wait(self):
        assert self.factory.disconnect is False
        self.factory.last_reconnection_wait = \
            CardinalBotFactory.MAXIMUM_RECONNECTION_WAIT

        clock = Clock()
        mock_connector = Mock()
        self.factory._reactor = clock

        self.factory.clientConnectionFailed(mock_connector,
                                            'Called by unit test')

        # cannot increase past maximum
        assert self.factory.last_reconnection_wait == \
            CardinalBotFactory.MAXIMUM_RECONNECTION_WAIT

        # advance it one more time and it should be
        clock.advance(self.factory.MAXIMUM_RECONNECTION_WAIT)
        mock_connector.connect.assert_called_once()

    def test_bypass_reconnection(self):
        # Mark that we purposefully disconnected
        self.factory.disconnect = True

        self.factory._reactor = Mock()

        self.factory.clientConnectionLost(None, 'Called by unit test')

        self.factory._reactor.stop.assert_called_once()
Пример #6
0
 def setup_method(self):
     self.factory = CardinalBotFactory(network='irc.TestNet.test')
Пример #7
0
        for directory in directories:
            if not os.path.exists(directory):
                logger.info(
                    "Initializing storage directory: {}".format(directory))
                os.makedirs(directory)

    # If no username is supplied, default to nickname
    if config['username'] is None:
        config['username'] = config['nickname']

    # Instance a new factory, and connect with/without SSL
    logger.debug("Instantiating CardinalBotFactory")
    factory = CardinalBotFactory(config['network'], config['server_password'],
                                 config['channels'], config['nickname'],
                                 config['password'], config['username'],
                                 config['realname'], config['plugins'],
                                 config['blacklist'], config['storage'])

    if not config['ssl']:
        logger.info("Connecting over plaintext to %s:%d" %
                    (config['network'], config['port']))

        reactor.connectTCP(config['network'], config['port'], factory)
    else:
        logger.info("Connecting over SSL to %s:%d" %
                    (config['network'], config['port']))

        # For SSL, we need to import the SSL module from Twisted
        from twisted.internet import ssl
        reactor.connectSSL(config['network'], config['port'], factory,