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 mydir = lldbtest.Base.compute_mydir(__file__) 8499451b44SJordan Rupprecht 85a31130f6STatyana Krasnukha # The way normal tests evaluate debugger commands is 8699451b44SJordan Rupprecht # by using a SBCommandInterpreter directly, which captures 8799451b44SJordan Rupprecht # the output in a result object. For many of tests tests 8899451b44SJordan Rupprecht # we want the debugger to write the output directly to 8999451b44SJordan Rupprecht # its I/O streams like it would have done interactively. 9099451b44SJordan Rupprecht # 9199451b44SJordan Rupprecht # For this reason we also define handleCmd() here, even though 9299451b44SJordan Rupprecht # it is similar to runCmd(). 9399451b44SJordan Rupprecht 9499451b44SJordan Rupprecht def setUp(self): 9599451b44SJordan Rupprecht super(FileHandleTestCase, self).setUp() 9699451b44SJordan Rupprecht self.out_filename = self.getBuildArtifact('output') 9799451b44SJordan Rupprecht self.in_filename = self.getBuildArtifact('input') 9899451b44SJordan Rupprecht 9999451b44SJordan Rupprecht def tearDown(self): 10099451b44SJordan Rupprecht super(FileHandleTestCase, self).tearDown() 10199451b44SJordan Rupprecht for name in (self.out_filename, self.in_filename): 10299451b44SJordan Rupprecht if os.path.exists(name): 10399451b44SJordan Rupprecht os.unlink(name) 10499451b44SJordan Rupprecht 105a31130f6STatyana Krasnukha # Similar to runCmd(), but letting the debugger just print the results 106a31130f6STatyana Krasnukha # instead of collecting them. 10799451b44SJordan Rupprecht def handleCmd(self, cmd, check=True, collect_result=True): 10899451b44SJordan Rupprecht assert not check or collect_result 10999451b44SJordan Rupprecht ret = lldb.SBCommandReturnObject() 11099451b44SJordan Rupprecht if collect_result: 111a31130f6STatyana Krasnukha interpreter = self.dbg.GetCommandInterpreter() 11299451b44SJordan Rupprecht interpreter.HandleCommand(cmd, ret) 11399451b44SJordan Rupprecht else: 114a31130f6STatyana Krasnukha self.dbg.HandleCommand(cmd) 115a31130f6STatyana Krasnukha self.dbg.GetOutputFile().Flush() 116a31130f6STatyana Krasnukha self.dbg.GetErrorFile().Flush() 11799451b44SJordan Rupprecht if collect_result and check: 11899451b44SJordan Rupprecht self.assertTrue(ret.Succeeded()) 11999451b44SJordan Rupprecht return ret.GetOutput() 12099451b44SJordan Rupprecht 12199451b44SJordan Rupprecht 12299451b44SJordan Rupprecht @add_test_categories(['pyapi']) 12399451b44SJordan Rupprecht def test_legacy_file_out_script(self): 12499451b44SJordan Rupprecht with open(self.out_filename, 'w') as f: 125a31130f6STatyana Krasnukha self.dbg.SetOutputFileHandle(f, False) 12699451b44SJordan Rupprecht # scripts print to output even if you capture the results 12799451b44SJordan Rupprecht # I'm not sure I love that behavior, but that's the way 12899451b44SJordan Rupprecht # it's been for a long time. That's why this test works 12999451b44SJordan Rupprecht # even with collect_result=True. 13099451b44SJordan Rupprecht self.handleCmd('script 1+1') 131a31130f6STatyana Krasnukha self.dbg.GetOutputFileHandle().write('FOO\n') 132*7a11cc06STatyana Krasnukha self.dbg.GetOutputFileHandle().flush() 13399451b44SJordan Rupprecht with open(self.out_filename, 'r') as f: 13499451b44SJordan Rupprecht self.assertEqual(readStrippedLines(f), ['2', 'FOO']) 13599451b44SJordan Rupprecht 13699451b44SJordan Rupprecht 13799451b44SJordan Rupprecht @add_test_categories(['pyapi']) 13899451b44SJordan Rupprecht def test_legacy_file_out(self): 13999451b44SJordan Rupprecht with open(self.out_filename, 'w') as f: 140a31130f6STatyana Krasnukha self.dbg.SetOutputFileHandle(f, False) 14199451b44SJordan Rupprecht self.handleCmd('p/x 3735928559', collect_result=False, check=False) 14299451b44SJordan Rupprecht with open(self.out_filename, 'r') as f: 14399451b44SJordan Rupprecht self.assertIn('deadbeef', f.read()) 14499451b44SJordan Rupprecht 14599451b44SJordan Rupprecht @add_test_categories(['pyapi']) 14699451b44SJordan Rupprecht def test_legacy_file_err_with_get(self): 14799451b44SJordan Rupprecht with open(self.out_filename, 'w') as f: 148a31130f6STatyana Krasnukha self.dbg.SetErrorFileHandle(f, False) 14999451b44SJordan Rupprecht self.handleCmd('lolwut', check=False, collect_result=False) 150a31130f6STatyana Krasnukha f2 = self.dbg.GetErrorFileHandle() 15199451b44SJordan Rupprecht f2.write('FOOBAR\n') 15299451b44SJordan Rupprecht f2.flush() 15399451b44SJordan Rupprecht with open(self.out_filename, 'r') as f: 15499451b44SJordan Rupprecht errors = f.read() 15599451b44SJordan Rupprecht self.assertTrue(re.search(r'error:.*lolwut', errors)) 15699451b44SJordan Rupprecht self.assertTrue(re.search(r'FOOBAR', errors)) 15799451b44SJordan Rupprecht 15899451b44SJordan Rupprecht 15999451b44SJordan Rupprecht @add_test_categories(['pyapi']) 16099451b44SJordan Rupprecht def test_legacy_file_err(self): 16199451b44SJordan Rupprecht with open(self.out_filename, 'w') as f: 162a31130f6STatyana Krasnukha self.dbg.SetErrorFileHandle(f, False) 16399451b44SJordan Rupprecht self.handleCmd('lol', check=False, collect_result=False) 16499451b44SJordan Rupprecht with open(self.out_filename, 'r') as f: 16599451b44SJordan Rupprecht self.assertIn("is not a valid command", f.read()) 16699451b44SJordan Rupprecht 16799451b44SJordan Rupprecht 16899451b44SJordan Rupprecht @add_test_categories(['pyapi']) 16999451b44SJordan Rupprecht def test_legacy_file_error(self): 17099451b44SJordan Rupprecht with open(self.out_filename, 'w') as f: 171a31130f6STatyana Krasnukha self.dbg.SetErrorFileHandle(f, False) 17299451b44SJordan Rupprecht self.handleCmd('lolwut', check=False, collect_result=False) 17399451b44SJordan Rupprecht with open(self.out_filename, 'r') as f: 17499451b44SJordan Rupprecht errors = f.read() 17599451b44SJordan Rupprecht self.assertTrue(re.search(r'error:.*lolwut', errors)) 17699451b44SJordan Rupprecht 17799451b44SJordan Rupprecht @add_test_categories(['pyapi']) 17899451b44SJordan Rupprecht def test_sbfile_type_errors(self): 17999451b44SJordan Rupprecht sbf = lldb.SBFile() 18099451b44SJordan Rupprecht self.assertRaises(Exception, sbf.Write, None) 18199451b44SJordan Rupprecht self.assertRaises(Exception, sbf.Read, None) 18299451b44SJordan Rupprecht self.assertRaises(Exception, sbf.Read, b'this bytes is not mutable') 18399451b44SJordan Rupprecht self.assertRaises(Exception, sbf.Write, u"ham sandwich") 18499451b44SJordan Rupprecht self.assertRaises(Exception, sbf.Read, u"ham sandwich") 18599451b44SJordan Rupprecht 18699451b44SJordan Rupprecht 18799451b44SJordan Rupprecht @add_test_categories(['pyapi']) 18899451b44SJordan Rupprecht def test_sbfile_write_fileno(self): 18999451b44SJordan Rupprecht with open(self.out_filename, 'w') as f: 19099451b44SJordan Rupprecht sbf = lldb.SBFile(f.fileno(), "w", False) 19199451b44SJordan Rupprecht self.assertTrue(sbf.IsValid()) 19299451b44SJordan Rupprecht e, n = sbf.Write(b'FOO\nBAR') 19399451b44SJordan Rupprecht self.assertTrue(e.Success()) 19499451b44SJordan Rupprecht self.assertEqual(n, 7) 19599451b44SJordan Rupprecht sbf.Close() 19699451b44SJordan Rupprecht self.assertFalse(sbf.IsValid()) 19799451b44SJordan Rupprecht with open(self.out_filename, 'r') as f: 19899451b44SJordan Rupprecht self.assertEqual(readStrippedLines(f), ['FOO', 'BAR']) 19999451b44SJordan Rupprecht 20099451b44SJordan Rupprecht 20199451b44SJordan Rupprecht @add_test_categories(['pyapi']) 20299451b44SJordan Rupprecht def test_sbfile_write(self): 20399451b44SJordan Rupprecht with open(self.out_filename, 'w') as f: 20499451b44SJordan Rupprecht sbf = lldb.SBFile(f) 20599451b44SJordan Rupprecht e, n = sbf.Write(b'FOO\n') 20699451b44SJordan Rupprecht self.assertTrue(e.Success()) 20799451b44SJordan Rupprecht self.assertEqual(n, 4) 20899451b44SJordan Rupprecht sbf.Close() 20999451b44SJordan Rupprecht self.assertTrue(f.closed) 21099451b44SJordan Rupprecht with open(self.out_filename, 'r') as f: 21199451b44SJordan Rupprecht self.assertEqual(f.read().strip(), 'FOO') 21299451b44SJordan Rupprecht 21399451b44SJordan Rupprecht 21499451b44SJordan Rupprecht @add_test_categories(['pyapi']) 21599451b44SJordan Rupprecht def test_sbfile_read_fileno(self): 21699451b44SJordan Rupprecht with open(self.out_filename, 'w') as f: 21799451b44SJordan Rupprecht f.write('FOO') 21899451b44SJordan Rupprecht 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) 22399451b44SJordan Rupprecht self.assertTrue(e.Success()) 22499451b44SJordan Rupprecht self.assertEqual(buffer[:n], b'FOO') 22599451b44SJordan Rupprecht 22699451b44SJordan Rupprecht 22799451b44SJordan Rupprecht @add_test_categories(['pyapi']) 22899451b44SJordan Rupprecht def test_sbfile_read(self): 22999451b44SJordan Rupprecht with open(self.out_filename, 'w') as f: 23099451b44SJordan Rupprecht f.write('foo') 23199451b44SJordan Rupprecht with open(self.out_filename, 'r') as f: 23299451b44SJordan Rupprecht sbf = lldb.SBFile(f) 23399451b44SJordan Rupprecht buf = bytearray(100) 23499451b44SJordan Rupprecht e, n = sbf.Read(buf) 23599451b44SJordan Rupprecht self.assertTrue(e.Success()) 23699451b44SJordan Rupprecht self.assertEqual(n, 3) 23799451b44SJordan Rupprecht self.assertEqual(buf[:n], b'foo') 23899451b44SJordan Rupprecht sbf.Close() 23999451b44SJordan Rupprecht self.assertTrue(f.closed) 24099451b44SJordan Rupprecht 24199451b44SJordan Rupprecht 24299451b44SJordan Rupprecht @add_test_categories(['pyapi']) 24399451b44SJordan Rupprecht def test_fileno_out(self): 24499451b44SJordan Rupprecht with open(self.out_filename, 'w') as f: 24599451b44SJordan Rupprecht sbf = lldb.SBFile(f.fileno(), "w", False) 246a31130f6STatyana Krasnukha status = self.dbg.SetOutputFile(sbf) 24799451b44SJordan Rupprecht self.assertTrue(status.Success()) 24899451b44SJordan Rupprecht self.handleCmd('script 1+2') 249a31130f6STatyana Krasnukha self.dbg.GetOutputFile().Write(b'quux') 250*7a11cc06STatyana Krasnukha self.dbg.GetOutputFile().Flush() 25199451b44SJordan Rupprecht 25299451b44SJordan Rupprecht with open(self.out_filename, 'r') as f: 25399451b44SJordan Rupprecht self.assertEqual(readStrippedLines(f), ['3', 'quux']) 25499451b44SJordan Rupprecht 25599451b44SJordan Rupprecht 25699451b44SJordan Rupprecht @add_test_categories(['pyapi']) 25799451b44SJordan Rupprecht def test_fileno_help(self): 25899451b44SJordan Rupprecht with open(self.out_filename, 'w') as f: 25999451b44SJordan Rupprecht sbf = lldb.SBFile(f.fileno(), "w", False) 260a31130f6STatyana Krasnukha status = self.dbg.SetOutputFile(sbf) 26199451b44SJordan Rupprecht self.assertTrue(status.Success()) 26299451b44SJordan Rupprecht self.handleCmd("help help", collect_result=False, check=False) 26399451b44SJordan Rupprecht with open(self.out_filename, 'r') as f: 26499451b44SJordan Rupprecht self.assertTrue(re.search(r'Show a list of all debugger commands', f.read())) 26599451b44SJordan Rupprecht 26699451b44SJordan Rupprecht 26799451b44SJordan Rupprecht @add_test_categories(['pyapi']) 26899451b44SJordan Rupprecht def test_help(self): 26999451b44SJordan Rupprecht with open(self.out_filename, 'w') as f: 270a31130f6STatyana Krasnukha status = self.dbg.SetOutputFile(lldb.SBFile(f)) 27199451b44SJordan Rupprecht self.assertTrue(status.Success()) 27299451b44SJordan Rupprecht self.handleCmd("help help", check=False, collect_result=False) 27399451b44SJordan Rupprecht with open(self.out_filename, 'r') as f: 27499451b44SJordan Rupprecht self.assertIn('Show a list of all debugger commands', f.read()) 27599451b44SJordan Rupprecht 27699451b44SJordan Rupprecht 27799451b44SJordan Rupprecht @add_test_categories(['pyapi']) 27899451b44SJordan Rupprecht def test_immediate(self): 27999451b44SJordan Rupprecht with open(self.out_filename, 'w') as f: 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 with open(self.out_filename, 'r') as f: 28899451b44SJordan Rupprecht output = f.read() 28999451b44SJordan Rupprecht self.assertTrue(re.search(r'Show a list of all debugger commands', output)) 29099451b44SJordan Rupprecht self.assertTrue(re.search(r'QUUX', output)) 29199451b44SJordan Rupprecht 29299451b44SJordan Rupprecht 29399451b44SJordan Rupprecht @add_test_categories(['pyapi']) 29499451b44SJordan Rupprecht @skipIf(py_version=['<', (3,)]) 29599451b44SJordan Rupprecht def test_immediate_string(self): 29699451b44SJordan Rupprecht f = io.StringIO() 29799451b44SJordan Rupprecht ret = lldb.SBCommandReturnObject() 29899451b44SJordan Rupprecht ret.SetImmediateOutputFile(f) 299a31130f6STatyana Krasnukha interpreter = self.dbg.GetCommandInterpreter() 30099451b44SJordan Rupprecht interpreter.HandleCommand("help help", ret) 30199451b44SJordan Rupprecht # make sure the file wasn't closed early. 30299451b44SJordan Rupprecht f.write("\nQUUX\n") 30399451b44SJordan Rupprecht ret = None # call destructor and flush streams 30499451b44SJordan Rupprecht output = f.getvalue() 30599451b44SJordan Rupprecht self.assertTrue(re.search(r'Show a list of all debugger commands', output)) 30699451b44SJordan Rupprecht self.assertTrue(re.search(r'QUUX', output)) 30799451b44SJordan Rupprecht 30899451b44SJordan Rupprecht 30999451b44SJordan Rupprecht @add_test_categories(['pyapi']) 31099451b44SJordan Rupprecht @skipIf(py_version=['<', (3,)]) 31199451b44SJordan Rupprecht def test_immediate_sbfile_string(self): 31299451b44SJordan Rupprecht f = io.StringIO() 31399451b44SJordan Rupprecht ret = lldb.SBCommandReturnObject() 31499451b44SJordan Rupprecht ret.SetImmediateOutputFile(lldb.SBFile(f)) 315a31130f6STatyana Krasnukha interpreter = self.dbg.GetCommandInterpreter() 31699451b44SJordan Rupprecht interpreter.HandleCommand("help help", ret) 31799451b44SJordan Rupprecht output = f.getvalue() 31899451b44SJordan Rupprecht ret = None # call destructor and flush streams 31999451b44SJordan Rupprecht # sbfile default constructor doesn't borrow the file 32099451b44SJordan Rupprecht self.assertTrue(f.closed) 32199451b44SJordan Rupprecht self.assertTrue(re.search(r'Show a list of all debugger commands', output)) 32299451b44SJordan Rupprecht 32399451b44SJordan Rupprecht 32499451b44SJordan Rupprecht @add_test_categories(['pyapi']) 32599451b44SJordan Rupprecht def test_fileno_inout(self): 32699451b44SJordan Rupprecht with open(self.in_filename, 'w') as f: 32799451b44SJordan Rupprecht f.write("help help\n") 32899451b44SJordan Rupprecht 32999451b44SJordan Rupprecht with open(self.out_filename, 'w') as outf, open(self.in_filename, 'r') as inf: 33099451b44SJordan Rupprecht 33199451b44SJordan Rupprecht outsbf = lldb.SBFile(outf.fileno(), "w", False) 332a31130f6STatyana Krasnukha status = self.dbg.SetOutputFile(outsbf) 33399451b44SJordan Rupprecht self.assertTrue(status.Success()) 33499451b44SJordan Rupprecht 33599451b44SJordan Rupprecht insbf = lldb.SBFile(inf.fileno(), "r", False) 336a31130f6STatyana Krasnukha status = self.dbg.SetInputFile(insbf) 33799451b44SJordan Rupprecht self.assertTrue(status.Success()) 33899451b44SJordan Rupprecht 33999451b44SJordan Rupprecht opts = lldb.SBCommandInterpreterRunOptions() 340a31130f6STatyana Krasnukha self.dbg.RunCommandInterpreter(True, False, opts, 0, False, False) 341a31130f6STatyana Krasnukha self.dbg.GetOutputFile().Flush() 34299451b44SJordan Rupprecht 34399451b44SJordan Rupprecht with open(self.out_filename, 'r') as f: 34499451b44SJordan Rupprecht self.assertTrue(re.search(r'Show a list of all debugger commands', f.read())) 34599451b44SJordan Rupprecht 34699451b44SJordan Rupprecht 34799451b44SJordan Rupprecht @add_test_categories(['pyapi']) 34899451b44SJordan Rupprecht def test_inout(self): 34999451b44SJordan Rupprecht with open(self.in_filename, 'w') as f: 35099451b44SJordan Rupprecht f.write("help help\n") 35199451b44SJordan Rupprecht with open(self.out_filename, 'w') as outf, \ 35299451b44SJordan Rupprecht open(self.in_filename, 'r') as inf: 353a31130f6STatyana Krasnukha status = self.dbg.SetOutputFile(lldb.SBFile(outf)) 35499451b44SJordan Rupprecht self.assertTrue(status.Success()) 355a31130f6STatyana Krasnukha status = self.dbg.SetInputFile(lldb.SBFile(inf)) 35699451b44SJordan Rupprecht self.assertTrue(status.Success()) 35799451b44SJordan Rupprecht opts = lldb.SBCommandInterpreterRunOptions() 358a31130f6STatyana Krasnukha self.dbg.RunCommandInterpreter(True, False, opts, 0, False, False) 359a31130f6STatyana Krasnukha self.dbg.GetOutputFile().Flush() 36099451b44SJordan Rupprecht with open(self.out_filename, 'r') as f: 36199451b44SJordan Rupprecht output = f.read() 36299451b44SJordan Rupprecht self.assertIn('Show a list of all debugger commands', output) 36399451b44SJordan Rupprecht 36499451b44SJordan Rupprecht 36599451b44SJordan Rupprecht @add_test_categories(['pyapi']) 36699451b44SJordan Rupprecht def test_binary_inout(self): 36799451b44SJordan Rupprecht with open(self.in_filename, 'w') as f: 36899451b44SJordan Rupprecht f.write("help help\n") 36999451b44SJordan Rupprecht with open(self.out_filename, 'wb') as outf, \ 37099451b44SJordan Rupprecht open(self.in_filename, 'rb') as inf: 371a31130f6STatyana Krasnukha status = self.dbg.SetOutputFile(lldb.SBFile(outf)) 37299451b44SJordan Rupprecht self.assertTrue(status.Success()) 373a31130f6STatyana Krasnukha status = self.dbg.SetInputFile(lldb.SBFile(inf)) 37499451b44SJordan Rupprecht self.assertTrue(status.Success()) 37599451b44SJordan Rupprecht opts = lldb.SBCommandInterpreterRunOptions() 376a31130f6STatyana Krasnukha self.dbg.RunCommandInterpreter(True, False, opts, 0, False, False) 377a31130f6STatyana Krasnukha self.dbg.GetOutputFile().Flush() 37899451b44SJordan Rupprecht with open(self.out_filename, 'r') as f: 37999451b44SJordan Rupprecht output = f.read() 38099451b44SJordan Rupprecht self.assertIn('Show a list of all debugger commands', output) 38199451b44SJordan Rupprecht 38299451b44SJordan Rupprecht 38399451b44SJordan Rupprecht @add_test_categories(['pyapi']) 38499451b44SJordan Rupprecht @skipIf(py_version=['<', (3,)]) 38599451b44SJordan Rupprecht def test_string_inout(self): 38699451b44SJordan Rupprecht inf = io.StringIO("help help\np/x ~0\n") 38799451b44SJordan Rupprecht outf = io.StringIO() 388a31130f6STatyana Krasnukha status = self.dbg.SetOutputFile(lldb.SBFile(outf)) 38999451b44SJordan Rupprecht self.assertTrue(status.Success()) 390a31130f6STatyana Krasnukha status = self.dbg.SetInputFile(lldb.SBFile(inf)) 39199451b44SJordan Rupprecht self.assertTrue(status.Success()) 39299451b44SJordan Rupprecht opts = lldb.SBCommandInterpreterRunOptions() 393a31130f6STatyana Krasnukha self.dbg.RunCommandInterpreter(True, False, opts, 0, False, False) 394a31130f6STatyana Krasnukha self.dbg.GetOutputFile().Flush() 39599451b44SJordan Rupprecht output = outf.getvalue() 39699451b44SJordan Rupprecht self.assertIn('Show a list of all debugger commands', output) 39799451b44SJordan Rupprecht self.assertIn('0xfff', output) 39899451b44SJordan Rupprecht 39999451b44SJordan Rupprecht 40099451b44SJordan Rupprecht @add_test_categories(['pyapi']) 40199451b44SJordan Rupprecht @skipIf(py_version=['<', (3,)]) 40299451b44SJordan Rupprecht def test_bytes_inout(self): 40399451b44SJordan Rupprecht inf = io.BytesIO(b"help help\nhelp b\n") 40499451b44SJordan Rupprecht outf = io.BytesIO() 405a31130f6STatyana Krasnukha status = self.dbg.SetOutputFile(lldb.SBFile(outf)) 40699451b44SJordan Rupprecht self.assertTrue(status.Success()) 407a31130f6STatyana Krasnukha status = self.dbg.SetInputFile(lldb.SBFile(inf)) 40899451b44SJordan Rupprecht self.assertTrue(status.Success()) 40999451b44SJordan Rupprecht opts = lldb.SBCommandInterpreterRunOptions() 410a31130f6STatyana Krasnukha self.dbg.RunCommandInterpreter(True, False, opts, 0, False, False) 411a31130f6STatyana Krasnukha self.dbg.GetOutputFile().Flush() 41299451b44SJordan Rupprecht output = outf.getvalue() 41399451b44SJordan Rupprecht self.assertIn(b'Show a list of all debugger commands', output) 41499451b44SJordan Rupprecht self.assertIn(b'Set a breakpoint', output) 41599451b44SJordan Rupprecht 41699451b44SJordan Rupprecht 41799451b44SJordan Rupprecht @add_test_categories(['pyapi']) 41899451b44SJordan Rupprecht def test_fileno_error(self): 41999451b44SJordan Rupprecht with open(self.out_filename, 'w') as f: 42099451b44SJordan Rupprecht 42199451b44SJordan Rupprecht sbf = lldb.SBFile(f.fileno(), 'w', False) 422a31130f6STatyana Krasnukha status = self.dbg.SetErrorFile(sbf) 42399451b44SJordan Rupprecht self.assertTrue(status.Success()) 42499451b44SJordan Rupprecht 42599451b44SJordan Rupprecht self.handleCmd('lolwut', check=False, collect_result=False) 42699451b44SJordan Rupprecht 427a31130f6STatyana Krasnukha self.dbg.GetErrorFile().Write(b'\nzork\n') 42899451b44SJordan Rupprecht 42999451b44SJordan Rupprecht with open(self.out_filename, 'r') as f: 43099451b44SJordan Rupprecht errors = f.read() 43199451b44SJordan Rupprecht self.assertTrue(re.search(r'error:.*lolwut', errors)) 43299451b44SJordan Rupprecht self.assertTrue(re.search(r'zork', errors)) 43399451b44SJordan Rupprecht 43499451b44SJordan Rupprecht 43599451b44SJordan Rupprecht @add_test_categories(['pyapi']) 43699451b44SJordan Rupprecht def test_replace_stdout(self): 43799451b44SJordan Rupprecht f = io.StringIO() 43899451b44SJordan Rupprecht with replace_stdout(f): 43999451b44SJordan Rupprecht self.assertEqual(sys.stdout, f) 44099451b44SJordan Rupprecht self.handleCmd('script sys.stdout.write("lol")', 44199451b44SJordan Rupprecht collect_result=False, check=False) 44299451b44SJordan Rupprecht self.assertEqual(sys.stdout, f) 44399451b44SJordan Rupprecht 44499451b44SJordan Rupprecht 44599451b44SJordan Rupprecht @add_test_categories(['pyapi']) 44699451b44SJordan Rupprecht def test_replace_stdout_with_nonfile(self): 44799451b44SJordan Rupprecht f = io.StringIO() 44899451b44SJordan Rupprecht with replace_stdout(f): 44999451b44SJordan Rupprecht class Nothing(): 45099451b44SJordan Rupprecht pass 45199451b44SJordan Rupprecht with replace_stdout(Nothing): 45299451b44SJordan Rupprecht self.assertEqual(sys.stdout, Nothing) 45399451b44SJordan Rupprecht self.handleCmd('script sys.stdout.write("lol")', 45499451b44SJordan Rupprecht check=False, collect_result=False) 45599451b44SJordan Rupprecht self.assertEqual(sys.stdout, Nothing) 45699451b44SJordan Rupprecht sys.stdout.write(u"FOO") 45799451b44SJordan Rupprecht self.assertEqual(f.getvalue(), "FOO") 45899451b44SJordan Rupprecht 45999451b44SJordan Rupprecht 46099451b44SJordan Rupprecht @add_test_categories(['pyapi']) 46199451b44SJordan Rupprecht def test_sbfile_write_borrowed(self): 46299451b44SJordan Rupprecht with open(self.out_filename, 'w') as f: 46399451b44SJordan Rupprecht sbf = lldb.SBFile.Create(f, borrow=True) 46499451b44SJordan Rupprecht e, n = sbf.Write(b'FOO') 46599451b44SJordan Rupprecht self.assertTrue(e.Success()) 46699451b44SJordan Rupprecht self.assertEqual(n, 3) 46799451b44SJordan Rupprecht sbf.Close() 46899451b44SJordan Rupprecht self.assertFalse(f.closed) 46999451b44SJordan Rupprecht f.write('BAR\n') 47099451b44SJordan Rupprecht with open(self.out_filename, 'r') as f: 47199451b44SJordan Rupprecht self.assertEqual(f.read().strip(), 'FOOBAR') 47299451b44SJordan Rupprecht 47399451b44SJordan Rupprecht 47499451b44SJordan Rupprecht 47599451b44SJordan Rupprecht @add_test_categories(['pyapi']) 47699451b44SJordan Rupprecht @skipIf(py_version=['<', (3,)]) 47799451b44SJordan Rupprecht def test_sbfile_write_forced(self): 47899451b44SJordan Rupprecht with open(self.out_filename, 'w') as f: 47999451b44SJordan Rupprecht written = MutableBool(False) 48099451b44SJordan Rupprecht orig_write = f.write 48199451b44SJordan Rupprecht def mywrite(x): 48299451b44SJordan Rupprecht written.set(True) 48399451b44SJordan Rupprecht return orig_write(x) 48499451b44SJordan Rupprecht f.write = mywrite 48599451b44SJordan Rupprecht sbf = lldb.SBFile.Create(f, force_io_methods=True) 48699451b44SJordan Rupprecht e, n = sbf.Write(b'FOO') 48799451b44SJordan Rupprecht self.assertTrue(written) 48899451b44SJordan Rupprecht self.assertTrue(e.Success()) 48999451b44SJordan Rupprecht self.assertEqual(n, 3) 49099451b44SJordan Rupprecht sbf.Close() 49199451b44SJordan Rupprecht self.assertTrue(f.closed) 49299451b44SJordan Rupprecht with open(self.out_filename, 'r') as f: 49399451b44SJordan Rupprecht self.assertEqual(f.read().strip(), 'FOO') 49499451b44SJordan Rupprecht 49599451b44SJordan Rupprecht 49699451b44SJordan Rupprecht @add_test_categories(['pyapi']) 49799451b44SJordan Rupprecht @skipIf(py_version=['<', (3,)]) 49899451b44SJordan Rupprecht def test_sbfile_write_forced_borrowed(self): 49999451b44SJordan Rupprecht with open(self.out_filename, 'w') as f: 50099451b44SJordan Rupprecht written = MutableBool(False) 50199451b44SJordan Rupprecht orig_write = f.write 50299451b44SJordan Rupprecht def mywrite(x): 50399451b44SJordan Rupprecht written.set(True) 50499451b44SJordan Rupprecht return orig_write(x) 50599451b44SJordan Rupprecht f.write = mywrite 50699451b44SJordan Rupprecht sbf = lldb.SBFile.Create(f, borrow=True, force_io_methods=True) 50799451b44SJordan Rupprecht e, n = sbf.Write(b'FOO') 50899451b44SJordan Rupprecht self.assertTrue(written) 50999451b44SJordan Rupprecht self.assertTrue(e.Success()) 51099451b44SJordan Rupprecht self.assertEqual(n, 3) 51199451b44SJordan Rupprecht sbf.Close() 51299451b44SJordan Rupprecht self.assertFalse(f.closed) 51399451b44SJordan Rupprecht with open(self.out_filename, 'r') as f: 51499451b44SJordan Rupprecht self.assertEqual(f.read().strip(), 'FOO') 51599451b44SJordan Rupprecht 51699451b44SJordan Rupprecht 51799451b44SJordan Rupprecht @add_test_categories(['pyapi']) 51899451b44SJordan Rupprecht @skipIf(py_version=['<', (3,)]) 51999451b44SJordan Rupprecht def test_sbfile_write_string(self): 52099451b44SJordan Rupprecht f = io.StringIO() 52199451b44SJordan Rupprecht sbf = lldb.SBFile(f) 52299451b44SJordan Rupprecht e, n = sbf.Write(b'FOO') 52399451b44SJordan Rupprecht self.assertEqual(f.getvalue().strip(), "FOO") 52499451b44SJordan Rupprecht self.assertTrue(e.Success()) 52599451b44SJordan Rupprecht self.assertEqual(n, 3) 52699451b44SJordan Rupprecht sbf.Close() 52799451b44SJordan Rupprecht self.assertTrue(f.closed) 52899451b44SJordan Rupprecht 52999451b44SJordan Rupprecht 53099451b44SJordan Rupprecht @add_test_categories(['pyapi']) 53199451b44SJordan Rupprecht @skipIf(py_version=['<', (3,)]) 53299451b44SJordan Rupprecht def test_string_out(self): 53399451b44SJordan Rupprecht f = io.StringIO() 534a31130f6STatyana Krasnukha status = self.dbg.SetOutputFile(f) 53599451b44SJordan Rupprecht self.assertTrue(status.Success()) 53699451b44SJordan Rupprecht self.handleCmd("script 'foobar'") 53799451b44SJordan Rupprecht self.assertEqual(f.getvalue().strip(), "'foobar'") 53899451b44SJordan Rupprecht 53999451b44SJordan Rupprecht 54099451b44SJordan Rupprecht @add_test_categories(['pyapi']) 54199451b44SJordan Rupprecht @skipIf(py_version=['<', (3,)]) 54299451b44SJordan Rupprecht def test_string_error(self): 54399451b44SJordan Rupprecht f = io.StringIO() 544a31130f6STatyana Krasnukha status = self.dbg.SetErrorFile(f) 54599451b44SJordan Rupprecht self.assertTrue(status.Success()) 54699451b44SJordan Rupprecht self.handleCmd('lolwut', check=False, collect_result=False) 54799451b44SJordan Rupprecht errors = f.getvalue() 54899451b44SJordan Rupprecht self.assertTrue(re.search(r'error:.*lolwut', errors)) 54999451b44SJordan Rupprecht 55099451b44SJordan Rupprecht 55199451b44SJordan Rupprecht @add_test_categories(['pyapi']) 55299451b44SJordan Rupprecht @skipIf(py_version=['<', (3,)]) 55399451b44SJordan Rupprecht def test_sbfile_write_bytes(self): 55499451b44SJordan Rupprecht f = io.BytesIO() 55599451b44SJordan Rupprecht sbf = lldb.SBFile(f) 55699451b44SJordan Rupprecht e, n = sbf.Write(b'FOO') 55799451b44SJordan Rupprecht self.assertEqual(f.getvalue().strip(), b"FOO") 55899451b44SJordan Rupprecht self.assertTrue(e.Success()) 55999451b44SJordan Rupprecht self.assertEqual(n, 3) 56099451b44SJordan Rupprecht sbf.Close() 56199451b44SJordan Rupprecht self.assertTrue(f.closed) 56299451b44SJordan Rupprecht 56399451b44SJordan Rupprecht @add_test_categories(['pyapi']) 56499451b44SJordan Rupprecht @skipIf(py_version=['<', (3,)]) 56599451b44SJordan Rupprecht def test_sbfile_read_string(self): 56699451b44SJordan Rupprecht f = io.StringIO('zork') 56799451b44SJordan Rupprecht sbf = lldb.SBFile(f) 56899451b44SJordan Rupprecht buf = bytearray(100) 56999451b44SJordan Rupprecht e, n = sbf.Read(buf) 57099451b44SJordan Rupprecht self.assertTrue(e.Success()) 57199451b44SJordan Rupprecht self.assertEqual(buf[:n], b'zork') 57299451b44SJordan Rupprecht 57399451b44SJordan Rupprecht 57499451b44SJordan Rupprecht @add_test_categories(['pyapi']) 57599451b44SJordan Rupprecht @skipIf(py_version=['<', (3,)]) 57699451b44SJordan Rupprecht def test_sbfile_read_string_one_byte(self): 57799451b44SJordan Rupprecht f = io.StringIO('z') 57899451b44SJordan Rupprecht sbf = lldb.SBFile(f) 57999451b44SJordan Rupprecht buf = bytearray(1) 58099451b44SJordan Rupprecht e, n = sbf.Read(buf) 58199451b44SJordan Rupprecht self.assertTrue(e.Fail()) 58299451b44SJordan Rupprecht self.assertEqual(n, 0) 58399451b44SJordan Rupprecht self.assertEqual(e.GetCString(), "can't read less than 6 bytes from a utf8 text stream") 58499451b44SJordan Rupprecht 58599451b44SJordan Rupprecht 58699451b44SJordan Rupprecht @add_test_categories(['pyapi']) 58799451b44SJordan Rupprecht @skipIf(py_version=['<', (3,)]) 58899451b44SJordan Rupprecht def test_sbfile_read_bytes(self): 58999451b44SJordan Rupprecht f = io.BytesIO(b'zork') 59099451b44SJordan Rupprecht sbf = lldb.SBFile(f) 59199451b44SJordan Rupprecht buf = bytearray(100) 59299451b44SJordan Rupprecht e, n = sbf.Read(buf) 59399451b44SJordan Rupprecht self.assertTrue(e.Success()) 59499451b44SJordan Rupprecht self.assertEqual(buf[:n], b'zork') 59599451b44SJordan Rupprecht 59699451b44SJordan Rupprecht 59799451b44SJordan Rupprecht @add_test_categories(['pyapi']) 59899451b44SJordan Rupprecht @skipIf(py_version=['<', (3,)]) 59999451b44SJordan Rupprecht def test_sbfile_out(self): 60099451b44SJordan Rupprecht with open(self.out_filename, 'w') as f: 60199451b44SJordan Rupprecht sbf = lldb.SBFile(f) 602a31130f6STatyana Krasnukha status = self.dbg.SetOutputFile(sbf) 60399451b44SJordan Rupprecht self.assertTrue(status.Success()) 60499451b44SJordan Rupprecht self.handleCmd('script 2+2') 60599451b44SJordan Rupprecht with open(self.out_filename, 'r') as f: 60699451b44SJordan Rupprecht self.assertEqual(f.read().strip(), '4') 60799451b44SJordan Rupprecht 60899451b44SJordan Rupprecht 60999451b44SJordan Rupprecht @add_test_categories(['pyapi']) 61099451b44SJordan Rupprecht @skipIf(py_version=['<', (3,)]) 61199451b44SJordan Rupprecht def test_file_out(self): 61299451b44SJordan Rupprecht with open(self.out_filename, 'w') as f: 613a31130f6STatyana Krasnukha status = self.dbg.SetOutputFile(f) 61499451b44SJordan Rupprecht self.assertTrue(status.Success()) 61599451b44SJordan Rupprecht self.handleCmd('script 2+2') 61699451b44SJordan Rupprecht with open(self.out_filename, 'r') as f: 61799451b44SJordan Rupprecht self.assertEqual(f.read().strip(), '4') 61899451b44SJordan Rupprecht 61999451b44SJordan Rupprecht 62099451b44SJordan Rupprecht @add_test_categories(['pyapi']) 62199451b44SJordan Rupprecht def test_sbfile_error(self): 62299451b44SJordan Rupprecht with open(self.out_filename, 'w') as f: 62399451b44SJordan Rupprecht sbf = lldb.SBFile(f) 624a31130f6STatyana Krasnukha status = self.dbg.SetErrorFile(sbf) 62599451b44SJordan Rupprecht self.assertTrue(status.Success()) 62699451b44SJordan Rupprecht self.handleCmd('lolwut', check=False, collect_result=False) 62799451b44SJordan Rupprecht with open(self.out_filename, 'r') as f: 62899451b44SJordan Rupprecht errors = f.read() 62999451b44SJordan Rupprecht self.assertTrue(re.search(r'error:.*lolwut', errors)) 63099451b44SJordan Rupprecht 63199451b44SJordan Rupprecht 63299451b44SJordan Rupprecht @add_test_categories(['pyapi']) 63399451b44SJordan Rupprecht def test_file_error(self): 63499451b44SJordan Rupprecht with open(self.out_filename, 'w') as f: 635a31130f6STatyana Krasnukha status = self.dbg.SetErrorFile(f) 63699451b44SJordan Rupprecht self.assertTrue(status.Success()) 63799451b44SJordan Rupprecht self.handleCmd('lolwut', check=False, collect_result=False) 63899451b44SJordan Rupprecht with open(self.out_filename, 'r') as f: 63999451b44SJordan Rupprecht errors = f.read() 64099451b44SJordan Rupprecht self.assertTrue(re.search(r'error:.*lolwut', errors)) 64199451b44SJordan Rupprecht 64299451b44SJordan Rupprecht 64399451b44SJordan Rupprecht @add_test_categories(['pyapi']) 64499451b44SJordan Rupprecht def test_exceptions(self): 64599451b44SJordan Rupprecht self.assertRaises(Exception, lldb.SBFile, None) 64699451b44SJordan Rupprecht self.assertRaises(Exception, lldb.SBFile, "ham sandwich") 64799451b44SJordan Rupprecht if sys.version_info[0] < 3: 64899451b44SJordan Rupprecht self.assertRaises(Exception, lldb.SBFile, ReallyBadIO()) 64999451b44SJordan Rupprecht else: 65099451b44SJordan Rupprecht self.assertRaises(OhNoe, lldb.SBFile, ReallyBadIO()) 65199451b44SJordan Rupprecht error, n = lldb.SBFile(BadIO()).Write(b"FOO") 65299451b44SJordan Rupprecht self.assertEqual(n, 0) 65399451b44SJordan Rupprecht self.assertTrue(error.Fail()) 65499451b44SJordan Rupprecht self.assertIn('OH NOE', error.GetCString()) 65599451b44SJordan Rupprecht error, n = lldb.SBFile(BadIO()).Read(bytearray(100)) 65699451b44SJordan Rupprecht self.assertEqual(n, 0) 65799451b44SJordan Rupprecht self.assertTrue(error.Fail()) 65899451b44SJordan Rupprecht self.assertIn('OH NOE', error.GetCString()) 65999451b44SJordan Rupprecht 66099451b44SJordan Rupprecht 66199451b44SJordan Rupprecht @add_test_categories(['pyapi']) 66299451b44SJordan Rupprecht @skipIf(py_version=['<', (3,)]) 66399451b44SJordan Rupprecht def test_exceptions_logged(self): 66499451b44SJordan Rupprecht messages = list() 665a31130f6STatyana Krasnukha self.dbg.SetLoggingCallback(messages.append) 66699451b44SJordan Rupprecht self.handleCmd('log enable lldb script') 667a31130f6STatyana Krasnukha self.dbg.SetOutputFile(lldb.SBFile(BadIO())) 66899451b44SJordan Rupprecht self.handleCmd('script 1+1') 66999451b44SJordan Rupprecht self.assertTrue(any('OH NOE' in msg for msg in messages)) 67099451b44SJordan Rupprecht 67199451b44SJordan Rupprecht 67299451b44SJordan Rupprecht @add_test_categories(['pyapi']) 67399451b44SJordan Rupprecht @skipIf(py_version=['<', (3,)]) 67499451b44SJordan Rupprecht def test_flush(self): 67599451b44SJordan Rupprecht flushed = MutableBool(False) 67699451b44SJordan Rupprecht closed = MutableBool(False) 67799451b44SJordan Rupprecht f = FlushTestIO(flushed, closed) 67899451b44SJordan Rupprecht self.assertFalse(flushed) 67999451b44SJordan Rupprecht self.assertFalse(closed) 68099451b44SJordan Rupprecht sbf = lldb.SBFile(f) 68199451b44SJordan Rupprecht self.assertFalse(flushed) 68299451b44SJordan Rupprecht self.assertFalse(closed) 68399451b44SJordan Rupprecht sbf = None 68499451b44SJordan Rupprecht self.assertFalse(flushed) 68599451b44SJordan Rupprecht self.assertTrue(closed) 68699451b44SJordan Rupprecht self.assertTrue(f.closed) 68799451b44SJordan Rupprecht 68899451b44SJordan Rupprecht flushed = MutableBool(False) 68999451b44SJordan Rupprecht closed = MutableBool(False) 69099451b44SJordan Rupprecht f = FlushTestIO(flushed, closed) 69199451b44SJordan Rupprecht self.assertFalse(flushed) 69299451b44SJordan Rupprecht self.assertFalse(closed) 69399451b44SJordan Rupprecht sbf = lldb.SBFile.Create(f, borrow=True) 69499451b44SJordan Rupprecht self.assertFalse(flushed) 69599451b44SJordan Rupprecht self.assertFalse(closed) 69699451b44SJordan Rupprecht sbf = None 69799451b44SJordan Rupprecht self.assertTrue(flushed) 69899451b44SJordan Rupprecht self.assertFalse(closed) 69999451b44SJordan Rupprecht self.assertFalse(f.closed) 70099451b44SJordan Rupprecht 70199451b44SJordan Rupprecht 70299451b44SJordan Rupprecht @add_test_categories(['pyapi']) 70399451b44SJordan Rupprecht def test_fileno_flush(self): 70499451b44SJordan Rupprecht with open(self.out_filename, 'w') as f: 70599451b44SJordan Rupprecht f.write("foo") 70699451b44SJordan Rupprecht sbf = lldb.SBFile(f) 70799451b44SJordan Rupprecht sbf.Write(b'bar') 70899451b44SJordan Rupprecht sbf = None 70999451b44SJordan Rupprecht self.assertTrue(f.closed) 71099451b44SJordan Rupprecht with open(self.out_filename, 'r') as f: 71199451b44SJordan Rupprecht self.assertEqual(f.read(), 'foobar') 71299451b44SJordan Rupprecht 71399451b44SJordan Rupprecht with open(self.out_filename, 'w+') as f: 71499451b44SJordan Rupprecht f.write("foo") 71599451b44SJordan Rupprecht sbf = lldb.SBFile.Create(f, borrow=True) 71699451b44SJordan Rupprecht sbf.Write(b'bar') 71799451b44SJordan Rupprecht sbf = None 71899451b44SJordan Rupprecht self.assertFalse(f.closed) 71999451b44SJordan Rupprecht f.seek(0) 72099451b44SJordan Rupprecht self.assertEqual(f.read(), 'foobar') 72199451b44SJordan Rupprecht 72299451b44SJordan Rupprecht 72399451b44SJordan Rupprecht @add_test_categories(['pyapi']) 72499451b44SJordan Rupprecht def test_close(self): 72599451b44SJordan Rupprecht with open(self.out_filename, 'w') as f: 726a31130f6STatyana Krasnukha status = self.dbg.SetOutputFile(f) 72799451b44SJordan Rupprecht self.assertTrue(status.Success()) 72899451b44SJordan Rupprecht self.handleCmd("help help", check=False, collect_result=False) 72999451b44SJordan Rupprecht # make sure the file wasn't closed early. 73099451b44SJordan Rupprecht f.write("\nZAP\n") 731a31130f6STatyana Krasnukha lldb.SBDebugger.Destroy(self.dbg) 73299451b44SJordan Rupprecht # check that output file was closed when debugger was destroyed. 73399451b44SJordan Rupprecht with self.assertRaises(ValueError): 73499451b44SJordan Rupprecht f.write("\nQUUX\n") 73599451b44SJordan Rupprecht with open(self.out_filename, 'r') as f: 73699451b44SJordan Rupprecht output = f.read() 73799451b44SJordan Rupprecht self.assertTrue(re.search(r'Show a list of all debugger commands', output)) 73899451b44SJordan Rupprecht self.assertTrue(re.search(r'ZAP', output)) 73999451b44SJordan Rupprecht 74099451b44SJordan Rupprecht 74199451b44SJordan Rupprecht @add_test_categories(['pyapi']) 74299451b44SJordan Rupprecht @skipIf(py_version=['<', (3,)]) 74399451b44SJordan Rupprecht def test_stdout(self): 74499451b44SJordan Rupprecht f = io.StringIO() 745a31130f6STatyana Krasnukha status = self.dbg.SetOutputFile(f) 74699451b44SJordan Rupprecht self.assertTrue(status.Success()) 74799451b44SJordan Rupprecht self.handleCmd(r"script sys.stdout.write('foobar\n')") 74899451b44SJordan Rupprecht self.assertEqual(f.getvalue().strip().split(), ["foobar", "7"]) 74999451b44SJordan Rupprecht 75099451b44SJordan Rupprecht 75199451b44SJordan Rupprecht @add_test_categories(['pyapi']) 75299451b44SJordan Rupprecht def test_stdout_file(self): 75399451b44SJordan Rupprecht with open(self.out_filename, 'w') as f: 754a31130f6STatyana Krasnukha status = self.dbg.SetOutputFile(f) 75599451b44SJordan Rupprecht self.assertTrue(status.Success()) 75699451b44SJordan Rupprecht self.handleCmd(r"script sys.stdout.write('foobar\n')") 75799451b44SJordan Rupprecht with open(self.out_filename, 'r') as f: 75899451b44SJordan Rupprecht # In python2 sys.stdout.write() returns None, which 75999451b44SJordan Rupprecht # the REPL will ignore, but in python3 it will 76099451b44SJordan Rupprecht # return the number of bytes written, which the REPL 76199451b44SJordan Rupprecht # will print out. 76299451b44SJordan Rupprecht lines = [x for x in f.read().strip().split() if x != "7"] 76399451b44SJordan Rupprecht self.assertEqual(lines, ["foobar"]) 76499451b44SJordan Rupprecht 76599451b44SJordan Rupprecht 76699451b44SJordan Rupprecht @add_test_categories(['pyapi']) 76799451b44SJordan Rupprecht @skipIf(py_version=['<', (3,)]) 76899451b44SJordan Rupprecht def test_identity(self): 76999451b44SJordan Rupprecht 77099451b44SJordan Rupprecht f = io.StringIO() 77199451b44SJordan Rupprecht sbf = lldb.SBFile(f) 77299451b44SJordan Rupprecht self.assertTrue(f is sbf.GetFile()) 77399451b44SJordan Rupprecht sbf.Close() 77499451b44SJordan Rupprecht self.assertTrue(f.closed) 77599451b44SJordan Rupprecht 77699451b44SJordan Rupprecht f = io.StringIO() 77799451b44SJordan Rupprecht sbf = lldb.SBFile.Create(f, borrow=True) 77899451b44SJordan Rupprecht self.assertTrue(f is sbf.GetFile()) 77999451b44SJordan Rupprecht sbf.Close() 78099451b44SJordan Rupprecht self.assertFalse(f.closed) 78199451b44SJordan Rupprecht 78299451b44SJordan Rupprecht with open(self.out_filename, 'w') as f: 78399451b44SJordan Rupprecht sbf = lldb.SBFile(f) 78499451b44SJordan Rupprecht self.assertTrue(f is sbf.GetFile()) 78599451b44SJordan Rupprecht sbf.Close() 78699451b44SJordan Rupprecht self.assertTrue(f.closed) 78799451b44SJordan Rupprecht 78899451b44SJordan Rupprecht with open(self.out_filename, 'w') as f: 78999451b44SJordan Rupprecht sbf = lldb.SBFile.Create(f, borrow=True) 79099451b44SJordan Rupprecht self.assertFalse(f is sbf.GetFile()) 79199451b44SJordan Rupprecht sbf.Write(b"foobar\n") 79299451b44SJordan Rupprecht self.assertEqual(f.fileno(), sbf.GetFile().fileno()) 79399451b44SJordan Rupprecht sbf.Close() 79499451b44SJordan Rupprecht self.assertFalse(f.closed) 79599451b44SJordan Rupprecht 79699451b44SJordan Rupprecht with open(self.out_filename, 'r') as f: 79799451b44SJordan Rupprecht self.assertEqual("foobar", f.read().strip()) 79899451b44SJordan Rupprecht 79999451b44SJordan Rupprecht with open(self.out_filename, 'wb') as f: 80099451b44SJordan Rupprecht sbf = lldb.SBFile.Create(f, borrow=True, force_io_methods=True) 80199451b44SJordan Rupprecht self.assertTrue(f is sbf.GetFile()) 80299451b44SJordan Rupprecht sbf.Write(b"foobar\n") 80399451b44SJordan Rupprecht self.assertEqual(f.fileno(), sbf.GetFile().fileno()) 80499451b44SJordan Rupprecht sbf.Close() 80599451b44SJordan Rupprecht self.assertFalse(f.closed) 80699451b44SJordan Rupprecht 80799451b44SJordan Rupprecht with open(self.out_filename, 'r') as f: 80899451b44SJordan Rupprecht self.assertEqual("foobar", f.read().strip()) 80999451b44SJordan Rupprecht 81099451b44SJordan Rupprecht with open(self.out_filename, 'wb') as f: 81199451b44SJordan Rupprecht sbf = lldb.SBFile.Create(f, force_io_methods=True) 81299451b44SJordan Rupprecht self.assertTrue(f is sbf.GetFile()) 81399451b44SJordan Rupprecht sbf.Write(b"foobar\n") 81499451b44SJordan Rupprecht self.assertEqual(f.fileno(), sbf.GetFile().fileno()) 81599451b44SJordan Rupprecht sbf.Close() 81699451b44SJordan Rupprecht self.assertTrue(f.closed) 81799451b44SJordan Rupprecht 81899451b44SJordan Rupprecht with open(self.out_filename, 'r') as f: 81999451b44SJordan Rupprecht self.assertEqual("foobar", f.read().strip()) 82099451b44SJordan Rupprecht 82199451b44SJordan Rupprecht 82299451b44SJordan Rupprecht @add_test_categories(['pyapi']) 82399451b44SJordan Rupprecht def test_back_and_forth(self): 82499451b44SJordan Rupprecht with open(self.out_filename, 'w') as f: 82599451b44SJordan Rupprecht # at each step here we're borrowing the file, so we have to keep 82699451b44SJordan Rupprecht # them all alive until the end. 82799451b44SJordan Rupprecht sbf = lldb.SBFile.Create(f, borrow=True) 82899451b44SJordan Rupprecht def i(sbf): 82999451b44SJordan Rupprecht for i in range(10): 83099451b44SJordan Rupprecht f = sbf.GetFile() 83199451b44SJordan Rupprecht self.assertEqual(f.mode, "w") 83299451b44SJordan Rupprecht yield f 83399451b44SJordan Rupprecht sbf = lldb.SBFile.Create(f, borrow=True) 83499451b44SJordan Rupprecht yield sbf 83599451b44SJordan Rupprecht sbf.Write(str(i).encode('ascii') + b"\n") 83699451b44SJordan Rupprecht files = list(i(sbf)) 83799451b44SJordan Rupprecht with open(self.out_filename, 'r') as f: 83899451b44SJordan Rupprecht self.assertEqual(list(range(10)), list(map(int, f.read().strip().split()))) 83999451b44SJordan Rupprecht 84099451b44SJordan Rupprecht 84199451b44SJordan Rupprecht @add_test_categories(['pyapi']) 84299451b44SJordan Rupprecht def test_set_filehandle_none(self): 843a31130f6STatyana Krasnukha self.assertRaises(Exception, self.dbg.SetOutputFile, None) 844a31130f6STatyana Krasnukha self.assertRaises(Exception, self.dbg.SetOutputFile, "ham sandwich") 845a31130f6STatyana Krasnukha self.assertRaises(Exception, self.dbg.SetOutputFileHandle, "ham sandwich") 846a31130f6STatyana Krasnukha self.assertRaises(Exception, self.dbg.SetInputFile, None) 847a31130f6STatyana Krasnukha self.assertRaises(Exception, self.dbg.SetInputFile, "ham sandwich") 848a31130f6STatyana Krasnukha self.assertRaises(Exception, self.dbg.SetInputFileHandle, "ham sandwich") 849a31130f6STatyana Krasnukha self.assertRaises(Exception, self.dbg.SetErrorFile, None) 850a31130f6STatyana Krasnukha self.assertRaises(Exception, self.dbg.SetErrorFile, "ham sandwich") 851a31130f6STatyana Krasnukha self.assertRaises(Exception, self.dbg.SetErrorFileHandle, "ham sandwich") 85299451b44SJordan Rupprecht 85399451b44SJordan Rupprecht with open(self.out_filename, 'w') as f: 854a31130f6STatyana Krasnukha status = self.dbg.SetOutputFile(f) 85599451b44SJordan Rupprecht self.assertTrue(status.Success()) 856a31130f6STatyana Krasnukha status = self.dbg.SetErrorFile(f) 85799451b44SJordan Rupprecht self.assertTrue(status.Success()) 858a31130f6STatyana Krasnukha self.dbg.SetOutputFileHandle(None, False) 859a31130f6STatyana Krasnukha self.dbg.SetErrorFileHandle(None, False) 860a31130f6STatyana Krasnukha sbf = self.dbg.GetOutputFile() 86199451b44SJordan Rupprecht if sys.version_info.major >= 3: 86299451b44SJordan Rupprecht # python 2 lacks PyFile_FromFd, so GetFile() will 86399451b44SJordan Rupprecht # have to duplicate the file descriptor and make a FILE* 86499451b44SJordan Rupprecht # in order to convert a NativeFile it back to a python 86599451b44SJordan Rupprecht # file. 86699451b44SJordan Rupprecht self.assertEqual(sbf.GetFile().fileno(), 1) 867a31130f6STatyana Krasnukha sbf = self.dbg.GetErrorFile() 86899451b44SJordan Rupprecht if sys.version_info.major >= 3: 86999451b44SJordan Rupprecht self.assertEqual(sbf.GetFile().fileno(), 2) 87099451b44SJordan Rupprecht with open(self.out_filename, 'r') as f: 871a31130f6STatyana Krasnukha status = self.dbg.SetInputFile(f) 87299451b44SJordan Rupprecht self.assertTrue(status.Success()) 873a31130f6STatyana Krasnukha self.dbg.SetInputFileHandle(None, False) 874a31130f6STatyana Krasnukha sbf = self.dbg.GetInputFile() 87599451b44SJordan Rupprecht if sys.version_info.major >= 3: 87699451b44SJordan Rupprecht self.assertEqual(sbf.GetFile().fileno(), 0) 87799451b44SJordan Rupprecht 87899451b44SJordan Rupprecht 87999451b44SJordan Rupprecht @add_test_categories(['pyapi']) 88099451b44SJordan Rupprecht def test_sbstream(self): 88199451b44SJordan Rupprecht 88299451b44SJordan Rupprecht with open(self.out_filename, 'w') as f: 88399451b44SJordan Rupprecht stream = lldb.SBStream() 88499451b44SJordan Rupprecht stream.RedirectToFile(f) 88599451b44SJordan Rupprecht stream.Print("zork") 88699451b44SJordan Rupprecht with open(self.out_filename, 'r') as f: 88799451b44SJordan Rupprecht self.assertEqual(f.read().strip(), "zork") 88899451b44SJordan Rupprecht 88999451b44SJordan Rupprecht with open(self.out_filename, 'w') as f: 89099451b44SJordan Rupprecht stream = lldb.SBStream() 89199451b44SJordan Rupprecht stream.RedirectToFileHandle(f, True) 89299451b44SJordan Rupprecht stream.Print("Yendor") 89399451b44SJordan Rupprecht with open(self.out_filename, 'r') as f: 89499451b44SJordan Rupprecht self.assertEqual(f.read().strip(), "Yendor") 89599451b44SJordan Rupprecht 89699451b44SJordan Rupprecht stream = lldb.SBStream() 89799451b44SJordan Rupprecht f = open(self.out_filename, 'w') 89899451b44SJordan Rupprecht stream.RedirectToFile(lldb.SBFile.Create(f, borrow=False)) 89999451b44SJordan Rupprecht stream.Print("Frobozz") 90099451b44SJordan Rupprecht stream = None 90199451b44SJordan Rupprecht self.assertTrue(f.closed) 90299451b44SJordan Rupprecht with open(self.out_filename, 'r') as f: 90399451b44SJordan Rupprecht self.assertEqual(f.read().strip(), "Frobozz") 904