mirror of
https://github.com/llvm/llvm-project.git
synced 2025-05-10 18:16:06 +00:00

Summary: expect() forwards its command to sendline(). This can be problematic if the command already contains a newline: sendline() unconditionally adds a newline to the command, which causes the command to run twice (hitting enter in lldb runs the previous command). The expect() helper looks for the prompt and finds the first one, but because the command has run a second time, the buffer will contain the contents of the second time the command ran, causing potential erroneous matching. Simplify the editline test, which was using different commands to workaround this misunderstanding. Reviewers: labath Reviewed By: labath Subscribers: merge_guards_bot, lldb-commits Tags: #lldb Differential Revision: https://reviews.llvm.org/D70324
64 lines
2.0 KiB
Python
64 lines
2.0 KiB
Python
from __future__ import print_function
|
|
from __future__ import absolute_import
|
|
|
|
# System modules
|
|
import sys
|
|
|
|
# Third-party modules
|
|
import six
|
|
|
|
# LLDB Modules
|
|
import lldb
|
|
from .lldbtest import *
|
|
from . import lldbutil
|
|
|
|
if sys.platform.startswith('win32'):
|
|
# llvm.org/pr22274: need a pexpect replacement for windows
|
|
class PExpectTest(object):
|
|
pass
|
|
else:
|
|
import pexpect
|
|
|
|
class PExpectTest(TestBase):
|
|
|
|
NO_DEBUG_INFO_TESTCASE = True
|
|
PROMPT = "(lldb) "
|
|
|
|
def expect_prompt(self):
|
|
self.child.expect_exact(self.PROMPT)
|
|
|
|
def launch(self, executable=None, extra_args=None, timeout=30, dimensions=None):
|
|
logfile = getattr(sys.stdout, 'buffer',
|
|
sys.stdout) if self.TraceOn() else None
|
|
args = ['--no-lldbinit', '--no-use-colors']
|
|
for cmd in self.setUpCommands():
|
|
args += ['-O', cmd]
|
|
if executable is not None:
|
|
args += ['--file', executable]
|
|
if extra_args is not None:
|
|
args.extend(extra_args)
|
|
self.child = pexpect.spawn(
|
|
lldbtest_config.lldbExec, args=args, logfile=logfile,
|
|
timeout=timeout, dimensions=dimensions)
|
|
self.expect_prompt()
|
|
for cmd in self.setUpCommands():
|
|
self.child.expect_exact(cmd)
|
|
self.expect_prompt()
|
|
if executable is not None:
|
|
self.child.expect_exact("target create")
|
|
self.child.expect_exact("Current executable set to")
|
|
self.expect_prompt()
|
|
|
|
def expect(self, cmd, substrs=None):
|
|
self.assertNotIn('\n', cmd)
|
|
self.child.sendline(cmd)
|
|
if substrs is not None:
|
|
for s in substrs:
|
|
self.child.expect_exact(s)
|
|
self.expect_prompt()
|
|
|
|
def quit(self, gracefully=True):
|
|
self.child.sendeof()
|
|
self.child.close(force=not gracefully)
|
|
self.child = None
|