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
1699451b44SJordan Rupprechtclass OhNoe(Exception):
1799451b44SJordan Rupprecht    pass
1899451b44SJordan Rupprecht
1999451b44SJordan Rupprechtclass BadIO(io.TextIOBase):
2099451b44SJordan Rupprecht    @property
2199451b44SJordan Rupprecht    def closed(self):
2299451b44SJordan Rupprecht        return False
2399451b44SJordan Rupprecht    def writable(self):
2499451b44SJordan Rupprecht        return True
2599451b44SJordan Rupprecht    def readable(self):
2699451b44SJordan Rupprecht        return True
2799451b44SJordan Rupprecht    def write(self, s):
2899451b44SJordan Rupprecht        raise OhNoe('OH NOE')
2999451b44SJordan Rupprecht    def read(self, n):
3099451b44SJordan Rupprecht        raise OhNoe("OH NOE")
3199451b44SJordan Rupprecht    def flush(self):
3299451b44SJordan Rupprecht        raise OhNoe('OH NOE')
3399451b44SJordan Rupprecht
3499451b44SJordan Rupprecht# This class will raise an exception while it's being
3599451b44SJordan Rupprecht# converted into a C++ object by swig
3699451b44SJordan Rupprechtclass ReallyBadIO(io.TextIOBase):
3799451b44SJordan Rupprecht    def fileno(self):
3899451b44SJordan Rupprecht        return 999
3999451b44SJordan Rupprecht    def writable(self):
4099451b44SJordan Rupprecht        raise OhNoe("OH NOE!!!")
4199451b44SJordan Rupprecht
4299451b44SJordan Rupprechtclass MutableBool():
4399451b44SJordan Rupprecht    def __init__(self, value):
4499451b44SJordan Rupprecht        self.value = value
4599451b44SJordan Rupprecht    def set(self, value):
4699451b44SJordan Rupprecht        self.value = bool(value)
4799451b44SJordan Rupprecht    def __bool__(self):
4899451b44SJordan Rupprecht        return self.value
4999451b44SJordan Rupprecht
5099451b44SJordan Rupprechtclass FlushTestIO(io.StringIO):
5199451b44SJordan Rupprecht    def __init__(self, mutable_flushed, mutable_closed):
5299451b44SJordan Rupprecht        super(FlushTestIO, self).__init__()
5399451b44SJordan Rupprecht        self.mut_flushed = mutable_flushed
5499451b44SJordan Rupprecht        self.mut_closed = mutable_closed
5599451b44SJordan Rupprecht    def close(self):
5699451b44SJordan Rupprecht        self.mut_closed.set(True)
5799451b44SJordan Rupprecht        return super(FlushTestIO, self).close()
5899451b44SJordan Rupprecht    def flush(self):
5999451b44SJordan Rupprecht        self.mut_flushed.set(True)
6099451b44SJordan Rupprecht        return super(FlushTestIO, self).flush()
6199451b44SJordan Rupprecht
6299451b44SJordan Rupprecht@contextmanager
6399451b44SJordan Rupprechtdef replace_stdout(new):
6499451b44SJordan Rupprecht    old = sys.stdout
6599451b44SJordan Rupprecht    sys.stdout = new
6699451b44SJordan Rupprecht    try:
6799451b44SJordan Rupprecht        yield
6899451b44SJordan Rupprecht    finally:
6999451b44SJordan Rupprecht        sys.stdout = old
7099451b44SJordan Rupprecht
7199451b44SJordan Rupprechtdef readStrippedLines(f):
7299451b44SJordan Rupprecht    def i():
7399451b44SJordan Rupprecht        for line in f:
7499451b44SJordan Rupprecht            line = line.strip()
7599451b44SJordan Rupprecht            if line:
7699451b44SJordan Rupprecht                yield line
7799451b44SJordan Rupprecht    return list(i())
7899451b44SJordan Rupprecht
7999451b44SJordan Rupprecht
8099451b44SJordan Rupprechtclass FileHandleTestCase(lldbtest.TestBase):
8199451b44SJordan Rupprecht
8299451b44SJordan Rupprecht    NO_DEBUG_INFO_TESTCASE = True
8399451b44SJordan Rupprecht
84a31130f6STatyana Krasnukha    # The way normal tests evaluate debugger commands is
8599451b44SJordan Rupprecht    # by using a SBCommandInterpreter directly, which captures
8699451b44SJordan Rupprecht    # the output in a result object.   For many of tests tests
8799451b44SJordan Rupprecht    # we want the debugger to write the  output directly to
8899451b44SJordan Rupprecht    # its I/O streams like it would have done interactively.
8999451b44SJordan Rupprecht    #
9099451b44SJordan Rupprecht    # For this reason we also define handleCmd() here, even though
9199451b44SJordan Rupprecht    # it is similar to runCmd().
9299451b44SJordan Rupprecht
9399451b44SJordan Rupprecht    def setUp(self):
9499451b44SJordan Rupprecht        super(FileHandleTestCase, self).setUp()
9599451b44SJordan Rupprecht        self.out_filename = self.getBuildArtifact('output')
9699451b44SJordan Rupprecht        self.in_filename = self.getBuildArtifact('input')
9799451b44SJordan Rupprecht
9899451b44SJordan Rupprecht    def tearDown(self):
9999451b44SJordan Rupprecht        super(FileHandleTestCase, self).tearDown()
10099451b44SJordan Rupprecht        for name in (self.out_filename, self.in_filename):
10199451b44SJordan Rupprecht            if os.path.exists(name):
10299451b44SJordan Rupprecht                os.unlink(name)
10399451b44SJordan Rupprecht
104a31130f6STatyana Krasnukha    # Similar to runCmd(), but letting the debugger just print the results
105a31130f6STatyana Krasnukha    # instead of collecting them.
10699451b44SJordan Rupprecht    def handleCmd(self, cmd, check=True, collect_result=True):
10799451b44SJordan Rupprecht        assert not check or collect_result
10899451b44SJordan Rupprecht        ret = lldb.SBCommandReturnObject()
10999451b44SJordan Rupprecht        if collect_result:
110a31130f6STatyana Krasnukha            interpreter = self.dbg.GetCommandInterpreter()
11199451b44SJordan Rupprecht            interpreter.HandleCommand(cmd, ret)
11299451b44SJordan Rupprecht        else:
113a31130f6STatyana Krasnukha            self.dbg.HandleCommand(cmd)
114a31130f6STatyana Krasnukha        self.dbg.GetOutputFile().Flush()
115a31130f6STatyana Krasnukha        self.dbg.GetErrorFile().Flush()
11699451b44SJordan Rupprecht        if collect_result and check:
11799451b44SJordan Rupprecht            self.assertTrue(ret.Succeeded())
11899451b44SJordan Rupprecht        return ret.GetOutput()
11999451b44SJordan Rupprecht
12099451b44SJordan Rupprecht
12199451b44SJordan Rupprecht    def test_legacy_file_out_script(self):
12299451b44SJordan Rupprecht        with open(self.out_filename, 'w') as f:
123a31130f6STatyana Krasnukha            self.dbg.SetOutputFileHandle(f, False)
12499451b44SJordan Rupprecht            # scripts print to output even if you capture the results
12599451b44SJordan Rupprecht            # I'm not sure I love that behavior, but that's the way
12699451b44SJordan Rupprecht            # it's been for a long time.  That's why this test works
12799451b44SJordan Rupprecht            # even with collect_result=True.
12899451b44SJordan Rupprecht            self.handleCmd('script 1+1')
129a31130f6STatyana Krasnukha            self.dbg.GetOutputFileHandle().write('FOO\n')
1307a11cc06STatyana Krasnukha            self.dbg.GetOutputFileHandle().flush()
13199451b44SJordan Rupprecht        with open(self.out_filename, 'r') as f:
13299451b44SJordan Rupprecht            self.assertEqual(readStrippedLines(f), ['2', 'FOO'])
13399451b44SJordan Rupprecht
13499451b44SJordan Rupprecht
13599451b44SJordan Rupprecht    def test_legacy_file_out(self):
13699451b44SJordan Rupprecht        with open(self.out_filename, 'w') as f:
137a31130f6STatyana Krasnukha            self.dbg.SetOutputFileHandle(f, False)
13899451b44SJordan Rupprecht            self.handleCmd('p/x 3735928559', collect_result=False, check=False)
13999451b44SJordan Rupprecht        with open(self.out_filename, 'r') as f:
14099451b44SJordan Rupprecht            self.assertIn('deadbeef', f.read())
14199451b44SJordan Rupprecht
14299451b44SJordan Rupprecht    def test_legacy_file_err_with_get(self):
14399451b44SJordan Rupprecht        with open(self.out_filename, 'w') as f:
144a31130f6STatyana Krasnukha            self.dbg.SetErrorFileHandle(f, False)
14599451b44SJordan Rupprecht            self.handleCmd('lolwut', check=False, collect_result=False)
146a31130f6STatyana Krasnukha            f2 = self.dbg.GetErrorFileHandle()
14799451b44SJordan Rupprecht            f2.write('FOOBAR\n')
14899451b44SJordan Rupprecht            f2.flush()
14999451b44SJordan Rupprecht        with open(self.out_filename, 'r') as f:
15099451b44SJordan Rupprecht            errors = f.read()
15199451b44SJordan Rupprecht            self.assertTrue(re.search(r'error:.*lolwut', errors))
15299451b44SJordan Rupprecht            self.assertTrue(re.search(r'FOOBAR', errors))
15399451b44SJordan Rupprecht
15499451b44SJordan Rupprecht
15599451b44SJordan Rupprecht    def test_legacy_file_err(self):
15699451b44SJordan Rupprecht        with open(self.out_filename, 'w') as f:
157a31130f6STatyana Krasnukha            self.dbg.SetErrorFileHandle(f, False)
15899451b44SJordan Rupprecht            self.handleCmd('lol', check=False, collect_result=False)
15999451b44SJordan Rupprecht        with open(self.out_filename, 'r') as f:
16099451b44SJordan Rupprecht            self.assertIn("is not a valid command", f.read())
16199451b44SJordan Rupprecht
16299451b44SJordan Rupprecht
16399451b44SJordan Rupprecht    def test_legacy_file_error(self):
16499451b44SJordan Rupprecht        with open(self.out_filename, 'w') as f:
165a31130f6STatyana Krasnukha            self.dbg.SetErrorFileHandle(f, False)
16699451b44SJordan Rupprecht            self.handleCmd('lolwut', check=False, collect_result=False)
16799451b44SJordan Rupprecht        with open(self.out_filename, 'r') as f:
16899451b44SJordan Rupprecht            errors = f.read()
16999451b44SJordan Rupprecht            self.assertTrue(re.search(r'error:.*lolwut', errors))
17099451b44SJordan Rupprecht
17199451b44SJordan Rupprecht    def test_sbfile_type_errors(self):
17299451b44SJordan Rupprecht        sbf = lldb.SBFile()
17399451b44SJordan Rupprecht        self.assertRaises(Exception, sbf.Write, None)
17499451b44SJordan Rupprecht        self.assertRaises(Exception, sbf.Read, None)
17599451b44SJordan Rupprecht        self.assertRaises(Exception, sbf.Read, b'this bytes is not mutable')
17699451b44SJordan Rupprecht        self.assertRaises(Exception, sbf.Write, u"ham sandwich")
17799451b44SJordan Rupprecht        self.assertRaises(Exception, sbf.Read, u"ham sandwich")
17899451b44SJordan Rupprecht
17999451b44SJordan Rupprecht
18099451b44SJordan Rupprecht    def test_sbfile_write_fileno(self):
18199451b44SJordan Rupprecht        with open(self.out_filename, 'w') as f:
18299451b44SJordan Rupprecht            sbf = lldb.SBFile(f.fileno(), "w", False)
18399451b44SJordan Rupprecht            self.assertTrue(sbf.IsValid())
18499451b44SJordan Rupprecht            e, n = sbf.Write(b'FOO\nBAR')
185*779bbbf2SDave Lee            self.assertSuccess(e)
18699451b44SJordan Rupprecht            self.assertEqual(n, 7)
18799451b44SJordan Rupprecht            sbf.Close()
18899451b44SJordan Rupprecht            self.assertFalse(sbf.IsValid())
18999451b44SJordan Rupprecht        with open(self.out_filename, 'r') as f:
19099451b44SJordan Rupprecht            self.assertEqual(readStrippedLines(f), ['FOO', 'BAR'])
19199451b44SJordan Rupprecht
19299451b44SJordan Rupprecht
19399451b44SJordan Rupprecht    def test_sbfile_write(self):
19499451b44SJordan Rupprecht        with open(self.out_filename, 'w') as f:
19599451b44SJordan Rupprecht            sbf = lldb.SBFile(f)
19699451b44SJordan Rupprecht            e, n = sbf.Write(b'FOO\n')
197*779bbbf2SDave Lee            self.assertSuccess(e)
19899451b44SJordan Rupprecht            self.assertEqual(n, 4)
19999451b44SJordan Rupprecht            sbf.Close()
20099451b44SJordan Rupprecht            self.assertTrue(f.closed)
20199451b44SJordan Rupprecht        with open(self.out_filename, 'r') as f:
20299451b44SJordan Rupprecht            self.assertEqual(f.read().strip(), 'FOO')
20399451b44SJordan Rupprecht
20499451b44SJordan Rupprecht
20599451b44SJordan Rupprecht    def test_sbfile_read_fileno(self):
20699451b44SJordan Rupprecht        with open(self.out_filename, 'w') as f:
20799451b44SJordan Rupprecht            f.write('FOO')
20899451b44SJordan Rupprecht        with open(self.out_filename, 'r') as f:
20999451b44SJordan Rupprecht            sbf = lldb.SBFile(f.fileno(), "r", False)
21099451b44SJordan Rupprecht            self.assertTrue(sbf.IsValid())
21199451b44SJordan Rupprecht            buffer = bytearray(100)
21299451b44SJordan Rupprecht            e, n = sbf.Read(buffer)
213*779bbbf2SDave Lee            self.assertSuccess(e)
21499451b44SJordan Rupprecht            self.assertEqual(buffer[:n], b'FOO')
21599451b44SJordan Rupprecht
21699451b44SJordan Rupprecht
21799451b44SJordan Rupprecht    def test_sbfile_read(self):
21899451b44SJordan Rupprecht        with open(self.out_filename, 'w') as f:
21999451b44SJordan Rupprecht            f.write('foo')
22099451b44SJordan Rupprecht        with open(self.out_filename, 'r') as f:
22199451b44SJordan Rupprecht            sbf = lldb.SBFile(f)
22299451b44SJordan Rupprecht            buf = bytearray(100)
22399451b44SJordan Rupprecht            e, n = sbf.Read(buf)
224*779bbbf2SDave Lee            self.assertSuccess(e)
22599451b44SJordan Rupprecht            self.assertEqual(n, 3)
22699451b44SJordan Rupprecht            self.assertEqual(buf[:n], b'foo')
22799451b44SJordan Rupprecht            sbf.Close()
22899451b44SJordan Rupprecht            self.assertTrue(f.closed)
22999451b44SJordan Rupprecht
23099451b44SJordan Rupprecht
23199451b44SJordan Rupprecht    def test_fileno_out(self):
23299451b44SJordan Rupprecht        with open(self.out_filename, 'w') as f:
23399451b44SJordan Rupprecht            sbf = lldb.SBFile(f.fileno(), "w", False)
234a31130f6STatyana Krasnukha            status = self.dbg.SetOutputFile(sbf)
235*779bbbf2SDave Lee            self.assertSuccess(status)
23699451b44SJordan Rupprecht            self.handleCmd('script 1+2')
237a31130f6STatyana Krasnukha            self.dbg.GetOutputFile().Write(b'quux')
2387a11cc06STatyana Krasnukha            self.dbg.GetOutputFile().Flush()
23999451b44SJordan Rupprecht
24099451b44SJordan Rupprecht        with open(self.out_filename, 'r') as f:
24199451b44SJordan Rupprecht            self.assertEqual(readStrippedLines(f), ['3', 'quux'])
24299451b44SJordan Rupprecht
24399451b44SJordan Rupprecht
24499451b44SJordan Rupprecht    def test_fileno_help(self):
24599451b44SJordan Rupprecht        with open(self.out_filename, 'w') as f:
24699451b44SJordan Rupprecht            sbf = lldb.SBFile(f.fileno(), "w", False)
247a31130f6STatyana Krasnukha            status = self.dbg.SetOutputFile(sbf)
248*779bbbf2SDave Lee            self.assertSuccess(status)
24999451b44SJordan Rupprecht            self.handleCmd("help help", collect_result=False, check=False)
25099451b44SJordan Rupprecht        with open(self.out_filename, 'r') as f:
25199451b44SJordan Rupprecht            self.assertTrue(re.search(r'Show a list of all debugger commands', f.read()))
25299451b44SJordan Rupprecht
25399451b44SJordan Rupprecht
25499451b44SJordan Rupprecht    def test_help(self):
25599451b44SJordan Rupprecht        with open(self.out_filename, 'w') as f:
256a31130f6STatyana Krasnukha            status = self.dbg.SetOutputFile(lldb.SBFile(f))
257*779bbbf2SDave Lee            self.assertSuccess(status)
25899451b44SJordan Rupprecht            self.handleCmd("help help", check=False, collect_result=False)
25999451b44SJordan Rupprecht        with open(self.out_filename, 'r') as f:
26099451b44SJordan Rupprecht            self.assertIn('Show a list of all debugger commands', f.read())
26199451b44SJordan Rupprecht
26299451b44SJordan Rupprecht
26399451b44SJordan Rupprecht    def test_immediate(self):
26499451b44SJordan Rupprecht        with open(self.out_filename, 'w') as f:
26599451b44SJordan Rupprecht            ret = lldb.SBCommandReturnObject()
26699451b44SJordan Rupprecht            ret.SetImmediateOutputFile(f)
267a31130f6STatyana Krasnukha            interpreter = self.dbg.GetCommandInterpreter()
26899451b44SJordan Rupprecht            interpreter.HandleCommand("help help", ret)
26999451b44SJordan Rupprecht            # make sure the file wasn't closed early.
27099451b44SJordan Rupprecht            f.write("\nQUUX\n")
27199451b44SJordan Rupprecht        ret = None # call destructor and flush streams
27299451b44SJordan Rupprecht        with open(self.out_filename, 'r') as f:
27399451b44SJordan Rupprecht            output = f.read()
27499451b44SJordan Rupprecht            self.assertTrue(re.search(r'Show a list of all debugger commands', output))
27599451b44SJordan Rupprecht            self.assertTrue(re.search(r'QUUX', output))
27699451b44SJordan Rupprecht
27799451b44SJordan Rupprecht
27899451b44SJordan Rupprecht    def test_immediate_string(self):
27999451b44SJordan Rupprecht        f = io.StringIO()
28099451b44SJordan Rupprecht        ret = lldb.SBCommandReturnObject()
28199451b44SJordan Rupprecht        ret.SetImmediateOutputFile(f)
282a31130f6STatyana Krasnukha        interpreter = self.dbg.GetCommandInterpreter()
28399451b44SJordan Rupprecht        interpreter.HandleCommand("help help", ret)
28499451b44SJordan Rupprecht        # make sure the file wasn't closed early.
28599451b44SJordan Rupprecht        f.write("\nQUUX\n")
28699451b44SJordan Rupprecht        ret = None # call destructor and flush streams
28799451b44SJordan Rupprecht        output = f.getvalue()
28899451b44SJordan Rupprecht        self.assertTrue(re.search(r'Show a list of all debugger commands', output))
28999451b44SJordan Rupprecht        self.assertTrue(re.search(r'QUUX', output))
29099451b44SJordan Rupprecht
29199451b44SJordan Rupprecht
29299451b44SJordan Rupprecht    def test_immediate_sbfile_string(self):
29399451b44SJordan Rupprecht        f = io.StringIO()
29499451b44SJordan Rupprecht        ret = lldb.SBCommandReturnObject()
29599451b44SJordan Rupprecht        ret.SetImmediateOutputFile(lldb.SBFile(f))
296a31130f6STatyana Krasnukha        interpreter = self.dbg.GetCommandInterpreter()
29799451b44SJordan Rupprecht        interpreter.HandleCommand("help help", ret)
29899451b44SJordan Rupprecht        output = f.getvalue()
29999451b44SJordan Rupprecht        ret = None # call destructor and flush streams
30099451b44SJordan Rupprecht        # sbfile default constructor doesn't borrow the file
30199451b44SJordan Rupprecht        self.assertTrue(f.closed)
30299451b44SJordan Rupprecht        self.assertTrue(re.search(r'Show a list of all debugger commands', output))
30399451b44SJordan Rupprecht
30499451b44SJordan Rupprecht
30599451b44SJordan Rupprecht    def test_fileno_inout(self):
30699451b44SJordan Rupprecht        with open(self.in_filename, 'w') as f:
30799451b44SJordan Rupprecht            f.write("help help\n")
30899451b44SJordan Rupprecht
30999451b44SJordan Rupprecht        with open(self.out_filename, 'w') as outf, open(self.in_filename, 'r') as inf:
31099451b44SJordan Rupprecht
31199451b44SJordan Rupprecht            outsbf = lldb.SBFile(outf.fileno(), "w", False)
312a31130f6STatyana Krasnukha            status = self.dbg.SetOutputFile(outsbf)
313*779bbbf2SDave Lee            self.assertSuccess(status)
31499451b44SJordan Rupprecht
31599451b44SJordan Rupprecht            insbf = lldb.SBFile(inf.fileno(), "r", False)
316a31130f6STatyana Krasnukha            status = self.dbg.SetInputFile(insbf)
317*779bbbf2SDave Lee            self.assertSuccess(status)
31899451b44SJordan Rupprecht
31999451b44SJordan Rupprecht            opts = lldb.SBCommandInterpreterRunOptions()
320a31130f6STatyana Krasnukha            self.dbg.RunCommandInterpreter(True, False, opts, 0, False, False)
321a31130f6STatyana Krasnukha            self.dbg.GetOutputFile().Flush()
32299451b44SJordan Rupprecht
32399451b44SJordan Rupprecht        with open(self.out_filename, 'r') as f:
32499451b44SJordan Rupprecht            self.assertTrue(re.search(r'Show a list of all debugger commands', f.read()))
32599451b44SJordan Rupprecht
32699451b44SJordan Rupprecht
32799451b44SJordan Rupprecht    def test_inout(self):
32899451b44SJordan Rupprecht        with open(self.in_filename, 'w') as f:
32999451b44SJordan Rupprecht            f.write("help help\n")
33099451b44SJordan Rupprecht        with  open(self.out_filename, 'w') as outf, \
33199451b44SJordan Rupprecht              open(self.in_filename, 'r') as inf:
332a31130f6STatyana Krasnukha            status = self.dbg.SetOutputFile(lldb.SBFile(outf))
333*779bbbf2SDave Lee            self.assertSuccess(status)
334a31130f6STatyana Krasnukha            status = self.dbg.SetInputFile(lldb.SBFile(inf))
335*779bbbf2SDave Lee            self.assertSuccess(status)
33699451b44SJordan Rupprecht            opts = lldb.SBCommandInterpreterRunOptions()
337a31130f6STatyana Krasnukha            self.dbg.RunCommandInterpreter(True, False, opts, 0, False, False)
338a31130f6STatyana Krasnukha            self.dbg.GetOutputFile().Flush()
33999451b44SJordan Rupprecht        with open(self.out_filename, 'r') as f:
34099451b44SJordan Rupprecht            output = f.read()
34199451b44SJordan Rupprecht            self.assertIn('Show a list of all debugger commands', output)
34299451b44SJordan Rupprecht
34399451b44SJordan Rupprecht
34499451b44SJordan Rupprecht    def test_binary_inout(self):
34599451b44SJordan Rupprecht        with open(self.in_filename, 'w') as f:
34699451b44SJordan Rupprecht            f.write("help help\n")
34799451b44SJordan Rupprecht        with  open(self.out_filename, 'wb') as outf, \
34899451b44SJordan Rupprecht              open(self.in_filename, 'rb') as inf:
349a31130f6STatyana Krasnukha            status = self.dbg.SetOutputFile(lldb.SBFile(outf))
350*779bbbf2SDave Lee            self.assertSuccess(status)
351a31130f6STatyana Krasnukha            status = self.dbg.SetInputFile(lldb.SBFile(inf))
352*779bbbf2SDave Lee            self.assertSuccess(status)
35399451b44SJordan Rupprecht            opts = lldb.SBCommandInterpreterRunOptions()
354a31130f6STatyana Krasnukha            self.dbg.RunCommandInterpreter(True, False, opts, 0, False, False)
355a31130f6STatyana Krasnukha            self.dbg.GetOutputFile().Flush()
35699451b44SJordan Rupprecht        with open(self.out_filename, 'r') as f:
35799451b44SJordan Rupprecht            output = f.read()
35899451b44SJordan Rupprecht            self.assertIn('Show a list of all debugger commands', output)
35999451b44SJordan Rupprecht
36099451b44SJordan Rupprecht
36199451b44SJordan Rupprecht    def test_string_inout(self):
36299451b44SJordan Rupprecht        inf = io.StringIO("help help\np/x ~0\n")
36399451b44SJordan Rupprecht        outf = io.StringIO()
364a31130f6STatyana Krasnukha        status = self.dbg.SetOutputFile(lldb.SBFile(outf))
365*779bbbf2SDave Lee        self.assertSuccess(status)
366a31130f6STatyana Krasnukha        status = self.dbg.SetInputFile(lldb.SBFile(inf))
367*779bbbf2SDave 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()
37299451b44SJordan Rupprecht        self.assertIn('Show a list of all debugger commands', output)
37399451b44SJordan Rupprecht        self.assertIn('0xfff', output)
37499451b44SJordan Rupprecht
37599451b44SJordan Rupprecht
37699451b44SJordan Rupprecht    def test_bytes_inout(self):
37799451b44SJordan Rupprecht        inf = io.BytesIO(b"help help\nhelp b\n")
37899451b44SJordan Rupprecht        outf = io.BytesIO()
379a31130f6STatyana Krasnukha        status = self.dbg.SetOutputFile(lldb.SBFile(outf))
380*779bbbf2SDave Lee        self.assertSuccess(status)
381a31130f6STatyana Krasnukha        status = self.dbg.SetInputFile(lldb.SBFile(inf))
382*779bbbf2SDave Lee        self.assertSuccess(status)
38399451b44SJordan Rupprecht        opts = lldb.SBCommandInterpreterRunOptions()
384a31130f6STatyana Krasnukha        self.dbg.RunCommandInterpreter(True, False, opts, 0, False, False)
385a31130f6STatyana Krasnukha        self.dbg.GetOutputFile().Flush()
38699451b44SJordan Rupprecht        output = outf.getvalue()
38799451b44SJordan Rupprecht        self.assertIn(b'Show a list of all debugger commands', output)
38899451b44SJordan Rupprecht        self.assertIn(b'Set a breakpoint', output)
38999451b44SJordan Rupprecht
39099451b44SJordan Rupprecht
39199451b44SJordan Rupprecht    def test_fileno_error(self):
39299451b44SJordan Rupprecht        with open(self.out_filename, 'w') as f:
39399451b44SJordan Rupprecht
39499451b44SJordan Rupprecht            sbf = lldb.SBFile(f.fileno(), 'w', False)
395a31130f6STatyana Krasnukha            status = self.dbg.SetErrorFile(sbf)
396*779bbbf2SDave Lee            self.assertSuccess(status)
39799451b44SJordan Rupprecht
39899451b44SJordan Rupprecht            self.handleCmd('lolwut', check=False, collect_result=False)
39999451b44SJordan Rupprecht
400a31130f6STatyana Krasnukha            self.dbg.GetErrorFile().Write(b'\nzork\n')
40199451b44SJordan Rupprecht
40299451b44SJordan Rupprecht        with open(self.out_filename, 'r') as f:
40399451b44SJordan Rupprecht            errors = f.read()
40499451b44SJordan Rupprecht            self.assertTrue(re.search(r'error:.*lolwut', errors))
40599451b44SJordan Rupprecht            self.assertTrue(re.search(r'zork', errors))
40699451b44SJordan Rupprecht
40799451b44SJordan Rupprecht
40899451b44SJordan Rupprecht    def test_replace_stdout(self):
40999451b44SJordan Rupprecht        f = io.StringIO()
41099451b44SJordan Rupprecht        with replace_stdout(f):
41199451b44SJordan Rupprecht            self.assertEqual(sys.stdout, f)
41299451b44SJordan Rupprecht            self.handleCmd('script sys.stdout.write("lol")',
41399451b44SJordan Rupprecht                collect_result=False, check=False)
41499451b44SJordan Rupprecht            self.assertEqual(sys.stdout, f)
41599451b44SJordan Rupprecht
41699451b44SJordan Rupprecht
41799451b44SJordan Rupprecht    def test_replace_stdout_with_nonfile(self):
41899451b44SJordan Rupprecht        f = io.StringIO()
41999451b44SJordan Rupprecht        with replace_stdout(f):
42099451b44SJordan Rupprecht            class Nothing():
42199451b44SJordan Rupprecht                pass
42299451b44SJordan Rupprecht            with replace_stdout(Nothing):
42399451b44SJordan Rupprecht                self.assertEqual(sys.stdout, Nothing)
42499451b44SJordan Rupprecht                self.handleCmd('script sys.stdout.write("lol")',
42599451b44SJordan Rupprecht                    check=False, collect_result=False)
42699451b44SJordan Rupprecht                self.assertEqual(sys.stdout, Nothing)
42799451b44SJordan Rupprecht            sys.stdout.write(u"FOO")
42899451b44SJordan Rupprecht        self.assertEqual(f.getvalue(), "FOO")
42999451b44SJordan Rupprecht
43099451b44SJordan Rupprecht
43199451b44SJordan Rupprecht    def test_sbfile_write_borrowed(self):
43299451b44SJordan Rupprecht        with open(self.out_filename, 'w') as f:
43399451b44SJordan Rupprecht            sbf = lldb.SBFile.Create(f, borrow=True)
43499451b44SJordan Rupprecht            e, n = sbf.Write(b'FOO')
435*779bbbf2SDave Lee            self.assertSuccess(e)
43699451b44SJordan Rupprecht            self.assertEqual(n, 3)
43799451b44SJordan Rupprecht            sbf.Close()
43899451b44SJordan Rupprecht            self.assertFalse(f.closed)
43999451b44SJordan Rupprecht            f.write('BAR\n')
44099451b44SJordan Rupprecht        with open(self.out_filename, 'r') as f:
44199451b44SJordan Rupprecht            self.assertEqual(f.read().strip(), 'FOOBAR')
44299451b44SJordan Rupprecht
44399451b44SJordan Rupprecht
44499451b44SJordan Rupprecht
44599451b44SJordan Rupprecht    def test_sbfile_write_forced(self):
44699451b44SJordan Rupprecht        with open(self.out_filename, 'w') as f:
44799451b44SJordan Rupprecht            written = MutableBool(False)
44899451b44SJordan Rupprecht            orig_write = f.write
44999451b44SJordan Rupprecht            def mywrite(x):
45099451b44SJordan Rupprecht                written.set(True)
45199451b44SJordan Rupprecht                return orig_write(x)
45299451b44SJordan Rupprecht            f.write = mywrite
45399451b44SJordan Rupprecht            sbf = lldb.SBFile.Create(f, force_io_methods=True)
45499451b44SJordan Rupprecht            e, n = sbf.Write(b'FOO')
45599451b44SJordan Rupprecht            self.assertTrue(written)
456*779bbbf2SDave Lee            self.assertSuccess(e)
45799451b44SJordan Rupprecht            self.assertEqual(n, 3)
45899451b44SJordan Rupprecht            sbf.Close()
45999451b44SJordan Rupprecht            self.assertTrue(f.closed)
46099451b44SJordan Rupprecht        with open(self.out_filename, 'r') as f:
46199451b44SJordan Rupprecht            self.assertEqual(f.read().strip(), 'FOO')
46299451b44SJordan Rupprecht
46399451b44SJordan Rupprecht
46499451b44SJordan Rupprecht    def test_sbfile_write_forced_borrowed(self):
46599451b44SJordan Rupprecht        with open(self.out_filename, 'w') as f:
46699451b44SJordan Rupprecht            written = MutableBool(False)
46799451b44SJordan Rupprecht            orig_write = f.write
46899451b44SJordan Rupprecht            def mywrite(x):
46999451b44SJordan Rupprecht                written.set(True)
47099451b44SJordan Rupprecht                return orig_write(x)
47199451b44SJordan Rupprecht            f.write = mywrite
47299451b44SJordan Rupprecht            sbf = lldb.SBFile.Create(f, borrow=True, force_io_methods=True)
47399451b44SJordan Rupprecht            e, n = sbf.Write(b'FOO')
47499451b44SJordan Rupprecht            self.assertTrue(written)
475*779bbbf2SDave Lee            self.assertSuccess(e)
47699451b44SJordan Rupprecht            self.assertEqual(n, 3)
47799451b44SJordan Rupprecht            sbf.Close()
47899451b44SJordan Rupprecht            self.assertFalse(f.closed)
47999451b44SJordan Rupprecht        with open(self.out_filename, 'r') as f:
48099451b44SJordan Rupprecht            self.assertEqual(f.read().strip(), 'FOO')
48199451b44SJordan Rupprecht
48299451b44SJordan Rupprecht
48399451b44SJordan Rupprecht    def test_sbfile_write_string(self):
48499451b44SJordan Rupprecht        f = io.StringIO()
48599451b44SJordan Rupprecht        sbf = lldb.SBFile(f)
48699451b44SJordan Rupprecht        e, n = sbf.Write(b'FOO')
48799451b44SJordan Rupprecht        self.assertEqual(f.getvalue().strip(), "FOO")
488*779bbbf2SDave Lee        self.assertSuccess(e)
48999451b44SJordan Rupprecht        self.assertEqual(n, 3)
49099451b44SJordan Rupprecht        sbf.Close()
49199451b44SJordan Rupprecht        self.assertTrue(f.closed)
49299451b44SJordan Rupprecht
49399451b44SJordan Rupprecht
49499451b44SJordan Rupprecht    def test_string_out(self):
49599451b44SJordan Rupprecht        f = io.StringIO()
496a31130f6STatyana Krasnukha        status = self.dbg.SetOutputFile(f)
497*779bbbf2SDave Lee        self.assertSuccess(status)
49899451b44SJordan Rupprecht        self.handleCmd("script 'foobar'")
49999451b44SJordan Rupprecht        self.assertEqual(f.getvalue().strip(), "'foobar'")
50099451b44SJordan Rupprecht
50199451b44SJordan Rupprecht
50299451b44SJordan Rupprecht    def test_string_error(self):
50399451b44SJordan Rupprecht        f = io.StringIO()
504a31130f6STatyana Krasnukha        status = self.dbg.SetErrorFile(f)
505*779bbbf2SDave Lee        self.assertSuccess(status)
50699451b44SJordan Rupprecht        self.handleCmd('lolwut', check=False, collect_result=False)
50799451b44SJordan Rupprecht        errors = f.getvalue()
50899451b44SJordan Rupprecht        self.assertTrue(re.search(r'error:.*lolwut', errors))
50999451b44SJordan Rupprecht
51099451b44SJordan Rupprecht
51199451b44SJordan Rupprecht    def test_sbfile_write_bytes(self):
51299451b44SJordan Rupprecht        f = io.BytesIO()
51399451b44SJordan Rupprecht        sbf = lldb.SBFile(f)
51499451b44SJordan Rupprecht        e, n = sbf.Write(b'FOO')
51599451b44SJordan Rupprecht        self.assertEqual(f.getvalue().strip(), b"FOO")
516*779bbbf2SDave Lee        self.assertSuccess(e)
51799451b44SJordan Rupprecht        self.assertEqual(n, 3)
51899451b44SJordan Rupprecht        sbf.Close()
51999451b44SJordan Rupprecht        self.assertTrue(f.closed)
52099451b44SJordan Rupprecht
52199451b44SJordan Rupprecht    def test_sbfile_read_string(self):
52299451b44SJordan Rupprecht        f = io.StringIO('zork')
52399451b44SJordan Rupprecht        sbf = lldb.SBFile(f)
52499451b44SJordan Rupprecht        buf = bytearray(100)
52599451b44SJordan Rupprecht        e, n = sbf.Read(buf)
526*779bbbf2SDave Lee        self.assertSuccess(e)
52799451b44SJordan Rupprecht        self.assertEqual(buf[:n], b'zork')
52899451b44SJordan Rupprecht
52999451b44SJordan Rupprecht
53099451b44SJordan Rupprecht    def test_sbfile_read_string_one_byte(self):
53199451b44SJordan Rupprecht        f = io.StringIO('z')
53299451b44SJordan Rupprecht        sbf = lldb.SBFile(f)
53399451b44SJordan Rupprecht        buf = bytearray(1)
53499451b44SJordan Rupprecht        e, n = sbf.Read(buf)
53599451b44SJordan Rupprecht        self.assertTrue(e.Fail())
53699451b44SJordan Rupprecht        self.assertEqual(n, 0)
53799451b44SJordan Rupprecht        self.assertEqual(e.GetCString(), "can't read less than 6 bytes from a utf8 text stream")
53899451b44SJordan Rupprecht
53999451b44SJordan Rupprecht
54099451b44SJordan Rupprecht    def test_sbfile_read_bytes(self):
54199451b44SJordan Rupprecht        f = io.BytesIO(b'zork')
54299451b44SJordan Rupprecht        sbf = lldb.SBFile(f)
54399451b44SJordan Rupprecht        buf = bytearray(100)
54499451b44SJordan Rupprecht        e, n = sbf.Read(buf)
545*779bbbf2SDave Lee        self.assertSuccess(e)
54699451b44SJordan Rupprecht        self.assertEqual(buf[:n], b'zork')
54799451b44SJordan Rupprecht
54899451b44SJordan Rupprecht
54999451b44SJordan Rupprecht    def test_sbfile_out(self):
55099451b44SJordan Rupprecht        with open(self.out_filename, 'w') as f:
55199451b44SJordan Rupprecht            sbf = lldb.SBFile(f)
552a31130f6STatyana Krasnukha            status = self.dbg.SetOutputFile(sbf)
553*779bbbf2SDave Lee            self.assertSuccess(status)
55499451b44SJordan Rupprecht            self.handleCmd('script 2+2')
55599451b44SJordan Rupprecht        with open(self.out_filename, 'r') as f:
55699451b44SJordan Rupprecht            self.assertEqual(f.read().strip(), '4')
55799451b44SJordan Rupprecht
55899451b44SJordan Rupprecht
55999451b44SJordan Rupprecht    def test_file_out(self):
56099451b44SJordan Rupprecht        with open(self.out_filename, 'w') as f:
561a31130f6STatyana Krasnukha            status = self.dbg.SetOutputFile(f)
562*779bbbf2SDave Lee            self.assertSuccess(status)
56399451b44SJordan Rupprecht            self.handleCmd('script 2+2')
56499451b44SJordan Rupprecht        with open(self.out_filename, 'r') as f:
56599451b44SJordan Rupprecht            self.assertEqual(f.read().strip(), '4')
56699451b44SJordan Rupprecht
56799451b44SJordan Rupprecht
56899451b44SJordan Rupprecht    def test_sbfile_error(self):
56999451b44SJordan Rupprecht        with open(self.out_filename, 'w') as f:
57099451b44SJordan Rupprecht            sbf = lldb.SBFile(f)
571a31130f6STatyana Krasnukha            status = self.dbg.SetErrorFile(sbf)
572*779bbbf2SDave Lee            self.assertSuccess(status)
57399451b44SJordan Rupprecht            self.handleCmd('lolwut', check=False, collect_result=False)
57499451b44SJordan Rupprecht        with open(self.out_filename, 'r') as f:
57599451b44SJordan Rupprecht            errors = f.read()
57699451b44SJordan Rupprecht            self.assertTrue(re.search(r'error:.*lolwut', errors))
57799451b44SJordan Rupprecht
57899451b44SJordan Rupprecht
57999451b44SJordan Rupprecht    def test_file_error(self):
58099451b44SJordan Rupprecht        with open(self.out_filename, 'w') as f:
581a31130f6STatyana Krasnukha            status = self.dbg.SetErrorFile(f)
582*779bbbf2SDave Lee            self.assertSuccess(status)
58399451b44SJordan Rupprecht            self.handleCmd('lolwut', check=False, collect_result=False)
58499451b44SJordan Rupprecht        with open(self.out_filename, 'r') as f:
58599451b44SJordan Rupprecht            errors = f.read()
58699451b44SJordan Rupprecht            self.assertTrue(re.search(r'error:.*lolwut', errors))
58799451b44SJordan Rupprecht
58899451b44SJordan Rupprecht
58999451b44SJordan Rupprecht    def test_exceptions(self):
59099451b44SJordan Rupprecht        self.assertRaises(Exception, lldb.SBFile, None)
59199451b44SJordan Rupprecht        self.assertRaises(Exception, lldb.SBFile, "ham sandwich")
59299451b44SJordan Rupprecht        self.assertRaises(OhNoe, lldb.SBFile, ReallyBadIO())
59399451b44SJordan Rupprecht        error, n = lldb.SBFile(BadIO()).Write(b"FOO")
59499451b44SJordan Rupprecht        self.assertEqual(n, 0)
59599451b44SJordan Rupprecht        self.assertTrue(error.Fail())
59699451b44SJordan Rupprecht        self.assertIn('OH NOE', error.GetCString())
59799451b44SJordan Rupprecht        error, n = lldb.SBFile(BadIO()).Read(bytearray(100))
59899451b44SJordan Rupprecht        self.assertEqual(n, 0)
59999451b44SJordan Rupprecht        self.assertTrue(error.Fail())
60099451b44SJordan Rupprecht        self.assertIn('OH NOE', error.GetCString())
60199451b44SJordan Rupprecht
60299451b44SJordan Rupprecht
60399451b44SJordan Rupprecht    def test_exceptions_logged(self):
60499451b44SJordan Rupprecht        messages = list()
605a31130f6STatyana Krasnukha        self.dbg.SetLoggingCallback(messages.append)
60699451b44SJordan Rupprecht        self.handleCmd('log enable lldb script')
607a31130f6STatyana Krasnukha        self.dbg.SetOutputFile(lldb.SBFile(BadIO()))
60899451b44SJordan Rupprecht        self.handleCmd('script 1+1')
60999451b44SJordan Rupprecht        self.assertTrue(any('OH NOE' in msg for msg in messages))
61099451b44SJordan Rupprecht
61199451b44SJordan Rupprecht
61299451b44SJordan Rupprecht    def test_flush(self):
61399451b44SJordan Rupprecht        flushed = MutableBool(False)
61499451b44SJordan Rupprecht        closed = MutableBool(False)
61599451b44SJordan Rupprecht        f = FlushTestIO(flushed, closed)
61699451b44SJordan Rupprecht        self.assertFalse(flushed)
61799451b44SJordan Rupprecht        self.assertFalse(closed)
61899451b44SJordan Rupprecht        sbf = lldb.SBFile(f)
61999451b44SJordan Rupprecht        self.assertFalse(flushed)
62099451b44SJordan Rupprecht        self.assertFalse(closed)
62199451b44SJordan Rupprecht        sbf = None
62299451b44SJordan Rupprecht        self.assertFalse(flushed)
62399451b44SJordan Rupprecht        self.assertTrue(closed)
62499451b44SJordan Rupprecht        self.assertTrue(f.closed)
62599451b44SJordan Rupprecht
62699451b44SJordan Rupprecht        flushed = MutableBool(False)
62799451b44SJordan Rupprecht        closed = MutableBool(False)
62899451b44SJordan Rupprecht        f = FlushTestIO(flushed, closed)
62999451b44SJordan Rupprecht        self.assertFalse(flushed)
63099451b44SJordan Rupprecht        self.assertFalse(closed)
63199451b44SJordan Rupprecht        sbf = lldb.SBFile.Create(f, borrow=True)
63299451b44SJordan Rupprecht        self.assertFalse(flushed)
63399451b44SJordan Rupprecht        self.assertFalse(closed)
63499451b44SJordan Rupprecht        sbf = None
63599451b44SJordan Rupprecht        self.assertTrue(flushed)
63699451b44SJordan Rupprecht        self.assertFalse(closed)
63799451b44SJordan Rupprecht        self.assertFalse(f.closed)
63899451b44SJordan Rupprecht
63999451b44SJordan Rupprecht
64099451b44SJordan Rupprecht    def test_fileno_flush(self):
64199451b44SJordan Rupprecht        with open(self.out_filename, 'w') as f:
64299451b44SJordan Rupprecht            f.write("foo")
64399451b44SJordan Rupprecht            sbf = lldb.SBFile(f)
64499451b44SJordan Rupprecht            sbf.Write(b'bar')
64599451b44SJordan Rupprecht            sbf = None
64699451b44SJordan Rupprecht            self.assertTrue(f.closed)
64799451b44SJordan Rupprecht        with open(self.out_filename, 'r') as f:
64899451b44SJordan Rupprecht            self.assertEqual(f.read(), 'foobar')
64999451b44SJordan Rupprecht
65099451b44SJordan Rupprecht        with open(self.out_filename, 'w+') as f:
65199451b44SJordan Rupprecht            f.write("foo")
65299451b44SJordan Rupprecht            sbf = lldb.SBFile.Create(f, borrow=True)
65399451b44SJordan Rupprecht            sbf.Write(b'bar')
65499451b44SJordan Rupprecht            sbf = None
65599451b44SJordan Rupprecht            self.assertFalse(f.closed)
65699451b44SJordan Rupprecht            f.seek(0)
65799451b44SJordan Rupprecht            self.assertEqual(f.read(), 'foobar')
65899451b44SJordan Rupprecht
65999451b44SJordan Rupprecht
66099451b44SJordan Rupprecht    def test_close(self):
66199451b44SJordan Rupprecht        with open(self.out_filename, 'w') as f:
662a31130f6STatyana Krasnukha            status = self.dbg.SetOutputFile(f)
663*779bbbf2SDave Lee            self.assertSuccess(status)
66499451b44SJordan Rupprecht            self.handleCmd("help help", check=False, collect_result=False)
66599451b44SJordan Rupprecht            # make sure the file wasn't closed early.
66699451b44SJordan Rupprecht            f.write("\nZAP\n")
667a31130f6STatyana Krasnukha            lldb.SBDebugger.Destroy(self.dbg)
66899451b44SJordan Rupprecht            # check that output file was closed when debugger was destroyed.
66999451b44SJordan Rupprecht            with self.assertRaises(ValueError):
67099451b44SJordan Rupprecht                f.write("\nQUUX\n")
67199451b44SJordan Rupprecht        with open(self.out_filename, 'r') as f:
67299451b44SJordan Rupprecht            output = f.read()
67399451b44SJordan Rupprecht            self.assertTrue(re.search(r'Show a list of all debugger commands', output))
67499451b44SJordan Rupprecht            self.assertTrue(re.search(r'ZAP', output))
67599451b44SJordan Rupprecht
67699451b44SJordan Rupprecht
67799451b44SJordan Rupprecht    def test_stdout(self):
67899451b44SJordan Rupprecht        f = io.StringIO()
679a31130f6STatyana Krasnukha        status = self.dbg.SetOutputFile(f)
680*779bbbf2SDave Lee        self.assertSuccess(status)
68199451b44SJordan Rupprecht        self.handleCmd(r"script sys.stdout.write('foobar\n')")
68299451b44SJordan Rupprecht        self.assertEqual(f.getvalue().strip().split(), ["foobar", "7"])
68399451b44SJordan Rupprecht
68499451b44SJordan Rupprecht
68599451b44SJordan Rupprecht    def test_stdout_file(self):
68699451b44SJordan Rupprecht        with open(self.out_filename, 'w') as f:
687a31130f6STatyana Krasnukha            status = self.dbg.SetOutputFile(f)
688*779bbbf2SDave Lee            self.assertSuccess(status)
68999451b44SJordan Rupprecht            self.handleCmd(r"script sys.stdout.write('foobar\n')")
69099451b44SJordan Rupprecht        with open(self.out_filename, 'r') as f:
69199451b44SJordan Rupprecht            # In python2 sys.stdout.write() returns None, which
69299451b44SJordan Rupprecht            # the REPL will ignore, but in python3 it will
69399451b44SJordan Rupprecht            # return the number of bytes written, which the REPL
69499451b44SJordan Rupprecht            # will print out.
69599451b44SJordan Rupprecht            lines = [x for x in f.read().strip().split() if x != "7"]
69699451b44SJordan Rupprecht            self.assertEqual(lines, ["foobar"])
69799451b44SJordan Rupprecht
69899451b44SJordan Rupprecht
69999451b44SJordan Rupprecht    def test_identity(self):
70099451b44SJordan Rupprecht        f = io.StringIO()
70199451b44SJordan Rupprecht        sbf = lldb.SBFile(f)
70299451b44SJordan Rupprecht        self.assertTrue(f is sbf.GetFile())
70399451b44SJordan Rupprecht        sbf.Close()
70499451b44SJordan Rupprecht        self.assertTrue(f.closed)
70599451b44SJordan Rupprecht
70699451b44SJordan Rupprecht        f = io.StringIO()
70799451b44SJordan Rupprecht        sbf = lldb.SBFile.Create(f, borrow=True)
70899451b44SJordan Rupprecht        self.assertTrue(f is sbf.GetFile())
70999451b44SJordan Rupprecht        sbf.Close()
71099451b44SJordan Rupprecht        self.assertFalse(f.closed)
71199451b44SJordan Rupprecht
71299451b44SJordan Rupprecht        with open(self.out_filename, 'w') as f:
71399451b44SJordan Rupprecht            sbf = lldb.SBFile(f)
71499451b44SJordan Rupprecht            self.assertTrue(f is sbf.GetFile())
71599451b44SJordan Rupprecht            sbf.Close()
71699451b44SJordan Rupprecht            self.assertTrue(f.closed)
71799451b44SJordan Rupprecht
71899451b44SJordan Rupprecht        with open(self.out_filename, 'w') as f:
71999451b44SJordan Rupprecht            sbf = lldb.SBFile.Create(f, borrow=True)
72099451b44SJordan Rupprecht            self.assertFalse(f is sbf.GetFile())
72199451b44SJordan Rupprecht            sbf.Write(b"foobar\n")
72299451b44SJordan Rupprecht            self.assertEqual(f.fileno(), sbf.GetFile().fileno())
72399451b44SJordan Rupprecht            sbf.Close()
72499451b44SJordan Rupprecht            self.assertFalse(f.closed)
72599451b44SJordan Rupprecht
72699451b44SJordan Rupprecht        with open(self.out_filename, 'r') as f:
72799451b44SJordan Rupprecht            self.assertEqual("foobar", f.read().strip())
72899451b44SJordan Rupprecht
72999451b44SJordan Rupprecht        with open(self.out_filename, 'wb') as f:
73099451b44SJordan Rupprecht            sbf = lldb.SBFile.Create(f, borrow=True, force_io_methods=True)
73199451b44SJordan Rupprecht            self.assertTrue(f is sbf.GetFile())
73299451b44SJordan Rupprecht            sbf.Write(b"foobar\n")
73399451b44SJordan Rupprecht            self.assertEqual(f.fileno(), sbf.GetFile().fileno())
73499451b44SJordan Rupprecht            sbf.Close()
73599451b44SJordan Rupprecht            self.assertFalse(f.closed)
73699451b44SJordan Rupprecht
73799451b44SJordan Rupprecht        with open(self.out_filename, 'r') as f:
73899451b44SJordan Rupprecht            self.assertEqual("foobar", f.read().strip())
73999451b44SJordan Rupprecht
74099451b44SJordan Rupprecht        with open(self.out_filename, 'wb') as f:
74199451b44SJordan Rupprecht            sbf = lldb.SBFile.Create(f, force_io_methods=True)
74299451b44SJordan Rupprecht            self.assertTrue(f is sbf.GetFile())
74399451b44SJordan Rupprecht            sbf.Write(b"foobar\n")
74499451b44SJordan Rupprecht            self.assertEqual(f.fileno(), sbf.GetFile().fileno())
74599451b44SJordan Rupprecht            sbf.Close()
74699451b44SJordan Rupprecht            self.assertTrue(f.closed)
74799451b44SJordan Rupprecht
74899451b44SJordan Rupprecht        with open(self.out_filename, 'r') as f:
74999451b44SJordan Rupprecht            self.assertEqual("foobar", f.read().strip())
75099451b44SJordan Rupprecht
75199451b44SJordan Rupprecht
75299451b44SJordan Rupprecht    def test_back_and_forth(self):
75399451b44SJordan Rupprecht        with open(self.out_filename, 'w') as f:
75499451b44SJordan Rupprecht            # at each step here we're borrowing the file, so we have to keep
75599451b44SJordan Rupprecht            # them all alive until the end.
75699451b44SJordan Rupprecht            sbf = lldb.SBFile.Create(f, borrow=True)
75799451b44SJordan Rupprecht            def i(sbf):
75899451b44SJordan Rupprecht                for i in range(10):
75999451b44SJordan Rupprecht                    f = sbf.GetFile()
76099451b44SJordan Rupprecht                    self.assertEqual(f.mode, "w")
76199451b44SJordan Rupprecht                    yield f
76299451b44SJordan Rupprecht                    sbf = lldb.SBFile.Create(f, borrow=True)
76399451b44SJordan Rupprecht                    yield sbf
76499451b44SJordan Rupprecht                    sbf.Write(str(i).encode('ascii') + b"\n")
76599451b44SJordan Rupprecht            files = list(i(sbf))
76699451b44SJordan Rupprecht        with open(self.out_filename, 'r') as f:
76799451b44SJordan Rupprecht            self.assertEqual(list(range(10)), list(map(int, f.read().strip().split())))
76899451b44SJordan Rupprecht
76999451b44SJordan Rupprecht
77099451b44SJordan Rupprecht    def test_set_filehandle_none(self):
771a31130f6STatyana Krasnukha        self.assertRaises(Exception, self.dbg.SetOutputFile, None)
772a31130f6STatyana Krasnukha        self.assertRaises(Exception, self.dbg.SetOutputFile, "ham sandwich")
773a31130f6STatyana Krasnukha        self.assertRaises(Exception, self.dbg.SetOutputFileHandle, "ham sandwich")
774a31130f6STatyana Krasnukha        self.assertRaises(Exception, self.dbg.SetInputFile, None)
775a31130f6STatyana Krasnukha        self.assertRaises(Exception, self.dbg.SetInputFile, "ham sandwich")
776a31130f6STatyana Krasnukha        self.assertRaises(Exception, self.dbg.SetInputFileHandle, "ham sandwich")
777a31130f6STatyana Krasnukha        self.assertRaises(Exception, self.dbg.SetErrorFile, None)
778a31130f6STatyana Krasnukha        self.assertRaises(Exception, self.dbg.SetErrorFile, "ham sandwich")
779a31130f6STatyana Krasnukha        self.assertRaises(Exception, self.dbg.SetErrorFileHandle, "ham sandwich")
78099451b44SJordan Rupprecht
78199451b44SJordan Rupprecht        with open(self.out_filename, 'w') as f:
782a31130f6STatyana Krasnukha            status = self.dbg.SetOutputFile(f)
783*779bbbf2SDave Lee            self.assertSuccess(status)
784a31130f6STatyana Krasnukha            status = self.dbg.SetErrorFile(f)
785*779bbbf2SDave Lee            self.assertSuccess(status)
786a31130f6STatyana Krasnukha            self.dbg.SetOutputFileHandle(None, False)
787a31130f6STatyana Krasnukha            self.dbg.SetErrorFileHandle(None, False)
788a31130f6STatyana Krasnukha            sbf = self.dbg.GetOutputFile()
78999451b44SJordan Rupprecht            self.assertEqual(sbf.GetFile().fileno(), 1)
790a31130f6STatyana Krasnukha            sbf = self.dbg.GetErrorFile()
79199451b44SJordan Rupprecht            self.assertEqual(sbf.GetFile().fileno(), 2)
79299451b44SJordan Rupprecht        with open(self.out_filename, 'r') as f:
793a31130f6STatyana Krasnukha            status = self.dbg.SetInputFile(f)
794*779bbbf2SDave Lee            self.assertSuccess(status)
795a31130f6STatyana Krasnukha            self.dbg.SetInputFileHandle(None, False)
796a31130f6STatyana Krasnukha            sbf = self.dbg.GetInputFile()
79799451b44SJordan Rupprecht            self.assertEqual(sbf.GetFile().fileno(), 0)
79899451b44SJordan Rupprecht
79999451b44SJordan Rupprecht
80099451b44SJordan Rupprecht    def test_sbstream(self):
80199451b44SJordan Rupprecht
80299451b44SJordan Rupprecht        with open(self.out_filename, 'w') as f:
80399451b44SJordan Rupprecht            stream = lldb.SBStream()
80499451b44SJordan Rupprecht            stream.RedirectToFile(f)
80599451b44SJordan Rupprecht            stream.Print("zork")
80699451b44SJordan Rupprecht        with open(self.out_filename, 'r') as f:
80799451b44SJordan Rupprecht            self.assertEqual(f.read().strip(), "zork")
80899451b44SJordan Rupprecht
80999451b44SJordan Rupprecht        with open(self.out_filename, 'w') as f:
81099451b44SJordan Rupprecht            stream = lldb.SBStream()
81199451b44SJordan Rupprecht            stream.RedirectToFileHandle(f, True)
81299451b44SJordan Rupprecht            stream.Print("Yendor")
81399451b44SJordan Rupprecht        with open(self.out_filename, 'r') as f:
81499451b44SJordan Rupprecht            self.assertEqual(f.read().strip(), "Yendor")
81599451b44SJordan Rupprecht
81699451b44SJordan Rupprecht        stream = lldb.SBStream()
81799451b44SJordan Rupprecht        f = open(self.out_filename,  'w')
81899451b44SJordan Rupprecht        stream.RedirectToFile(lldb.SBFile.Create(f, borrow=False))
81999451b44SJordan Rupprecht        stream.Print("Frobozz")
82099451b44SJordan Rupprecht        stream = None
82199451b44SJordan Rupprecht        self.assertTrue(f.closed)
82299451b44SJordan Rupprecht        with open(self.out_filename, 'r') as f:
82399451b44SJordan Rupprecht            self.assertEqual(f.read().strip(), "Frobozz")
824f23b829aSLevon Ter-Grigoryan
825f23b829aSLevon Ter-Grigoryan    def test_set_sbstream(self):
826f23b829aSLevon Ter-Grigoryan        with open(self.out_filename, 'w') as outf:
827f23b829aSLevon Ter-Grigoryan            outsbf = lldb.SBFile(outf.fileno(), "w", False)
828f23b829aSLevon Ter-Grigoryan            status = self.dbg.SetOutputFile(outsbf)
829*779bbbf2SDave Lee            self.assertSuccess(status)
830c0e3bb4dSPavel Labath            self.dbg.SetInputString("help apropos\nhelp help\n")
831f23b829aSLevon Ter-Grigoryan
832f23b829aSLevon Ter-Grigoryan            opts = lldb.SBCommandInterpreterRunOptions()
833f23b829aSLevon Ter-Grigoryan            self.dbg.RunCommandInterpreter(True, False, opts, 0, False, False)
834f23b829aSLevon Ter-Grigoryan            self.dbg.GetOutputFile().Flush()
835f23b829aSLevon Ter-Grigoryan
836f23b829aSLevon Ter-Grigoryan        with open(self.out_filename, 'r') as f:
837f23b829aSLevon Ter-Grigoryan            output = f.read()
838c0e3bb4dSPavel Labath            self.assertIn('Show a list of all debugger commands', output)
839c0e3bb4dSPavel Labath            self.assertIn('List debugger commands related to a word', output)
840