xref: /llvm-project/lldb/test/API/commands/process/launch-with-shellexpand/TestLaunchWithShellExpand.py (revision 2238dcc39358353cac21df75c3c3286ab20b8f53)
1"""
2Test that argdumper is a viable launching strategy.
3"""
4import os
5
6
7import lldb
8from lldbsuite.test.decorators import *
9from lldbsuite.test.lldbtest import *
10from lldbsuite.test import lldbutil
11
12
13class LaunchWithShellExpandTestCase(TestBase):
14    NO_DEBUG_INFO_TESTCASE = True
15
16    @expectedFailureAll(
17        oslist=["windows", "linux", "freebsd"],
18        bugnumber="llvm.org/pr24778 llvm.org/pr22627 llvm.org/pr48349",
19    )
20    @skipIfDarwinEmbedded  # iOS etc don't launch the binary via a shell, so arg expansion won't happen
21    @expectedFailureNetBSD
22    def test(self):
23        self.build()
24        target = self.createTestTarget()
25
26        # Create any breakpoints we need
27        breakpoint = target.BreakpointCreateBySourceRegex(
28            "break here", lldb.SBFileSpec("main.cpp", False)
29        )
30        self.assertTrue(breakpoint, VALID_BREAKPOINT)
31
32        # Ensure we do the expansion with /bin/sh on POSIX.
33        os.environ["SHELL"] = "/bin/sh"
34
35        self.runCmd(
36            "process launch -X true -w %s -- fi*.tx? () > <" % (self.getSourceDir())
37        )
38
39        process = self.process()
40
41        self.assertState(
42            process.GetState(), lldb.eStateStopped, STOPPED_DUE_TO_BREAKPOINT
43        )
44
45        thread = process.GetThreadAtIndex(0)
46
47        self.assertTrue(
48            thread.IsValid(), "Process stopped at 'main' should have a valid thread"
49        )
50
51        stop_reason = thread.GetStopReason()
52
53        self.assertEqual(
54            stop_reason,
55            lldb.eStopReasonBreakpoint,
56            "Thread in process stopped in 'main' should have a stop reason of eStopReasonBreakpoint",
57        )
58
59        self.expect_var_path("argv[1]", summary='"file1.txt"')
60        self.expect_var_path("argv[2]", summary='"file2.txt"')
61        self.expect_var_path("argv[3]", summary='"file3.txt"')
62        self.expect_var_path("argv[4]", summary='"file4.txy"')
63        self.expect_var_path("argv[5]", summary='"()"')
64        self.expect_var_path("argv[6]", summary='">"')
65        self.expect_var_path("argv[7]", summary='"<"')
66        self.expect_var_path("argc", value="8")
67
68        self.runCmd("process kill")
69
70        self.runCmd('process launch -X true -w %s -- "foo bar"' % (self.getSourceDir()))
71
72        process = self.process()
73
74        self.assertState(
75            process.GetState(), lldb.eStateStopped, STOPPED_DUE_TO_BREAKPOINT
76        )
77
78        thread = process.GetThreadAtIndex(0)
79
80        self.assertTrue(
81            thread.IsValid(), "Process stopped at 'main' should have a valid thread"
82        )
83
84        stop_reason = thread.GetStopReason()
85
86        self.assertEqual(
87            stop_reason,
88            lldb.eStopReasonBreakpoint,
89            "Thread in process stopped in 'main' should have a stop reason of eStopReasonBreakpoint",
90        )
91
92        self.expect("frame variable argv[1]", substrs=["foo bar"])
93
94        self.runCmd("process kill")
95
96        self.runCmd("process launch -X true -w %s -- foo\ bar" % (self.getBuildDir()))
97
98        process = self.process()
99
100        self.assertState(
101            process.GetState(), lldb.eStateStopped, STOPPED_DUE_TO_BREAKPOINT
102        )
103
104        thread = process.GetThreadAtIndex(0)
105
106        self.assertTrue(
107            thread.IsValid(), "Process stopped at 'main' should have a valid thread"
108        )
109
110        stop_reason = thread.GetStopReason()
111
112        self.assertEqual(
113            stop_reason,
114            lldb.eStopReasonBreakpoint,
115            "Thread in process stopped in 'main' should have a stop reason of eStopReasonBreakpoint",
116        )
117
118        self.expect("frame variable argv[1]", substrs=["foo bar"])
119