# test code for the synchronize module
# (c) 2014, 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/>.

- name: install rsync
  package:
    name: rsync
  when: ansible_distribution != "MacOSX"

- name: cleanup old files
  shell: rm -rf {{output_dir}}/*

- name: create test new files
  copy: dest={{output_dir}}/{{item}} mode=0644 content="hello world"
  with_items:
    - foo.txt
    - bar.txt

- name: synchronize file to new filename
  synchronize: src={{output_dir}}/foo.txt dest={{output_dir}}/foo.result
  register: sync_result

- assert:
    that:
        - "'changed' in sync_result"
        - "sync_result.changed == true"
        - "'cmd' in sync_result"
        - "'rsync' in sync_result.cmd"
        - "'msg' in sync_result"
        - "sync_result.msg.startswith('>f+')"
        - "sync_result.msg.endswith('+ foo.txt\n')"

- name: test that the file was really copied over
  stat:
    path: "{{ output_dir }}/foo.result"
  register: stat_result

- assert:
    that:
      - "stat_result.stat.exists == True"
      - "stat_result.stat.checksum == '2aae6c35c94fcfb415dbe95f408b9ce91ee846ed'"

- name: test that the file is not copied a second time
  synchronize: src={{output_dir}}/foo.txt dest={{output_dir}}/foo.result
  register: sync_result

- assert:
    that:
     - "sync_result.changed == False"

- name: Cleanup
  file:
    state: absent
    path: "{{output_dir}}/{{item}}"
  with_items:
    - foo.result
    - bar.result

- name: Synchronize using the mode=push param
  synchronize:
    src: "{{output_dir}}/foo.txt"
    dest: "{{output_dir}}/foo.result"
    mode: push
  register: sync_result

- assert:
    that:
        - "'changed' in sync_result"
        - "sync_result.changed == true"
        - "'cmd' in sync_result"
        - "'rsync' in sync_result.cmd"
        - "'msg' in sync_result"
        - "sync_result.msg.startswith('>f+')"
        - "sync_result.msg.endswith('+ foo.txt\n')"

- name: test that the file was really copied over
  stat:
    path: "{{ output_dir }}/foo.result"
  register: stat_result

- assert:
    that:
      - "stat_result.stat.exists == True"
      - "stat_result.stat.checksum == '2aae6c35c94fcfb415dbe95f408b9ce91ee846ed'"

- name: test that the file is not copied a second time
  synchronize:
    src: "{{output_dir}}/foo.txt"
    dest: "{{output_dir}}/foo.result"
    mode: push
  register: sync_result

- assert:
    that:
     - "sync_result.changed == False"

- name: Cleanup
  file:
    state: absent
    path: "{{output_dir}}/{{item}}"
  with_items:
    - foo.result
    - bar.result

- name: Synchronize using the mode=pull param
  synchronize:
    src: "{{output_dir}}/foo.txt"
    dest: "{{output_dir}}/foo.result"
    mode: pull
  register: sync_result

- assert:
    that:
        - "'changed' in sync_result"
        - "sync_result.changed == true"
        - "'cmd' in sync_result"
        - "'rsync' in sync_result.cmd"
        - "'msg' in sync_result"
        - "sync_result.msg.startswith('>f+')"
        - "sync_result.msg.endswith('+ foo.txt\n')"

- name: test that the file was really copied over
  stat:
    path: "{{ output_dir }}/foo.result"
  register: stat_result

- assert:
    that:
      - "stat_result.stat.exists == True"
      - "stat_result.stat.checksum == '2aae6c35c94fcfb415dbe95f408b9ce91ee846ed'"

- name: test that the file is not copied a second time
  synchronize:
    src: "{{output_dir}}/foo.txt"
    dest: "{{output_dir}}/foo.result"
    mode: pull
  register: sync_result

- assert:
    that:
     - "sync_result.changed == False"

- name: Cleanup
  file:
    state: absent
    path: "{{output_dir}}/{{item}}"
  with_items:
    - foo.result
    - bar.result

- name: synchronize files using with_items (issue#5965)
  synchronize: src={{output_dir}}/{{item}} dest={{output_dir}}/{{item}}.result
  with_items:
    - foo.txt
    - bar.txt
  register: sync_result

- assert:
    that:
        - "sync_result.changed"
        - "sync_result.msg == 'All items completed'"
        - "'results' in sync_result"
        - "sync_result.results|length == 2"
        - "sync_result.results[0].msg.endswith('+ foo.txt\n')"
        - "sync_result.results[1].msg.endswith('+ bar.txt\n')"

- name: Cleanup
  file:
    state: absent
    path: "{{output_dir}}/{{item}}.result"
  with_items:
    - foo.txt
    - bar.txt

- name: synchronize files using rsync_path (issue#7182)
  synchronize: src={{output_dir}}/foo.txt dest={{output_dir}}/foo.rsync_path rsync_path="sudo rsync"
  register: sync_result

- assert:
    that:
        - "'changed' in sync_result"
        - "sync_result.changed == true"
        - "'cmd' in sync_result"
        - "'rsync' in sync_result.cmd"
        - "'rsync_path' in sync_result.cmd"
        - "'msg' in sync_result"
        - "sync_result.msg.startswith('>f+')"
        - "sync_result.msg.endswith('+ foo.txt\n')"

- name: Cleanup
  file:
    state: absent
    path: "{{output_dir}}/{{item}}"
  with_items:
    - foo.rsync_path

- name: add subdirectories for link-dest test
  file:
    path: "{{output_dir}}/{{item}}/"
    state: directory
    mode: 0755
  with_items:
    - directory_a
    - directory_b

- name: copy foo.txt into the first directory
  synchronize:
    src: "{{output_dir}}/foo.txt"
    dest: "{{output_dir}}/{{item}}/foo.txt"
  with_items:
    - directory_a

- name: synchronize files using link_dest
  synchronize:
    src: "{{output_dir}}/directory_a/foo.txt"
    dest: "{{output_dir}}/directory_b/foo.txt"
    link_dest:
      - "{{output_dir}}/directory_a"
  register: sync_result

- name: get stat information for directory_a
  stat:
    path: "{{ output_dir }}/directory_a/foo.txt"
  register: stat_result_a

- name: get stat information for directory_b
  stat:
    path: "{{ output_dir }}/directory_b/foo.txt"
  register: stat_result_b

- assert:
    that:
        - "'changed' in sync_result"
        - "sync_result.changed == true"
        - "stat_result_a.stat.inode == stat_result_b.stat.inode"

- name: synchronize files using link_dest that would be recursive
  synchronize:
    src: "{{output_dir}}/foo.txt"
    dest: "{{output_dir}}/foo.result"
    link_dest:
      - "{{output_dir}}"
  register: sync_result
  ignore_errors: yes

- assert:
    that:
      - sync_result is not changed
      - sync_result is failed

- name: Cleanup
  file:
    state: absent
    path: "{{output_dir}}/{{item}}"
  with_items:
    - "directory_b/foo.txt"
    - "directory_a/foo.txt"
    - "directory_a"
    - "directory_b"
