示例#1
0
 def test_setClient(self):
     c1 = Client(ip="1.2.3.4", connections=2, guid="abcdefghijkl", pbid="123546abcdef", name="some dude",
                 greeting="hi!", mask_level=20, group_bits=8, login="******", password="******")
     c1_id = self.storage.setClient(c1)
     self.assertEqual(1, c1_id)
     c2 = self.storage.getClient(Client(id=c1_id))
     self.assertIsInstance(c2, Client)
     self.assertEqual("1.2.3.4", c2.ip)
     self.assertEqual(2, c2.connections)
     self.assertEqual("abcdefghijkl", c2.guid)
     self.assertEqual("123546abcdef", c2.pbid)
     self.assertEqual("some dude", c2.name)
     self.assertEqual("hi!", c2.greeting)
     self.assertEqual("test login", c2.login)
     self.assertEqual("test password", c2.password)
     c3 = Client(id=c1_id, ip="5.6.7.8", connections=1, guid="ddddddddd", pbid="zzzzzzzzzzz", name="milka",
                 greeting="hello")
     self.storage.setClient(c3)
     c4 = self.storage.getClient(Client(id=c1_id))
     self.assertIsInstance(c4, Client)
     self.assertEqual("5.6.7.8", c4.ip)
     self.assertEqual(1, c4.connections)
     self.assertEqual("ddddddddd", c4.guid)
     self.assertEqual("zzzzzzzzzzz", c4.pbid)
     self.assertEqual("milka", c4.name)
     self.assertEqual("hello", c4.greeting)
    def test_getClientsMatching(self):
        self.storage.setClient(Client(ip="1.2.3.4", connections=2, guid="mlkjmlkjqsdf", pbid="123546abcdef", name="bill"))
        self.storage.setClient(Client(ip="4.2.3.5", connections=3, guid="azerazerazer", pbid="wxcvwxvcxwcv", name="john"))
        self.storage.setClient(Client(ip="4.2.3.5", connections=45, guid="rtyrtyrty", pbid="rtyrtyrrtyr", name="jack"))

        result = self.storage.getClientsMatching({'guid': "xxxxxxxxxx"})
        self.assertEqual(0, len(result))

        result = self.storage.getClientsMatching({'ip': "1.2.3.4"})
        self.assertEqual(1, len(result))
        self.assertEqual('bill', result[0].name)

        result = self.storage.getClientsMatching({'ip': "4.2.3.5"})
        self.assertEqual(2, len(result))

        result = self.storage.getClientsMatching({'pbid': "rtyrtyrrtyr"})
        self.assertEqual(1, len(result))
        self.assertEqual('jack', result[0].name)

        result = self.storage.getClientsMatching({'name': "jack"})
        self.assertEqual(1, len(result))
        self.assertEqual('jack', result[0].name)

        result = self.storage.getClientsMatching({'ip': "4.2.3.5", 'name': 'jack'})
        self.assertEqual(1, len(result))
        self.assertEqual('jack', result[0].name)

        result = self.storage.getClientsMatching({'ip': "4.2.3.5", 'connections >': 10})
        self.assertEqual(1, len(result))
        self.assertEqual('jack', result[0].name)
 def test_getClient_guid(self):
     c1 = Client(ip="1.2.3.4", connections=3, guid="mlkjmlkjqsdf", pbid="123546abcdef", name="some dude", greeting="hi!")
     c1_id = self.storage.setClient(c1)
     self.assertEqual(1, c1_id)
     c2 = self.storage.getClient(Client(guid="mlkjmlkjqsdf"))
     self.assertIsInstance(c2, Client)
     self.assertRaises(KeyError, self.storage.getClient, Client(guid='god'))
示例#4
0
    def test_two_bans_with_reason(self):
        # GIVEN
        when(self.console).time().thenReturn(0)
        player1 = Client(console=self.console, guid='player1GUID', name="P1")
        player1.save()
        penalty1 = ClientBan(clientId=player1.id,
                             timeExpire=-1,
                             adminId=0,
                             reason="test reason")

        player2 = Client(console=self.console, guid='player2GUID', name="P2")
        player2.save()
        penalty2 = ClientTempBan(clientId=player2.id,
                                 timeExpire=self.console.time() + 60 * 2,
                                 adminId=0,
                                 reason="test reason f00")

        when(self.console.storage).getLastPenalties(types=whatever(),
                                                    num=whatever()).thenReturn(
                                                        [penalty1, penalty2])
        # WHEN
        self.lastbans()
        # THEN
        self.mock_command.sayLoudOrPM.assert_has_calls([
            call(self.player, u'^2@1^7 P1^7^7 (Perm) test reason'),
            call(self.player,
                 u'^2@2^7 P2^7^7 (2 minutes remaining) test reason f00'),
        ])
示例#5
0
 def test_truncateTables_single_table(self):
     self.storage.setClient(Client(guid="aaaaaaaaa"))
     self.storage.setClient(Client(guid="bbbbbbbbb"))
     cursor = self.storage.query("SELECT * FROM clients")
     self.assertFalse(cursor.EOF)
     self.storage.truncateTable('clients')
     cursor = self.storage.query("SELECT * FROM clients")
     self.assertTrue(cursor.EOF)
示例#6
0
 def setUp(self):
     B3TestCase.setUp(self)
     self.queueEvent_patcher = patch.object(self.console, 'queueEvent')
     self.queueEvent_mock = self.queueEvent_patcher.start()
     
     self.admin = Client(console=self.console)
     self.client = Client(console=self.console)
     self.client.save()
示例#7
0
    def test_connected_client_with_verified_guid(self):
        # GIVEN
        self.parser.routeBattleyeEvent(
            u'Player #8 Max (111.222.200.50:2304) connected')
        self.parser.routeBattleyeEvent(
            u'Player #8 Max - GUID: 73c5e50a7860475f0000000000000000 (unverified)'
        )
        self.parser.routeBattleyeEvent(
            u'Verified GUID (73c5e50a7860475f0000000000000000) of player #8 Max'
        )
        self.assertDictContainsSubset({'clients': 2},
                                      self.parser.storage.getCounts())
        self.assertIn('8', self.parser.clients)
        # GIVEN that the player exists in database
        client_from_db = self.parser.storage.getClient(
            Client(guid="73c5e50a7860475f0000000000000000"))
        self.assertIsNotNone(client_from_db)
        self.assertEqual("Max", client_from_db.name)
        self.assertEqual("73c5e50a7860475f0000000000000000",
                         client_from_db.guid)
        self.assertEqual("111.222.200.50", client_from_db.ip)
        self.clear_events()
        # WHEN
        when(self.parser.output).write('players').thenReturn('''\
Players on server:
[#] [IP Address]:[Port] [Ping] [GUID] [Name]
--------------------------------------------------
8   111.222.200.50:2304   62   73c5e50a7860475f0000000000000000(OK) Max (Lobby)
(1 players in total)
''')
        rv = self.parser.sync()
        # THEN no new client is saved to database
        self.assertDictContainsSubset({'clients': 2},
                                      self.parser.storage.getCounts())
        # THEN sync return correct info
        self.assertIn('8', rv)
        client = rv["8"]
        self.assertEqual("Max", client.name)
        self.assertEqual("8", client.cid)
        self.assertEqual("111.222.200.50", client.ip)
        self.assertEqual('73c5e50a7860475f0000000000000000', client.guid)
        self.assertTrue(client.authed)
        # THEN connected client list is updated
        self.assertIn('8', self.parser.clients)
        client = self.parser.clients['8']
        self.assertEqual("Max", client.name)
        self.assertEqual("111.222.200.50", client.ip)
        self.assertEqual('73c5e50a7860475f0000000000000000', client.guid)
        self.assertTrue(client.authed)
        # THEN player info in database is correct
        client_from_db = self.parser.storage.getClient(
            Client(guid="73c5e50a7860475f0000000000000000"))
        self.assertIsNotNone(client_from_db)
        self.assertEqual("Max", client_from_db.name)
        self.assertEqual("73c5e50a7860475f0000000000000000",
                         client_from_db.guid)
        self.assertEqual("111.222.200.50", client_from_db.ip)
 def test_player_connecting_with_unverified_guid_at_first(self):
     # GIVEN
     self.clear_events()
     # WHEN
     self.parser.routeBattleyeEvent(u'Player #8 Max (111.222.200.50:2304) connected')
     self.parser.routeBattleyeEvent(u'Player #8 Max - GUID: 73c5e50a7860475f0000000000000000 (unverified)')
     self.parser.routeBattleyeEvent(u'Verified GUID (73c5e50a7860475f0000000000000000) of player #8 Max')
     # THEN
     self.assertEqual(2, len(self.evt_queue))
     event1, event2 = self.evt_queue
     # check EVT_CLIENT_CONNECT
     self.assertEqual(self.parser.getEventID("EVT_CLIENT_CONNECT"), event1.type)
     self.assertEqual("Max", event1.client.name)
     self.assertEqual("8", event1.client.cid)
     self.assertEqual("73c5e50a7860475f0000000000000000", event1.client.guid)
     self.assertEqual("111.222.200.50", event1.client.ip)
     # check EVT_CLIENT_CONNECT
     self.assertEqual(self.parser.getEventID("EVT_CLIENT_AUTH"), event2.type)
     self.assertEqual("Max", event2.client.name)
     self.assertEqual("8", event2.client.cid)
     self.assertEqual("73c5e50a7860475f0000000000000000", event2.client.guid)
     self.assertEqual("111.222.200.50", event2.client.ip)
     # check player info in database
     client_from_db = self.parser.storage.getClient(Client(guid="73c5e50a7860475f0000000000000000"))
     self.assertIsNotNone(client_from_db)
     self.assertEqual("Max", client_from_db.name)
     self.assertEqual("73c5e50a7860475f0000000000000000", client_from_db.guid)
     self.assertEqual("111.222.200.50", client_from_db.ip)
示例#9
0
 def setUp(self):
     CommandTestCase.setUp(self)
     self.init()
     self.player = Client(console=self.console, name="joe", _maxLevel=0)
     self.player.message = Mock()
     self.assertEqual(0, self.player.maskedLevel)
     self.assertIsNone(self.player.maskedGroup)
示例#10
0
    def test_auth_client_without_guid_but_with_known_pbid(self):
        # GIVEN

        # known superadmin named Snoopy
        superadmin = Client(console=self.parser, name='Snoopy', guid='EA_AAAAAAAABBBBBBBBBBBBBB00000000000012222', pbid='300000aaaaaabbbbbbccccc111223300', group_bits=128, connections=21)
        superadmin.save()

        # bf3 server failing to provide guid
        def write(data):
            if data == ('admin.listPlayers', 'player', 'Snoopy'):
                return ['7', 'name', 'guid', 'teamId', 'squadId', 'kills', 'deaths', 'score', '1', 'Snoopy', '', '2', '8', '0', '0', '0']
            else:
                return DEFAULT
        self.write_mock.side_effect = write

        # WHEN
        self.assertFalse('Snoopy' in self.parser.clients)
        self.parser.OnPBPlayerGuid(match=re.match(self.regex_for_OnPBPlistItem, self.event_raw_data), data=self.event_raw_data)

        # THEN
        # B3 should have authed Snoopy
        self.assertTrue('Snoopy' in self.parser.clients)
        snoopy = self.parser.clients['Snoopy']
        self.assertTrue(snoopy.authed)
        for attb in ('name', 'pbid', 'guid', 'groupBits'):
            self.assertEqual(getattr(superadmin, attb), getattr(snoopy, attb))
 def test_message_with_color_codes(self):
     self.parser.msgPrefix = "[Pre]"
     player = Client(console=self.parser, guid="theGuid")
     with patch.object(self.parser.output, 'write') as write_mock:
         player.message("^7message ^1with ^2color ^8codes")
         write_mock.assert_has_calls(
             [call('sm_psay #theGuid "[Pre] message with color codes"')])
示例#12
0
 def test_known_client__guid(self):
     # GIVEN
     known_client = Client(console=self.parser,
                           guid="12312312312312312",
                           name="courgette",
                           connections=15)
     known_client.save()
     self.assertEqual(1, len(self.parser.clients))
     self.assertDictContainsSubset({'clients': 2},
                                   self.parser.storage.getCounts())
     # WHEN
     client = self.parser.getClientOrCreate(guid="12312312312312312",
                                            name="newName",
                                            team="0")
     # THEN
     self.assertIsInstance(client, Client)
     self.assertEqual(known_client.id, client.id)
     self.assertEqual("12312312312312312", client.cid)
     self.assertEqual("12312312312312312", client.guid)
     self.assertEqual("newName", client.name)
     self.assertEqual(TEAM_SCAVENGERS, client.team)
     self.assertEqual(16, client.connections)
     self.assertTrue(client.authed)
     self.assertEqual(2, len(self.parser.clients))
     self.assertDictContainsSubset({'clients': 2},
                                   self.parser.storage.getCounts())
示例#13
0
    def test_player_connecting_with_unverified_guid_at_first_and_sync(self):
        # GIVEN
        self.clear_events()
        # WHEN
        self.parser.routeBattleyeEvent(
            u'Player #8 Max (111.222.200.50:2304) connected')
        self.parser.routeBattleyeEvent(
            u'Player #8 Max - GUID: 73c5e50a7860475f0000000000000000 (unverified)'
        )
        when(self.parser.output).write('players').thenReturn(
            u'''Players on server:
[#] [IP Address]:[Port] [Ping] [GUID] [Name]
--------------------------------------------------
8   111.222.200.50:2304   -1   73c5e50a7860475f0000000000000000(?)  Max (Lobby)
(14 players in total)''')
        self.parser.sync()
        self.parser.routeBattleyeEvent(
            u'Verified GUID (73c5e50a7860475f0000000000000000) of player #8 Max'
        )
        # THEN check events were raised
        self.assert_has_event("EVT_CLIENT_CONNECT")
        self.assert_has_event("EVT_CLIENT_AUTH")
        # check player info in database
        client_from_db = self.parser.storage.getClient(
            Client(guid="73c5e50a7860475f0000000000000000"))
        self.assertIsNotNone(client_from_db)
        self.assertEqual("Max", client_from_db.name)
        self.assertEqual("73c5e50a7860475f0000000000000000",
                         client_from_db.guid)
        self.assertEqual("111.222.200.50", client_from_db.ip)
 def test_truncateTables_multiple_tables(self):
     c1 = Client(guid="aaaaaaaaa")
     c2 = Client(guid="bbbbbbbbb")
     self.storage.setClient(c1)
     self.storage.setClient(c2)
     self.storage.setClientPenalty(Penalty(clientId=c1.id, adminId=0, type='Kick'))
     self.storage.setClientPenalty(Penalty(clientId=c2.id, adminId=0, type='Kick'))
     cursor = self.storage.query("SELECT * FROM clients")
     self.assertFalse(cursor.EOF)
     cursor = self.storage.query("SELECT * FROM penalties")
     self.assertFalse(cursor.EOF)
     self.storage.truncateTable(['clients', 'penalties'])
     cursor = self.storage.query("SELECT * FROM clients")
     self.assertTrue(cursor.EOF)
     cursor = self.storage.query("SELECT * FROM penalties")
     self.assertTrue(cursor.EOF)
示例#15
0
 def on_kicked(self, name, cid, guid, team, properties):
     # L 08/28/2012 - 00:12:07: [basecommands.smx] "Console<0><Console><Console>" kicked "courgette<91><STEAM_1:0:1111111><>" (reason "f00")
     client = self.storage.getClient(Client(guid=guid))
     if client:
         p = self.parseProperties(properties)
         return self.getEvent("EVT_CLIENT_KICK", p.get('reason', ''),
                              client)
 def test_message_with_color_codes(self):
     self.parser.msgPrefix = "[Pre]"
     player = Client(console=self.parser, guid="theGuid")
     with patch.object(self.parser, 'writelines') as write_mock:
         player.message("^7message ^1with ^2color ^8codes")
         write_mock.assert_has_calls(
             [call(['m  [Pre] ^8[pm]^7 ^7message ^1with ^2color ^8codes'])])
示例#17
0
 def test_entered_the_game(self):
     # GIVEN
     p = Client(cid="12312312312312312", guid="12312312312312312", name="courgette")
     self.queueEvent_mock.reset_mock()
     # WHEN
     self.parser.route_game_event('''"courgette<12312312312312312><0>" entered the game''')
     # THEN
     self.assert_has_event('EVT_CLIENT_JOIN', client=p)
 def test_getCounts(self):
     c1 = Client(guid="aaaaaaaaa")
     self.assertEqual({'Kicks': 0, 'TempBans': 0, 'clients': 0, 'Bans': 0, 'Warnings': 0}, self.storage.getCounts())
     self.storage.setClient(c1)
     self.assertEqual({'Kicks': 0, 'TempBans': 0, 'clients': 1, 'Bans': 0, 'Warnings': 0}, self.storage.getCounts())
     self.storage.setClient(Client(guid="bbbbbbbbbb"))
     self.assertEqual({'Kicks': 0, 'TempBans': 0, 'clients': 2, 'Bans': 0, 'Warnings': 0}, self.storage.getCounts())
     Penalty(clientId=c1.id, adminId=0, type='Ban').save(self.console)
     self.assertEqual({'Kicks': 0, 'TempBans': 0, 'clients': 2, 'Bans': 1, 'Warnings': 0}, self.storage.getCounts())
     Penalty(clientId=c1.id, adminId=0, type='Ban').save(self.console)
     self.assertEqual({'Kicks': 0, 'TempBans': 0, 'clients': 2, 'Bans': 2, 'Warnings': 0}, self.storage.getCounts())
     Penalty(clientId=c1.id, adminId=0, type='TempBan').save(self.console)
     self.assertEqual({'Kicks': 0, 'TempBans': 1, 'clients': 2, 'Bans': 2, 'Warnings': 0}, self.storage.getCounts())
     Penalty(clientId=c1.id, adminId=0, type='Kick').save(self.console)
     self.assertEqual({'Kicks': 1, 'TempBans': 1, 'clients': 2, 'Bans': 2, 'Warnings': 0}, self.storage.getCounts())
     Penalty(clientId=c1.id, adminId=0, type='Warning').save(self.console)
     self.assertEqual({'Kicks': 1, 'TempBans': 1, 'clients': 2, 'Bans': 2, 'Warnings': 1}, self.storage.getCounts())
示例#19
0
 def test_message(self):
     """\
     display a message to a given player
     """
     superman = Client(console=self.console, cid="11")
     self.console.msgPrefix = "B3:"
     self.console.message(superman, "something")
     verify(self.output_mock).write('tell 11 B3: ^3[pm]^7 something')
示例#20
0
 def test_say(self):
     # GIVEN
     p = Client(cid="12312312312312312", guid="12312312312312312", name="courgette")
     self.queueEvent_mock.reset_mock()
     # WHEN
     self.parser.route_game_event('''"courgette<12312312312312312><1>" say "<FONT COLOR='#FF0000'> hi"''')
     # THEN
     self.assert_has_event('EVT_CLIENT_SAY', data="hi", client=p)
示例#21
0
 def test_say_team(self):
     # GIVEN
     p = Client(cid="12312312312312312", guid="12312312312312312", name="courgette")
     self.queueEvent_mock.reset_mock()
     # WHEN
     self.parser.route_game_event(r'''"courgette<12312312312312312><1>" say_team "(Team) <FONT COLOR='#66CCFF'> hi team"''')
     # THEN
     self.assert_has_event('EVT_CLIENT_TEAM_SAY', data="hi team", client=p)
示例#22
0
 def test_joined_team(self):
     # GIVEN
     p = Client(cid="12312312312312312", guid="12312312312312312", name="courgette")
     self.queueEvent_mock.reset_mock()
     # WHEN
     self.parser.route_game_event('''"courgette<12312312312312312><1>" joined team "1"''')
     # THEN
     self.assert_has_event('EVT_CLIENT_TEAM_CHANGE', data=TEAM_RESISTANCE, client=p)
示例#23
0
 def test_committed_suicide(self):
     # GIVEN
     p = Client(cid="12312312312312312", guid="12312312312312312", name="courgette")
     self.queueEvent_mock.reset_mock()
     # WHEN
     self.parser.route_game_event('''"courgette<12312312312312312><1>" committed suicide with "R_DmgType_M26Grenade"''')
     # THEN
     self.assert_has_event('EVT_CLIENT_SUICIDE', data=(100, "R_DmgType_M26Grenade", 'body'), client=p, target=p)
示例#24
0
 def test_connected(self):
     # GIVEN
     p = Client(cid="12312312312312312", guid="12312312312312312", ip="192.168.0.1")
     self.queueEvent_mock.reset_mock()
     # WHEN
     self.parser.route_game_event('''"<12312312312312312><>" connected, address "192.168.0.1"''')
     # THEN
     self.assert_has_event('EVT_CLIENT_CONNECT', data=self.whatever, client=p)
示例#25
0
 def test_disconnected(self):
     # GIVEN
     p = Client(cid="12312312312312312", guid="12312312312312312", name="courgette")
     self.queueEvent_mock.reset_mock()
     # WHEN
     self.parser.route_game_event('''"courgette<12312312312312312><0>"disconnected''')
     # THEN
     self.assert_has_event('EVT_CLIENT_DISCONNECT', data="12312312312312312", client=p)
示例#26
0
 def test_with_named_parameters__unicode(self):
     client = Client(name=u"ÄÖé")
     self.assertDictContainsSubset(
         {
             'clientname': client.name,
             'reason': 'this is a good reason'
         },
         self.parser.getMessageVariables(client=client,
                                         reason="this is a good reason"))
示例#27
0
 def test_with_named_parameters(self):
     client = Client(name="Jack")
     self.assertDictIsSubset(
         {
             'clientname': client.name,
             'reason': 'this is a good reason'
         },
         self.parser.getMessageVariables(client=client,
                                         reason="this is a good reason"))
示例#28
0
 def on_banid(self, name, cid, guid, team, duration, admin):
     # L 08/28/2012 - 00:03:01: Banid: "courgette<91><STEAM_1:0:1111111><>" was banned "for 1.00 minutes" by "Console"
     client = self.storage.getClient(Client(guid=guid))
     if client:
         return self.getEvent("EVT_CLIENT_BAN_TEMP", {
             "duration": duration,
             "admin": admin,
             'reason': None
         }, client)
示例#29
0
 def onServerUnBan(self, name, guid, hash):
     """UnBanned Player: PlayerName="" PlayerID=-1 ProfileID=1561500 Hash="""
     # we are using storage instead of self.clients because the player cannot be connected
     client = self.storage.getClient(Client(guid=guid))
     if client:
         self.saybig("%s removed from server banlist" % client.name)
     else:
         self.error('Cannot find banned client')
     # update banlist
     self.retrieveBanList()
示例#30
0
 def onServerBan_remove(self, data):
     """ [int: SteamID] """
     # we are using storage instead of self.clients because the player 
     # is obviously not connected when banned
     client = self.storage.getClient(Client(guid=data))
     if client:
         self.write(self.getCommand('saybig',  prefix='', message="%s removed from server banlist" % client.name))
     else:
         self.write(self.getCommand('saybig',  prefix='', message="%s unbanned" % data))
     # update banlist
     self.retrieveBanList()