Currently, the test runner makes the assumption that it will run commands through /bin/sh. This is obviously not true on Windows, so this patch abstracts this logic out somewhat. Instead of having the caller build the command string himself, the caller will now pass in argument list of the form [[a, b], [c, d], ...] which will get converted into a string of the form a b; c d or a b && c d, depending on the platform. Reviewed by: Todd Fiala Differential Revision: http://reviews.llvm.org/D4590 llvm-svn: 213669
89 lines
3.4 KiB
Python
89 lines
3.4 KiB
Python
"""
|
|
Test C++ virtual function and virtual inheritance.
|
|
"""
|
|
|
|
import os, time
|
|
import re
|
|
import lldb
|
|
from lldbtest import *
|
|
import lldbutil
|
|
|
|
def Msg(expr, val):
|
|
return "'expression %s' matches the output (from compiled code): %s" % (expr, val)
|
|
|
|
class CppVirtualMadness(TestBase):
|
|
|
|
mydir = TestBase.compute_mydir(__file__)
|
|
|
|
# This is the pattern by design to match the "my_expr = 'value'" output from
|
|
# printf() stmts (see main.cpp).
|
|
pattern = re.compile("^([^=]*) = '([^=]*)'$")
|
|
|
|
# Assert message.
|
|
PRINTF_OUTPUT_GROKKED = "The printf output from compiled code is parsed correctly"
|
|
|
|
@unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin")
|
|
def test_virtual_madness_dsym(self):
|
|
"""Test that expression works correctly with virtual inheritance as well as virtual function."""
|
|
self.buildDsym()
|
|
self.virtual_madness_test()
|
|
|
|
@expectedFailureIcc('llvm.org/pr16808') # lldb does not call the correct virtual function with icc
|
|
def test_virtual_madness_dwarf(self):
|
|
"""Test that expression works correctly with virtual inheritance as well as virtual function."""
|
|
self.buildDwarf()
|
|
self.virtual_madness_test()
|
|
|
|
def setUp(self):
|
|
# Call super's setUp().
|
|
TestBase.setUp(self)
|
|
# Find the line number to break for main.cpp.
|
|
self.line = line_number('main.cpp', '// Set first breakpoint here.')
|
|
|
|
def virtual_madness_test(self):
|
|
"""Test that variable expressions with basic types are evaluated correctly."""
|
|
|
|
# First, capture the golden output emitted by the oracle, i.e., the
|
|
# series of printf statements.
|
|
go = system([["./a.out"]], sender=self)[0]
|
|
# This golden list contains a list of "my_expr = 'value' pairs extracted
|
|
# from the golden output.
|
|
gl = []
|
|
|
|
# Scan the golden output line by line, looking for the pattern:
|
|
#
|
|
# my_expr = 'value'
|
|
#
|
|
for line in go.split(os.linesep):
|
|
match = self.pattern.search(line)
|
|
if match:
|
|
my_expr, val = match.group(1), match.group(2)
|
|
gl.append((my_expr, val))
|
|
#print "golden list:", gl
|
|
|
|
# Bring the program to the point where we can issue a series of
|
|
# 'expression' command to compare against the golden output.
|
|
self.runCmd("file a.out", CURRENT_EXECUTABLE_SET)
|
|
lldbutil.run_break_set_by_file_and_line (self, "main.cpp", self.line, num_expected_locations=1, loc_exact=False)
|
|
self.runCmd("run", RUN_SUCCEEDED)
|
|
|
|
# Now iterate through the golden list, comparing against the output from
|
|
# 'expression var'.
|
|
for my_expr, val in gl:
|
|
# Don't overwhelm the expression mechanism.
|
|
# This slows down the test suite quite a bit, to enable it, define
|
|
# the environment variable LLDB_TYPES_EXPR_TIME_WAIT. For example:
|
|
#
|
|
# export LLDB_TYPES_EXPR_TIME_WAIT=0.5
|
|
#
|
|
# causes a 0.5 second delay between 'expression' commands.
|
|
if "LLDB_TYPES_EXPR_TIME_WAIT" in os.environ:
|
|
time.sleep(float(os.environ["LLDB_TYPES_EXPR_TIME_WAIT"]))
|
|
|
|
self.runCmd("expression %s" % my_expr)
|
|
output = self.res.GetOutput()
|
|
|
|
# The expression output must match the oracle.
|
|
self.expect(output, Msg(my_expr, val), exe=False,
|
|
substrs = [val])
|