From 1a9582b7a66759d1c478f5b6b2adc91e39cc982a Mon Sep 17 00:00:00 2001 From: Anna Henningsen Date: Mon, 24 Sep 2018 11:47:13 +0200 Subject: [PATCH] tools: allow input for TTY tests Since faking TTY input is not otherwise fake-able, we need support in the test runner for it. Backport-PR-URL: https://github.com/nodejs/node/pull/25351 PR-URL: https://github.com/nodejs/node/pull/23053 Reviewed-By: James M Snell --- test/pseudo-tty/testcfg.py | 12 +++++++++--- tools/test.py | 13 ++++++++++++- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/test/pseudo-tty/testcfg.py b/test/pseudo-tty/testcfg.py index 40396db247e279..c6c93c13b98340 100644 --- a/test/pseudo-tty/testcfg.py +++ b/test/pseudo-tty/testcfg.py @@ -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 @@ -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, @@ -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): diff --git a/tools/test.py b/tools/test.py index dafcc3d2ad4122..a51b475b1f23cd 100755 --- a/tools/test.py +++ b/tools/test.py @@ -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()