From b9db213912964cf2eb074f64a846ed6fb01aab12 Mon Sep 17 00:00:00 2001 From: Roman Zeyde Date: Sat, 16 Oct 2021 21:55:51 +0300 Subject: [PATCH] Use Popen.communicate to get stdout from subprocess --- libagent/gpg/keyring.py | 5 ++++- libagent/gpg/tests/test_keyring.py | 17 +++++++++++------ 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/libagent/gpg/keyring.py b/libagent/gpg/keyring.py index 736ab5c..2260b82 100644 --- a/libagent/gpg/keyring.py +++ b/libagent/gpg/keyring.py @@ -17,8 +17,11 @@ log = logging.getLogger(__name__) def check_output(args, env=None, sp=subprocess): """Call an external binary and return its stdout.""" log.debug('calling %s with env %s', args, env) - output = sp.check_output(args=args, env=env) + p = sp.Popen(args=args, env=env, stdin=sp.PIPE, stdout=sp.PIPE, stderr=sp.PIPE) + (output, error) = p.communicate() log.debug('output: %r', output) + if error: + log.debug('error: %r', error) return output diff --git a/libagent/gpg/tests/test_keyring.py b/libagent/gpg/tests/test_keyring.py index e83616e..6faa446 100644 --- a/libagent/gpg/tests/test_keyring.py +++ b/libagent/gpg/tests/test_keyring.py @@ -53,6 +53,14 @@ class FakeSocket: self.tx.write(data) +def mock_subprocess(output, error=b''): + sp = mock.Mock(spec=['Popen', 'PIPE']) + p = mock.Mock(spec=['communicate']) + sp.Popen.return_value = p + p.communicate.return_value = (output, error) + return sp + + def test_sign_digest(): sock = FakeSocket() sock.rx.write(b'OK Pleased to meet you, process XYZ\n') @@ -61,10 +69,8 @@ def test_sign_digest(): sock.rx.seek(0) keygrip = '1234' digest = b'A' * 32 - sp = mock.Mock(spec=['check_output']) - sp.check_output.return_value = '/dev/pts/0' sig = keyring.sign_digest(sock=sock, keygrip=keygrip, - digest=digest, sp=sp, + digest=digest, sp=mock_subprocess('/dev/pts/0'), environ={'DISPLAY': ':0'}) assert sig == (0x30313233343536373839414243444546,) assert sock.tx.getvalue() == b'''RESET @@ -85,8 +91,7 @@ def test_iterlines(): def test_get_agent_sock_path(): - sp = mock.Mock(spec=['check_output']) - sp.check_output.return_value = b'''sysconfdir:/usr/local/etc/gnupg + sp = mock_subprocess(b'''sysconfdir:/usr/local/etc/gnupg bindir:/usr/local/bin libexecdir:/usr/local/libexec libdir:/usr/local/lib/gnupg @@ -96,6 +101,6 @@ dirmngr-socket:/run/user/1000/gnupg/S.dirmngr agent-ssh-socket:/run/user/1000/gnupg/S.gpg-agent.ssh agent-socket:/run/user/1000/gnupg/S.gpg-agent homedir:/home/roman/.gnupg -''' +''') expected = b'/run/user/1000/gnupg/S.gpg-agent' assert keyring.get_agent_sock_path(sp=sp) == expected