"""
Test suite for parsing.py. Uses unittest module.

2011, Razvan Deaconescu, razvan.deaconescu@cs.pub.ro
"""

import unittest
import os
import os.path
import shutil
import sys

import parsing
import storage

class LibtorrentLogParserTest(unittest.TestCase):
    """Test suite for LibtorrentLogParser class in parsing.py."""

    ok_dir = "ok_dir"
    no_dir = "no_dir"
    status_file = "status.log"
    verbose_file1 = "141.85.224.201_12345.log"
    verbose_file2 = "141.85.224.202_12345.log"
    verbose_file3 = "141.85.224.203_12345.log"
    bogus_file1 = "dht.log"
    bogus_file2 = "141.85.224.203.log"
    bogus_file3 = "12345.log"

    def setUp(self):
        # Create folder and log files.
        os.mkdir(self.ok_dir)
        self.ok_status_file_path = os.path.join(self.ok_dir,
                self.status_file)
        self.ok_verbose_file_path1 = os.path.join(self.ok_dir,
                self.verbose_file1)
        self.ok_verbose_file_path2 = os.path.join(self.ok_dir,
                self.verbose_file2)
        self.ok_verbose_file_path3 = os.path.join(self.ok_dir,
                self.verbose_file3)
        self.ok_bogus_file_path1 = os.path.join(self.ok_dir,
                self.bogus_file1)
        self.ok_bogus_file_path2 = os.path.join(self.ok_dir,
                self.bogus_file2)
        self.ok_bogus_file_path3 = os.path.join(self.ok_dir,
                self.bogus_file3)
        f = open(self.ok_status_file_path, "w")
        f.close()
        f = open(self.ok_verbose_file_path1, "w")
        f.close()
        f = open(self.ok_verbose_file_path2, "w")
        f.close()
        f = open(self.ok_verbose_file_path3, "w")
        f.close()
        f = open(self.ok_bogus_file_path1, "w")
        f.close()
        f = open(self.ok_bogus_file_path2, "w")
        f.close()
        f = open(self.ok_bogus_file_path3, "w")
        f.close()

        # Initialize message type counters.
        self.statmsg_count = 0
        self.pstatmsg_count = 0
        self.verbmsg_count = 0

        # Initialize internal call counts.
        self.bogus_line_num_calls = 0
        self.status_line_num_calls = 0
        self.peer_status_line_num_calls = 0
        self.verbose_line_num_calls = 0

        # Remove no_dir in case it exists.
        try:
            shutil.rmtree(self.no_dir)
        except OSError, e:
            pass

    def tearDown(self):
        shutil.rmtree(self.ok_dir)
        # Remove no_dir in case it exists.
        try:
            shutil.rmtree(self.no_dir)
        except OSError, e:
            pass

    def append_line(self, filename, line):
        """Add (append) a line to to a file."""
        f = open(filename, "at")
        f.write(line + "\n")
        f.close()

    def add_bogus_line(self, filename):
        """Add bogus (non-relevant) line to file."""
        if self.bogus_line_num_calls == 0:
            self.append_line(filename, "Nebuchadnezzar")
        else:
            self.append_line(filename, "Assurbanipal")
        self.bogus_line_num_calls = self.bogus_line_num_calls + 1

    def add_status_line(self, filename):
        """Add status line to file."""
        if self.status_line_num_calls == 0:
            self.append_line(filename, "ps: 5, dht: 21 <> dl: 462.1kb/s, ul: 255.2kb/s <> dld: 45mb, uld: 3mb, size: 698mb <> eta: 24m 7s")
        else:
            self.append_line(filename, "ps: 5, dht: 21 <> dl: 469kb/s, ul: 255.66kb/s <> dld: 46mb, uld: 4mb, size: 698mb <> eta: 23m 45s")
        self.status_line_num_calls = self.status_line_num_calls + 1

    def add_peer_status_line(self, filename):
        """Add peer status line to file."""
        if self.peer_status_line_num_calls == 0:
            self.append_line(filename, "--Peers: (Aug 14 17:22:35) [ ip: 10.1.7.5:33289, dl: 86.63kb/s, ul: 175.07kb/s ][ ip: 10.1.9.5:55611, dl: 14.63kb/s, ul: 110.79kb/s ]")
        else:
            self.append_line(filename, "--Peers: (Aug 14 17:22:40) [ ip: 10.1.7.5:33289, dl: 23.6kb/s, ul: 94.91kb/s ][ ip: 10.1.6.5:47254, dl: 55.61kb/s, ul: 100.72kb/s ][ ip: 10.1.4.5:6881, dl: 93.99kb/s, ul: 100.11kb/s ]")
        self.peer_status_line_num_calls = self.peer_status_line_num_calls + 1

    def add_verbose_line(self, filename):
        """Add verbose line to file."""
        if self.verbose_line_num_calls == 0:
            self.append_line(filename, "Jan 08 22:20:50 <== REQUEST [ piece: 8a | s: 38000 | l: 4000 ]")
        else:
            self.append_line(filename, "Jan 08 22:20:50 ==> PIECE   [ piece: 8a | s: 34000 | l: 4000 ]")
        self.verbose_line_num_calls = self.verbose_line_num_calls + 1

    def add_message_to_count(self, msg):
        """Update message type counters according to msg."""
        if msg.__class__ == storage.StatusMessage:
            self.statmsg_count = self.statmsg_count + 1
        elif msg.__class__ == storage.PeerStatusMessage:
            self.pstatmsg_count = self.pstatmsg_count + 1
        elif msg.__class__ == storage.VerboseMessage:
            self.verbmsg_count = self.verbmsg_count + 1

    def test_non_existent_folder(self):
        """libtorrent log folder doesn't exist.
        Exception should be raised.
        """
        exception_raised = False
        try:
            p = parsing.LibtorrentLogParser(self.no_dir,
                    "2009-01-01 12:13:14")
        except OSError, e:
            exception_raised = True

        self.assertEqual(exception_raised, True)

    def test_no_log_files(self):
        """No log files are present in the log folder.
        Exception should be raised.
        """
        # Remove files.
        os.remove(self.ok_status_file_path)
        os.remove(self.ok_verbose_file_path1)
        os.remove(self.ok_verbose_file_path2)
        os.remove(self.ok_verbose_file_path3)

        exception_raised = False
        try:
            p = parsing.LibtorrentLogParser(self.ok_dir,
                    "2009-01-01 12:13:14")
        except (IOError, OSError, IndexError), e:
            exception_raised = True

        self.assertEqual(exception_raised, True)

    def test_get_parsing_file_no_status_log_file(self):
        """No status log file is present.
        Use get_current_parsing_filename() to get current log file.
        """
        # Remove status log file.
        os.remove(self.ok_status_file_path)

        p = parsing.LibtorrentLogParser(self.ok_dir, "2009-01-01 12:13:14")
        current = p.get_current_parsing_filename()

        value = (current == self.ok_verbose_file_path1 or
                current == self.ok_verbose_file_path2 or
                current == self.ok_verbose_file_path3)
        self.assertEqual(value, True)

    def test_get_to_parse_files_no_status_log_files(self):
        """No status log file is present.
        Use get_to_parse_list() to get files to be parsed.
        """
        # Remove status log file.
        os.remove(self.ok_status_file_path)

        # to_parse list should consists of 2 entries: the verbose log
        # files minus the one that is currently being parsed.
        p = parsing.LibtorrentLogParser(self.ok_dir, "2009-01-01 12:13:14")
        count = len(p.get_to_parse_list())

        self.assertEqual(count, 2)

    def test_get_parsing_file_no_verbose_log_files(self):
        """No verbose log file is present.
        Use get_current_parsing_filename() to get current log file.
        """
        # Remove status log file.
        os.remove(self.ok_verbose_file_path1)
        os.remove(self.ok_verbose_file_path2)
        os.remove(self.ok_verbose_file_path3)

        p = parsing.LibtorrentLogParser(self.ok_dir, "2009-01-01 12:13:14")
        current = p.get_current_parsing_filename()

        value = (current == self.ok_status_file_path)
        self.assertEqual(value, True)

    def test_get_to_parse_files_no_verbose_log_files(self):
        """No verbose log file is present.
        Use get_to_parse_list() to get files to be parsed.
        """
        # Remove verbose log files.
        os.remove(self.ok_verbose_file_path1)
        os.remove(self.ok_verbose_file_path2)
        os.remove(self.ok_verbose_file_path3)

        # to_parse list should be empty: no verbose files and the
        # status file is currently being parsed.
        p = parsing.LibtorrentLogParser(self.ok_dir, "2009-01-01 12:13:14")
        count = len(p.get_to_parse_list())

        self.assertEqual(count, 0)

    def test_get_parsing_status_priority(self):
        """Set priority as "status".
        get_current_parsing_filename() should return status log file.
        """
        p = parsing.LibtorrentLogParser(self.ok_dir,
                "2009-01-01 12:13:14", priority="status")
        current = p.get_current_parsing_filename()

        value = (current == self.ok_status_file_path)
        self.assertEqual(value, True)

    def test_get_parsing_verbose_priority(self):
        """Set priority as "status".
        get_current_parsing_filename() should return a verbose log file.
        """
        p = parsing.LibtorrentLogParser(self.ok_dir,
                "2009-01-01 12:13:14", priority="verbose")
        current = p.get_current_parsing_filename()

        value = (current == self.ok_verbose_file_path1 or
                current == self.ok_verbose_file_path2 or
                current == self.ok_verbose_file_path3)
        self.assertEqual(value, True)

    def test_get_message_no_status_log_file_empty_verbose_log_files(self):
        """Status log file does not exist, verbose log files are empty.
        Returned message should be None.
        """
        # Remove status log file.
        os.remove(self.ok_status_file_path)

        p = parsing.LibtorrentLogParser(self.ok_dir, "2009-01-01 12:13:14")
        msg = p.get_next_message()

        self.assertEqual(msg, None)

    def test_get_message_no_verbose_log_files_empty_status_log_file(self):
        """Verbose log files do not exist, status log file is empty.
        Returned message should be None.
        """
        # Remove verbose log files.
        os.remove(self.ok_verbose_file_path1)
        os.remove(self.ok_verbose_file_path2)
        os.remove(self.ok_verbose_file_path3)

        p = parsing.LibtorrentLogParser(self.ok_dir, "2009-01-01 12:13:14")
        msg = p.get_next_message()

        self.assertEqual(msg, None)

    def test_get_message_empty_log_files(self):
        """Log files are empty.
        Returned message should be None.
        """
        p = parsing.LibtorrentLogParser(self.ok_dir, "2009-01-01 12:13:14")
        msg = p.get_next_message()

        self.assertEqual(msg, None)

    def test_get_none_message_in_status_log_file(self):
        """Status log file consists of bogus information (no messages).
        Set priority as "status".
        Message is returned from verbose log file.
        """
        self.add_bogus_line(self.ok_status_file_path)
        self.add_verbose_line(self.ok_verbose_file_path1)

        p = parsing.LibtorrentLogParser(self.ok_dir,
                "2009-01-01 12:13:14", priority="status")
        msg = p.get_next_message()

        self.add_message_to_count(msg)

        self.assertEqual(self.verbmsg_count, 1)

    def test_get_none_message_in_verbose_log_files(self):
        """Verbose log files consist of bogus information (no messages).
        Set priority as "verbose".
        Message is returned from status log file.
        """
        self.add_bogus_line(self.ok_verbose_file_path1)
        self.add_bogus_line(self.ok_verbose_file_path2)
        self.add_bogus_line(self.ok_verbose_file_path3)
        self.add_status_line(self.ok_status_file_path)

        p = parsing.LibtorrentLogParser(self.ok_dir,
                "2009-01-01 12:13:14", priority="verbose")
        msg = p.get_next_message()

        self.add_message_to_count(msg)

        self.assertEqual(self.statmsg_count, 1)

    def test_get_status_message(self):
        """Return a status message from status log file."""
        self.add_status_line(self.ok_status_file_path)

        p = parsing.LibtorrentLogParser(self.ok_dir,
                "2009-01-01 12:13:14", priority="verbose")
        msg = p.get_next_message()

        self.add_message_to_count(msg)

        self.assertEqual(self.statmsg_count, 1)

    def test_get_status_messages(self):
        """Return multiple status messages from status log file."""
        self.add_status_line(self.ok_status_file_path)
        self.add_status_line(self.ok_status_file_path)

        p = parsing.LibtorrentLogParser(self.ok_dir,
                "2009-01-01 12:13:14", priority="verbose")
        msg1 = p.get_next_message()
        msg2 = p.get_next_message()

        self.add_message_to_count(msg1)
        self.add_message_to_count(msg2)

        self.assertEqual(self.statmsg_count, 2)

    def test_get_status_messages_different_files(self):
        """Return multiple status messages from different log files."""
        self.add_status_line(self.ok_status_file_path)
        self.add_status_line(self.ok_verbose_file_path1)

        p = parsing.LibtorrentLogParser(self.ok_dir,
                "2009-01-01 12:13:14", priority="verbose")
        msg1 = p.get_next_message()
        msg2 = p.get_next_message()

        self.add_message_to_count(msg1)
        self.add_message_to_count(msg2)

        self.assertEqual(self.statmsg_count, 2)

    def test_get_peer_status_message(self):
        """Return a peer status message from status log file."""
        self.add_peer_status_line(self.ok_status_file_path)

        p = parsing.LibtorrentLogParser(self.ok_dir,
                "2009-01-01 12:13:14", priority="verbose")
        msg = p.get_next_message()

        self.add_message_to_count(msg)

        self.assertEqual(self.pstatmsg_count, 1)

    def test_get_peer_status_messages(self):
        """Return multiple peer status messages from status log file."""
        self.add_peer_status_line(self.ok_status_file_path)
        self.add_peer_status_line(self.ok_status_file_path)

        p = parsing.LibtorrentLogParser(self.ok_dir,
                "2009-01-01 12:13:14", priority="verbose")
        msg1 = p.get_next_message()
        msg2 = p.get_next_message()
        msg3 = p.get_next_message()
        msg4 = p.get_next_message()
        msg5 = p.get_next_message()

        self.add_message_to_count(msg1)
        self.add_message_to_count(msg2)
        self.add_message_to_count(msg3)
        self.add_message_to_count(msg4)
        self.add_message_to_count(msg5)

        self.assertEqual(self.pstatmsg_count, 5)

    def test_get_peer_status_messages_different_files(self):
        """Return multiple peer status messages from different log files."""
        self.add_peer_status_line(self.ok_status_file_path)
        self.add_peer_status_line(self.ok_verbose_file_path1)

        p = parsing.LibtorrentLogParser(self.ok_dir,
                "2009-01-01 12:13:14", priority="verbose")
        msg1 = p.get_next_message()
        msg2 = p.get_next_message()
        msg3 = p.get_next_message()
        msg4 = p.get_next_message()
        msg5 = p.get_next_message()

        self.add_message_to_count(msg1)
        self.add_message_to_count(msg2)
        self.add_message_to_count(msg3)
        self.add_message_to_count(msg4)
        self.add_message_to_count(msg5)

        self.assertEqual(self.pstatmsg_count, 5)

    def test_get_verbose_message(self):
        """Return a verbose message from verbose log file."""
        self.add_verbose_line(self.ok_verbose_file_path1)

        p = parsing.LibtorrentLogParser(self.ok_dir,
                "2009-01-01 12:13:14", priority="status")
        msg = p.get_next_message()

        self.add_message_to_count(msg)

        self.assertEqual(self.verbmsg_count, 1)

    def test_get_verbose_messages(self):
        """Return multiple verbose messages from verbose log file."""
        self.add_verbose_line(self.ok_verbose_file_path1)
        self.add_verbose_line(self.ok_verbose_file_path1)

        p = parsing.LibtorrentLogParser(self.ok_dir,
                "2009-01-01 12:13:14", priority="verbose")
        msg1 = p.get_next_message()
        msg2 = p.get_next_message()

        self.add_message_to_count(msg1)
        self.add_message_to_count(msg2)

        self.assertEqual(self.verbmsg_count, 2)

    def test_get_verbose_messages_different_files(self):
        """Return multiple verbose messages from different log files."""
        self.add_verbose_line(self.ok_verbose_file_path1)
        self.add_verbose_line(self.ok_verbose_file_path2)

        p = parsing.LibtorrentLogParser(self.ok_dir,
                "2009-01-01 12:13:14", priority="verbose")
        msg1 = p.get_next_message()
        msg2 = p.get_next_message()

        self.add_message_to_count(msg1)
        self.add_message_to_count(msg2)

        self.assertEqual(self.verbmsg_count, 2)

    def test_get_mixed_messages_same_file(self):
        """Status file contains multiple messages of different types."""
        self.add_status_line(self.ok_status_file_path)
        self.add_peer_status_line(self.ok_status_file_path)
        self.add_verbose_line(self.ok_status_file_path)

        p = parsing.LibtorrentLogParser(self.ok_dir,
                "2009-01-01 12:13:14", priority="verbose")
        msg1 = p.get_next_message()
        msg2 = p.get_next_message()
        msg3 = p.get_next_message()
        msg4 = p.get_next_message()

        self.add_message_to_count(msg1)
        self.add_message_to_count(msg2)
        self.add_message_to_count(msg3)
        self.add_message_to_count(msg4)

        self.assertEqual(self.statmsg_count, 1)
        self.assertEqual(self.pstatmsg_count, 2)
        self.assertEqual(self.verbmsg_count, 1)

    def test_get_mixed_messages_own_file(self):
        """Each log file contains a single type of messages."""
        self.add_status_line(self.ok_status_file_path)
        self.add_status_line(self.ok_status_file_path)
        self.add_peer_status_line(self.ok_verbose_file_path1)
        self.add_peer_status_line(self.ok_verbose_file_path1)
        self.add_verbose_line(self.ok_verbose_file_path2)
        self.add_verbose_line(self.ok_verbose_file_path2)

        p = parsing.LibtorrentLogParser(self.ok_dir,
                "2009-01-01 12:13:14", priority="verbose")
        msg1 = p.get_next_message()
        msg2 = p.get_next_message()
        msg3 = p.get_next_message()
        msg4 = p.get_next_message()
        msg5 = p.get_next_message()
        msg6 = p.get_next_message()
        msg7 = p.get_next_message()
        msg8 = p.get_next_message()
        msg9 = p.get_next_message()

        self.add_message_to_count(msg1)
        self.add_message_to_count(msg2)
        self.add_message_to_count(msg3)
        self.add_message_to_count(msg4)
        self.add_message_to_count(msg5)
        self.add_message_to_count(msg6)
        self.add_message_to_count(msg7)
        self.add_message_to_count(msg8)
        self.add_message_to_count(msg9)

        self.assertEqual(self.statmsg_count, 2)
        self.assertEqual(self.pstatmsg_count, 5)
        self.assertEqual(self.verbmsg_count, 2)

    def test_get_mixed_messages_different_files(self):
        """Log files contain different message types."""
        self.add_status_line(self.ok_status_file_path)
        self.add_status_line(self.ok_status_file_path)
        self.add_peer_status_line(self.ok_verbose_file_path1)
        self.add_peer_status_line(self.ok_verbose_file_path1)
        self.add_verbose_line(self.ok_verbose_file_path2)
        self.add_verbose_line(self.ok_verbose_file_path2)

        p = parsing.LibtorrentLogParser(self.ok_dir,
                "2009-01-01 12:13:14", priority="verbose")
        msg1 = p.get_next_message()
        msg2 = p.get_next_message()
        msg3 = p.get_next_message()
        msg4 = p.get_next_message()
        msg5 = p.get_next_message()
        msg6 = p.get_next_message()
        msg7 = p.get_next_message()
        msg8 = p.get_next_message()
        msg9 = p.get_next_message()

        self.add_message_to_count(msg1)
        self.add_message_to_count(msg2)
        self.add_message_to_count(msg3)
        self.add_message_to_count(msg4)
        self.add_message_to_count(msg5)
        self.add_message_to_count(msg6)
        self.add_message_to_count(msg7)
        self.add_message_to_count(msg8)
        self.add_message_to_count(msg9)

        self.assertEqual(self.statmsg_count, 2)
        self.assertEqual(self.pstatmsg_count, 5)
        self.assertEqual(self.verbmsg_count, 2)


class TriblerLogParserTest(unittest.TestCase):
    """Test suite for TriblerLogParser class in parsing.py."""

    log_file = 'tribler.log'
    no_log_file = 'no.log'

    def setUp(self):
        """Create log file and initiate local counter variables."""
        f = open(self.log_file, "w")
        f.close()

        # Initialize message type counters.
        self.statmsg_count = 0
        self.pstatmsg_count = 0
        self.verbmsg_count = 0

        # Initialize internal call counts.
        self.bogus_line_num_calls = 0
        self.status_line_num_calls = 0
        self.peer_status_line_num_calls = 0
        self.verbose_line_num_calls = 0

        # Remove no log file in case it exists.
        try:
            os.remove(self.no_log_file)
        except OSError, e:
            pass

    def tearDown(self):
        """Remove log file."""
        os.remove(self.log_file)

    def append_line(self, filename, line):
        """Add (append) a line to to a file."""
        f = open(filename, "at")
        f.write(line + "\n")
        f.close()

    def add_bogus_line(self, filename):
        """Add bogus (non-relevant) line to file."""
        if self.bogus_line_num_calls == 0:
            self.append_line(filename, "Nebuchadnezzar")
        else:
            self.append_line(filename, "Assurbanipal")
        self.bogus_line_num_calls = self.bogus_line_num_calls + 1

    def add_status_line(self, filename):
        """Add status line to file."""
        if self.status_line_num_calls == 0:
            self.append_line(filename, "03-11-2009 12:19:13   aqua.mpeg DLSTATUS_SEEDING 100.00% None up     0.00KB/s down     0.00KB/s eta 0 peers 0")
        else:
            self.append_line(filename, "03-11-2009 12:19:04   aqua.mpeg DLSTATUS_DOWNLOADING 93.89% None up     0.00KB/s down  5440.21KB/s eta 1.67072531777 peers 2")
        self.status_line_num_calls = self.status_line_num_calls + 1

    def add_peer_status_line(self, filename):
        """Add peer status line to file."""
        if self.peer_status_line_num_calls == 0:
            self.append_line(filename, "--Peers: (Aug 14 17:22:35) [ ip: 10.1.7.5:33289, dl: 86.63KB/s, ul: 175.07KB/s ][ ip: 10.1.9.5:55611, dl: 14.63KB/s, ul: 110.79KB/s ]")
        else:
            self.append_line(filename, "--Peers: (Aug 14 17:22:40) [ ip: 10.1.7.5:33289, dl: 23.6KB/s, ul: 94.91KB/s ][ ip: 10.1.6.5:47254, dl: 55.61KB/s, ul: 100.72KB/s ][ ip: 10.1.4.5:6881, dl: 93.99KB/s, ul: 100.11KB/s ]")
        self.peer_status_line_num_calls = self.peer_status_line_num_calls + 1

    def add_verbose_line(self, filename):
        """Add verbose line to file."""
        if self.verbose_line_num_calls == 0:
            self.append_line(filename, "14-11-2009 23:11:13   connecter: Got HAVE( 17 ) from 141.85.37.41")
        else:
           self.append_line(filename, "14-11-2009 23:11:13   connecter: Got BITFIELD 141.85.37.41")
        self.verbose_line_num_calls = self.verbose_line_num_calls + 1

    def add_message_to_count(self, msg):
        """Update message type counters according to msg."""
        if msg.__class__ == storage.StatusMessage:
            self.statmsg_count = self.statmsg_count + 1
        elif msg.__class__ == storage.PeerStatusMessage:
            self.pstatmsg_count = self.pstatmsg_count + 1
        elif msg.__class__ == storage.VerboseMessage:
            self.verbmsg_count = self.verbmsg_count + 1

    def test_no_log_file(self):
        """Log file doesn't exist."""
        exception_raised = False
        try:
            p = parsing.TriblerLogParser(self.no_log_file,
                    "2009-01-01 12:13:14")
        except (IOError, OSError, IndexError), e:
            exception_raised = True

        self.assertEqual(exception_raised, True)

    def test_empty_log_file(self):
        """Log file is empty."""
        p = parsing.TriblerLogParser(self.log_file, "2009-01-01 12:13:14")

        msg = p.get_next_message()

        self.assertEqual(msg, None)

    def test_bogus_log_file(self):
        """Log file contains bogus information (no real data)."""
        self.add_bogus_line(self.log_file)
        self.add_bogus_line(self.log_file)
        p = parsing.TriblerLogParser(self.log_file, "2009-01-01 12:13:14")

        msg = p.get_next_message()

        self.assertEqual(msg, None)

    def test_get_status_message(self):
        """Add status message."""
        self.add_status_line(self.log_file)
        p = parsing.TriblerLogParser(self.log_file, "2009-01-01 12:13:14")

        msg = p.get_next_message()
        self.add_message_to_count(msg)

        self.assertEqual(self.statmsg_count, 1)

    def test_get_status_messages(self):
        """Add multiple status messages."""
        self.add_status_line(self.log_file)
        self.add_status_line(self.log_file)
        p = parsing.TriblerLogParser(self.log_file, "2009-01-01 12:13:14")

        msg1 = p.get_next_message()
        msg2 = p.get_next_message()
        self.add_message_to_count(msg1)
        self.add_message_to_count(msg2)

        self.assertEqual(self.statmsg_count, 2)

    def test_get_peer_status_message(self):
        """Add peer status message."""
        self.add_peer_status_line(self.log_file)
        p = parsing.TriblerLogParser(self.log_file, "2009-01-01 12:13:14")

        msg = p.get_next_message()
        self.add_message_to_count(msg)

        self.assertEqual(self.pstatmsg_count, 1)

    def test_get_peer_status_messages(self):
        """Add multiple peer status messsages."""
        self.add_peer_status_line(self.log_file)
        self.add_peer_status_line(self.log_file)
        p = parsing.TriblerLogParser(self.log_file, "2009-01-01 12:13:14")

        msg1 = p.get_next_message()
        msg2 = p.get_next_message()
        self.add_message_to_count(msg1)
        self.add_message_to_count(msg2)

        self.assertEqual(self.pstatmsg_count, 2)

    def test_get_verbose_message(self):
        """Add verbose message."""
        self.add_verbose_line(self.log_file)
        p = parsing.TriblerLogParser(self.log_file, "2009-01-01 12:13:14")

        msg = p.get_next_message()
        self.add_message_to_count(msg)

        self.assertEqual(self.verbmsg_count, 1)

    def test_get_verbose_messages(self):
        """Add multiple verbose messages."""
        self.add_verbose_line(self.log_file)
        self.add_verbose_line(self.log_file)
        p = parsing.TriblerLogParser(self.log_file, "2009-01-01 12:13:14")

        msg1 = p.get_next_message()
        msg2 = p.get_next_message()
        self.add_message_to_count(msg1)
        self.add_message_to_count(msg2)

        self.assertEqual(self.verbmsg_count, 2)

    def test_get_mixed_messages_same_file(self):
        """Add mixed messages in the same file.
        Parser should detect a message of each type (status, peer status
        and verbose).
        """
        self.add_bogus_line(self.log_file)
        self.add_status_line(self.log_file)
        self.add_peer_status_line(self.log_file)
        self.add_verbose_line(self.log_file)
        p = parsing.TriblerLogParser(self.log_file, "2009-01-01 12:13:14")

        msg1 = p.get_next_message()
        msg2 = p.get_next_message()
        msg3 = p.get_next_message()
        msg4 = p.get_next_message()
        self.add_message_to_count(msg1)
        self.add_message_to_count(msg2)
        self.add_message_to_count(msg3)
        self.add_message_to_count(msg4)

        self.assertEqual(self.statmsg_count, 1)
        self.assertEqual(self.pstatmsg_count, 2)
        self.assertEqual(self.verbmsg_count, 1)


if __name__ == "__main__":
#    suite = unittest.TestSuite()
#    suite.addTest(LibtorrentLogParserTest('test_get_status_message'))
#    suite.addTest(LibtorrentLogParserTest('test_get_status_messages'))
#    suite.addTest(LibtorrentLogParserTest('test_get_status_messages_different_files'))
#    suite.addTest(LibtorrentLogParserTest('test_get_verbose_message'))
#    suite.addTest(LibtorrentLogParserTest('test_get_verbose_messages'))
#    suite.addTest(LibtorrentLogParserTest('test_get_verbose_messages_different_files'))
#    suite.addTest(LibtorrentLogParserTest('test_get_mixed_messages_same_file'))
#    unittest.TextTestRunner().run(suite)
    unittest.main()
