1*99451b44SJordan Rupprecht""" 2*99451b44SJordan RupprechtTest lldb Python commands. 3*99451b44SJordan Rupprecht""" 4*99451b44SJordan Rupprecht 5*99451b44SJordan Rupprecht 6*99451b44SJordan Rupprechtimport sys 7*99451b44SJordan Rupprechtimport lldb 8*99451b44SJordan Rupprechtfrom lldbsuite.test.decorators import * 9*99451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import * 10*99451b44SJordan Rupprecht 11*99451b44SJordan Rupprecht 12*99451b44SJordan Rupprechtclass CmdPythonTestCase(TestBase): 13*99451b44SJordan Rupprecht 14*99451b44SJordan Rupprecht mydir = TestBase.compute_mydir(__file__) 15*99451b44SJordan Rupprecht NO_DEBUG_INFO_TESTCASE = True 16*99451b44SJordan Rupprecht 17*99451b44SJordan Rupprecht def test(self): 18*99451b44SJordan Rupprecht self.build() 19*99451b44SJordan Rupprecht self.pycmd_tests() 20*99451b44SJordan Rupprecht 21*99451b44SJordan Rupprecht def pycmd_tests(self): 22*99451b44SJordan Rupprecht self.runCmd("command source py_import") 23*99451b44SJordan Rupprecht 24*99451b44SJordan Rupprecht # Test a bunch of different kinds of python callables with 25*99451b44SJordan Rupprecht # both 4 and 5 positional arguments. 26*99451b44SJordan Rupprecht self.expect("foobar", substrs=["All good"]) 27*99451b44SJordan Rupprecht self.expect("foobar4", substrs=["All good"]) 28*99451b44SJordan Rupprecht self.expect("vfoobar", substrs=["All good"]) 29*99451b44SJordan Rupprecht self.expect("v5foobar", substrs=["All good"]) 30*99451b44SJordan Rupprecht self.expect("sfoobar", substrs=["All good"]) 31*99451b44SJordan Rupprecht self.expect("cfoobar", substrs=["All good"]) 32*99451b44SJordan Rupprecht self.expect("ifoobar", substrs=["All good"]) 33*99451b44SJordan Rupprecht self.expect("sfoobar4", substrs=["All good"]) 34*99451b44SJordan Rupprecht self.expect("cfoobar4", substrs=["All good"]) 35*99451b44SJordan Rupprecht self.expect("ifoobar4", substrs=["All good"]) 36*99451b44SJordan Rupprecht self.expect("ofoobar", substrs=["All good"]) 37*99451b44SJordan Rupprecht self.expect("ofoobar4", substrs=["All good"]) 38*99451b44SJordan Rupprecht 39*99451b44SJordan Rupprecht # Verify command that specifies eCommandRequiresTarget returns failure 40*99451b44SJordan Rupprecht # without a target. 41*99451b44SJordan Rupprecht self.expect('targetname', 42*99451b44SJordan Rupprecht substrs=['a.out'], matching=False, error=True) 43*99451b44SJordan Rupprecht 44*99451b44SJordan Rupprecht exe = self.getBuildArtifact("a.out") 45*99451b44SJordan Rupprecht self.expect("file " + exe, 46*99451b44SJordan Rupprecht patterns=["Current executable set to .*a.out"]) 47*99451b44SJordan Rupprecht 48*99451b44SJordan Rupprecht self.expect('targetname', 49*99451b44SJordan Rupprecht substrs=['a.out'], matching=True, error=False) 50*99451b44SJordan Rupprecht 51*99451b44SJordan Rupprecht # This is the function to remove the custom commands in order to have a 52*99451b44SJordan Rupprecht # clean slate for the next test case. 53*99451b44SJordan Rupprecht def cleanup(): 54*99451b44SJordan Rupprecht self.runCmd('command script delete welcome', check=False) 55*99451b44SJordan Rupprecht self.runCmd('command script delete targetname', check=False) 56*99451b44SJordan Rupprecht self.runCmd('command script delete longwait', check=False) 57*99451b44SJordan Rupprecht self.runCmd('command script delete mysto', check=False) 58*99451b44SJordan Rupprecht self.runCmd('command script delete tell_sync', check=False) 59*99451b44SJordan Rupprecht self.runCmd('command script delete tell_async', check=False) 60*99451b44SJordan Rupprecht self.runCmd('command script delete tell_curr', check=False) 61*99451b44SJordan Rupprecht self.runCmd('command script delete bug11569', check=False) 62*99451b44SJordan Rupprecht self.runCmd('command script delete takes_exe_ctx', check=False) 63*99451b44SJordan Rupprecht self.runCmd('command script delete decorated', check=False) 64*99451b44SJordan Rupprecht 65*99451b44SJordan Rupprecht # Execute the cleanup function during test case tear down. 66*99451b44SJordan Rupprecht self.addTearDownHook(cleanup) 67*99451b44SJordan Rupprecht 68*99451b44SJordan Rupprecht # Interact with debugger in synchronous mode 69*99451b44SJordan Rupprecht self.setAsync(False) 70*99451b44SJordan Rupprecht 71*99451b44SJordan Rupprecht # We don't want to display the stdout if not in TraceOn() mode. 72*99451b44SJordan Rupprecht if not self.TraceOn(): 73*99451b44SJordan Rupprecht self.HideStdout() 74*99451b44SJordan Rupprecht 75*99451b44SJordan Rupprecht self.expect('welcome Enrico', 76*99451b44SJordan Rupprecht substrs=['Hello Enrico, welcome to LLDB']) 77*99451b44SJordan Rupprecht 78*99451b44SJordan Rupprecht self.expect("help welcome", 79*99451b44SJordan Rupprecht substrs=['Just a docstring for welcome_impl', 80*99451b44SJordan Rupprecht 'A command that says hello to LLDB users']) 81*99451b44SJordan Rupprecht 82*99451b44SJordan Rupprecht decorated_commands = ["decorated" + str(n) for n in range(1, 5)] 83*99451b44SJordan Rupprecht for name in decorated_commands: 84*99451b44SJordan Rupprecht self.expect(name, substrs=["hello from " + name]) 85*99451b44SJordan Rupprecht self.expect("help " + name, 86*99451b44SJordan Rupprecht substrs=["Python command defined by @lldb.command"]) 87*99451b44SJordan Rupprecht 88*99451b44SJordan Rupprecht self.expect("help", 89*99451b44SJordan Rupprecht substrs=['For more information run'] 90*99451b44SJordan Rupprecht + decorated_commands + ['welcome']) 91*99451b44SJordan Rupprecht 92*99451b44SJordan Rupprecht self.expect("help -a", 93*99451b44SJordan Rupprecht substrs=['For more information run'] 94*99451b44SJordan Rupprecht + decorated_commands + ['welcome']) 95*99451b44SJordan Rupprecht 96*99451b44SJordan Rupprecht self.expect("help -u", matching=False, 97*99451b44SJordan Rupprecht substrs=['For more information run']) 98*99451b44SJordan Rupprecht 99*99451b44SJordan Rupprecht self.runCmd("command script delete welcome") 100*99451b44SJordan Rupprecht 101*99451b44SJordan Rupprecht self.expect('welcome Enrico', matching=False, error=True, 102*99451b44SJordan Rupprecht substrs=['Hello Enrico, welcome to LLDB']) 103*99451b44SJordan Rupprecht 104*99451b44SJordan Rupprecht self.expect('targetname fail', error=True, 105*99451b44SJordan Rupprecht substrs=['a test for error in command']) 106*99451b44SJordan Rupprecht 107*99451b44SJordan Rupprecht self.expect('command script list', 108*99451b44SJordan Rupprecht substrs=['targetname', 109*99451b44SJordan Rupprecht 'For more information run']) 110*99451b44SJordan Rupprecht 111*99451b44SJordan Rupprecht self.expect("help targetname", 112*99451b44SJordan Rupprecht substrs=['Expects', '\'raw\'', 'input', 113*99451b44SJordan Rupprecht 'help', 'raw-input']) 114*99451b44SJordan Rupprecht 115*99451b44SJordan Rupprecht self.expect("longwait", 116*99451b44SJordan Rupprecht substrs=['Done; if you saw the delays I am doing OK']) 117*99451b44SJordan Rupprecht 118*99451b44SJordan Rupprecht self.runCmd("b main") 119*99451b44SJordan Rupprecht self.runCmd("run") 120*99451b44SJordan Rupprecht self.runCmd("mysto 3") 121*99451b44SJordan Rupprecht self.expect("frame variable array", 122*99451b44SJordan Rupprecht substrs=['[0] = 79630', '[1] = 388785018', '[2] = 0']) 123*99451b44SJordan Rupprecht self.runCmd("mysto 3") 124*99451b44SJordan Rupprecht self.expect("frame variable array", 125*99451b44SJordan Rupprecht substrs=['[0] = 79630', '[4] = 388785018', '[5] = 0']) 126*99451b44SJordan Rupprecht 127*99451b44SJordan Rupprecht# we cannot use the stepover command to check for async execution mode since LLDB 128*99451b44SJordan Rupprecht# seems to get confused when events start to queue up 129*99451b44SJordan Rupprecht self.expect("tell_sync", 130*99451b44SJordan Rupprecht substrs=['running sync']) 131*99451b44SJordan Rupprecht self.expect("tell_async", 132*99451b44SJordan Rupprecht substrs=['running async']) 133*99451b44SJordan Rupprecht self.expect("tell_curr", 134*99451b44SJordan Rupprecht substrs=['I am running sync']) 135*99451b44SJordan Rupprecht 136*99451b44SJordan Rupprecht# check that the execution context is passed in to commands that ask for it 137*99451b44SJordan Rupprecht self.expect("takes_exe_ctx", substrs=["a.out"]) 138*99451b44SJordan Rupprecht 139*99451b44SJordan Rupprecht # Test that a python command can redefine itself 140*99451b44SJordan Rupprecht self.expect('command script add -f foobar welcome -h "just some help"') 141*99451b44SJordan Rupprecht 142*99451b44SJordan Rupprecht self.runCmd("command script clear") 143*99451b44SJordan Rupprecht 144*99451b44SJordan Rupprecht # Test that re-defining an existing command works 145*99451b44SJordan Rupprecht self.runCmd( 146*99451b44SJordan Rupprecht 'command script add my_command --class welcome.WelcomeCommand') 147*99451b44SJordan Rupprecht self.expect('my_command Blah', substrs=['Hello Blah, welcome to LLDB']) 148*99451b44SJordan Rupprecht 149*99451b44SJordan Rupprecht self.runCmd( 150*99451b44SJordan Rupprecht 'command script add my_command --class welcome.TargetnameCommand') 151*99451b44SJordan Rupprecht self.expect('my_command', substrs=['a.out']) 152*99451b44SJordan Rupprecht 153*99451b44SJordan Rupprecht self.runCmd("command script clear") 154*99451b44SJordan Rupprecht 155*99451b44SJordan Rupprecht self.expect('command script list', matching=False, 156*99451b44SJordan Rupprecht substrs=['targetname', 157*99451b44SJordan Rupprecht 'longwait']) 158*99451b44SJordan Rupprecht 159*99451b44SJordan Rupprecht self.expect('command script add -f foobar frame', error=True, 160*99451b44SJordan Rupprecht substrs=['cannot add command']) 161*99451b44SJordan Rupprecht 162*99451b44SJordan Rupprecht # http://llvm.org/bugs/show_bug.cgi?id=11569 163*99451b44SJordan Rupprecht # LLDBSwigPythonCallCommand crashes when a command script returns an 164*99451b44SJordan Rupprecht # object 165*99451b44SJordan Rupprecht self.runCmd('command script add -f bug11569 bug11569') 166*99451b44SJordan Rupprecht # This should not crash. 167*99451b44SJordan Rupprecht self.runCmd('bug11569', check=False) 168