[stable-2.10] Add integration tests for test plugins. (#70576)
(cherry picked from commit df45dcdae0
)
Co-authored-by: Matt Clay <mclay@redhat.com>
This commit is contained in:
parent
ba645400bf
commit
f28fabe6ef
9 changed files with 381 additions and 0 deletions
1
test/integration/targets/test_core/inventory
Normal file
1
test/integration/targets/test_core/inventory
Normal file
|
@ -0,0 +1 @@
|
||||||
|
unreachable ansible_connection=ssh ansible_host=127.0.0.1 ansible_port=1011 # IANA Reserved port
|
5
test/integration/targets/test_core/runme.sh
Executable file
5
test/integration/targets/test_core/runme.sh
Executable file
|
@ -0,0 +1,5 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
set -eu
|
||||||
|
|
||||||
|
ANSIBLE_ROLES_PATH=../ ansible-playbook --vault-password-file vault-password runme.yml -i inventory "${@}"
|
4
test/integration/targets/test_core/runme.yml
Normal file
4
test/integration/targets/test_core/runme.yml
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
- hosts: localhost
|
||||||
|
gather_facts: no
|
||||||
|
roles:
|
||||||
|
- test_core
|
|
@ -1,3 +1,254 @@
|
||||||
|
- name: Failure
|
||||||
|
set_fact:
|
||||||
|
hello: world
|
||||||
|
failed_when: true
|
||||||
|
ignore_errors: yes
|
||||||
|
register: intentional_failure
|
||||||
|
|
||||||
|
- name: Success
|
||||||
|
set_fact:
|
||||||
|
hello: world
|
||||||
|
register: intentional_success
|
||||||
|
|
||||||
|
- name: Try failure test on non-dictionary
|
||||||
|
set_fact:
|
||||||
|
hello: "{{ 'nope' is failure }}"
|
||||||
|
ignore_errors: yes
|
||||||
|
register: misuse_of_failure
|
||||||
|
|
||||||
|
- name: Assert failure tests work
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- intentional_failure is failed # old name
|
||||||
|
- intentional_failure is failure
|
||||||
|
- intentional_success is not failure
|
||||||
|
- misuse_of_failure is failed
|
||||||
|
|
||||||
|
- name: Assert successful tests work
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- intentional_success is succeeded # old name
|
||||||
|
- intentional_success is success # old name
|
||||||
|
- intentional_success is successful
|
||||||
|
- intentional_failure is not successful
|
||||||
|
|
||||||
|
- name: Try reachable host
|
||||||
|
command: id
|
||||||
|
register: reachable_host
|
||||||
|
|
||||||
|
- name: Try unreachable host
|
||||||
|
command: id
|
||||||
|
delegate_to: unreachable
|
||||||
|
ignore_unreachable: yes
|
||||||
|
ignore_errors: yes
|
||||||
|
register: unreachable_host
|
||||||
|
|
||||||
|
- name: Try reachable test on non-dictionary
|
||||||
|
set_fact:
|
||||||
|
hello: "{{ 'nope' is reachable }}"
|
||||||
|
ignore_errors: yes
|
||||||
|
register: misuse_of_reachable
|
||||||
|
|
||||||
|
- name: Assert reachable tests work
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- misuse_of_reachable is failed
|
||||||
|
- reachable_host is reachable
|
||||||
|
- unreachable_host is not reachable
|
||||||
|
|
||||||
|
- name: Try unreachable test on non-dictionary
|
||||||
|
set_fact:
|
||||||
|
hello: "{{ 'nope' is unreachable }}"
|
||||||
|
ignore_errors: yes
|
||||||
|
register: misuse_of_unreachable
|
||||||
|
|
||||||
|
- name: Assert unreachable tests work
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- misuse_of_unreachable is failed
|
||||||
|
- reachable_host is not unreachable
|
||||||
|
- unreachable_host is unreachable
|
||||||
|
|
||||||
|
- name: Make changes
|
||||||
|
file:
|
||||||
|
path: dir_for_changed
|
||||||
|
state: directory
|
||||||
|
register: directory_created
|
||||||
|
|
||||||
|
- name: Make no changes
|
||||||
|
file:
|
||||||
|
path: dir_for_changed
|
||||||
|
state: directory
|
||||||
|
register: directory_unchanged
|
||||||
|
|
||||||
|
- name: Try changed test on non-dictionary
|
||||||
|
set_fact:
|
||||||
|
hello: "{{ 'nope' is changed }}"
|
||||||
|
ignore_errors: yes
|
||||||
|
register: misuse_of_changed
|
||||||
|
|
||||||
|
# providing artificial task results since there are no modules in ansible-base that provide a 'results' list instead of 'changed'
|
||||||
|
- name: Prepare artificial task results
|
||||||
|
set_fact:
|
||||||
|
results_all_changed:
|
||||||
|
results:
|
||||||
|
- changed: true
|
||||||
|
- changed: true
|
||||||
|
results_some_changed:
|
||||||
|
results:
|
||||||
|
- changed: true
|
||||||
|
- changed: false
|
||||||
|
results_none_changed:
|
||||||
|
results:
|
||||||
|
- changed: false
|
||||||
|
- changed: false
|
||||||
|
results_missing_changed: {}
|
||||||
|
|
||||||
|
- name: Assert changed tests work
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- directory_created is changed
|
||||||
|
- directory_unchanged is not changed
|
||||||
|
- misuse_of_changed is failed
|
||||||
|
- results_all_changed is changed
|
||||||
|
- results_some_changed is changed
|
||||||
|
- results_none_changed is not changed
|
||||||
|
- results_missing_changed is not changed
|
||||||
|
|
||||||
|
- name: Skip me
|
||||||
|
set_fact:
|
||||||
|
hello: world
|
||||||
|
when: false
|
||||||
|
register: skipped_task
|
||||||
|
|
||||||
|
- name: Don't skip me
|
||||||
|
set_fact:
|
||||||
|
hello: world
|
||||||
|
register: executed_task
|
||||||
|
|
||||||
|
- name: Try skipped test on non-dictionary
|
||||||
|
set_fact:
|
||||||
|
hello: "{{ 'nope' is skipped }}"
|
||||||
|
ignore_errors: yes
|
||||||
|
register: misuse_of_skipped
|
||||||
|
|
||||||
|
- name: Assert skipped tests work
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- skipped_task is skipped
|
||||||
|
- executed_task is not skipped
|
||||||
|
- misuse_of_skipped is failure
|
||||||
|
|
||||||
|
- name: Not an async task
|
||||||
|
set_fact:
|
||||||
|
hello: world
|
||||||
|
register: non_async_task
|
||||||
|
|
||||||
|
- name: Complete an async task
|
||||||
|
command: id
|
||||||
|
async: 10
|
||||||
|
poll: 1
|
||||||
|
register: async_completed
|
||||||
|
|
||||||
|
- name: Start an async task without waiting for completion
|
||||||
|
shell: sleep 3
|
||||||
|
async: 10
|
||||||
|
poll: 0
|
||||||
|
register: async_incomplete
|
||||||
|
|
||||||
|
- name: Try finished test on non-dictionary
|
||||||
|
set_fact:
|
||||||
|
hello: "{{ 'nope' is finished }}"
|
||||||
|
ignore_errors: yes
|
||||||
|
register: misuse_of_finished
|
||||||
|
|
||||||
|
- name: Assert finished tests work (warning expected)
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- non_async_task is finished
|
||||||
|
- misuse_of_finished is failed
|
||||||
|
- async_completed is finished
|
||||||
|
- async_incomplete is not finished
|
||||||
|
|
||||||
|
- name: Try started test on non-dictionary
|
||||||
|
set_fact:
|
||||||
|
hello: "{{ 'nope' is started }}"
|
||||||
|
ignore_errors: yes
|
||||||
|
register: misuse_of_started
|
||||||
|
|
||||||
|
- name: Assert started tests work (warning expected)
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- non_async_task is started
|
||||||
|
- misuse_of_started is failed
|
||||||
|
- async_completed is started
|
||||||
|
- async_incomplete is started
|
||||||
|
|
||||||
|
- name: Assert match tests work
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- "'hello' is match('h.ll.')"
|
||||||
|
- "'hello' is not match('.ll.')"
|
||||||
|
|
||||||
|
- name: Assert search tests work
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- "'hello' is search('.l')"
|
||||||
|
- "'hello' is not search('nope')"
|
||||||
|
|
||||||
|
- name: Assert regex tests work
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- "'hello' is regex('.l')"
|
||||||
|
- "'hello' is regex('.L', ignorecase=true)"
|
||||||
|
- "'hello\nAnsible' is regex('^Ansible', multiline=true)"
|
||||||
|
- "'hello' is not regex('.L')"
|
||||||
|
- "'hello\nAnsible' is not regex('^Ansible')"
|
||||||
|
|
||||||
|
- name: Try version tests with bad operator
|
||||||
|
set_fact:
|
||||||
|
result: "{{ '1.0' is version('1.0', 'equals') }}"
|
||||||
|
ignore_errors: yes
|
||||||
|
register: version_bad_operator
|
||||||
|
|
||||||
|
- name: Try version tests with bad value
|
||||||
|
set_fact:
|
||||||
|
result: "{{ '1.0' is version('nope', '==', true) }}"
|
||||||
|
ignore_errors: yes
|
||||||
|
register: version_bad_value
|
||||||
|
|
||||||
|
- name: Assert version tests work
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- "'1.0' is version_compare('1.0', '==')" # old name
|
||||||
|
- "'1.0' is version('1.0', '==')"
|
||||||
|
- "'1.0' is version('2.0', '!=')"
|
||||||
|
- "'1.0' is version('2.0', '<')"
|
||||||
|
- "'2.0' is version('1.0', '>')"
|
||||||
|
- "'1.0' is version('1.0', '<=')"
|
||||||
|
- "'1.0' is version('1.0', '>=')"
|
||||||
|
- "'1.0' is version_compare('1.0', '==', true)" # old name
|
||||||
|
- "'1.0' is version('1.0', '==', true)"
|
||||||
|
- "'1.0' is version('2.0', '!=', true)"
|
||||||
|
- "'1.0' is version('2.0', '<', true)"
|
||||||
|
- "'2.0' is version('1.0', '>', true)"
|
||||||
|
- "'1.0' is version('1.0', '<=', true)"
|
||||||
|
- "'1.0' is version('1.0', '>=', true)"
|
||||||
|
- version_bad_operator is failed
|
||||||
|
- version_bad_value is failed
|
||||||
|
|
||||||
|
- name: Assert any tests work
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- "[true, false] is any"
|
||||||
|
- "[false] is not any"
|
||||||
|
|
||||||
|
- name: Assert all tests work
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- "[true] is all"
|
||||||
|
- "[true, false] is not all"
|
||||||
|
|
||||||
- name: Assert truthy tests work
|
- name: Assert truthy tests work
|
||||||
assert:
|
assert:
|
||||||
that:
|
that:
|
||||||
|
@ -13,6 +264,7 @@
|
||||||
- '[] is not truthy'
|
- '[] is not truthy'
|
||||||
- '"on" is truthy(convert_bool=True)'
|
- '"on" is truthy(convert_bool=True)'
|
||||||
- '"off" is not truthy(convert_bool=True)'
|
- '"off" is not truthy(convert_bool=True)'
|
||||||
|
- '"fred" is truthy(convert_bool=True)'
|
||||||
- '{} is not truthy'
|
- '{} is not truthy'
|
||||||
- '{"key": "value"} is truthy'
|
- '{"key": "value"} is truthy'
|
||||||
|
|
||||||
|
@ -33,3 +285,19 @@
|
||||||
- '"off" is falsy(convert_bool=True)'
|
- '"off" is falsy(convert_bool=True)'
|
||||||
- '{} is falsy'
|
- '{} is falsy'
|
||||||
- '{"key": "value"} is not falsy'
|
- '{"key": "value"} is not falsy'
|
||||||
|
|
||||||
|
- name: Create vaulted variable for vault_encrypted test
|
||||||
|
set_fact:
|
||||||
|
vaulted_value: !vault |
|
||||||
|
$ANSIBLE_VAULT;1.1;AES256
|
||||||
|
35323961353038346165643738646465376139363061353835303739663538343266303232326635
|
||||||
|
3365353662646236356665323135633630656238316530640a663362363763633436373439663031
|
||||||
|
33663433383037396438656464636433653837376361313638366362333037323961316364363363
|
||||||
|
3835616438623261650a636164376534376661393134326662326362323131373964313961623365
|
||||||
|
3833
|
||||||
|
|
||||||
|
- name: Assert vault_encrypted tests work
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- vaulted_value is vault_encrypted
|
||||||
|
- inventory_hostname is not vault_encrypted
|
||||||
|
|
1
test/integration/targets/test_core/vault-password
Normal file
1
test/integration/targets/test_core/vault-password
Normal file
|
@ -0,0 +1 @@
|
||||||
|
test-vault-password
|
2
test/integration/targets/test_files/aliases
Normal file
2
test/integration/targets/test_files/aliases
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
shippable/posix/group5
|
||||||
|
skip/python2.6 # tests are controller only, and we no longer support Python 2.6 on the controller
|
60
test/integration/targets/test_files/tasks/main.yml
Normal file
60
test/integration/targets/test_files/tasks/main.yml
Normal file
|
@ -0,0 +1,60 @@
|
||||||
|
- name: Create a broken symbolic link
|
||||||
|
file:
|
||||||
|
src: does_not_exist
|
||||||
|
dest: link_to_nonexistent_file
|
||||||
|
state: link
|
||||||
|
force: yes
|
||||||
|
follow: no
|
||||||
|
|
||||||
|
- name: Assert directory tests work
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- "'.' is is_dir" # old name
|
||||||
|
- "'.' is directory"
|
||||||
|
- "'does_not_exist' is not directory"
|
||||||
|
|
||||||
|
- name: Assert file tests work
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- "(role_path + '/aliases') is is_file" # old name
|
||||||
|
- "(role_path + '/aliases') is file"
|
||||||
|
- "'does_not_exist' is not file"
|
||||||
|
|
||||||
|
- name: Assert link tests work
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- "'link_to_nonexistent_file' is link"
|
||||||
|
- "'.' is not link"
|
||||||
|
|
||||||
|
- name: Assert exists tests work
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- "(role_path + '/aliases') is exists"
|
||||||
|
- "'link_to_nonexistent_file' is not exists"
|
||||||
|
|
||||||
|
- name: Assert link_exists tests work
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- "'link_to_nonexistent_file' is link_exists"
|
||||||
|
- "'does_not_exist' is not link_exists"
|
||||||
|
|
||||||
|
- name: Assert abs tests work
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- "'/' is is_abs" # old name
|
||||||
|
- "'/' is abs"
|
||||||
|
- "'../' is not abs"
|
||||||
|
|
||||||
|
- name: Assert same_file tests work
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- "'/' is is_same_file('/')" # old name
|
||||||
|
- "'/' is same_file('/')"
|
||||||
|
- "'/' is not same_file(role_path + '/aliases')"
|
||||||
|
|
||||||
|
- name: Assert mount tests work
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- "'/' is is_mount" # old name
|
||||||
|
- "'/' is mount"
|
||||||
|
- "'/does_not_exist' is not mount"
|
2
test/integration/targets/test_mathstuff/aliases
Normal file
2
test/integration/targets/test_mathstuff/aliases
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
shippable/posix/group5
|
||||||
|
skip/python2.6 # tests are controller only, and we no longer support Python 2.6 on the controller
|
38
test/integration/targets/test_mathstuff/tasks/main.yml
Normal file
38
test/integration/targets/test_mathstuff/tasks/main.yml
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
- name: Get Jinja2 version
|
||||||
|
set_fact:
|
||||||
|
jinja2_version: >-
|
||||||
|
{{ lookup('pipe', '{{ ansible_playbook_python }} -c "import jinja2; print(jinja2.__version__)"') }}
|
||||||
|
|
||||||
|
- name: Assert subset tests work
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- "[1] is issubset([1, 2])" # old name
|
||||||
|
- "[1] is subset([1, 2])"
|
||||||
|
- "[1] is not subset([2])"
|
||||||
|
|
||||||
|
- name: Assert superset tests work
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- "[1, 2] is issuperset([1])" # old name
|
||||||
|
- "[1, 2] is superset([1])"
|
||||||
|
- "[2] is not superset([1])"
|
||||||
|
|
||||||
|
- name: Assert contains tests work
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- "[1] is contains(1)"
|
||||||
|
- "[1] is not contains(2)"
|
||||||
|
|
||||||
|
- name: Assert nan tests work
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- "'bad' is not nan"
|
||||||
|
- "1.1 | float is not nan"
|
||||||
|
|
||||||
|
# Jinja2 versions prior to 2.10 will traceback when using: 'nan' | float
|
||||||
|
- name: Assert nan tests work (Jinja2 2.10+)
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- "'nan' | float is isnan" # old name
|
||||||
|
- "'nan' | float is nan"
|
||||||
|
when: jinja2_version is version('2.10', '>=')
|
Loading…
Reference in a new issue