Skip to content

Commit

Permalink
tools: allow input for TTY tests
Browse files Browse the repository at this point in the history
Since faking TTY input is not otherwise fake-able, we need
support in the test runner for it.

Backport-PR-URL: #25351
PR-URL: #23053
Reviewed-By: James M Snell <jasnell@gmail.com>
  • Loading branch information
addaleax authored and BethGriggs committed Mar 19, 2019
1 parent e936907 commit 1a9582b
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 4 deletions.
12 changes: 9 additions & 3 deletions test/pseudo-tty/testcfg.py
Expand Up @@ -35,10 +35,11 @@

class TTYTestCase(test.TestCase):

def __init__(self, path, file, expected, arch, mode, context, config):
def __init__(self, path, file, expected, input, arch, mode, context, config):
super(TTYTestCase, self).__init__(context, path, arch, mode)
self.file = file
self.expected = expected
self.input = input
self.config = config
self.arch = arch
self.mode = mode
Expand Down Expand Up @@ -104,12 +105,16 @@ def GetSource(self):
+ open(self.expected).read())

def RunCommand(self, command, env):
input = None
if self.input is not None and exists(self.input):
input = open(self.input).read()
full_command = self.context.processor(command)
output = test.Execute(full_command,
self.context,
self.context.GetTimeout(self.mode),
env,
True)
faketty=True,
input=input)
self.Cleanup()
return test.TestOutput(self,
full_command,
Expand Down Expand Up @@ -140,11 +145,12 @@ def ListTests(self, current_path, path, arch, mode):
if self.Contains(path, test):
file_prefix = join(self.root, reduce(join, test[1:], ""))
file_path = file_prefix + ".js"
input_path = file_prefix + ".in"
output_path = file_prefix + ".out"
if not exists(output_path):
raise Exception("Could not find %s" % output_path)
result.append(TTYTestCase(test, file_path, output_path,
arch, mode, self.context, self))
input_path, arch, mode, self.context, self))
return result

def GetBuildRequirements(self):
Expand Down
13 changes: 12 additions & 1 deletion tools/test.py
Expand Up @@ -717,12 +717,23 @@ def CheckedUnlink(name):
PrintError("os.unlink() " + str(e))
break

def Execute(args, context, timeout=None, env={}, faketty=False, disable_core_files=False):
def Execute(args, context, timeout=None, env={}, faketty=False, disable_core_files=False, input=None):
if faketty:
import pty
(out_master, fd_out) = pty.openpty()
fd_in = fd_err = fd_out
pty_out = out_master

if input is not None:
# Before writing input data, disable echo so the input doesn't show
# up as part of the output.
import termios
attr = termios.tcgetattr(fd_in)
attr[3] = attr[3] & ~termios.ECHO
termios.tcsetattr(fd_in, termios.TCSADRAIN, attr)

os.write(pty_out, input)
os.write(pty_out, '\x04') # End-of-file marker (Ctrl+D)
else:
(fd_out, outname) = tempfile.mkstemp()
(fd_err, errname) = tempfile.mkstemp()
Expand Down

0 comments on commit 1a9582b

Please sign in to comment.