ansible/test/integration/targets/find/tasks/main.yml
Rick Elrod 810a9a5593
find: Allow reading whole file for contains regex (#71083)
Change:
- Add a parameter `read_whole_file` which allows for reading the whole
  file when doing a `contains` regex search.
- This allows for (for example) matching a pattern at the very end of
  a file.

Test Plan:
- New integration tests

Tickets:
- Fixes #63378

Signed-off-by: Rick Elrod <rick@elrod.me>
2020-08-04 12:49:45 -05:00

195 lines
4.8 KiB
YAML

# Test code for the find module.
# (c) 2017, James Tanner <tanner.jc@gmail.com>
# This file is part of Ansible
#
# Ansible is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# Ansible is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Ansible. If not, see <http://www.gnu.org/licenses/>.
- set_fact: output_dir_test={{output_dir}}/test_find
- name: make sure our testing sub-directory does not exist
file:
path: "{{ output_dir_test }}"
state: absent
- name: create our testing sub-directory
file:
path: "{{ output_dir_test }}"
state: directory
##
## find
##
- name: make some directories
file:
path: "{{ output_dir_test }}/{{ item }}"
state: directory
with_items:
- a/b/c/d
- e/f/g/h
- name: make some files
copy:
dest: "{{ output_dir_test }}/{{ item }}"
content: 'data'
with_items:
- a/1.txt
- a/b/2.jpg
- a/b/c/3
- a/b/c/d/4.xml
- e/5.json
- e/f/6.swp
- e/f/g/7.img
- e/f/g/h/8.ogg
- name: find the directories
find:
paths: "{{ output_dir_test }}"
file_type: directory
recurse: yes
register: find_test0
- debug: var=find_test0
- name: validate directory results
assert:
that:
- 'find_test0.changed is defined'
- 'find_test0.examined is defined'
- 'find_test0.files is defined'
- 'find_test0.matched is defined'
- 'find_test0.msg is defined'
- 'find_test0.matched == 8'
- 'find_test0.files | length == 8'
- name: find the xml and img files
find:
paths: "{{ output_dir_test }}"
file_type: file
patterns: "*.xml,*.img"
recurse: yes
register: find_test1
- debug: var=find_test1
- name: validate directory results
assert:
that:
- 'find_test1.matched == 2'
- 'find_test1.files | length == 2'
- name: find the xml file
find:
paths: "{{ output_dir_test }}"
patterns: "*.xml"
recurse: yes
register: find_test2
- debug: var=find_test2
- name: validate gr_name and pw_name are defined
assert:
that:
- 'find_test2.matched == 1'
- 'find_test2.files[0].pw_name is defined'
- 'find_test2.files[0].gr_name is defined'
- name: find the xml file with empty excludes
find:
paths: "{{ output_dir_test }}"
patterns: "*.xml"
recurse: yes
excludes: []
register: find_test3
- debug: var=find_test3
- name: validate gr_name and pw_name are defined
assert:
that:
- 'find_test3.matched == 1'
- 'find_test3.files[0].pw_name is defined'
- 'find_test3.files[0].gr_name is defined'
- name: Copy some files into the test dir
copy:
src: "{{ item }}"
dest: "{{ output_dir_test }}/{{ item }}"
mode: 0644
with_items:
- a.txt
- log.txt
- name: Ensure '$' only matches the true end of the file with read_whole_file, not a line
find:
paths: "{{ output_dir_test }}"
patterns: "*.txt"
contains: "KO$"
read_whole_file: true
register: whole_no_match
- debug: var=whole_no_match
- assert:
that:
- whole_no_match.matched == 0
- name: Match the end of the file successfully
find:
paths: "{{ output_dir_test }}"
patterns: "*.txt"
contains: "OK$"
read_whole_file: true
register: whole_match
- debug: var=whole_match
- assert:
that:
- whole_match.matched == 1
- name: When read_whole_file=False, $ should match an individual line
find:
paths: "{{ output_dir_test }}"
patterns: "*.txt"
contains: ".*KO$"
read_whole_file: false
register: match_end_of_line
- debug: var=match_end_of_line
- assert:
that:
- match_end_of_line.matched == 1
- name: When read_whole_file=True, match across line boundaries
find:
paths: "{{ output_dir_test }}"
patterns: "*.txt"
contains: "has\na few"
read_whole_file: true
register: match_line_boundaries
- debug: var=match_line_boundaries
- assert:
that:
- match_line_boundaries.matched == 1
- name: When read_whole_file=False, do not match across line boundaries
find:
paths: "{{ output_dir_test }}"
patterns: "*.txt"
contains: "has\na few"
read_whole_file: false
register: no_match_line_boundaries
- debug: var=no_match_line_boundaries
- assert:
that:
- no_match_line_boundaries.matched == 0