Properly handle EOF in input (#4612)

* properly handle eof

* cleanup InputWithTimeoutTest

* add test_eof

* add comment about mimicking getpass
This commit is contained in:
Brad Warren
2017-05-03 14:44:15 -07:00
committed by GitHub
parent a5bd0cf50c
commit 13c88f1c02
2 changed files with 15 additions and 7 deletions
+6 -1
View File
@@ -69,6 +69,8 @@ def input_with_timeout(prompt=None, timeout=36000.0):
:raises errors.Error if no answer is given before the timeout
"""
# use of sys.stdin and sys.stdout to mimic six.moves.input based on
# https://github.com/python/cpython/blob/baf7bb30a02aabde260143136bdf5b3738a1d409/Lib/getpass.py#L129
if prompt:
sys.stdout.write(prompt)
sys.stdout.flush()
@@ -79,7 +81,10 @@ def input_with_timeout(prompt=None, timeout=36000.0):
raise errors.Error(
"Timed out waiting for answer to prompt '{0}'".format(prompt))
return rlist[0].readline().rstrip('\n')
line = rlist[0].readline()
if not line:
raise EOFError
return line.rstrip('\n')
@zope.interface.implementer(interfaces.IDisplay)
+9 -6
View File
@@ -2,6 +2,7 @@
import inspect
import os
import socket
import tempfile
import unittest
import six
@@ -25,15 +26,17 @@ class InputWithTimeoutTest(unittest.TestCase):
from certbot.display.util import input_with_timeout
return input_with_timeout(*args, **kwargs)
def setUp(self):
self.expected_msg = "foo bar"
self.stdin = six.StringIO(self.expected_msg + "\n")
def test_eof(self):
with tempfile.TemporaryFile("r+") as f:
with mock.patch("certbot.display.util.sys.stdin", new=f):
self.assertRaises(EOFError, self._call)
def test_input(self, prompt=None):
expected = "foo bar"
stdin = six.StringIO(expected + "\n")
with mock.patch("certbot.display.util.select.select") as mock_select:
mock_select.return_value = ([self.stdin], [], [],)
self.assertEqual(display_util.input_with_timeout(prompt),
self.expected_msg)
mock_select.return_value = ([stdin], [], [],)
self.assertEqual(self._call(prompt), expected)
@mock.patch("certbot.display.util.sys.stdout")
def test_input_with_prompt(self, mock_stdout):