sapling/eden/integration/lib/pexpect.py
Andres Suarez fbdb46f5cb Tidy up license headers
Reviewed By: chadaustin

Differential Revision: D17872966

fbshipit-source-id: cd60a364a2146f0dadbeca693b1d4a5d7c97ff63
2019-10-11 05:28:23 -07:00

69 lines
2.2 KiB
Python

#!/usr/bin/env python3
# Copyright (c) Facebook, Inc. and its affiliates.
#
# This software may be used and distributed according to the terms of the
# GNU General Public License version 2.
import abc
import shlex
from typing import Any, Optional, Union
import pexpect
class PexpectAssertionMixin(metaclass=abc.ABCMeta):
def assert_process_succeeds(self, process: pexpect.spawn):
actual_exit_code = wait_for_pexpect_process(process)
self.assertEqual(
actual_exit_code,
0,
f"Command should return success: {pexpect_process_shell_command(process)}",
)
def assert_process_fails(
self, process: pexpect.spawn, exit_code: Optional[int] = None
):
if exit_code is None:
actual_exit_code = wait_for_pexpect_process(process)
self.assertNotEqual(
actual_exit_code,
0,
f"Command should return an error code: "
f"{pexpect_process_shell_command(process)}",
)
else:
self.assert_process_exit_code(process, exit_code)
def assert_process_exit_code(self, process: pexpect.spawn, exit_code: int):
actual_exit_code = wait_for_pexpect_process(process)
self.assertEqual(
actual_exit_code,
exit_code,
f"Command should exit with code {exit_code}: "
f"{pexpect_process_shell_command(process)}",
)
@abc.abstractmethod
def assertEqual(self, first: Any, second: Any, msg: Any = ...) -> None:
raise NotImplementedError()
@abc.abstractmethod
def assertNotEqual(self, first: Any, second: Any, msg: Any = ...) -> None:
raise NotImplementedError()
def pexpect_process_shell_command(process: pexpect.spawn) -> str:
def str_from_strlike(s: Union[bytes, str]) -> str:
if isinstance(s, str):
return s
else:
return s.decode("utf-8")
command_parts = [process.command] + [str_from_strlike(arg) for arg in process.args]
return " ".join(map(shlex.quote, command_parts))
def wait_for_pexpect_process(process: pexpect.spawn) -> int:
process.expect_exact(pexpect.EOF)
return process.wait()