xref: /llvm-project/lldb/test/API/python_api/file_handle/TestFileHandle.py (revision 9c2468821ec51defd09c246fea4a47886fff8c01)
199451b44SJordan Rupprecht"""
299451b44SJordan RupprechtTest lldb Python API for file handles.
399451b44SJordan Rupprecht"""
499451b44SJordan Rupprecht
599451b44SJordan Rupprecht
699451b44SJordan Rupprechtimport os
799451b44SJordan Rupprechtimport io
899451b44SJordan Rupprechtimport re
999451b44SJordan Rupprechtimport sys
1099451b44SJordan Rupprechtfrom contextlib import contextmanager
1199451b44SJordan Rupprecht
1299451b44SJordan Rupprechtimport lldb
1399451b44SJordan Rupprechtfrom lldbsuite.test import lldbtest
1499451b44SJordan Rupprechtfrom lldbsuite.test.decorators import *
1599451b44SJordan Rupprecht
162238dcc3SJonas Devlieghere
1799451b44SJordan Rupprechtclass OhNoe(Exception):
1899451b44SJordan Rupprecht    pass
1999451b44SJordan Rupprecht
202238dcc3SJonas Devlieghere
2199451b44SJordan Rupprechtclass BadIO(io.TextIOBase):
2299451b44SJordan Rupprecht    @property
2399451b44SJordan Rupprecht    def closed(self):
2499451b44SJordan Rupprecht        return False
252238dcc3SJonas Devlieghere
2699451b44SJordan Rupprecht    def writable(self):
2799451b44SJordan Rupprecht        return True
282238dcc3SJonas Devlieghere
2999451b44SJordan Rupprecht    def readable(self):
3099451b44SJordan Rupprecht        return True
312238dcc3SJonas Devlieghere
3299451b44SJordan Rupprecht    def write(self, s):
332238dcc3SJonas Devlieghere        raise OhNoe("OH NOE")
342238dcc3SJonas Devlieghere
3599451b44SJordan Rupprecht    def read(self, n):
3699451b44SJordan Rupprecht        raise OhNoe("OH NOE")
372238dcc3SJonas Devlieghere
3899451b44SJordan Rupprecht    def flush(self):
392238dcc3SJonas Devlieghere        raise OhNoe("OH NOE")
402238dcc3SJonas Devlieghere
4199451b44SJordan Rupprecht
4299451b44SJordan Rupprecht# This class will raise an exception while it's being
4399451b44SJordan Rupprecht# converted into a C++ object by swig
4499451b44SJordan Rupprechtclass ReallyBadIO(io.TextIOBase):
4599451b44SJordan Rupprecht    def fileno(self):
4699451b44SJordan Rupprecht        return 999
472238dcc3SJonas Devlieghere
4899451b44SJordan Rupprecht    def writable(self):
4999451b44SJordan Rupprecht        raise OhNoe("OH NOE!!!")
5099451b44SJordan Rupprecht
512238dcc3SJonas Devlieghere
522238dcc3SJonas Devlieghereclass MutableBool:
5399451b44SJordan Rupprecht    def __init__(self, value):
5499451b44SJordan Rupprecht        self.value = value
552238dcc3SJonas Devlieghere
5699451b44SJordan Rupprecht    def set(self, value):
5799451b44SJordan Rupprecht        self.value = bool(value)
582238dcc3SJonas Devlieghere
5999451b44SJordan Rupprecht    def __bool__(self):
6099451b44SJordan Rupprecht        return self.value
6199451b44SJordan Rupprecht
622238dcc3SJonas Devlieghere
6399451b44SJordan Rupprechtclass FlushTestIO(io.StringIO):
6499451b44SJordan Rupprecht    def __init__(self, mutable_flushed, mutable_closed):
6599451b44SJordan Rupprecht        super(FlushTestIO, self).__init__()
6699451b44SJordan Rupprecht        self.mut_flushed = mutable_flushed
6799451b44SJordan Rupprecht        self.mut_closed = mutable_closed
682238dcc3SJonas Devlieghere
6999451b44SJordan Rupprecht    def close(self):
7099451b44SJordan Rupprecht        self.mut_closed.set(True)
7199451b44SJordan Rupprecht        return super(FlushTestIO, self).close()
722238dcc3SJonas Devlieghere
7399451b44SJordan Rupprecht    def flush(self):
7499451b44SJordan Rupprecht        self.mut_flushed.set(True)
7599451b44SJordan Rupprecht        return super(FlushTestIO, self).flush()
7699451b44SJordan Rupprecht
772238dcc3SJonas Devlieghere
7899451b44SJordan Rupprecht@contextmanager
7999451b44SJordan Rupprechtdef replace_stdout(new):
8099451b44SJordan Rupprecht    old = sys.stdout
8199451b44SJordan Rupprecht    sys.stdout = new
8299451b44SJordan Rupprecht    try:
8399451b44SJordan Rupprecht        yield
8499451b44SJordan Rupprecht    finally:
8599451b44SJordan Rupprecht        sys.stdout = old
8699451b44SJordan Rupprecht
872238dcc3SJonas Devlieghere
8899451b44SJordan Rupprechtdef readStrippedLines(f):
8999451b44SJordan Rupprecht    def i():
9099451b44SJordan Rupprecht        for line in f:
9199451b44SJordan Rupprecht            line = line.strip()
9299451b44SJordan Rupprecht            if line:
9399451b44SJordan Rupprecht                yield line
942238dcc3SJonas Devlieghere
9599451b44SJordan Rupprecht    return list(i())
9699451b44SJordan Rupprecht
9799451b44SJordan Rupprecht
9899451b44SJordan Rupprechtclass FileHandleTestCase(lldbtest.TestBase):
9999451b44SJordan Rupprecht    NO_DEBUG_INFO_TESTCASE = True
10099451b44SJordan Rupprecht
101a31130f6STatyana Krasnukha    # The way normal tests evaluate debugger commands is
10299451b44SJordan Rupprecht    # by using a SBCommandInterpreter directly, which captures
10399451b44SJordan Rupprecht    # the output in a result object.   For many of tests tests
10499451b44SJordan Rupprecht    # we want the debugger to write the  output directly to
10599451b44SJordan Rupprecht    # its I/O streams like it would have done interactively.
10699451b44SJordan Rupprecht    #
10799451b44SJordan Rupprecht    # For this reason we also define handleCmd() here, even though
10899451b44SJordan Rupprecht    # it is similar to runCmd().
10999451b44SJordan Rupprecht
11099451b44SJordan Rupprecht    def setUp(self):
11199451b44SJordan Rupprecht        super(FileHandleTestCase, self).setUp()
1122238dcc3SJonas Devlieghere        self.out_filename = self.getBuildArtifact("output")
1132238dcc3SJonas Devlieghere        self.in_filename = self.getBuildArtifact("input")
11499451b44SJordan Rupprecht
11599451b44SJordan Rupprecht    def tearDown(self):
11699451b44SJordan Rupprecht        super(FileHandleTestCase, self).tearDown()
11799451b44SJordan Rupprecht        for name in (self.out_filename, self.in_filename):
11899451b44SJordan Rupprecht            if os.path.exists(name):
11999451b44SJordan Rupprecht                os.unlink(name)
12099451b44SJordan Rupprecht
121a31130f6STatyana Krasnukha    # Similar to runCmd(), but letting the debugger just print the results
122a31130f6STatyana Krasnukha    # instead of collecting them.
12399451b44SJordan Rupprecht    def handleCmd(self, cmd, check=True, collect_result=True):
12499451b44SJordan Rupprecht        assert not check or collect_result
12599451b44SJordan Rupprecht        ret = lldb.SBCommandReturnObject()
12699451b44SJordan Rupprecht        if collect_result:
127a31130f6STatyana Krasnukha            interpreter = self.dbg.GetCommandInterpreter()
12899451b44SJordan Rupprecht            interpreter.HandleCommand(cmd, ret)
12999451b44SJordan Rupprecht        else:
130a31130f6STatyana Krasnukha            self.dbg.HandleCommand(cmd)
131a31130f6STatyana Krasnukha        self.dbg.GetOutputFile().Flush()
132a31130f6STatyana Krasnukha        self.dbg.GetErrorFile().Flush()
13399451b44SJordan Rupprecht        if collect_result and check:
13499451b44SJordan Rupprecht            self.assertTrue(ret.Succeeded())
13599451b44SJordan Rupprecht        return ret.GetOutput()
13699451b44SJordan Rupprecht
13799451b44SJordan Rupprecht    def test_legacy_file_out_script(self):
1382238dcc3SJonas Devlieghere        with open(self.out_filename, "w") as f:
139a31130f6STatyana Krasnukha            self.dbg.SetOutputFileHandle(f, False)
14099451b44SJordan Rupprecht            # scripts print to output even if you capture the results
14199451b44SJordan Rupprecht            # I'm not sure I love that behavior, but that's the way
14299451b44SJordan Rupprecht            # it's been for a long time.  That's why this test works
14399451b44SJordan Rupprecht            # even with collect_result=True.
1442238dcc3SJonas Devlieghere            self.handleCmd("script 1+1")
1452238dcc3SJonas Devlieghere            self.dbg.GetOutputFileHandle().write("FOO\n")
1467a11cc06STatyana Krasnukha            self.dbg.GetOutputFileHandle().flush()
1472238dcc3SJonas Devlieghere        with open(self.out_filename, "r") as f:
1482238dcc3SJonas Devlieghere            self.assertEqual(readStrippedLines(f), ["2", "FOO"])
14999451b44SJordan Rupprecht
15099451b44SJordan Rupprecht    def test_legacy_file_out(self):
1512238dcc3SJonas Devlieghere        with open(self.out_filename, "w") as f:
152a31130f6STatyana Krasnukha            self.dbg.SetOutputFileHandle(f, False)
1532238dcc3SJonas Devlieghere            self.handleCmd("expression/x 3735928559", collect_result=False, check=False)
1542238dcc3SJonas Devlieghere        with open(self.out_filename, "r") as f:
1552238dcc3SJonas Devlieghere            self.assertIn("deadbeef", f.read())
15699451b44SJordan Rupprecht
15799451b44SJordan Rupprecht    def test_legacy_file_err_with_get(self):
1582238dcc3SJonas Devlieghere        with open(self.out_filename, "w") as f:
159a31130f6STatyana Krasnukha            self.dbg.SetErrorFileHandle(f, False)
1602238dcc3SJonas Devlieghere            self.handleCmd("lolwut", check=False, collect_result=False)
161a31130f6STatyana Krasnukha            f2 = self.dbg.GetErrorFileHandle()
1622238dcc3SJonas Devlieghere            f2.write("FOOBAR\n")
16399451b44SJordan Rupprecht            f2.flush()
1642238dcc3SJonas Devlieghere        with open(self.out_filename, "r") as f:
16599451b44SJordan Rupprecht            errors = f.read()
1662238dcc3SJonas Devlieghere            self.assertTrue(re.search(r"error:.*lolwut", errors))
1672238dcc3SJonas Devlieghere            self.assertTrue(re.search(r"FOOBAR", errors))
16899451b44SJordan Rupprecht
16999451b44SJordan Rupprecht    def test_legacy_file_err(self):
1702238dcc3SJonas Devlieghere        with open(self.out_filename, "w") as f:
171a31130f6STatyana Krasnukha            self.dbg.SetErrorFileHandle(f, False)
1722238dcc3SJonas Devlieghere            self.handleCmd("lol", check=False, collect_result=False)
1732238dcc3SJonas Devlieghere        with open(self.out_filename, "r") as f:
17499451b44SJordan Rupprecht            self.assertIn("is not a valid command", f.read())
17599451b44SJordan Rupprecht
17699451b44SJordan Rupprecht    def test_legacy_file_error(self):
1772238dcc3SJonas Devlieghere        with open(self.out_filename, "w") as f:
178a31130f6STatyana Krasnukha            self.dbg.SetErrorFileHandle(f, False)
1792238dcc3SJonas Devlieghere            self.handleCmd("lolwut", check=False, collect_result=False)
1802238dcc3SJonas Devlieghere        with open(self.out_filename, "r") as f:
18199451b44SJordan Rupprecht            errors = f.read()
1822238dcc3SJonas Devlieghere            self.assertTrue(re.search(r"error:.*lolwut", errors))
18399451b44SJordan Rupprecht
18499451b44SJordan Rupprecht    def test_sbfile_type_errors(self):
18599451b44SJordan Rupprecht        sbf = lldb.SBFile()
18699451b44SJordan Rupprecht        self.assertRaises(Exception, sbf.Write, None)
18799451b44SJordan Rupprecht        self.assertRaises(Exception, sbf.Read, None)
1882238dcc3SJonas Devlieghere        self.assertRaises(Exception, sbf.Read, b"this bytes is not mutable")
1892238dcc3SJonas Devlieghere        self.assertRaises(Exception, sbf.Write, "ham sandwich")
1902238dcc3SJonas Devlieghere        self.assertRaises(Exception, sbf.Read, "ham sandwich")
19199451b44SJordan Rupprecht
19299451b44SJordan Rupprecht    def test_sbfile_write_fileno(self):
1932238dcc3SJonas Devlieghere        with open(self.out_filename, "w") as f:
19499451b44SJordan Rupprecht            sbf = lldb.SBFile(f.fileno(), "w", False)
19599451b44SJordan Rupprecht            self.assertTrue(sbf.IsValid())
1962238dcc3SJonas Devlieghere            e, n = sbf.Write(b"FOO\nBAR")
197779bbbf2SDave Lee            self.assertSuccess(e)
19899451b44SJordan Rupprecht            self.assertEqual(n, 7)
19999451b44SJordan Rupprecht            sbf.Close()
20099451b44SJordan Rupprecht            self.assertFalse(sbf.IsValid())
2012238dcc3SJonas Devlieghere        with open(self.out_filename, "r") as f:
2022238dcc3SJonas Devlieghere            self.assertEqual(readStrippedLines(f), ["FOO", "BAR"])
20399451b44SJordan Rupprecht
20499451b44SJordan Rupprecht    def test_sbfile_write(self):
2052238dcc3SJonas Devlieghere        with open(self.out_filename, "w") as f:
20699451b44SJordan Rupprecht            sbf = lldb.SBFile(f)
2072238dcc3SJonas Devlieghere            e, n = sbf.Write(b"FOO\n")
208779bbbf2SDave Lee            self.assertSuccess(e)
20999451b44SJordan Rupprecht            self.assertEqual(n, 4)
21099451b44SJordan Rupprecht            sbf.Close()
21199451b44SJordan Rupprecht            self.assertTrue(f.closed)
2122238dcc3SJonas Devlieghere        with open(self.out_filename, "r") as f:
2132238dcc3SJonas Devlieghere            self.assertEqual(f.read().strip(), "FOO")
21499451b44SJordan Rupprecht
21599451b44SJordan Rupprecht    def test_sbfile_read_fileno(self):
2162238dcc3SJonas Devlieghere        with open(self.out_filename, "w") as f:
2172238dcc3SJonas Devlieghere            f.write("FOO")
2182238dcc3SJonas Devlieghere        with open(self.out_filename, "r") as f:
21999451b44SJordan Rupprecht            sbf = lldb.SBFile(f.fileno(), "r", False)
22099451b44SJordan Rupprecht            self.assertTrue(sbf.IsValid())
22199451b44SJordan Rupprecht            buffer = bytearray(100)
22299451b44SJordan Rupprecht            e, n = sbf.Read(buffer)
223779bbbf2SDave Lee            self.assertSuccess(e)
2242238dcc3SJonas Devlieghere            self.assertEqual(buffer[:n], b"FOO")
22599451b44SJordan Rupprecht
22699451b44SJordan Rupprecht    def test_sbfile_read(self):
2272238dcc3SJonas Devlieghere        with open(self.out_filename, "w") as f:
2282238dcc3SJonas Devlieghere            f.write("foo")
2292238dcc3SJonas Devlieghere        with open(self.out_filename, "r") as f:
23099451b44SJordan Rupprecht            sbf = lldb.SBFile(f)
23199451b44SJordan Rupprecht            buf = bytearray(100)
23299451b44SJordan Rupprecht            e, n = sbf.Read(buf)
233779bbbf2SDave Lee            self.assertSuccess(e)
23499451b44SJordan Rupprecht            self.assertEqual(n, 3)
2352238dcc3SJonas Devlieghere            self.assertEqual(buf[:n], b"foo")
23699451b44SJordan Rupprecht            sbf.Close()
23799451b44SJordan Rupprecht            self.assertTrue(f.closed)
23899451b44SJordan Rupprecht
23999451b44SJordan Rupprecht    def test_fileno_out(self):
2402238dcc3SJonas Devlieghere        with open(self.out_filename, "w") as f:
24199451b44SJordan Rupprecht            sbf = lldb.SBFile(f.fileno(), "w", False)
242a31130f6STatyana Krasnukha            status = self.dbg.SetOutputFile(sbf)
243779bbbf2SDave Lee            self.assertSuccess(status)
2442238dcc3SJonas Devlieghere            self.handleCmd("script 1+2")
2452238dcc3SJonas Devlieghere            self.dbg.GetOutputFile().Write(b"quux")
2467a11cc06STatyana Krasnukha            self.dbg.GetOutputFile().Flush()
24799451b44SJordan Rupprecht
2482238dcc3SJonas Devlieghere        with open(self.out_filename, "r") as f:
2492238dcc3SJonas Devlieghere            self.assertEqual(readStrippedLines(f), ["3", "quux"])
25099451b44SJordan Rupprecht
25199451b44SJordan Rupprecht    def test_fileno_help(self):
2522238dcc3SJonas Devlieghere        with open(self.out_filename, "w") as f:
25399451b44SJordan Rupprecht            sbf = lldb.SBFile(f.fileno(), "w", False)
254a31130f6STatyana Krasnukha            status = self.dbg.SetOutputFile(sbf)
255779bbbf2SDave Lee            self.assertSuccess(status)
25699451b44SJordan Rupprecht            self.handleCmd("help help", collect_result=False, check=False)
2572238dcc3SJonas Devlieghere        with open(self.out_filename, "r") as f:
2582238dcc3SJonas Devlieghere            self.assertTrue(
2592238dcc3SJonas Devlieghere                re.search(r"Show a list of all debugger commands", f.read())
2602238dcc3SJonas Devlieghere            )
26199451b44SJordan Rupprecht
26299451b44SJordan Rupprecht    def test_help(self):
2632238dcc3SJonas Devlieghere        with open(self.out_filename, "w") as f:
264a31130f6STatyana Krasnukha            status = self.dbg.SetOutputFile(lldb.SBFile(f))
265779bbbf2SDave Lee            self.assertSuccess(status)
26699451b44SJordan Rupprecht            self.handleCmd("help help", check=False, collect_result=False)
2672238dcc3SJonas Devlieghere        with open(self.out_filename, "r") as f:
2682238dcc3SJonas Devlieghere            self.assertIn("Show a list of all debugger commands", f.read())
26999451b44SJordan Rupprecht
27099451b44SJordan Rupprecht    def test_immediate(self):
2712238dcc3SJonas Devlieghere        with open(self.out_filename, "w") as f:
27299451b44SJordan Rupprecht            ret = lldb.SBCommandReturnObject()
27399451b44SJordan Rupprecht            ret.SetImmediateOutputFile(f)
274a31130f6STatyana Krasnukha            interpreter = self.dbg.GetCommandInterpreter()
27599451b44SJordan Rupprecht            interpreter.HandleCommand("help help", ret)
27699451b44SJordan Rupprecht            # make sure the file wasn't closed early.
27799451b44SJordan Rupprecht            f.write("\nQUUX\n")
27899451b44SJordan Rupprecht        ret = None  # call destructor and flush streams
2792238dcc3SJonas Devlieghere        with open(self.out_filename, "r") as f:
28099451b44SJordan Rupprecht            output = f.read()
2812238dcc3SJonas Devlieghere            self.assertTrue(re.search(r"Show a list of all debugger commands", output))
2822238dcc3SJonas Devlieghere            self.assertTrue(re.search(r"QUUX", output))
28399451b44SJordan Rupprecht
28499451b44SJordan Rupprecht    def test_immediate_string(self):
28599451b44SJordan Rupprecht        f = io.StringIO()
28699451b44SJordan Rupprecht        ret = lldb.SBCommandReturnObject()
28799451b44SJordan Rupprecht        ret.SetImmediateOutputFile(f)
288a31130f6STatyana Krasnukha        interpreter = self.dbg.GetCommandInterpreter()
28999451b44SJordan Rupprecht        interpreter.HandleCommand("help help", ret)
29099451b44SJordan Rupprecht        # make sure the file wasn't closed early.
29199451b44SJordan Rupprecht        f.write("\nQUUX\n")
29299451b44SJordan Rupprecht        ret = None  # call destructor and flush streams
29399451b44SJordan Rupprecht        output = f.getvalue()
2942238dcc3SJonas Devlieghere        self.assertTrue(re.search(r"Show a list of all debugger commands", output))
2952238dcc3SJonas Devlieghere        self.assertTrue(re.search(r"QUUX", output))
29699451b44SJordan Rupprecht
29799451b44SJordan Rupprecht    def test_immediate_sbfile_string(self):
29899451b44SJordan Rupprecht        f = io.StringIO()
29999451b44SJordan Rupprecht        ret = lldb.SBCommandReturnObject()
30099451b44SJordan Rupprecht        ret.SetImmediateOutputFile(lldb.SBFile(f))
301a31130f6STatyana Krasnukha        interpreter = self.dbg.GetCommandInterpreter()
30299451b44SJordan Rupprecht        interpreter.HandleCommand("help help", ret)
30399451b44SJordan Rupprecht        output = f.getvalue()
30499451b44SJordan Rupprecht        ret = None  # call destructor and flush streams
30599451b44SJordan Rupprecht        # sbfile default constructor doesn't borrow the file
30699451b44SJordan Rupprecht        self.assertTrue(f.closed)
3072238dcc3SJonas Devlieghere        self.assertTrue(re.search(r"Show a list of all debugger commands", output))
30899451b44SJordan Rupprecht
30999451b44SJordan Rupprecht    def test_fileno_inout(self):
3102238dcc3SJonas Devlieghere        with open(self.in_filename, "w") as f:
31199451b44SJordan Rupprecht            f.write("help help\n")
31299451b44SJordan Rupprecht
3132238dcc3SJonas Devlieghere        with open(self.out_filename, "w") as outf, open(self.in_filename, "r") as inf:
31499451b44SJordan Rupprecht            outsbf = lldb.SBFile(outf.fileno(), "w", False)
315a31130f6STatyana Krasnukha            status = self.dbg.SetOutputFile(outsbf)
316779bbbf2SDave Lee            self.assertSuccess(status)
31799451b44SJordan Rupprecht
31899451b44SJordan Rupprecht            insbf = lldb.SBFile(inf.fileno(), "r", False)
319a31130f6STatyana Krasnukha            status = self.dbg.SetInputFile(insbf)
320779bbbf2SDave Lee            self.assertSuccess(status)
32199451b44SJordan Rupprecht
32299451b44SJordan Rupprecht            opts = lldb.SBCommandInterpreterRunOptions()
323a31130f6STatyana Krasnukha            self.dbg.RunCommandInterpreter(True, False, opts, 0, False, False)
324a31130f6STatyana Krasnukha            self.dbg.GetOutputFile().Flush()
32599451b44SJordan Rupprecht
3262238dcc3SJonas Devlieghere        with open(self.out_filename, "r") as f:
3272238dcc3SJonas Devlieghere            self.assertTrue(
3282238dcc3SJonas Devlieghere                re.search(r"Show a list of all debugger commands", f.read())
3292238dcc3SJonas Devlieghere            )
33099451b44SJordan Rupprecht
33199451b44SJordan Rupprecht    def test_inout(self):
3322238dcc3SJonas Devlieghere        with open(self.in_filename, "w") as f:
33399451b44SJordan Rupprecht            f.write("help help\n")
3342238dcc3SJonas Devlieghere        with open(self.out_filename, "w") as outf, open(self.in_filename, "r") as inf:
335a31130f6STatyana Krasnukha            status = self.dbg.SetOutputFile(lldb.SBFile(outf))
336779bbbf2SDave Lee            self.assertSuccess(status)
337a31130f6STatyana Krasnukha            status = self.dbg.SetInputFile(lldb.SBFile(inf))
338779bbbf2SDave Lee            self.assertSuccess(status)
33999451b44SJordan Rupprecht            opts = lldb.SBCommandInterpreterRunOptions()
340a31130f6STatyana Krasnukha            self.dbg.RunCommandInterpreter(True, False, opts, 0, False, False)
341a31130f6STatyana Krasnukha            self.dbg.GetOutputFile().Flush()
3422238dcc3SJonas Devlieghere        with open(self.out_filename, "r") as f:
34399451b44SJordan Rupprecht            output = f.read()
3442238dcc3SJonas Devlieghere            self.assertIn("Show a list of all debugger commands", output)
34599451b44SJordan Rupprecht
34699451b44SJordan Rupprecht    def test_binary_inout(self):
3472238dcc3SJonas Devlieghere        with open(self.in_filename, "w") as f:
34899451b44SJordan Rupprecht            f.write("help help\n")
3492238dcc3SJonas Devlieghere        with open(self.out_filename, "wb") as outf, open(self.in_filename, "rb") as inf:
350a31130f6STatyana Krasnukha            status = self.dbg.SetOutputFile(lldb.SBFile(outf))
351779bbbf2SDave Lee            self.assertSuccess(status)
352a31130f6STatyana Krasnukha            status = self.dbg.SetInputFile(lldb.SBFile(inf))
353779bbbf2SDave Lee            self.assertSuccess(status)
35499451b44SJordan Rupprecht            opts = lldb.SBCommandInterpreterRunOptions()
355a31130f6STatyana Krasnukha            self.dbg.RunCommandInterpreter(True, False, opts, 0, False, False)
356a31130f6STatyana Krasnukha            self.dbg.GetOutputFile().Flush()
3572238dcc3SJonas Devlieghere        with open(self.out_filename, "r") as f:
35899451b44SJordan Rupprecht            output = f.read()
3592238dcc3SJonas Devlieghere            self.assertIn("Show a list of all debugger commands", output)
36099451b44SJordan Rupprecht
36199451b44SJordan Rupprecht    def test_string_inout(self):
36240766642SDave Lee        inf = io.StringIO("help help\nexpression/x ~0\n")
36399451b44SJordan Rupprecht        outf = io.StringIO()
364a31130f6STatyana Krasnukha        status = self.dbg.SetOutputFile(lldb.SBFile(outf))
365779bbbf2SDave Lee        self.assertSuccess(status)
366a31130f6STatyana Krasnukha        status = self.dbg.SetInputFile(lldb.SBFile(inf))
367779bbbf2SDave Lee        self.assertSuccess(status)
36899451b44SJordan Rupprecht        opts = lldb.SBCommandInterpreterRunOptions()
369a31130f6STatyana Krasnukha        self.dbg.RunCommandInterpreter(True, False, opts, 0, False, False)
370a31130f6STatyana Krasnukha        self.dbg.GetOutputFile().Flush()
37199451b44SJordan Rupprecht        output = outf.getvalue()
3722238dcc3SJonas Devlieghere        self.assertIn("Show a list of all debugger commands", output)
3732238dcc3SJonas Devlieghere        self.assertIn("0xfff", output)
37499451b44SJordan Rupprecht
37599451b44SJordan Rupprecht    def test_bytes_inout(self):
37699451b44SJordan Rupprecht        inf = io.BytesIO(b"help help\nhelp b\n")
37799451b44SJordan Rupprecht        outf = io.BytesIO()
378a31130f6STatyana Krasnukha        status = self.dbg.SetOutputFile(lldb.SBFile(outf))
379779bbbf2SDave Lee        self.assertSuccess(status)
380a31130f6STatyana Krasnukha        status = self.dbg.SetInputFile(lldb.SBFile(inf))
381779bbbf2SDave Lee        self.assertSuccess(status)
38299451b44SJordan Rupprecht        opts = lldb.SBCommandInterpreterRunOptions()
383a31130f6STatyana Krasnukha        self.dbg.RunCommandInterpreter(True, False, opts, 0, False, False)
384a31130f6STatyana Krasnukha        self.dbg.GetOutputFile().Flush()
38599451b44SJordan Rupprecht        output = outf.getvalue()
3862238dcc3SJonas Devlieghere        self.assertIn(b"Show a list of all debugger commands", output)
3872238dcc3SJonas Devlieghere        self.assertIn(b"Set a breakpoint", output)
38899451b44SJordan Rupprecht
38999451b44SJordan Rupprecht    def test_fileno_error(self):
3902238dcc3SJonas Devlieghere        with open(self.out_filename, "w") as f:
3912238dcc3SJonas Devlieghere            sbf = lldb.SBFile(f.fileno(), "w", False)
392a31130f6STatyana Krasnukha            status = self.dbg.SetErrorFile(sbf)
393779bbbf2SDave Lee            self.assertSuccess(status)
39499451b44SJordan Rupprecht
3952238dcc3SJonas Devlieghere            self.handleCmd("lolwut", check=False, collect_result=False)
39699451b44SJordan Rupprecht
3972238dcc3SJonas Devlieghere            self.dbg.GetErrorFile().Write(b"\nzork\n")
39899451b44SJordan Rupprecht
3992238dcc3SJonas Devlieghere        with open(self.out_filename, "r") as f:
40099451b44SJordan Rupprecht            errors = f.read()
4012238dcc3SJonas Devlieghere            self.assertTrue(re.search(r"error:.*lolwut", errors))
4022238dcc3SJonas Devlieghere            self.assertTrue(re.search(r"zork", errors))
40399451b44SJordan Rupprecht
40499451b44SJordan Rupprecht    def test_replace_stdout(self):
40599451b44SJordan Rupprecht        f = io.StringIO()
40699451b44SJordan Rupprecht        with replace_stdout(f):
40799451b44SJordan Rupprecht            self.assertEqual(sys.stdout, f)
4082238dcc3SJonas Devlieghere            self.handleCmd(
4092238dcc3SJonas Devlieghere                'script sys.stdout.write("lol")', collect_result=False, check=False
4102238dcc3SJonas Devlieghere            )
41199451b44SJordan Rupprecht            self.assertEqual(sys.stdout, f)
41299451b44SJordan Rupprecht
41399451b44SJordan Rupprecht    def test_replace_stdout_with_nonfile(self):
41499451b44SJordan Rupprecht        f = io.StringIO()
41599451b44SJordan Rupprecht        with replace_stdout(f):
4162238dcc3SJonas Devlieghere
4172238dcc3SJonas Devlieghere            class Nothing:
41899451b44SJordan Rupprecht                pass
4192238dcc3SJonas Devlieghere
42099451b44SJordan Rupprecht            with replace_stdout(Nothing):
42199451b44SJordan Rupprecht                self.assertEqual(sys.stdout, Nothing)
4222238dcc3SJonas Devlieghere                self.handleCmd(
4232238dcc3SJonas Devlieghere                    'script sys.stdout.write("lol")', check=False, collect_result=False
4242238dcc3SJonas Devlieghere                )
42599451b44SJordan Rupprecht                self.assertEqual(sys.stdout, Nothing)
4262238dcc3SJonas Devlieghere            sys.stdout.write("FOO")
42799451b44SJordan Rupprecht        self.assertEqual(f.getvalue(), "FOO")
42899451b44SJordan Rupprecht
42999451b44SJordan Rupprecht    def test_sbfile_write_borrowed(self):
4302238dcc3SJonas Devlieghere        with open(self.out_filename, "w") as f:
43199451b44SJordan Rupprecht            sbf = lldb.SBFile.Create(f, borrow=True)
4322238dcc3SJonas Devlieghere            e, n = sbf.Write(b"FOO")
433779bbbf2SDave Lee            self.assertSuccess(e)
43499451b44SJordan Rupprecht            self.assertEqual(n, 3)
43599451b44SJordan Rupprecht            sbf.Close()
43699451b44SJordan Rupprecht            self.assertFalse(f.closed)
4372238dcc3SJonas Devlieghere            f.write("BAR\n")
4382238dcc3SJonas Devlieghere        with open(self.out_filename, "r") as f:
4392238dcc3SJonas Devlieghere            self.assertEqual(f.read().strip(), "FOOBAR")
44099451b44SJordan Rupprecht
44199451b44SJordan Rupprecht    def test_sbfile_write_forced(self):
4422238dcc3SJonas Devlieghere        with open(self.out_filename, "w") as f:
44399451b44SJordan Rupprecht            written = MutableBool(False)
44499451b44SJordan Rupprecht            orig_write = f.write
4452238dcc3SJonas Devlieghere
44699451b44SJordan Rupprecht            def mywrite(x):
44799451b44SJordan Rupprecht                written.set(True)
44899451b44SJordan Rupprecht                return orig_write(x)
4492238dcc3SJonas Devlieghere
45099451b44SJordan Rupprecht            f.write = mywrite
45199451b44SJordan Rupprecht            sbf = lldb.SBFile.Create(f, force_io_methods=True)
4522238dcc3SJonas Devlieghere            e, n = sbf.Write(b"FOO")
45399451b44SJordan Rupprecht            self.assertTrue(written)
454779bbbf2SDave Lee            self.assertSuccess(e)
45599451b44SJordan Rupprecht            self.assertEqual(n, 3)
45699451b44SJordan Rupprecht            sbf.Close()
45799451b44SJordan Rupprecht            self.assertTrue(f.closed)
4582238dcc3SJonas Devlieghere        with open(self.out_filename, "r") as f:
4592238dcc3SJonas Devlieghere            self.assertEqual(f.read().strip(), "FOO")
46099451b44SJordan Rupprecht
46199451b44SJordan Rupprecht    def test_sbfile_write_forced_borrowed(self):
4622238dcc3SJonas Devlieghere        with open(self.out_filename, "w") as f:
46399451b44SJordan Rupprecht            written = MutableBool(False)
46499451b44SJordan Rupprecht            orig_write = f.write
4652238dcc3SJonas Devlieghere
46699451b44SJordan Rupprecht            def mywrite(x):
46799451b44SJordan Rupprecht                written.set(True)
46899451b44SJordan Rupprecht                return orig_write(x)
4692238dcc3SJonas Devlieghere
47099451b44SJordan Rupprecht            f.write = mywrite
47199451b44SJordan Rupprecht            sbf = lldb.SBFile.Create(f, borrow=True, force_io_methods=True)
4722238dcc3SJonas Devlieghere            e, n = sbf.Write(b"FOO")
47399451b44SJordan Rupprecht            self.assertTrue(written)
474779bbbf2SDave Lee            self.assertSuccess(e)
47599451b44SJordan Rupprecht            self.assertEqual(n, 3)
47699451b44SJordan Rupprecht            sbf.Close()
47799451b44SJordan Rupprecht            self.assertFalse(f.closed)
4782238dcc3SJonas Devlieghere        with open(self.out_filename, "r") as f:
4792238dcc3SJonas Devlieghere            self.assertEqual(f.read().strip(), "FOO")
48099451b44SJordan Rupprecht
48199451b44SJordan Rupprecht    def test_sbfile_write_string(self):
48299451b44SJordan Rupprecht        f = io.StringIO()
48399451b44SJordan Rupprecht        sbf = lldb.SBFile(f)
4842238dcc3SJonas Devlieghere        e, n = sbf.Write(b"FOO")
48599451b44SJordan Rupprecht        self.assertEqual(f.getvalue().strip(), "FOO")
486779bbbf2SDave Lee        self.assertSuccess(e)
48799451b44SJordan Rupprecht        self.assertEqual(n, 3)
48899451b44SJordan Rupprecht        sbf.Close()
48999451b44SJordan Rupprecht        self.assertTrue(f.closed)
49099451b44SJordan Rupprecht
49199451b44SJordan Rupprecht    def test_string_out(self):
49299451b44SJordan Rupprecht        f = io.StringIO()
493a31130f6STatyana Krasnukha        status = self.dbg.SetOutputFile(f)
494779bbbf2SDave Lee        self.assertSuccess(status)
49599451b44SJordan Rupprecht        self.handleCmd("script 'foobar'")
49699451b44SJordan Rupprecht        self.assertEqual(f.getvalue().strip(), "'foobar'")
49799451b44SJordan Rupprecht
49899451b44SJordan Rupprecht    def test_string_error(self):
49999451b44SJordan Rupprecht        f = io.StringIO()
500a31130f6STatyana Krasnukha        status = self.dbg.SetErrorFile(f)
501779bbbf2SDave Lee        self.assertSuccess(status)
5022238dcc3SJonas Devlieghere        self.handleCmd("lolwut", check=False, collect_result=False)
50399451b44SJordan Rupprecht        errors = f.getvalue()
5042238dcc3SJonas Devlieghere        self.assertTrue(re.search(r"error:.*lolwut", errors))
50599451b44SJordan Rupprecht
50699451b44SJordan Rupprecht    def test_sbfile_write_bytes(self):
50799451b44SJordan Rupprecht        f = io.BytesIO()
50899451b44SJordan Rupprecht        sbf = lldb.SBFile(f)
5092238dcc3SJonas Devlieghere        e, n = sbf.Write(b"FOO")
51099451b44SJordan Rupprecht        self.assertEqual(f.getvalue().strip(), b"FOO")
511779bbbf2SDave Lee        self.assertSuccess(e)
51299451b44SJordan Rupprecht        self.assertEqual(n, 3)
51399451b44SJordan Rupprecht        sbf.Close()
51499451b44SJordan Rupprecht        self.assertTrue(f.closed)
51599451b44SJordan Rupprecht
51699451b44SJordan Rupprecht    def test_sbfile_read_string(self):
5172238dcc3SJonas Devlieghere        f = io.StringIO("zork")
51899451b44SJordan Rupprecht        sbf = lldb.SBFile(f)
51999451b44SJordan Rupprecht        buf = bytearray(100)
52099451b44SJordan Rupprecht        e, n = sbf.Read(buf)
521779bbbf2SDave Lee        self.assertSuccess(e)
5222238dcc3SJonas Devlieghere        self.assertEqual(buf[:n], b"zork")
52399451b44SJordan Rupprecht
52499451b44SJordan Rupprecht    def test_sbfile_read_string_one_byte(self):
5252238dcc3SJonas Devlieghere        f = io.StringIO("z")
52699451b44SJordan Rupprecht        sbf = lldb.SBFile(f)
52799451b44SJordan Rupprecht        buf = bytearray(1)
52899451b44SJordan Rupprecht        e, n = sbf.Read(buf)
52999451b44SJordan Rupprecht        self.assertTrue(e.Fail())
53099451b44SJordan Rupprecht        self.assertEqual(n, 0)
5312238dcc3SJonas Devlieghere        self.assertEqual(
5322238dcc3SJonas Devlieghere            e.GetCString(), "can't read less than 6 bytes from a utf8 text stream"
5332238dcc3SJonas Devlieghere        )
53499451b44SJordan Rupprecht
53599451b44SJordan Rupprecht    def test_sbfile_read_bytes(self):
5362238dcc3SJonas Devlieghere        f = io.BytesIO(b"zork")
53799451b44SJordan Rupprecht        sbf = lldb.SBFile(f)
53899451b44SJordan Rupprecht        buf = bytearray(100)
53999451b44SJordan Rupprecht        e, n = sbf.Read(buf)
540779bbbf2SDave Lee        self.assertSuccess(e)
5412238dcc3SJonas Devlieghere        self.assertEqual(buf[:n], b"zork")
54299451b44SJordan Rupprecht
54399451b44SJordan Rupprecht    def test_sbfile_out(self):
5442238dcc3SJonas Devlieghere        with open(self.out_filename, "w") as f:
54599451b44SJordan Rupprecht            sbf = lldb.SBFile(f)
546a31130f6STatyana Krasnukha            status = self.dbg.SetOutputFile(sbf)
547779bbbf2SDave Lee            self.assertSuccess(status)
5482238dcc3SJonas Devlieghere            self.handleCmd("script 2+2")
5492238dcc3SJonas Devlieghere        with open(self.out_filename, "r") as f:
5502238dcc3SJonas Devlieghere            self.assertEqual(f.read().strip(), "4")
55199451b44SJordan Rupprecht
55299451b44SJordan Rupprecht    def test_file_out(self):
5532238dcc3SJonas Devlieghere        with open(self.out_filename, "w") as f:
554a31130f6STatyana Krasnukha            status = self.dbg.SetOutputFile(f)
555779bbbf2SDave Lee            self.assertSuccess(status)
5562238dcc3SJonas Devlieghere            self.handleCmd("script 2+2")
5572238dcc3SJonas Devlieghere        with open(self.out_filename, "r") as f:
5582238dcc3SJonas Devlieghere            self.assertEqual(f.read().strip(), "4")
55999451b44SJordan Rupprecht
56099451b44SJordan Rupprecht    def test_sbfile_error(self):
5612238dcc3SJonas Devlieghere        with open(self.out_filename, "w") as f:
56299451b44SJordan Rupprecht            sbf = lldb.SBFile(f)
563a31130f6STatyana Krasnukha            status = self.dbg.SetErrorFile(sbf)
564779bbbf2SDave Lee            self.assertSuccess(status)
5652238dcc3SJonas Devlieghere            self.handleCmd("lolwut", check=False, collect_result=False)
5662238dcc3SJonas Devlieghere        with open(self.out_filename, "r") as f:
56799451b44SJordan Rupprecht            errors = f.read()
5682238dcc3SJonas Devlieghere            self.assertTrue(re.search(r"error:.*lolwut", errors))
56999451b44SJordan Rupprecht
57099451b44SJordan Rupprecht    def test_file_error(self):
5712238dcc3SJonas Devlieghere        with open(self.out_filename, "w") as f:
572a31130f6STatyana Krasnukha            status = self.dbg.SetErrorFile(f)
573779bbbf2SDave Lee            self.assertSuccess(status)
5742238dcc3SJonas Devlieghere            self.handleCmd("lolwut", check=False, collect_result=False)
5752238dcc3SJonas Devlieghere        with open(self.out_filename, "r") as f:
57699451b44SJordan Rupprecht            errors = f.read()
5772238dcc3SJonas Devlieghere            self.assertTrue(re.search(r"error:.*lolwut", errors))
57899451b44SJordan Rupprecht
57999451b44SJordan Rupprecht    def test_exceptions(self):
58099451b44SJordan Rupprecht        self.assertRaises(Exception, lldb.SBFile, None)
58199451b44SJordan Rupprecht        self.assertRaises(Exception, lldb.SBFile, "ham sandwich")
58299451b44SJordan Rupprecht        self.assertRaises(OhNoe, lldb.SBFile, ReallyBadIO())
58399451b44SJordan Rupprecht        error, n = lldb.SBFile(BadIO()).Write(b"FOO")
58499451b44SJordan Rupprecht        self.assertEqual(n, 0)
58599451b44SJordan Rupprecht        self.assertTrue(error.Fail())
5862238dcc3SJonas Devlieghere        self.assertIn("OH NOE", error.GetCString())
58799451b44SJordan Rupprecht        error, n = lldb.SBFile(BadIO()).Read(bytearray(100))
58899451b44SJordan Rupprecht        self.assertEqual(n, 0)
58999451b44SJordan Rupprecht        self.assertTrue(error.Fail())
5902238dcc3SJonas Devlieghere        self.assertIn("OH NOE", error.GetCString())
59199451b44SJordan Rupprecht
59299451b44SJordan Rupprecht    def test_exceptions_logged(self):
59399451b44SJordan Rupprecht        messages = list()
594a31130f6STatyana Krasnukha        self.dbg.SetLoggingCallback(messages.append)
5952238dcc3SJonas Devlieghere        self.handleCmd("log enable lldb script")
596a31130f6STatyana Krasnukha        self.dbg.SetOutputFile(lldb.SBFile(BadIO()))
5972238dcc3SJonas Devlieghere        self.handleCmd("script 1+1")
5982238dcc3SJonas Devlieghere        self.assertTrue(any("OH NOE" in msg for msg in messages))
59999451b44SJordan Rupprecht
60099451b44SJordan Rupprecht    def test_flush(self):
60199451b44SJordan Rupprecht        flushed = MutableBool(False)
60299451b44SJordan Rupprecht        closed = MutableBool(False)
60399451b44SJordan Rupprecht        f = FlushTestIO(flushed, closed)
60499451b44SJordan Rupprecht        self.assertFalse(flushed)
60599451b44SJordan Rupprecht        self.assertFalse(closed)
60699451b44SJordan Rupprecht        sbf = lldb.SBFile(f)
60799451b44SJordan Rupprecht        self.assertFalse(flushed)
60899451b44SJordan Rupprecht        self.assertFalse(closed)
60999451b44SJordan Rupprecht        sbf = None
61099451b44SJordan Rupprecht        self.assertFalse(flushed)
61199451b44SJordan Rupprecht        self.assertTrue(closed)
61299451b44SJordan Rupprecht        self.assertTrue(f.closed)
61399451b44SJordan Rupprecht
61499451b44SJordan Rupprecht        flushed = MutableBool(False)
61599451b44SJordan Rupprecht        closed = MutableBool(False)
61699451b44SJordan Rupprecht        f = FlushTestIO(flushed, closed)
61799451b44SJordan Rupprecht        self.assertFalse(flushed)
61899451b44SJordan Rupprecht        self.assertFalse(closed)
61999451b44SJordan Rupprecht        sbf = lldb.SBFile.Create(f, borrow=True)
62099451b44SJordan Rupprecht        self.assertFalse(flushed)
62199451b44SJordan Rupprecht        self.assertFalse(closed)
62299451b44SJordan Rupprecht        sbf = None
62399451b44SJordan Rupprecht        self.assertTrue(flushed)
62499451b44SJordan Rupprecht        self.assertFalse(closed)
62599451b44SJordan Rupprecht        self.assertFalse(f.closed)
62699451b44SJordan Rupprecht
62799451b44SJordan Rupprecht    def test_fileno_flush(self):
6282238dcc3SJonas Devlieghere        with open(self.out_filename, "w") as f:
62999451b44SJordan Rupprecht            f.write("foo")
63099451b44SJordan Rupprecht            sbf = lldb.SBFile(f)
6312238dcc3SJonas Devlieghere            sbf.Write(b"bar")
63299451b44SJordan Rupprecht            sbf = None
63399451b44SJordan Rupprecht            self.assertTrue(f.closed)
6342238dcc3SJonas Devlieghere        with open(self.out_filename, "r") as f:
6352238dcc3SJonas Devlieghere            self.assertEqual(f.read(), "foobar")
63699451b44SJordan Rupprecht
6372238dcc3SJonas Devlieghere        with open(self.out_filename, "w+") as f:
63899451b44SJordan Rupprecht            f.write("foo")
63999451b44SJordan Rupprecht            sbf = lldb.SBFile.Create(f, borrow=True)
6402238dcc3SJonas Devlieghere            sbf.Write(b"bar")
64199451b44SJordan Rupprecht            sbf = None
64299451b44SJordan Rupprecht            self.assertFalse(f.closed)
64399451b44SJordan Rupprecht            f.seek(0)
6442238dcc3SJonas Devlieghere            self.assertEqual(f.read(), "foobar")
64599451b44SJordan Rupprecht
64699451b44SJordan Rupprecht    def test_close(self):
6472238dcc3SJonas Devlieghere        with open(self.out_filename, "w") as f:
648a31130f6STatyana Krasnukha            status = self.dbg.SetOutputFile(f)
649779bbbf2SDave Lee            self.assertSuccess(status)
65099451b44SJordan Rupprecht            self.handleCmd("help help", check=False, collect_result=False)
65199451b44SJordan Rupprecht            # make sure the file wasn't closed early.
65299451b44SJordan Rupprecht            f.write("\nZAP\n")
653a31130f6STatyana Krasnukha            lldb.SBDebugger.Destroy(self.dbg)
65499451b44SJordan Rupprecht            # check that output file was closed when debugger was destroyed.
65599451b44SJordan Rupprecht            with self.assertRaises(ValueError):
65699451b44SJordan Rupprecht                f.write("\nQUUX\n")
6572238dcc3SJonas Devlieghere        with open(self.out_filename, "r") as f:
65899451b44SJordan Rupprecht            output = f.read()
6592238dcc3SJonas Devlieghere            self.assertTrue(re.search(r"Show a list of all debugger commands", output))
6602238dcc3SJonas Devlieghere            self.assertTrue(re.search(r"ZAP", output))
66199451b44SJordan Rupprecht
66299451b44SJordan Rupprecht    def test_stdout(self):
66399451b44SJordan Rupprecht        f = io.StringIO()
664a31130f6STatyana Krasnukha        status = self.dbg.SetOutputFile(f)
665779bbbf2SDave Lee        self.assertSuccess(status)
66699451b44SJordan Rupprecht        self.handleCmd(r"script sys.stdout.write('foobar\n')")
66799451b44SJordan Rupprecht        self.assertEqual(f.getvalue().strip().split(), ["foobar", "7"])
66899451b44SJordan Rupprecht
66999451b44SJordan Rupprecht    def test_stdout_file(self):
6702238dcc3SJonas Devlieghere        with open(self.out_filename, "w") as f:
671a31130f6STatyana Krasnukha            status = self.dbg.SetOutputFile(f)
672779bbbf2SDave Lee            self.assertSuccess(status)
67399451b44SJordan Rupprecht            self.handleCmd(r"script sys.stdout.write('foobar\n')")
6742238dcc3SJonas Devlieghere        with open(self.out_filename, "r") as f:
67599451b44SJordan Rupprecht            # In python2 sys.stdout.write() returns None, which
67699451b44SJordan Rupprecht            # the REPL will ignore, but in python3 it will
67799451b44SJordan Rupprecht            # return the number of bytes written, which the REPL
67899451b44SJordan Rupprecht            # will print out.
67999451b44SJordan Rupprecht            lines = [x for x in f.read().strip().split() if x != "7"]
68099451b44SJordan Rupprecht            self.assertEqual(lines, ["foobar"])
68199451b44SJordan Rupprecht
68299451b44SJordan Rupprecht    def test_identity(self):
68399451b44SJordan Rupprecht        f = io.StringIO()
68499451b44SJordan Rupprecht        sbf = lldb.SBFile(f)
685*9c246882SJordan Rupprecht        self.assertIs(f, sbf.GetFile())
68699451b44SJordan Rupprecht        sbf.Close()
68799451b44SJordan Rupprecht        self.assertTrue(f.closed)
68899451b44SJordan Rupprecht
68999451b44SJordan Rupprecht        f = io.StringIO()
69099451b44SJordan Rupprecht        sbf = lldb.SBFile.Create(f, borrow=True)
691*9c246882SJordan Rupprecht        self.assertIs(f, sbf.GetFile())
69299451b44SJordan Rupprecht        sbf.Close()
69399451b44SJordan Rupprecht        self.assertFalse(f.closed)
69499451b44SJordan Rupprecht
6952238dcc3SJonas Devlieghere        with open(self.out_filename, "w") as f:
69699451b44SJordan Rupprecht            sbf = lldb.SBFile(f)
697*9c246882SJordan Rupprecht            self.assertIs(f, sbf.GetFile())
69899451b44SJordan Rupprecht            sbf.Close()
69999451b44SJordan Rupprecht            self.assertTrue(f.closed)
70099451b44SJordan Rupprecht
7012238dcc3SJonas Devlieghere        with open(self.out_filename, "w") as f:
70299451b44SJordan Rupprecht            sbf = lldb.SBFile.Create(f, borrow=True)
703*9c246882SJordan Rupprecht            self.assertIsNot(f, sbf.GetFile())
70499451b44SJordan Rupprecht            sbf.Write(b"foobar\n")
70599451b44SJordan Rupprecht            self.assertEqual(f.fileno(), sbf.GetFile().fileno())
70699451b44SJordan Rupprecht            sbf.Close()
70799451b44SJordan Rupprecht            self.assertFalse(f.closed)
70899451b44SJordan Rupprecht
7092238dcc3SJonas Devlieghere        with open(self.out_filename, "r") as f:
71099451b44SJordan Rupprecht            self.assertEqual("foobar", f.read().strip())
71199451b44SJordan Rupprecht
7122238dcc3SJonas Devlieghere        with open(self.out_filename, "wb") as f:
71399451b44SJordan Rupprecht            sbf = lldb.SBFile.Create(f, borrow=True, force_io_methods=True)
714*9c246882SJordan Rupprecht            self.assertIs(f, sbf.GetFile())
71599451b44SJordan Rupprecht            sbf.Write(b"foobar\n")
71699451b44SJordan Rupprecht            self.assertEqual(f.fileno(), sbf.GetFile().fileno())
71799451b44SJordan Rupprecht            sbf.Close()
71899451b44SJordan Rupprecht            self.assertFalse(f.closed)
71999451b44SJordan Rupprecht
7202238dcc3SJonas Devlieghere        with open(self.out_filename, "r") as f:
72199451b44SJordan Rupprecht            self.assertEqual("foobar", f.read().strip())
72299451b44SJordan Rupprecht
7232238dcc3SJonas Devlieghere        with open(self.out_filename, "wb") as f:
72499451b44SJordan Rupprecht            sbf = lldb.SBFile.Create(f, force_io_methods=True)
725*9c246882SJordan Rupprecht            self.assertIs(f, sbf.GetFile())
72699451b44SJordan Rupprecht            sbf.Write(b"foobar\n")
72799451b44SJordan Rupprecht            self.assertEqual(f.fileno(), sbf.GetFile().fileno())
72899451b44SJordan Rupprecht            sbf.Close()
72999451b44SJordan Rupprecht            self.assertTrue(f.closed)
73099451b44SJordan Rupprecht
7312238dcc3SJonas Devlieghere        with open(self.out_filename, "r") as f:
73299451b44SJordan Rupprecht            self.assertEqual("foobar", f.read().strip())
73399451b44SJordan Rupprecht
73499451b44SJordan Rupprecht    def test_back_and_forth(self):
7352238dcc3SJonas Devlieghere        with open(self.out_filename, "w") as f:
73699451b44SJordan Rupprecht            # at each step here we're borrowing the file, so we have to keep
73799451b44SJordan Rupprecht            # them all alive until the end.
73899451b44SJordan Rupprecht            sbf = lldb.SBFile.Create(f, borrow=True)
7392238dcc3SJonas Devlieghere
74099451b44SJordan Rupprecht            def i(sbf):
74199451b44SJordan Rupprecht                for i in range(10):
74299451b44SJordan Rupprecht                    f = sbf.GetFile()
74399451b44SJordan Rupprecht                    self.assertEqual(f.mode, "w")
74499451b44SJordan Rupprecht                    yield f
74599451b44SJordan Rupprecht                    sbf = lldb.SBFile.Create(f, borrow=True)
74699451b44SJordan Rupprecht                    yield sbf
7472238dcc3SJonas Devlieghere                    sbf.Write(str(i).encode("ascii") + b"\n")
74899451b44SJordan Rupprecht
7492238dcc3SJonas Devlieghere            files = list(i(sbf))
7502238dcc3SJonas Devlieghere        with open(self.out_filename, "r") as f:
7512238dcc3SJonas Devlieghere            self.assertEqual(list(range(10)), list(map(int, f.read().strip().split())))
75299451b44SJordan Rupprecht
75399451b44SJordan Rupprecht    def test_set_filehandle_none(self):
754a31130f6STatyana Krasnukha        self.assertRaises(Exception, self.dbg.SetOutputFile, None)
755a31130f6STatyana Krasnukha        self.assertRaises(Exception, self.dbg.SetOutputFile, "ham sandwich")
756a31130f6STatyana Krasnukha        self.assertRaises(Exception, self.dbg.SetOutputFileHandle, "ham sandwich")
757a31130f6STatyana Krasnukha        self.assertRaises(Exception, self.dbg.SetInputFile, None)
758a31130f6STatyana Krasnukha        self.assertRaises(Exception, self.dbg.SetInputFile, "ham sandwich")
759a31130f6STatyana Krasnukha        self.assertRaises(Exception, self.dbg.SetInputFileHandle, "ham sandwich")
760a31130f6STatyana Krasnukha        self.assertRaises(Exception, self.dbg.SetErrorFile, None)
761a31130f6STatyana Krasnukha        self.assertRaises(Exception, self.dbg.SetErrorFile, "ham sandwich")
762a31130f6STatyana Krasnukha        self.assertRaises(Exception, self.dbg.SetErrorFileHandle, "ham sandwich")
76399451b44SJordan Rupprecht
7642238dcc3SJonas Devlieghere        with open(self.out_filename, "w") as f:
765a31130f6STatyana Krasnukha            status = self.dbg.SetOutputFile(f)
766779bbbf2SDave Lee            self.assertSuccess(status)
767a31130f6STatyana Krasnukha            status = self.dbg.SetErrorFile(f)
768779bbbf2SDave Lee            self.assertSuccess(status)
769a31130f6STatyana Krasnukha            self.dbg.SetOutputFileHandle(None, False)
770a31130f6STatyana Krasnukha            self.dbg.SetErrorFileHandle(None, False)
771a31130f6STatyana Krasnukha            sbf = self.dbg.GetOutputFile()
77299451b44SJordan Rupprecht            self.assertEqual(sbf.GetFile().fileno(), 1)
773a31130f6STatyana Krasnukha            sbf = self.dbg.GetErrorFile()
77499451b44SJordan Rupprecht            self.assertEqual(sbf.GetFile().fileno(), 2)
7752238dcc3SJonas Devlieghere        with open(self.out_filename, "r") as f:
776a31130f6STatyana Krasnukha            status = self.dbg.SetInputFile(f)
777779bbbf2SDave Lee            self.assertSuccess(status)
778a31130f6STatyana Krasnukha            self.dbg.SetInputFileHandle(None, False)
779a31130f6STatyana Krasnukha            sbf = self.dbg.GetInputFile()
78099451b44SJordan Rupprecht            self.assertEqual(sbf.GetFile().fileno(), 0)
78199451b44SJordan Rupprecht
78299451b44SJordan Rupprecht    def test_sbstream(self):
7832238dcc3SJonas Devlieghere        with open(self.out_filename, "w") as f:
78499451b44SJordan Rupprecht            stream = lldb.SBStream()
78599451b44SJordan Rupprecht            stream.RedirectToFile(f)
78699451b44SJordan Rupprecht            stream.Print("zork")
7872238dcc3SJonas Devlieghere        with open(self.out_filename, "r") as f:
78899451b44SJordan Rupprecht            self.assertEqual(f.read().strip(), "zork")
78999451b44SJordan Rupprecht
7902238dcc3SJonas Devlieghere        with open(self.out_filename, "w") as f:
79199451b44SJordan Rupprecht            stream = lldb.SBStream()
79299451b44SJordan Rupprecht            stream.RedirectToFileHandle(f, True)
79399451b44SJordan Rupprecht            stream.Print("Yendor")
7942238dcc3SJonas Devlieghere        with open(self.out_filename, "r") as f:
79599451b44SJordan Rupprecht            self.assertEqual(f.read().strip(), "Yendor")
79699451b44SJordan Rupprecht
79799451b44SJordan Rupprecht        stream = lldb.SBStream()
7982238dcc3SJonas Devlieghere        f = open(self.out_filename, "w")
79999451b44SJordan Rupprecht        stream.RedirectToFile(lldb.SBFile.Create(f, borrow=False))
80099451b44SJordan Rupprecht        stream.Print("Frobozz")
80199451b44SJordan Rupprecht        stream = None
80299451b44SJordan Rupprecht        self.assertTrue(f.closed)
8032238dcc3SJonas Devlieghere        with open(self.out_filename, "r") as f:
80499451b44SJordan Rupprecht            self.assertEqual(f.read().strip(), "Frobozz")
805f23b829aSLevon Ter-Grigoryan
806f23b829aSLevon Ter-Grigoryan    def test_set_sbstream(self):
8072238dcc3SJonas Devlieghere        with open(self.out_filename, "w") as outf:
808f23b829aSLevon Ter-Grigoryan            outsbf = lldb.SBFile(outf.fileno(), "w", False)
809f23b829aSLevon Ter-Grigoryan            status = self.dbg.SetOutputFile(outsbf)
810779bbbf2SDave Lee            self.assertSuccess(status)
811c0e3bb4dSPavel Labath            self.dbg.SetInputString("help apropos\nhelp help\n")
812f23b829aSLevon Ter-Grigoryan
813f23b829aSLevon Ter-Grigoryan            opts = lldb.SBCommandInterpreterRunOptions()
814f23b829aSLevon Ter-Grigoryan            self.dbg.RunCommandInterpreter(True, False, opts, 0, False, False)
815f23b829aSLevon Ter-Grigoryan            self.dbg.GetOutputFile().Flush()
816f23b829aSLevon Ter-Grigoryan
8172238dcc3SJonas Devlieghere        with open(self.out_filename, "r") as f:
818f23b829aSLevon Ter-Grigoryan            output = f.read()
8192238dcc3SJonas Devlieghere            self.assertIn("Show a list of all debugger commands", output)
8202238dcc3SJonas Devlieghere            self.assertIn("List debugger commands related to a word", output)
821