Files
clang-p2996/lldb/test/API/functionalities/reproducers/attach/TestReproducerAttach.py
Jonas Devlieghere fc41013893 [lldb/Reproducers] Capture reproducers from the API test suite.
Make it possible to capture reproducers from the API test suite. Given
the symmetry between capture and replay, this patch also adds the
necessary code for replay. For now this is a NO-OP until the
corresponding reproducer instrumentation changes land.

For more info please refer to the RFC on lldb-dev:
http://lists.llvm.org/pipermail/lldb-dev/2020-April/016100.html

Differential revision: https://reviews.llvm.org/D77588
2020-04-14 09:24:23 -07:00

75 lines
2.4 KiB
Python

"""
Test reproducer attach.
"""
import lldb
import tempfile
from lldbsuite.test import lldbtest_config
from lldbsuite.test.decorators import *
from lldbsuite.test.lldbtest import *
from lldbsuite.test import lldbutil
class ReproducerAttachTestCase(TestBase):
mydir = TestBase.compute_mydir(__file__)
NO_DEBUG_INFO_TESTCASE = True
@skipIfFreeBSD
@skipIfNetBSD
@skipIfWindows
@skipIfRemote
@skipIfiOSSimulator
@skipIfReproducer
def test_reproducer_attach(self):
"""Test thread creation after process attach."""
exe = '%s_%d' % (self.testMethodName, os.getpid())
token = self.getBuildArtifact(exe + '.token')
if os.path.exists(token):
os.remove(token)
reproducer = self.getBuildArtifact(exe + '.reproducer')
if os.path.exists(reproducer):
try:
shutil.rmtree(reproducer)
except OSError:
pass
self.build(dictionary={'EXE': exe})
self.addTearDownHook(self.cleanupSubprocesses)
inferior = self.spawnSubprocess(self.getBuildArtifact(exe), [token])
pid = inferior.pid
lldbutil.wait_for_file_on_target(self, token)
# Use Popen because pexpect is overkill and spawnSubprocess is
# asynchronous.
capture = subprocess.Popen([
lldbtest_config.lldbExec, '-b', '--capture', '--capture-path',
reproducer, '-o', 'proc att -n {}'.format(exe), '-o',
'reproducer generate'
],
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
outs, _ = capture.communicate()
outs = outs.decode('utf-8')
self.assertIn('Process {} stopped'.format(pid), outs)
self.assertIn('Reproducer written', outs)
# Check that replay works.
replay = subprocess.Popen(
[lldbtest_config.lldbExec, '-replay', reproducer],
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
outs, _ = replay.communicate()
outs = outs.decode('utf-8')
self.assertIn('Process {} stopped'.format(pid), outs)
# We can dump the reproducer in the current context.
self.expect('reproducer dump -f {} -p process'.format(reproducer),
substrs=['pid = {}'.format(pid), 'name = {}'.format(exe)])