summaryrefslogtreecommitdiffstats
path: root/test/integration/targets/find/tasks/main.yml
diff options
context:
space:
mode:
Diffstat (limited to 'test/integration/targets/find/tasks/main.yml')
-rw-r--r--test/integration/targets/find/tasks/main.yml376
1 files changed, 376 insertions, 0 deletions
diff --git a/test/integration/targets/find/tasks/main.yml b/test/integration/targets/find/tasks/main.yml
new file mode 100644
index 0000000..5381a14
--- /dev/null
+++ b/test/integration/targets/find/tasks/main.yml
@@ -0,0 +1,376 @@
+# 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: remote_tmp_dir_test={{remote_tmp_dir}}/test_find
+
+- name: make sure our testing sub-directory does not exist
+ file:
+ path: "{{ remote_tmp_dir_test }}"
+ state: absent
+
+- name: create our testing sub-directory
+ file:
+ path: "{{ remote_tmp_dir_test }}"
+ state: directory
+
+##
+## find
+##
+
+- name: make some directories
+ file:
+ path: "{{ remote_tmp_dir_test }}/{{ item }}"
+ state: directory
+ with_items:
+ - a/b/c/d
+ - e/f/g/h
+
+- name: make some files
+ copy:
+ dest: "{{ remote_tmp_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: "{{ remote_tmp_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'
+ - 'find_test0.examined == 16'
+
+- name: find the xml and img files
+ find:
+ paths: "{{ remote_tmp_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: "{{ remote_tmp_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: "{{ remote_tmp_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: "{{ remote_tmp_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: "{{ remote_tmp_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: "{{ remote_tmp_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: "{{ remote_tmp_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: "{{ remote_tmp_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: "{{ remote_tmp_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
+
+- block:
+ - set_fact:
+ mypath: /idontexist{{lookup('pipe', 'mktemp')}}
+
+ - find:
+ paths: '{{mypath}}'
+ patterns: '*'
+ register: failed_path
+
+ - assert:
+ that:
+ - failed_path.files == []
+ - 'failed_path.msg == "Not all paths examined, check warnings for details"'
+ - mypath in failed_path.skipped_paths
+
+- name: test number of examined directories/files
+ block:
+ - name: Get all files/directories in the path
+ find:
+ paths: "{{ remote_tmp_dir_test }}"
+ recurse: yes
+ file_type: any
+ register: total_contents
+
+ - assert:
+ that:
+ - total_contents.matched == 18
+ - total_contents.examined == 18
+
+ - name: Get files and directories with depth
+ find:
+ paths: "{{ remote_tmp_dir_test }}"
+ recurse: yes
+ file_type: any
+ depth: 2
+ register: contents_with_depth
+
+ - assert:
+ that:
+ - contents_with_depth.matched == 8
+ # dir contents are considered until the depth exceeds the requested depth
+ # there are 8 files/directories in the requested depth and 4 that exceed it by 1
+ - contents_with_depth.examined == 12
+
+ - name: Find files with depth
+ find:
+ paths: "{{ remote_tmp_dir_test }}"
+ depth: 2
+ recurse: yes
+ register: files_with_depth
+
+ - assert:
+ that:
+ - files_with_depth.matched == 4
+ # dir contents are considered until the depth exceeds the requested depth
+ # there are 8 files/directories in the requested depth and 4 that exceed it by 1
+ - files_with_depth.examined == 12
+
+- name: exclude with regex
+ find:
+ paths: "{{ remote_tmp_dir_test }}"
+ recurse: yes
+ use_regex: true
+ exclude: .*\.ogg
+ register: find_test3
+
+- set_fact:
+ find_test3_list: "{{ find_test3.files|map(attribute='path') }}"
+
+- name: assert we skipped the ogg file
+ assert:
+ that:
+ - '"{{ remote_tmp_dir_test }}/e/f/g/h/8.ogg" not in find_test3_list'
+
+- name: patterns with regex
+ find:
+ paths: "{{ remote_tmp_dir_test }}"
+ recurse: yes
+ use_regex: true
+ patterns: .*\.ogg
+ register: find_test4
+
+- name: assert we matched the ogg file
+ assert:
+ that:
+ - remote_tmp_dir_test ~ "/e/f/g/h/8.ogg" in find_test4.files|map(attribute="path")
+
+- name: create our age/size testing sub-directory
+ file:
+ path: "{{ remote_tmp_dir_test }}/astest"
+ state: directory
+
+- name: create test file with old timestamps
+ file:
+ path: "{{ remote_tmp_dir_test }}/astest/old.txt"
+ state: touch
+ modification_time: "202001011200.0"
+
+- name: create test file with current timestamps
+ file:
+ path: "{{ remote_tmp_dir_test }}/astest/new.txt"
+ state: touch
+
+- name: create hidden test file with current timestamps
+ file:
+ path: "{{ remote_tmp_dir_test }}/astest/.hidden.txt"
+ state: touch
+
+- name: find files older than 1 week
+ find:
+ path: "{{ remote_tmp_dir_test }}/astest"
+ age: 1w
+ hidden: true
+ register: result
+
+- set_fact:
+ astest_list: "{{ result.files|map(attribute='path') }}"
+
+- name: assert we only find the old file
+ assert:
+ that:
+ - result.matched == 1
+ - '"{{ remote_tmp_dir_test }}/astest/old.txt" in astest_list'
+
+- name: find files newer than 1 week
+ find:
+ path: "{{ remote_tmp_dir_test }}/astest"
+ age: -1w
+ register: result
+
+- set_fact:
+ astest_list: "{{ result.files|map(attribute='path') }}"
+
+- name: assert we only find the current file
+ assert:
+ that:
+ - result.matched == 1
+ - '"{{ remote_tmp_dir_test }}/astest/new.txt" in astest_list'
+
+- name: add some content to the new file
+ shell: "echo hello world > {{ remote_tmp_dir_test }}/astest/new.txt"
+
+- name: find files with MORE than 5 bytes, also get checksums
+ find:
+ path: "{{ remote_tmp_dir_test }}/astest"
+ size: 5
+ hidden: true
+ get_checksum: true
+ register: result
+
+- set_fact:
+ astest_list: "{{ result.files|map(attribute='path') }}"
+
+- name: assert we only find the hello world file
+ assert:
+ that:
+ - result.matched == 1
+ - '"{{ remote_tmp_dir_test }}/astest/new.txt" in astest_list'
+ - '"checksum" in result.files[0]'
+
+- name: find ANY item with LESS than 5 bytes, also get checksums
+ find:
+ path: "{{ remote_tmp_dir_test }}/astest"
+ size: -5
+ hidden: true
+ get_checksum: true
+ file_type: any
+ register: result
+
+- set_fact:
+ astest_list: "{{ result.files|map(attribute='path') }}"
+
+- name: assert we do not find the hello world file and a checksum is present
+ assert:
+ that:
+ - result.matched == 2
+ - '"{{ remote_tmp_dir_test }}/astest/old.txt" in astest_list'
+ - '"{{ remote_tmp_dir_test }}/astest/.hidden.txt" in astest_list'
+ - '"checksum" in result.files[0]'