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 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_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
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())
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()
def setup_method(self): self.factory = CardinalBotFactory(network='irc.TestNet.test')
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,