199451b44SJordan Rupprecht"""Test that we are able to evaluate expressions when the inferior is blocked in a syscall"""
299451b44SJordan Rupprecht
399451b44SJordan Rupprechtimport lldb
499451b44SJordan Rupprechtfrom lldbsuite.test.decorators import *
599451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import *
699451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil
799451b44SJordan Rupprecht
899451b44SJordan Rupprecht
999451b44SJordan Rupprechtclass ExprSyscallTestCase(TestBase):
1099451b44SJordan Rupprecht
1199451b44SJordan Rupprecht    @expectedFailureAll(
1299451b44SJordan Rupprecht        oslist=["windows"],
1399451b44SJordan Rupprecht        bugnumber="llvm.org/pr21765, getpid() does not exist on Windows")
1499451b44SJordan Rupprecht    @expectedFailureNetBSD
1599451b44SJordan Rupprecht    def test_setpgid(self):
1699451b44SJordan Rupprecht        self.build()
1799451b44SJordan Rupprecht        self.expr_syscall()
1899451b44SJordan Rupprecht
1999451b44SJordan Rupprecht    def expr_syscall(self):
2099451b44SJordan Rupprecht        # Create a target by the debugger.
2154c26872SRaphael Isemann        target = self.createTestTarget()
2299451b44SJordan Rupprecht
2399451b44SJordan Rupprecht        listener = lldb.SBListener("my listener")
2499451b44SJordan Rupprecht
2599451b44SJordan Rupprecht        # launch the inferior and don't wait for it to stop
2699451b44SJordan Rupprecht        self.dbg.SetAsync(True)
2799451b44SJordan Rupprecht        error = lldb.SBError()
282ddba09eSJonas Devlieghere        flags = target.GetLaunchInfo().GetLaunchFlags()
2999451b44SJordan Rupprecht        process = target.Launch(listener,
3099451b44SJordan Rupprecht                                None,      # argv
3199451b44SJordan Rupprecht                                None,      # envp
3299451b44SJordan Rupprecht                                None,      # stdin_path
3399451b44SJordan Rupprecht                                None,      # stdout_path
3499451b44SJordan Rupprecht                                None,      # stderr_path
3599451b44SJordan Rupprecht                                None,      # working directory
362ddba09eSJonas Devlieghere                                flags,     # launch flags
3799451b44SJordan Rupprecht                                False,     # Stop at entry
3899451b44SJordan Rupprecht                                error)     # error
3999451b44SJordan Rupprecht
4099451b44SJordan Rupprecht        self.assertTrue(process and process.IsValid(), PROCESS_IS_VALID)
4199451b44SJordan Rupprecht
4299451b44SJordan Rupprecht        event = lldb.SBEvent()
4399451b44SJordan Rupprecht
4499451b44SJordan Rupprecht        # Give the child enough time to reach the syscall,
4599451b44SJordan Rupprecht        # while clearing out all the pending events.
4699451b44SJordan Rupprecht        # The last WaitForEvent call will time out after 2 seconds.
4799451b44SJordan Rupprecht        while listener.WaitForEvent(2, event):
4899451b44SJordan Rupprecht            pass
4999451b44SJordan Rupprecht
5099451b44SJordan Rupprecht        # now the process should be running (blocked in the syscall)
5199451b44SJordan Rupprecht        self.assertEqual(
5299451b44SJordan Rupprecht            process.GetState(),
5399451b44SJordan Rupprecht            lldb.eStateRunning,
5499451b44SJordan Rupprecht            "Process is running")
5599451b44SJordan Rupprecht
5699451b44SJordan Rupprecht        # send the process a signal
5799451b44SJordan Rupprecht        process.SendAsyncInterrupt()
5899451b44SJordan Rupprecht        while listener.WaitForEvent(2, event):
5999451b44SJordan Rupprecht            pass
6099451b44SJordan Rupprecht
6199451b44SJordan Rupprecht        # as a result the process should stop
6299451b44SJordan Rupprecht        # in all likelihood we have stopped in the middle of the sleep()
6399451b44SJordan Rupprecht        # syscall
6499451b44SJordan Rupprecht        self.assertEqual(
6599451b44SJordan Rupprecht            process.GetState(),
6699451b44SJordan Rupprecht            lldb.eStateStopped,
6799451b44SJordan Rupprecht            PROCESS_STOPPED)
6899451b44SJordan Rupprecht        thread = process.GetSelectedThread()
6999451b44SJordan Rupprecht
7099451b44SJordan Rupprecht        # try evaluating a couple of expressions in this state
7142b9a683SRaphael Isemann        self.expect_expr("release_flag = 1", result_value="1")
7242b9a683SRaphael Isemann        self.expect_expr("(int)getpid()", result_value=str(process.GetProcessID()))
7399451b44SJordan Rupprecht
7499451b44SJordan Rupprecht        # and run the process to completion
7599451b44SJordan Rupprecht        process.Continue()
7699451b44SJordan Rupprecht
7799451b44SJordan Rupprecht        # process all events
7899451b44SJordan Rupprecht        while listener.WaitForEvent(10, event):
7999451b44SJordan Rupprecht            new_state = lldb.SBProcess.GetStateFromEvent(event)
8099451b44SJordan Rupprecht            if new_state == lldb.eStateExited:
8199451b44SJordan Rupprecht                break
8299451b44SJordan Rupprecht
83*1b8c7352SJonas Devlieghere        self.assertState(process.GetState(), lldb.eStateExited)
8499451b44SJordan Rupprecht        self.assertEqual(process.GetExitStatus(), 0)
85