From a032f96222670adab880aaedadd683c6fcd6e59d Mon Sep 17 00:00:00 2001 From: Patrick Kingston <66141901+pkingstonxyz@users.noreply.github.com> Date: Thu, 3 Jul 2025 15:59:51 -0400 Subject: [PATCH] Expand expect module test suite (#85422) * Test expect module for missing pexpect * Test expect module for incorrect timeout type * Test expect module for out of date pexpect failures * Test pexpect.ExceptionPexpect Also fixed task naming to be inline with the rest of the file. * Change pexpect management to venv * Normalize b_out to b'' when falsy for consistent handling * Move test venv from /tmp/ to output_dir * Update tests according to corrections * Remove break_system_packages when installing pexpect 3.3 * Remove unnecessary if statement pexpect.run(...) shouldn't ever return None, so it's safe to remove the check entirely. Maintains 100% coverage --- lib/ansible/modules/expect.py | 3 - .../integration/targets/expect/tasks/main.yml | 92 +++++++++++++++++++ 2 files changed, 92 insertions(+), 3 deletions(-) diff --git a/lib/ansible/modules/expect.py b/lib/ansible/modules/expect.py index e9ac2bc13e4..d2d537f1a7d 100644 --- a/lib/ansible/modules/expect.py +++ b/lib/ansible/modules/expect.py @@ -249,9 +249,6 @@ def main(): end_date = datetime.datetime.now() delta = end_date - start_date - if b_out is None: - b_out = b'' - result = dict( cmd=args, stdout=to_native(b_out).rstrip('\r\n'), diff --git a/test/integration/targets/expect/tasks/main.yml b/test/integration/targets/expect/tasks/main.yml index ddb78f8e5da..cd053ddd87a 100644 --- a/test/integration/targets/expect/tasks/main.yml +++ b/test/integration/targets/expect/tasks/main.yml @@ -241,3 +241,95 @@ that: - "non_zero_result.failed" - "non_zero_result.msg == 'non-zero return code'" + +- name: run tests in venv + vars: + venv_dir: "{{ output_dir }}/pexpected_venv" + venv_python: "{{ venv_dir }}/bin/python" + block: + - name: ensure venv exists + pip: + name: coverage + virtualenv: "{{ venv_dir }}" + virtualenv_command: "{{ ansible_python_interpreter }} -m venv" + + - name: trigger pexpect dependency absence + expect: + command: "echo expectThePexpected" + responses: + foo: bar + vars: + ansible_python_interpreter: "{{ venv_python }}" + register: pexpect_dependency_absence + ignore_errors: true + + - name: assert pexpect dependency absence + assert: + that: + - pexpect_dependency_absence is failed + - pexpect_dependency_absence.msg is contains 'pexpect' + + - name: Install pexpect3.3 + pip: + name: pexpect + version: 3.3 + virtualenv: "{{ venv_dir }}" + + - name: trigger fallback to pexpect3.3 methods + expect: + command: "echo pexpectIsABitOutOfDate" + responses: + foo: bar + vars: + ansible_python_interpreter: "{{ venv_python }}" + register: pexpect_version_three_dot_three + + - name: install pexpect3.0 + pip: + name: pexpect + version: 3.0 + virtualenv: "{{ venv_dir }}" + + - name: trigger failure with out of date pexpect version + expect: + command: "echo pexpectIsTooOutOfDate" + responses: + foo: bar + vars: + ansible_python_interpreter: "{{ venv_python }}" + register: pexpect_version_out_of_date + ignore_errors: true + + - name: assert failure with out of date pexpect + assert: + that: + - pexpect_version_out_of_date is failed + - pexpect_version_out_of_date.msg is contains 'Insufficient version of pexpect installed' + +- name: trigger TypeError on timeout value + expect: + command: "echo piIsNotAnInt" + responses: + foo: bar + timeout: pi + register: pexpect_timeout_typeerror + ignore_errors: true + +- name: assert timeout triggers TypeError when not an int + assert: + that: + - pexpect_timeout_typeerror is failed + - pexpect_timeout_typeerror.msg is contains 'cannot be converted to an int' + +- name: trigger pexpect.ExceptionPexpect + expect: + command: commandthatdoesntexist + responses: + foo: bar + register: pexpect_exception_pexpect + ignore_errors: true + +- name: assert failure for a nonexistent command + assert: + that: + - pexpect_exception_pexpect is failed \ No newline at end of file