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