mirror of
https://github.com/intel/llvm.git
synced 2026-01-27 06:06:34 +08:00
Currently most of the test files have a separate dwarf and a separate dsym test with almost identical content (only the build step is different). With adding dwo symbol file handling to the test suit it would increase this to a 3-way duplication. The purpose of this change is to eliminate this redundancy with generating 2 test case (one dwarf and one dsym) for each test function specified (dwo handling will be added at a later commit). Main design goals: * There should be no boilerplate code in each test file to support the multiple debug info in most of the tests (custom scenarios are acceptable in special cases) so adding a new test case is easier and we can't miss one of the debug info type. * In case of a test failure, the debug symbols used during the test run have to be cleanly visible from the output of dotest.py to make debugging easier both from build bot logs and from local test runs * Each test case should have a unique, fully qualified name so we can run exactly 1 test with "-f <test-case>.<test-function>" syntax * Test output should be grouped based on test files the same way as it happens now (displaying dwarf/dsym results separately isn't preferable) Proposed solution (main logic in lldbtest.py, rest of them are test cases fixed up for the new style): * Have only 1 test fuction in the test files what will run for all debug info separately and this test function should call just "self.build(...)" to build an inferior with the right debug info * When a class is created by python (the class object, not the class instance), we will generate a new test method for each debug info format in the test class with the name "<test-function>_<debug-info>" and remove the original test method. This way unittest2 see multiple test methods (1 for each debug info, pretty much as of now) and will handle the test selection and the failure reporting correctly (the debug info will be visible from the end of the test name) * Add new annotation @no_debug_info_test to disable the generation of multiple tests for each debug info format when the test don't have an inferior Differential revision: http://reviews.llvm.org/D13028 llvm-svn: 248883
147 lines
5.4 KiB
Python
147 lines
5.4 KiB
Python
"""
|
|
Test lldb Python commands.
|
|
"""
|
|
|
|
import os, time
|
|
import unittest2
|
|
import lldb
|
|
from lldbtest import *
|
|
|
|
class CmdPythonTestCase(TestBase):
|
|
|
|
mydir = TestBase.compute_mydir(__file__)
|
|
|
|
def test (self):
|
|
self.build ()
|
|
self.pycmd_tests ()
|
|
|
|
def pycmd_tests (self):
|
|
self.runCmd("command source py_import")
|
|
|
|
# Verify command that specifies eCommandRequiresTarget returns failure
|
|
# without a target.
|
|
self.expect('targetname',
|
|
substrs = ['a.out'], matching=False, error=True)
|
|
|
|
exe = os.path.join (os.getcwd(), "a.out")
|
|
self.expect("file " + exe,
|
|
patterns = [ "Current executable set to .*a.out" ])
|
|
|
|
self.expect('targetname',
|
|
substrs = ['a.out'], matching=True, error=False)
|
|
|
|
# This is the function to remove the custom commands in order to have a
|
|
# clean slate for the next test case.
|
|
def cleanup():
|
|
self.runCmd('command script delete welcome', check=False)
|
|
self.runCmd('command script delete targetname', check=False)
|
|
self.runCmd('command script delete longwait', check=False)
|
|
self.runCmd('command script delete mysto', check=False)
|
|
self.runCmd('command script delete tell_sync', check=False)
|
|
self.runCmd('command script delete tell_async', check=False)
|
|
self.runCmd('command script delete tell_curr', check=False)
|
|
self.runCmd('command script delete bug11569', check=False)
|
|
self.runCmd('command script delete takes_exe_ctx', check=False)
|
|
|
|
# Execute the cleanup function during test case tear down.
|
|
self.addTearDownHook(cleanup)
|
|
|
|
# Interact with debugger in synchronous mode
|
|
self.setAsync(False)
|
|
|
|
# We don't want to display the stdout if not in TraceOn() mode.
|
|
if not self.TraceOn():
|
|
self.HideStdout()
|
|
|
|
self.expect('welcome Enrico',
|
|
substrs = ['Hello Enrico, welcome to LLDB']);
|
|
|
|
self.expect("help welcome",
|
|
substrs = ['Just a docstring for welcome_impl',
|
|
'A command that says hello to LLDB users'])
|
|
|
|
self.expect("help",
|
|
substrs = ['For more information run',
|
|
'welcome'])
|
|
|
|
self.expect("help -a",
|
|
substrs = ['For more information run',
|
|
'welcome'])
|
|
|
|
self.expect("help -u", matching=False,
|
|
substrs = ['For more information run'])
|
|
|
|
self.runCmd("command script delete welcome");
|
|
|
|
self.expect('welcome Enrico', matching=False, error=True,
|
|
substrs = ['Hello Enrico, welcome to LLDB']);
|
|
|
|
self.expect('targetname fail', error=True,
|
|
substrs = ['a test for error in command'])
|
|
|
|
self.expect('command script list',
|
|
substrs = ['targetname',
|
|
'For more information run'])
|
|
|
|
self.expect("help targetname",
|
|
substrs = ['This', 'command', 'takes', '\'raw\'', 'input',
|
|
'quote', 'stuff'])
|
|
|
|
self.expect("longwait",
|
|
substrs = ['Done; if you saw the delays I am doing OK'])
|
|
|
|
self.runCmd("b main")
|
|
self.runCmd("run")
|
|
self.runCmd("mysto 3")
|
|
self.expect("frame variable array",
|
|
substrs = ['[0] = 79630','[1] = 388785018','[2] = 0'])
|
|
self.runCmd("mysto 3")
|
|
self.expect("frame variable array",
|
|
substrs = ['[0] = 79630','[4] = 388785018','[5] = 0'])
|
|
|
|
# we cannot use the stepover command to check for async execution mode since LLDB
|
|
# seems to get confused when events start to queue up
|
|
self.expect("tell_sync",
|
|
substrs = ['running sync'])
|
|
self.expect("tell_async",
|
|
substrs = ['running async'])
|
|
self.expect("tell_curr",
|
|
substrs = ['I am running sync'])
|
|
|
|
# check that the execution context is passed in to commands that ask for it
|
|
self.expect("takes_exe_ctx", substrs = ["a.out"])
|
|
|
|
# Test that a python command can redefine itself
|
|
self.expect('command script add -f foobar welcome -h "just some help"')
|
|
|
|
self.runCmd("command script clear")
|
|
|
|
# Test that re-defining an existing command works
|
|
self.runCmd('command script add my_command --class welcome.WelcomeCommand')
|
|
self.expect('my_command Blah', substrs = ['Hello Blah, welcome to LLDB'])
|
|
|
|
self.runCmd('command script add my_command --class welcome.TargetnameCommand')
|
|
self.expect('my_command', substrs = ['a.out'])
|
|
|
|
self.runCmd("command script clear")
|
|
|
|
self.expect('command script list', matching=False,
|
|
substrs = ['targetname',
|
|
'longwait'])
|
|
|
|
self.expect('command script add -f foobar frame', error=True,
|
|
substrs = ['cannot add command'])
|
|
|
|
# http://llvm.org/bugs/show_bug.cgi?id=11569
|
|
# LLDBSwigPythonCallCommand crashes when a command script returns an object
|
|
self.runCmd('command script add -f bug11569 bug11569')
|
|
# This should not crash.
|
|
self.runCmd('bug11569', check=False)
|
|
|
|
if __name__ == '__main__':
|
|
import atexit
|
|
lldb.SBDebugger.Initialize()
|
|
atexit.register(lambda: lldb.SBDebugger.Terminate())
|
|
unittest2.main()
|
|
|