# Test code for the archive module.
# (c) 2017, Abhijeet Kasurde <akasurde@redhat.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/>.
# Make sure we start fresh

- name: Ensure zip is present to create test archive (yum)
  yum: name=zip state=latest
  when: ansible_pkg_mgr == 'yum'

- name: Ensure zip is present to create test archive (apt)
  apt: name=zip state=latest
  when: ansible_pkg_mgr == 'apt'

- name: Install prerequisites for backports.lzma when using python2 (non OSX)
  block:
    - name: Set liblzma package name depending on the OS
      set_fact:
        liblzma_dev_package:
          Debian: liblzma-dev
          RedHat: xz-devel
          Suse: xz-devel
    - name: Ensure liblzma-dev is present to install backports-lzma
      package: name={{ liblzma_dev_package[ansible_os_family] }} state=latest
      when: ansible_os_family in liblzma_dev_package.keys()
  when:
    - ansible_python_version.split('.')[0] == '2'
    - ansible_os_family != 'Darwin'

- name: Install prerequisites for backports.lzma when using python2 (OSX)
  block:
    - name: Find brew binary
      command: which brew
      register: brew_which
    - name: Get owner of brew binary
      stat: path="{{ brew_which.stdout }}"
      register: brew_stat
    - name: "Install package"
      homebrew:
        name: xz
        state: present
        update_homebrew: no
      become: yes
      become_user: "{{ brew_stat.stat.pw_name }}"
      # Newer versions of brew want to compile a package which takes a long time. Do not upgrade homebrew until a
      # proper solution can be found
      environment:
        HOMEBREW_NO_AUTO_UPDATE: True
  when:
    - ansible_python_version.split('.')[0] == '2'
    - ansible_os_family == 'Darwin'

- name: Ensure backports.lzma is present to create test archive (pip)
  pip: name=backports.lzma state=latest
  when: ansible_python_version.split('.')[0] == '2'
  register: backports_lzma_pip

- name: prep our files
  copy: src={{ item }} dest={{output_dir}}/{{ item }}
  with_items:
    - foo.txt
    - bar.txt
    - empty.txt

- name: archive using gz
  archive:
    path: "{{ output_dir }}/*.txt"
    dest: "{{ output_dir }}/archive_01.gz"
    format: gz
  register: archive_gz_result_01

- debug: msg="{{ archive_gz_result_01 }}"

- name: verify that the files archived
  file: path={{output_dir}}/archive_01.gz state=file

- name: check if gz file exists and includes all text files
  assert:
    that:
      - "{{ archive_gz_result_01.changed }}"
      - "{{ 'archived' in archive_gz_result_01 }}"
      - "{{ archive_gz_result_01['archived'] | length }} == 3"

- name: archive using zip
  archive:
    path: "{{ output_dir }}/*.txt"
    dest: "{{ output_dir }}/archive_01.zip"
    format: zip
  register: archive_zip_result_01

- debug: msg="{{ archive_zip_result_01 }}"

- name: verify that the files archived
  file: path={{output_dir}}/archive_01.zip state=file

- name: check if zip file exists
  assert:
    that:
      - "{{ archive_zip_result_01.changed }}"
      - "{{ 'archived' in archive_zip_result_01 }}"
      - "{{ archive_zip_result_01['archived'] | length }} == 3"

- name: archive using bz2
  archive:
    path: "{{ output_dir }}/*.txt"
    dest: "{{ output_dir }}/archive_01.bz2"
    format: bz2
  register: archive_bz2_result_01

- debug: msg="{{ archive_bz2_result_01 }}"

- name: verify that the files archived
  file: path={{output_dir}}/archive_01.bz2 state=file

- name: check if bzip file exists
  assert:
    that:
      - "{{ archive_bz2_result_01.changed }}"
      - "{{ 'archived' in archive_bz2_result_01 }}"
      - "{{ archive_bz2_result_01['archived'] | length }} == 3"

- name: archive using xz
  archive:
    path: "{{ output_dir }}/*.txt"
    dest: "{{ output_dir }}/archive_01.xz"
    format: xz
  register: archive_xz_result_01

- debug: msg="{{ archive_xz_result_01 }}"

- name: verify that the files archived
  file: path={{output_dir}}/archive_01.xz state=file

- name: check if xz file exists
  assert:
    that:
      - "{{ archive_xz_result_01.changed }}"
      - "{{ 'archived' in archive_xz_result_01 }}"
      - "{{ archive_xz_result_01['archived'] | length }} == 3"

- name: archive and set mode to 0600
  archive:
    path: "{{ output_dir }}/*.txt"
    dest: "{{ output_dir }}/archive_02.gz"
    format: gz
    mode: "u+rwX,g-rwx,o-rwx"
  register: archive_bz2_result_02

- name: Test that the file modes were changed
  stat:
    path: "{{ output_dir }}/archive_02.gz"
  register: archive_02_gz_stat

- debug: msg="{{ archive_02_gz_stat}}"

- name: Test that the file modes were changed
  assert:
    that:
      - "archive_02_gz_stat.changed == False "
      - "archive_02_gz_stat.stat.mode == '0600'"
      - "'archived' in archive_bz2_result_02"
      - "{{ archive_bz2_result_02['archived']| length}} == 3"

- name: remove our gz
  file: path="{{ output_dir }}/archive_02.gz" state=absent


- name: archive and set mode to 0600
  archive:
    path: "{{ output_dir }}/*.txt"
    dest: "{{ output_dir }}/archive_02.zip"
    format: zip
    mode: "u+rwX,g-rwx,o-rwx"
  register: archive_zip_result_02

- name: Test that the file modes were changed
  stat:
    path: "{{ output_dir }}/archive_02.zip"
  register: archive_02_zip_stat

- name: Test that the file modes were changed
  assert:
    that:
      - "archive_02_zip_stat.changed == False"
      - "archive_02_zip_stat.stat.mode == '0600'"
      - "'archived' in archive_zip_result_02"
      - "{{ archive_zip_result_02['archived']| length}} == 3"

- name: remove our zip
  file: path="{{ output_dir }}/archive_02.zip" state=absent


- name: archive and set mode to 0600
  archive:
    path: "{{ output_dir }}/*.txt"
    dest: "{{ output_dir }}/archive_02.bz2"
    format: bz2
    mode: "u+rwX,g-rwx,o-rwx"
  register: archive_bz2_result_02

- name: Test that the file modes were changed
  stat:
    path: "{{ output_dir }}/archive_02.bz2"
  register: archive_02_bz2_stat

- name: Test that the file modes were changed
  assert:
    that:
      - "archive_02_bz2_stat.changed == False"
      - "archive_02_bz2_stat.stat.mode == '0600'"
      - "'archived' in archive_bz2_result_02"
      - "{{ archive_bz2_result_02['archived']| length}} == 3"

- name: remove our bz2
  file: path="{{ output_dir }}/archive_02.bz2" state=absent

- name: archive and set mode to 0600
  archive:
    path: "{{ output_dir }}/*.txt"
    dest: "{{ output_dir }}/archive_02.xz"
    format: xz
    mode: "u+rwX,g-rwx,o-rwx"
  register: archive_xz_result_02

- name: Test that the file modes were changed
  stat:
    path: "{{ output_dir }}/archive_02.xz"
  register: archive_02_xz_stat

- name: Test that the file modes were changed
  assert:
    that:
      - "archive_02_xz_stat.changed == False"
      - "archive_02_xz_stat.stat.mode == '0600'"
      - "'archived' in archive_xz_result_02"
      - "{{ archive_xz_result_02['archived']| length}} == 3"

- name: remove our xz
  file: path="{{ output_dir }}/archive_02.xz" state=absent

- name: test that gz archive that contains non-ascii filenames
  archive:
    path: "{{ output_dir }}/*.txt"
    dest: "{{ output_dir }}/test-archive-nonascii-くらとみ.tar.gz"
    format: gz
  register: nonascii_result_0

- name: Check that file is really there
  stat:
    path: "{{ output_dir }}/test-archive-nonascii-くらとみ.tar.gz"
  register: nonascii_stat0

- name: Assert that nonascii tests succeeded
  assert:
    that:
      - "nonascii_result_0.changed == true"
      - "nonascii_stat0.stat.exists == true"

- name: remove nonascii test
  file: path="{{ output_dir }}/test-archive-nonascii-くらとみ.tar.gz" state=absent

- name: test that bz2 archive that contains non-ascii filenames
  archive:
    path: "{{ output_dir }}/*.txt"
    dest: "{{ output_dir }}/test-archive-nonascii-くらとみ.bz2"
    format: bz2
  register: nonascii_result_1

- name: Check that file is really there
  stat:
    path: "{{ output_dir }}/test-archive-nonascii-くらとみ.bz2"
  register: nonascii_stat_1

- name: Assert that nonascii tests succeeded
  assert:
    that:
      - "nonascii_result_1.changed == true"
      - "nonascii_stat_1.stat.exists == true"

- name: remove nonascii test
  file: path="{{ output_dir }}/test-archive-nonascii-くらとみ.bz2" state=absent

- name: test that xz archive that contains non-ascii filenames
  archive:
    path: "{{ output_dir }}/*.txt"
    dest: "{{ output_dir }}/test-archive-nonascii-くらとみ.xz"
    format: xz
  register: nonascii_result_1

- name: Check that file is really there
  stat:
    path: "{{ output_dir }}/test-archive-nonascii-くらとみ.xz"
  register: nonascii_stat_1

- name: Assert that nonascii tests succeeded
  assert:
    that:
      - "nonascii_result_1.changed == true"
      - "nonascii_stat_1.stat.exists == true"

- name: remove nonascii test
  file: path="{{ output_dir }}/test-archive-nonascii-くらとみ.xz" state=absent

- name: test that zip archive that contains non-ascii filenames
  archive:
    path: "{{ output_dir }}/*.txt"
    dest: "{{ output_dir }}/test-archive-nonascii-くらとみ.zip"
    format: zip
  register: nonascii_result_2

- name: Check that file is really there
  stat:
    path: "{{ output_dir }}/test-archive-nonascii-くらとみ.zip"
  register: nonascii_stat_2

- name: Assert that nonascii tests succeeded
  assert:
    that:
      - "nonascii_result_2.changed == true"
      - "nonascii_stat_2.stat.exists == true"

- name: remove nonascii test
  file: path="{{ output_dir }}/test-archive-nonascii-くらとみ.zip" state=absent

- name: Remove backports.lzma if previously installed (pip)
  pip: name=backports.lzma state=absent
  when: backports_lzma_pip is changed
