class Test_mysql(B3TestCase): def setUp(self): B3TestCase.setUp(self) logging.getLogger('output').setLevel(logging.DEBUG) with logging_disabled(): self.console.startup() self.conf = CfgConfigParser() self.p = ChatloggerPlugin(self.console, self.conf) ## prepare the mysql test database db = MySQLdb.connect(host=MYSQL_TEST_HOST, user=MYSQL_TEST_USER, passwd=MYSQL_TEST_PASSWORD) db.query("DROP DATABASE IF EXISTS %s" % MYSQL_TEST_DB) db.query("CREATE DATABASE %s CHARACTER SET utf8;" % MYSQL_TEST_DB) self.console.storage = DatabaseStorage( 'mysql://%s:%s@%s/%s' % (MYSQL_TEST_USER, MYSQL_TEST_PASSWORD, MYSQL_TEST_HOST, MYSQL_TEST_DB), self.console) self.console.storage.executeSql("@b3/sql/b3.sql") self.console.storage.executeSql(CHATLOGGER_SQL_FILE) when(self.console.config).get('b3', 'time_zone').thenReturn('GMT') self.p.setup_fileLogger = Mock() self.conf.loadFromString( dedent(""" [general] save_to_database: Yes save_to_file: no [file] logfile: @conf/chat.log rotation_rate: D [purge] max_age: 0 hour: 0 min: 0 """)) with logging_disabled(): self.p.onLoadConfig() self.p.onStartup() self.joe = FakeClient(self.console, name="Joe", guid="joe_guid", team=TEAM_RED) self.simon = FakeClient(self.console, name="Simon", guid="simon_guid", team=TEAM_BLUE) self.joe.connects(1) self.simon.connects(3) self.assertEqual(0, self.count_chatlog_lines()) self.assertEqual(0, self.count_cmdlog_lines()) def count_chatlog_lines(self): cursor = self.console.storage.query( "select count(*) as `count` from chatlog") count = cursor.getValue("count") cursor.close() return count def count_cmdlog_lines(self): cursor = self.console.storage.query( "select count(*) as `count` from cmdlog") count = cursor.getValue("count") cursor.close() return count def get_all_chatlog_lines_from_db(self): cursor = self.console.storage.query( "select msg_type, client_id, client_name, client_team, msg, target_id, " "target_name, target_team from chatlog") lines = [] if cursor: while not cursor.EOF: lines.append(cursor.getRow()) cursor.moveNext() cursor.close() return lines def get_all_cmdlog_lines_from_db(self): cursor = self.console.storage.query( "select admin_id, admin_name, command, data, result from cmdlog") lines = [] if cursor: while not cursor.EOF: lines.append(cursor.getRow()) cursor.moveNext() cursor.close() return lines def test_global_chat_gets_saved_to_db(self): # WHEN self.joe.says("hello") # THEN self.assertEqual(1, self.count_chatlog_lines()) self.assertEqual(0, self.count_cmdlog_lines()) self.assertDictEqual( { 'client_id': 1, 'client_name': 'Joe', 'client_team': TEAM_RED, 'msg': 'hello', 'msg_type': 'ALL', 'target_id': None, 'target_name': None, 'target_team': None }, self.get_all_chatlog_lines_from_db()[0]) def test_team_chat_gets_saved_to_db(self): # WHEN self.joe.says2team("hi") # THEN self.assertEqual(1, self.count_chatlog_lines()) self.assertEqual(0, self.count_cmdlog_lines()) self.assertDictEqual( { 'client_id': self.joe.id, 'client_name': 'Joe', 'client_team': self.joe.team, 'msg': 'hi', 'msg_type': 'TEAM', 'target_id': None, 'target_name': None, 'target_team': None }, self.get_all_chatlog_lines_from_db()[0]) @unittest.skipUnless( hasattr(FakeClient, "says2squad"), "FakeClient.says2squad not available in this version of B3") def test_squad_chat_gets_saved_to_db(self): # WHEN self.joe.says2squad("hi") # THEN self.assertEqual(1, self.count_chatlog_lines()) self.assertEqual(0, self.count_cmdlog_lines()) self.assertDictEqual( { 'client_id': self.joe.id, 'client_name': 'Joe', 'client_team': self.joe.team, 'msg': 'hi', 'msg_type': 'SQUAD', 'target_id': None, 'target_name': None, 'target_team': None }, self.get_all_chatlog_lines_from_db()[0]) def test_private_chat_gets_saved_to_db(self): # WHEN self.joe.sendsPM("hi", self.simon) # THEN self.assertEqual(1, self.count_chatlog_lines()) self.assertEqual(0, self.count_cmdlog_lines()) self.assertDictEqual( { 'client_id': self.joe.id, 'client_name': 'Joe', 'client_team': self.joe.team, 'msg': 'hi', 'msg_type': 'PM', 'target_id': self.simon.id, 'target_name': "Simon", 'target_team': self.simon.team }, self.get_all_chatlog_lines_from_db()[0]) def test_command_gets_saved_to_db(self): # WHEN self.joe.says("!help") # THEN self.assertEqual(1, self.count_chatlog_lines()) self.assertEqual(1, self.count_cmdlog_lines()) self.assertDictEqual( { 'client_id': self.joe.id, 'client_name': 'Joe', 'client_team': self.joe.team, 'msg': '!help', 'msg_type': 'ALL', 'target_id': None, 'target_name': None, 'target_team': None }, self.get_all_chatlog_lines_from_db()[0]) self.assertDictEqual( { 'admin_id': 1, 'admin_name': 'Joe', 'command': 'help', 'data': '', 'result': None }, self.get_all_cmdlog_lines_from_db()[0]) def test_unicode(self): # WHEN self.joe.name = u"★joe★" self.simon.name = u"❮❮simon❯❯" self.joe.sendsPM(u"hi ✪", self.simon) # THEN self.assertEqual(1, self.count_chatlog_lines()) self.assertEqual(0, self.count_cmdlog_lines()) self.assertDictEqual( { 'client_id': self.joe.id, 'client_name': u"★joe★", 'client_team': self.joe.team, 'msg': u"hi ✪", 'msg_type': 'PM', 'target_id': self.simon.id, 'target_name': u"❮❮simon❯❯", 'target_team': self.simon.team }, self.get_all_chatlog_lines_from_db()[0]) def test_sql_injection(self): # WHEN self.joe.says("sql injec;tion ' test") # THEN self.assertEqual(1, self.count_chatlog_lines()) self.assertEqual(0, self.count_cmdlog_lines()) # WHEN self.joe.sendsPM("sql; injection ' test", self.simon) # THEN self.assertEqual(2, self.count_chatlog_lines()) self.assertEqual(0, self.count_cmdlog_lines()) # WHEN self.joe.says("!help sql injection ' test;") # THEN self.assertEqual(3, self.count_chatlog_lines()) self.assertEqual(1, self.count_cmdlog_lines()) # WHEN self.joe.name = "j'oe" self.joe.says("sql injection test2") # THEN self.assertEqual(4, self.count_chatlog_lines()) self.assertEqual(1, self.count_cmdlog_lines()) # WHEN self.joe.name = "joe" self.simon.name = "s;m'n" self.joe.sendsPM("sql injection test2", self.simon) # THEN self.assertEqual(5, self.count_chatlog_lines()) self.assertEqual(1, self.count_cmdlog_lines())
class Test_mysql(B3TestCase): def setUp(self): B3TestCase.setUp(self) logging.getLogger('output').setLevel(logging.DEBUG) with logging_disabled(): self.console.startup() self.conf = CfgConfigParser() self.p = ChatloggerPlugin(self.console, self.conf) ## prepare the mysql test database db = MySQLdb.connect(host=MYSQL_TEST_HOST, user=MYSQL_TEST_USER, passwd=MYSQL_TEST_PASSWORD) db.query("DROP DATABASE IF EXISTS %s" % MYSQL_TEST_DB) db.query("CREATE DATABASE %s CHARACTER SET utf8;" % MYSQL_TEST_DB) self.console.storage = DatabaseStorage( 'mysql://%s:%s@%s/%s' % (MYSQL_TEST_USER, MYSQL_TEST_PASSWORD, MYSQL_TEST_HOST, MYSQL_TEST_DB), self.console) self.console.storage.executeSql("@b3/sql/b3.sql") self.console.storage.executeSql(CHATLOGGER_SQL_FILE) when(self.console.config).get('b3', 'time_zone').thenReturn('GMT') self.p.setup_fileLogger = Mock() self.conf.loadFromString(dedent(""" [general] save_to_database: Yes save_to_file: no [file] logfile: @conf/chat.log rotation_rate: D [purge] max_age: 0 hour: 0 min: 0 """)) with logging_disabled(): self.p.onLoadConfig() self.p.onStartup() self.joe = FakeClient(self.console, name="Joe", guid="joe_guid", team=TEAM_RED) self.simon = FakeClient(self.console, name="Simon", guid="simon_guid", team=TEAM_BLUE) self.joe.connects(1) self.simon.connects(3) self.assertEqual(0, self.count_chatlog_lines()) self.assertEqual(0, self.count_cmdlog_lines()) def count_chatlog_lines(self): cursor = self.console.storage.query("select count(*) as `count` from chatlog") count = cursor.getValue("count") cursor.close() return count def count_cmdlog_lines(self): cursor = self.console.storage.query("select count(*) as `count` from cmdlog") count = cursor.getValue("count") cursor.close() return count def get_all_chatlog_lines_from_db(self): cursor = self.console.storage.query("select msg_type, client_id, client_name, client_team, msg, target_id, " "target_name, target_team from chatlog") lines = [] if cursor: while not cursor.EOF: lines.append(cursor.getRow()) cursor.moveNext() cursor.close() return lines def get_all_cmdlog_lines_from_db(self): cursor = self.console.storage.query("select admin_id, admin_name, command, data, result from cmdlog") lines = [] if cursor: while not cursor.EOF: lines.append(cursor.getRow()) cursor.moveNext() cursor.close() return lines def test_global_chat_gets_saved_to_db(self): # WHEN self.joe.says("hello") # THEN self.assertEqual(1, self.count_chatlog_lines()) self.assertEqual(0, self.count_cmdlog_lines()) self.assertDictEqual({'client_id': 1, 'client_name': 'Joe', 'client_team': TEAM_RED, 'msg': 'hello', 'msg_type': 'ALL', 'target_id': None, 'target_name': None, 'target_team': None}, self.get_all_chatlog_lines_from_db()[0]) def test_team_chat_gets_saved_to_db(self): # WHEN self.joe.says2team("hi") # THEN self.assertEqual(1, self.count_chatlog_lines()) self.assertEqual(0, self.count_cmdlog_lines()) self.assertDictEqual({'client_id': self.joe.id, 'client_name': 'Joe', 'client_team': self.joe.team, 'msg': 'hi', 'msg_type': 'TEAM', 'target_id': None, 'target_name': None, 'target_team': None}, self.get_all_chatlog_lines_from_db()[0]) @unittest.skipUnless(hasattr(FakeClient, "says2squad"), "FakeClient.says2squad not available in this version of B3") def test_squad_chat_gets_saved_to_db(self): # WHEN self.joe.says2squad("hi") # THEN self.assertEqual(1, self.count_chatlog_lines()) self.assertEqual(0, self.count_cmdlog_lines()) self.assertDictEqual({'client_id': self.joe.id, 'client_name': 'Joe', 'client_team': self.joe.team, 'msg': 'hi', 'msg_type': 'SQUAD', 'target_id': None, 'target_name': None, 'target_team': None}, self.get_all_chatlog_lines_from_db()[0]) def test_private_chat_gets_saved_to_db(self): # WHEN self.joe.sendsPM("hi", self.simon) # THEN self.assertEqual(1, self.count_chatlog_lines()) self.assertEqual(0, self.count_cmdlog_lines()) self.assertDictEqual({'client_id': self.joe.id, 'client_name': 'Joe', 'client_team': self.joe.team, 'msg': 'hi', 'msg_type': 'PM', 'target_id': self.simon.id, 'target_name': "Simon", 'target_team': self.simon.team}, self.get_all_chatlog_lines_from_db()[0]) def test_command_gets_saved_to_db(self): # WHEN self.joe.says("!help") # THEN self.assertEqual(1, self.count_chatlog_lines()) self.assertEqual(1, self.count_cmdlog_lines()) self.assertDictEqual({'client_id': self.joe.id, 'client_name': 'Joe', 'client_team': self.joe.team, 'msg': '!help', 'msg_type': 'ALL', 'target_id': None, 'target_name': None, 'target_team': None}, self.get_all_chatlog_lines_from_db()[0]) self.assertDictEqual({'admin_id': 1, 'admin_name': 'Joe', 'command': 'help', 'data': '', 'result': None}, self.get_all_cmdlog_lines_from_db()[0]) def test_unicode(self): # WHEN self.joe.name = u"★joe★" self.simon.name = u"❮❮simon❯❯" self.joe.sendsPM(u"hi ✪", self.simon) # THEN self.assertEqual(1, self.count_chatlog_lines()) self.assertEqual(0, self.count_cmdlog_lines()) self.assertDictEqual({'client_id': self.joe.id, 'client_name': u"★joe★", 'client_team': self.joe.team, 'msg': u"hi ✪", 'msg_type': 'PM', 'target_id': self.simon.id, 'target_name': u"❮❮simon❯❯", 'target_team': self.simon.team}, self.get_all_chatlog_lines_from_db()[0]) def test_sql_injection(self): # WHEN self.joe.says("sql injec;tion ' test") # THEN self.assertEqual(1, self.count_chatlog_lines()) self.assertEqual(0, self.count_cmdlog_lines()) # WHEN self.joe.sendsPM("sql; injection ' test", self.simon) # THEN self.assertEqual(2, self.count_chatlog_lines()) self.assertEqual(0, self.count_cmdlog_lines()) # WHEN self.joe.says("!help sql injection ' test;") # THEN self.assertEqual(3, self.count_chatlog_lines()) self.assertEqual(1, self.count_cmdlog_lines()) # WHEN self.joe.name = "j'oe" self.joe.says("sql injection test2") # THEN self.assertEqual(4, self.count_chatlog_lines()) self.assertEqual(1, self.count_cmdlog_lines()) # WHEN self.joe.name = "joe" self.simon.name = "s;m'n" self.joe.sendsPM("sql injection test2", self.simon) # THEN self.assertEqual(5, self.count_chatlog_lines()) self.assertEqual(1, self.count_cmdlog_lines())
class Test_chatlogfile(ChatloggerTestCase): def setUp(self): ChatloggerTestCase.setUp(self) with logging_disabled(): self.console.startup() self.conf = CfgConfigParser() self.p = ChatloggerPlugin(self.console, self.conf) when(self.console.config).get('b3', 'time_zone').thenReturn('GMT') self.conf.loadFromString(dedent(""" [general] save_to_database: no save_to_file: yes [file] logfile: @conf/chat.log rotation_rate: D [purge] max_age: 0 hour: 0 min: 0 """)) self.temp_conf_folder = mkdtemp(suffix="b3_conf") when(b3).getConfPath(decode=ANY, conf=None).thenReturn(self.temp_conf_folder) with logging_disabled(): self.p.onLoadConfig() self.p.onStartup() self.chat_log_file = os.path.join(self.temp_conf_folder, 'chat.log') with logging_disabled(): self.joe = FakeClient(self.console, name="Joe", guid="joe_guid", team=TEAM_RED) self.simon = FakeClient(self.console, name="Simon", guid="simon_guid", team=TEAM_BLUE) self.joe.connects(1) self.simon.connects(3) def get_all_chatlog_lines_from_logfile(self): lines = [] with codecs.open(self.chat_log_file, "r", encoding="utf-8") as f: for l in f.readlines(): lines.append(l.strip()) return lines def count_chatlog_lines(self): return len(self.get_all_chatlog_lines_from_logfile()) def assert_log_line(self, line, expected): """ remove time stamp at the beginning of the line and compare the remainder """ clean_line = re.sub(r"^\d+-\d+-\d+ \d\d:\d\d:\d\d\t", "", line) self.assertEqual(clean_line, expected) def test_global_chat(self): # WHEN self.joe.says("hello") # THEN self.assertEqual(1, self.count_chatlog_lines()) self.assert_log_line(self.get_all_chatlog_lines_from_logfile()[0], "@1 [Joe] to ALL:\thello") def test_team_chat(self): # WHEN self.joe.says2team("hello") # THEN self.assertEqual(1, self.count_chatlog_lines()) self.assert_log_line(self.get_all_chatlog_lines_from_logfile()[0], "@1 [Joe] to TEAM:\thello") def test_squad_chat(self): # WHEN self.joe.says2squad("hi") # THEN self.assertEqual(1, self.count_chatlog_lines()) self.assert_log_line(self.get_all_chatlog_lines_from_logfile()[0], "@1 [Joe] to SQUAD:\thi") def test_private_chat(self): # WHEN self.joe.sendsPM("hi", self.simon) # THEN self.assertEqual(1, self.count_chatlog_lines()) self.assert_log_line(self.get_all_chatlog_lines_from_logfile()[0], "@1 [Joe] to PM:\thi") def test_unicode(self): # WHEN self.joe.name = u"★joe★" self.simon.name = u"❮❮simon❯❯" self.joe.sendsPM(u"hi ✪", self.simon) # THEN self.assertEqual(1, self.count_chatlog_lines()) self.assert_log_line(self.get_all_chatlog_lines_from_logfile()[0], u"@1 [★joe★] to PM:\thi ✪")