"""Test Python APIs for process IO."""

import os, sys, time
import unittest2
import lldb
from lldbtest import *

class ProcessIOTestCase(TestBase):

    mydir = os.path.join("python_api", "process", "io")

    @unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin")
    @python_api_test
    @dsym_test
    def test_put_stdin_with_dsym(self):
        """Exercise SBProcess.PutSTDIN()."""
        self.buildDsym()
        self.put_stdin()

    @python_api_test
    @dwarf_test
    def test_put_stdin_with_dwarf(self):
        """Exercise SBProcess.PutSTDIN()."""
        self.buildDwarf()
        self.put_stdin()

    def setUp(self):
        # Call super's setUp().
        TestBase.setUp(self)
        # Get the full path to our executable to be debugged.
        self.exe = os.path.join(os.getcwd(), "process_io")

    def put_stdin(self):
        """Launch a process and use SBProcess.PutSTDIN() to write data to it."""

        target = self.dbg.CreateTarget(self.exe)

        self.dbg.SetAsync(True)
        process = target.LaunchSimple(None, None, os.getcwd())
        if self.TraceOn():
            print "process launched."

        self.assertTrue(process, PROCESS_IS_VALID)

        process.PutSTDIN("Line 1 Entered.\n")
        process.PutSTDIN("Line 2 Entered.\n")
        process.PutSTDIN("Line 3 Entered.\n")

        for i in range(5):
            output = process.GetSTDOUT(500)
            error = process.GetSTDERR(500)
            if self.TraceOn():
                print "output->|%s|" % output
            # Since we launched the process without specifying stdin/out/err,
            # a pseudo terminal is used for stdout/err, and we are satisfied
            # once "input line=>1" appears in stdout.
            # See also main.c.
            if "input line=>1" in output:
                return
            time.sleep(5)

        self.fail("Expected output form launched process did not appear?")

if __name__ == '__main__':
    import atexit
    lldb.SBDebugger.Initialize()
    atexit.register(lambda: lldb.SBDebugger.Terminate())
    unittest2.main()
