- name: install rsync
  package:
    name: rsync
  when: ansible_distribution != "MacOSX"
- name: Clean up the working directory and files
  file:
    path: '{{ output_dir }}'
    state: absent
- name: Create the working directory
  file:
    path: '{{ output_dir }}'
    state: directory
- 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
  delegate_to: '{{ inventory_hostname }}'
- 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

      '')'
- 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
  delegate_to: '{{ inventory_hostname }}'
- 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
  delegate_to: '{{ inventory_hostname }}'
- 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

      '')'
- 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
  delegate_to: '{{ inventory_hostname }}'
- 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
  delegate_to: '{{ inventory_hostname }}'
- 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

      '')'
- 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
  delegate_to: '{{ inventory_hostname }}'
- 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
  delegate_to: '{{ inventory_hostname }}'
- 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

      '')'
    - 'sync_result.results[1].msg.endswith(''+ bar.txt

      '')'
- 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
  delegate_to: '{{ inventory_hostname }}'
- 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

      '')'
- 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
  delegate_to: '{{ inventory_hostname }}'
- 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
  delegate_to: '{{ inventory_hostname }}'
- 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: true
  delegate_to: '{{ inventory_hostname }}'

- 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

- name: setup - test for source with working dir with spaces in path
  file:
    state: directory
    path: '{{output_dir}}/{{item}}'
  delegate_to: '{{ inventory_hostname }}'
  with_items:
    - 'directory a'
    - 'directory b'
- name: setup - create test new files
  copy:
    dest: '{{output_dir}}/directory a/{{item}}'
    mode: '0644'
    content: 'hello world'
  with_items:
    - foo.txt
  delegate_to: '{{ inventory_hostname }}'
- name: copy source with spaces in dir path
  synchronize:
    src: '{{output_dir}}/directory a/foo.txt'
    dest: '{{output_dir}}/directory b/'
  delegate_to: '{{ inventory_hostname }}'
  register: sync_result
  ignore_errors: true
- 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_b.stat.exists == True
      - stat_result_b.stat.checksum == '2aae6c35c94fcfb415dbe95f408b9ce91ee846ed'
- name: Cleanup
  file:
    state: absent
    path: '{{output_dir}}/{{item}}'
  with_items:
    - 'directory b/foo.txt'
    - 'directory a/foo.txt'
    - 'directory a'
    - 'directory b'
