- block:
    # This block can be removed once we have a mechanism in ansible-test to separate
    # the control node from the managed node.
    - block:
        - name: Write temp file for sanity checking this is not the controller
          copy:
            content: 'I am the control node'
            dest: /tmp/Anything-Nutlike-Nuzzle-Plow-Overdue
          delegate_to: localhost
          connection: local
          when: inventory_hostname == ansible_play_hosts[0]

        - name: See if the temp file exists on the managed node
          stat:
            path: /tmp/Anything-Nutlike-Nuzzle-Plow-Overdue
          register: controller_temp_file

        - name: EXPECT FAILURE | Check if the managed node is the control node
          assert:
            msg: >
              This test must be run manually by modifying the inventory file to point
              "{{ inventory_hostname }}" at a remote host rather than "{{ ansible_host }}".
              Skipping reboot test.
            that:
              - not controller_temp_file.stat.exists

    - import_tasks: get_boot_time.yml

    - name: Reboot with default settings
      reboot:
      register: reboot_result

    - import_tasks: check_reboot.yml

    - import_tasks: get_boot_time.yml

    - name: Reboot with all options
      reboot:
        connect_timeout: 30
        search_paths: /usr/local/bin
        msg: Rebooting
        post_reboot_delay: 1
        pre_reboot_delay: 61
        test_command: uptime
        reboot_timeout: 500
      register: reboot_result

    - import_tasks: check_reboot.yml

    - import_tasks: get_boot_time.yml

    - name: Test with negative values for delays
      reboot:
        post_reboot_delay: -0.5
        pre_reboot_delay: -61
      register: reboot_result

    - import_tasks: check_reboot.yml

    - name: Use invalid parameter
      reboot:
        foo: bar
      ignore_errors: true
      register: invalid_parameter

    - name: Ensure task fails with error
      assert:
        that:
        - invalid_parameter is failed
        - "invalid_parameter.msg == 'Invalid options for reboot: foo'"

    - name: Reboot with test command that fails
      reboot:
        test_command: 'FAIL'
        reboot_timeout: "{{ timeout }}"
      register: reboot_fail_test
      failed_when: "reboot_fail_test.msg != 'Timed out waiting for post-reboot test command (timeout=' ~ timeout ~ ')'"
      vars:
        timeout: "{{ timeout_value[ansible_facts['distribution'] | lower] | default(60) }}"

    - name: Test molly-guard
      block:
        - import_tasks: get_boot_time.yml

        - name: Install molly-guard
          apt:
            update_cache: yes
            name: molly-guard
            state: present

        - name: Reboot when molly-guard is installed
          reboot:
            search_paths: /lib/molly-guard
          register: reboot_result

        - import_tasks: check_reboot.yml

      when: ansible_facts.distribution in ['Debian', 'Ubuntu']
      tags:
        - molly-guard

  always:
    - name: Cleanup temp file
      file:
        path: /tmp/Anything-Nutlike-Nuzzle-Plow-Overdue
        state: absent
      delegate_to: localhost
      connection: local
      when: inventory_hostname == ansible_play_hosts[0]

  when: ansible_virtualization_type | default('') != 'docker'
