# Verify copy module for small and large files, and inline content.
# To exercise https://github.com/mitogen-hq/mitogen/pull/1110 destination
# files must have extensions and loops must use `with_items:`.

- name: integration/action/copy.yml
  hosts: test-targets
  vars:
    sourced_files:
      - src: /tmp/copy-tiny-file
        dest: /tmp/copy-tiny-file.out
        content: this is a tiny file.
        expected_checksum: f29faa9a6f19a700a941bf2aa5b281643c4ec8a0
      - src: /tmp/copy-large-file
        dest: /tmp/copy-large-file.out
        content: "{{ 'x' * 200000 }}"
        expected_checksum: 62951f943c41cdd326e5ce2b53a779e7916a820d

    inline_files:
      - dest: /tmp/copy-tiny-inline-file.out
        content: tiny inline content
        expected_checksum: b26dd6444595e2bdb342aa0a91721b57478b5029
      - dest: /tmp/copy-large-inline-file.out
        content: |
          {{ 'y' * 200000 }}
        expected_checksum: d675f47e467eae19e49032a2cc39118e12a6ee72

    files: "{{ sourced_files + inline_files }}"
  tasks:
    - name: Create sourced files
      copy:
        dest: "{{ item.src }}"
        content: "{{ item.content }}"
        mode: u=rw,go=r
      with_items: "{{ sourced_files }}"
      loop_control:
        label: "{{ item.src }}"
      delegate_to: localhost
      run_once: true

    - name: Cleanup lingering destination files
      file:
        path: "{{ item.dest }}"
        state: absent
      with_items: "{{ files }}"
      loop_control:
        label: "{{ item.dest }}"

    - name: Copy sourced files
      copy:
        src: "{{ item.src }}"
        dest: "{{ item.dest }}"
        mode: u=rw,go=r
      with_items: "{{ sourced_files }}"
      loop_control:
        label: "{{ item.dest }}"

    - name: Copy inline files
      copy:
        dest: "{{ item.dest }}"
        content: "{{ item.content }}"
        mode: u=rw,go=r
      with_items: "{{ inline_files }}"
      loop_control:
        label: "{{ item.dest }}"

    # stat results

    - name: Stat copied files
      stat:
        path: "{{ item.dest }}"
      with_items: "{{ files }}"
      loop_control:
        label: "{{ item.dest }}"
      register: stat

    - assert:
        that:
          - item.stat.checksum == item.item.expected_checksum
        quiet: true  # Avoid spamming stdout with 400 kB of item.item.content
        fail_msg: |
          item={{ item }}
      with_items: "{{ stat.results }}"
      loop_control:
        label: "{{ item.stat.path }}"

    - name: Cleanup destination files
      file:
        path: "{{ item.dest }}"
        state: absent
      with_items: "{{ files }}"
      loop_control:
        label: "{{ item.dest }}"
  tags:
    - copy
    - issue_1110
