199451b44SJordan Rupprecht"""
299451b44SJordan RupprechtTest lldb logging.  This test just makes sure logging doesn't crash, and produces some output.
399451b44SJordan Rupprecht"""
499451b44SJordan Rupprecht
599451b44SJordan Rupprecht
699451b44SJordan Rupprecht
799451b44SJordan Rupprechtimport os
899451b44SJordan Rupprechtimport lldb
999451b44SJordan Rupprechtfrom lldbsuite.test.decorators import *
1099451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import *
1199451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil
1299451b44SJordan Rupprecht
1399451b44SJordan Rupprecht
1499451b44SJordan Rupprechtclass LogTestCase(TestBase):
1599451b44SJordan Rupprecht    NO_DEBUG_INFO_TESTCASE = True
1699451b44SJordan Rupprecht
1799451b44SJordan Rupprecht    def setUp(self):
1899451b44SJordan Rupprecht        super(LogTestCase, self).setUp()
1999451b44SJordan Rupprecht        self.log_file = self.getBuildArtifact("log-file.txt")
2099451b44SJordan Rupprecht
2164c87a94SJonas Devlieghere
2299451b44SJordan Rupprecht    def test_file_writing(self):
2399451b44SJordan Rupprecht        self.build()
2499451b44SJordan Rupprecht        exe = self.getBuildArtifact("a.out")
2599451b44SJordan Rupprecht        self.expect("file " + exe,
2699451b44SJordan Rupprecht                    patterns=["Current executable set to .*a.out"])
2799451b44SJordan Rupprecht
2899451b44SJordan Rupprecht        if (os.path.exists(self.log_file)):
2999451b44SJordan Rupprecht            os.remove(self.log_file)
3099451b44SJordan Rupprecht
3199451b44SJordan Rupprecht        # By default, Debugger::EnableLog() will set log options to
3299451b44SJordan Rupprecht        # PREPEND_THREAD_NAME + OPTION_THREADSAFE. We don't want the
3399451b44SJordan Rupprecht        # threadnames here, so we enable just threadsafe (-t).
34*70841b97SJonas Devlieghere        self.runCmd("log enable -f '%s' lldb commands" % (self.log_file))
3599451b44SJordan Rupprecht
3699451b44SJordan Rupprecht        self.runCmd("command alias bp breakpoint")
3799451b44SJordan Rupprecht
3899451b44SJordan Rupprecht        self.runCmd("bp set -n main")
3999451b44SJordan Rupprecht
4099451b44SJordan Rupprecht        self.runCmd("bp l")
4199451b44SJordan Rupprecht
4299451b44SJordan Rupprecht        self.runCmd("log disable lldb")
4399451b44SJordan Rupprecht
4499451b44SJordan Rupprecht        self.assertTrue(os.path.isfile(self.log_file))
4599451b44SJordan Rupprecht
4664c87a94SJonas Devlieghere        with open(self.log_file, 'r') as f:
4764c87a94SJonas Devlieghere            log_lines = f.read()
4899451b44SJordan Rupprecht        os.remove(self.log_file)
4999451b44SJordan Rupprecht
5099451b44SJordan Rupprecht        self.assertGreater(
5199451b44SJordan Rupprecht            len(log_lines),
5299451b44SJordan Rupprecht            0,
5399451b44SJordan Rupprecht            "Something was written to the log file.")
5499451b44SJordan Rupprecht
5599451b44SJordan Rupprecht    # Check that lldb truncates its log files
5699451b44SJordan Rupprecht    def test_log_truncate(self):
5799451b44SJordan Rupprecht        # put something in our log file
5899451b44SJordan Rupprecht        with open(self.log_file, "w") as f:
5999451b44SJordan Rupprecht            for i in range(1, 1000):
6099451b44SJordan Rupprecht                f.write("bacon\n")
6199451b44SJordan Rupprecht
62*70841b97SJonas Devlieghere        self.runCmd("log enable -f '%s' lldb commands" % self.log_file)
6399451b44SJordan Rupprecht        self.runCmd("help log")
6499451b44SJordan Rupprecht        self.runCmd("log disable lldb")
6599451b44SJordan Rupprecht
6699451b44SJordan Rupprecht        self.assertTrue(os.path.isfile(self.log_file))
6799451b44SJordan Rupprecht        with open(self.log_file, "r") as f:
6899451b44SJordan Rupprecht            contents = f.read()
6999451b44SJordan Rupprecht
7099451b44SJordan Rupprecht        # check that it got removed
7199451b44SJordan Rupprecht        self.assertEquals(contents.find("bacon"), -1)
7299451b44SJordan Rupprecht
7399451b44SJordan Rupprecht    # Check that lldb can append to a log file
7499451b44SJordan Rupprecht    def test_log_append(self):
7599451b44SJordan Rupprecht        # put something in our log file
7699451b44SJordan Rupprecht        with open(self.log_file, "w") as f:
7799451b44SJordan Rupprecht            f.write("bacon\n")
7899451b44SJordan Rupprecht
79*70841b97SJonas Devlieghere        self.runCmd( "log enable -a -f '%s' lldb commands" % self.log_file)
8099451b44SJordan Rupprecht        self.runCmd("help log")
8199451b44SJordan Rupprecht        self.runCmd("log disable lldb")
8299451b44SJordan Rupprecht
8399451b44SJordan Rupprecht        self.assertTrue(os.path.isfile(self.log_file))
8464c87a94SJonas Devlieghere        with open(self.log_file, 'r') as f:
8599451b44SJordan Rupprecht            contents = f.read()
8699451b44SJordan Rupprecht
8799451b44SJordan Rupprecht        # check that it is still there
8899451b44SJordan Rupprecht        self.assertEquals(contents.find("bacon"), 0)
8999451b44SJordan Rupprecht
9099451b44SJordan Rupprecht    # Enable all log options and check that nothing crashes.
9199451b44SJordan Rupprecht    @skipIfWindows
9299451b44SJordan Rupprecht    def test_all_log_options(self):
9399451b44SJordan Rupprecht        if (os.path.exists(self.log_file)):
9499451b44SJordan Rupprecht            os.remove(self.log_file)
9599451b44SJordan Rupprecht
96*70841b97SJonas Devlieghere        self.runCmd("log enable -v -s -T -p -n -S -F -f '%s' lldb commands" % self.log_file)
9799451b44SJordan Rupprecht        self.runCmd("help log")
9899451b44SJordan Rupprecht        self.runCmd("log disable lldb")
9999451b44SJordan Rupprecht
10099451b44SJordan Rupprecht        self.assertTrue(os.path.isfile(self.log_file))
101