diff options
Diffstat (limited to 'test/integration/targets/command_shell/tasks')
-rw-r--r-- | test/integration/targets/command_shell/tasks/main.yml | 548 |
1 files changed, 548 insertions, 0 deletions
diff --git a/test/integration/targets/command_shell/tasks/main.yml b/test/integration/targets/command_shell/tasks/main.yml new file mode 100644 index 0000000..12a944c --- /dev/null +++ b/test/integration/targets/command_shell/tasks/main.yml @@ -0,0 +1,548 @@ +# Test code for the command and shell modules. + +# Copyright: (c) 2014, Richard Isaacson <richard.c.isaacson@gmail.com> +# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) + +- name: use command with unsupported executable arg + command: ls /dev/null + args: + executable: /bogus + register: executable + +- name: assert executable warning was reported + assert: + that: + - executable.stdout == '/dev/null' + - executable.warnings | length() == 1 + - "'no longer supported' in executable.warnings[0]" + +- name: use command with no command + command: + args: + chdir: / + register: no_command + ignore_errors: true + +- name: assert executable fails with no command + assert: + that: + - no_command is failed + - no_command.msg == 'no command given' + - no_command.rc == 256 + +- name: use argv + command: + argv: + - echo + - testing + register: argv_command + ignore_errors: true + +- name: assert executable works with argv + assert: + that: + - "argv_command.stdout == 'testing'" + +- name: use argv and command string + command: echo testing + args: + argv: + - echo + - testing + register: argv_and_string_command + ignore_errors: true + +- name: assert executable fails with both argv and command string + assert: + that: + - argv_and_string_command is failed + - argv_and_string_command.msg == 'only command or argv can be given, not both' + - argv_and_string_command.rc == 256 + +- set_fact: + remote_tmp_dir_test: "{{ remote_tmp_dir }}/test_command_shell" + +- name: make sure our testing sub-directory does not exist + file: + path: "{{ remote_tmp_dir_test }}" + state: absent + +- name: create our testing sub-directory + file: + path: "{{ remote_tmp_dir_test }}" + state: directory + +- name: prep our test script + copy: + src: test.sh + dest: "{{ remote_tmp_dir_test }}" + mode: '0755' + +- name: prep our test script + copy: + src: create_afile.sh + dest: "{{ remote_tmp_dir_test }}" + mode: '0755' + +- name: prep our test script + copy: + src: remove_afile.sh + dest: "{{ remote_tmp_dir_test }}" + mode: '0755' + +- name: locate bash + shell: which bash + register: bash + +## +## command +## + +- name: execute the test.sh script via command + command: "{{ remote_tmp_dir_test }}/test.sh" + register: command_result0 + +- name: assert that the script executed correctly + assert: + that: + - command_result0.rc == 0 + - command_result0.stderr == '' + - command_result0.stdout == 'win' + +# executable + +# FIXME doesn't have the expected stdout. + +#- name: execute the test.sh script with executable via command +# command: "{{remote_tmp_dir_test }}/test.sh executable={{ bash.stdout }}" +# register: command_result1 +# +#- name: assert that the script executed correctly with command +# assert: +# that: +# - "command_result1.rc == 0" +# - "command_result1.stderr == ''" +# - "command_result1.stdout == 'win'" + +# chdir + +- name: execute the test.sh script with chdir via command + command: ./test.sh + args: + chdir: "{{ remote_tmp_dir_test }}" + register: command_result2 + +- name: Check invalid chdir + command: echo + args: + chdir: "{{ remote_tmp_dir }}/nope" + ignore_errors: yes + register: chdir_invalid + +- name: assert that the script executed correctly with chdir + assert: + that: + - command_result2.rc == 0 + - command_result2.stderr == '' + - command_result2.stdout == 'win' + - chdir_invalid is failed + - chdir_invalid.msg is search('Unable to change directory') + +# creates + +- name: verify that afile.txt is absent + file: + path: "{{ remote_tmp_dir_test }}/afile.txt" + state: absent + +- name: create afile.txt with create_afile.sh via command (check mode) + command: "{{ remote_tmp_dir_test }}/create_afile.sh {{remote_tmp_dir_test }}/afile.txt" + args: + creates: "{{ remote_tmp_dir_test }}/afile.txt" + register: check_mode_result + check_mode: yes + +- assert: + that: + - check_mode_result.changed + - "'skipped' not in check_mode_result" + +- name: verify that afile.txt still does not exist + stat: + path: "{{remote_tmp_dir_test}}/afile.txt" + register: stat_result + failed_when: stat_result.stat.exists + +- name: create afile.txt with create_afile.sh via command + command: "{{ remote_tmp_dir_test }}/create_afile.sh {{remote_tmp_dir_test }}/afile.txt" + args: + creates: "{{ remote_tmp_dir_test }}/afile.txt" + +- name: verify that afile.txt is present + file: + path: "{{ remote_tmp_dir_test }}/afile.txt" + state: file + +- name: re-run previous command using creates with globbing (check mode) + command: "{{ remote_tmp_dir_test }}/create_afile.sh {{ remote_tmp_dir_test }}/afile.txt" + args: + creates: "{{ remote_tmp_dir_test }}/afile.*" + register: check_mode_result + check_mode: yes + +- assert: + that: + - not check_mode_result.changed + - "'skipped' not in check_mode_result" + +- name: re-run previous command using creates with globbing + command: "{{ remote_tmp_dir_test }}/create_afile.sh {{ remote_tmp_dir_test }}/afile.txt" + args: + creates: "{{ remote_tmp_dir_test }}/afile.*" + register: command_result3 + +- name: assert that creates with globbing is working + assert: + that: + - command_result3 is not changed + +# removes + +- name: remove afile.txt with remote_afile.sh via command (check mode) + command: "{{ remote_tmp_dir_test }}/remove_afile.sh {{ remote_tmp_dir_test }}/afile.txt" + args: + removes: "{{ remote_tmp_dir_test }}/afile.txt" + register: check_mode_result + check_mode: yes + +- assert: + that: + - check_mode_result.changed + - "'skipped' not in check_mode_result" + +- name: verify that afile.txt still exists + stat: + path: "{{remote_tmp_dir_test}}/afile.txt" + register: stat_result + failed_when: not stat_result.stat.exists + +- name: remove afile.txt with remote_afile.sh via command + command: "{{ remote_tmp_dir_test }}/remove_afile.sh {{ remote_tmp_dir_test }}/afile.txt" + args: + removes: "{{ remote_tmp_dir_test }}/afile.txt" + +- name: verify that afile.txt is absent + file: path={{remote_tmp_dir_test}}/afile.txt state=absent + +- name: re-run previous command using removes with globbing (check mode) + command: "{{ remote_tmp_dir_test }}/remove_afile.sh {{ remote_tmp_dir_test }}/afile.txt" + args: + removes: "{{ remote_tmp_dir_test }}/afile.*" + register: check_mode_result + check_mode: yes + +- assert: + that: + - not check_mode_result.changed + - "'skipped' not in check_mode_result" + +- name: re-run previous command using removes with globbing + command: "{{ remote_tmp_dir_test }}/remove_afile.sh {{ remote_tmp_dir_test }}/afile.txt" + args: + removes: "{{ remote_tmp_dir_test }}/afile.*" + register: command_result4 + +- name: assert that removes with globbing is working + assert: + that: + - command_result4.changed != True + +- name: pass stdin to cat via command + command: cat + args: + stdin: 'foobar' + register: command_result5 + +- name: assert that stdin is passed + assert: + that: + - command_result5.stdout == 'foobar' + +- name: send to stdin literal multiline block + command: "{{ ansible_python.executable }} -c 'import hashlib, sys; print(hashlib.sha1((sys.stdin.buffer if hasattr(sys.stdin, \"buffer\") else sys.stdin).read()).hexdigest())'" + args: + stdin: |- + this is the first line + this is the second line + + this line is after an empty line + this line is the last line + register: command_result6 + +- name: assert the multiline input was passed correctly + assert: + that: + - "command_result6.stdout == '9cd0697c6a9ff6689f0afb9136fa62e0b3fee903'" + +## +## shell +## + +- name: Execute the test.sh script + shell: "{{ remote_tmp_dir_test }}/test.sh" + register: shell_result0 + +- name: Assert that the script executed correctly + assert: + that: + - shell_result0 is changed + - shell_result0.cmd == '{{ remote_tmp_dir_test }}/test.sh' + - shell_result0.rc == 0 + - shell_result0.stderr == '' + - shell_result0.stdout == 'win' + +# executable + +# FIXME doesn't pass the expected stdout + +#- name: execute the test.sh script +# shell: "{{remote_tmp_dir_test }}/test.sh executable={{ bash.stdout }}" +# register: shell_result1 +# +#- name: assert that the shell executed correctly +# assert: +# that: +# - "shell_result1.rc == 0" +# - "shell_result1.stderr == ''" +# - "shell_result1.stdout == 'win'" + +# chdir + +- name: Execute the test.sh script with chdir + shell: ./test.sh + args: + chdir: "{{ remote_tmp_dir_test }}" + register: shell_result2 + +- name: Assert that the shell executed correctly with chdir + assert: + that: + - shell_result2 is changed + - shell_result2.cmd == './test.sh' + - shell_result2.rc == 0 + - shell_result2.stderr == '' + - shell_result2.stdout == 'win' + +# creates + +- name: Verify that afile.txt is absent + file: + path: "{{ remote_tmp_dir_test }}/afile.txt" + state: absent + +- name: Execute the test.sh script with chdir + shell: "{{ remote_tmp_dir_test }}/test.sh > {{ remote_tmp_dir_test }}/afile.txt" + args: + chdir: "{{ remote_tmp_dir_test }}" + creates: "{{ remote_tmp_dir_test }}/afile.txt" + +- name: Verify that afile.txt is present + file: + path: "{{ remote_tmp_dir_test }}/afile.txt" + state: file + +# multiline + +- name: Remove test file previously created + file: + path: "{{ remote_tmp_dir_test }}/afile.txt" + state: absent + +- name: Execute a shell command using a literal multiline block + args: + executable: "{{ bash.stdout }}" + shell: | + echo this is a \ + "multiline echo" \ + "with a new line + in quotes" \ + | {{ ansible_python.executable }} -c 'import hashlib, sys; print(hashlib.sha1((sys.stdin.buffer if hasattr(sys.stdin, "buffer") else sys.stdin).read()).hexdigest())' + echo "this is a second line" + register: shell_result5 + +- name: Assert the multiline shell command ran as expected + assert: + that: + - shell_result5 is changed + - shell_result5.rc == 0 + - shell_result5.cmd == 'echo this is a "multiline echo" "with a new line\nin quotes" | ' + ansible_python.executable + ' -c \'import hashlib, sys; print(hashlib.sha1((sys.stdin.buffer if hasattr(sys.stdin, "buffer") else sys.stdin).read()).hexdigest())\'\necho "this is a second line"\n' + - shell_result5.stdout == '5575bb6b71c9558db0b6fbbf2f19909eeb4e3b98\nthis is a second line' + +- name: Execute a shell command using a literal multiline block with arguments in it + shell: | + executable="{{ bash.stdout }}" + creates={{ remote_tmp_dir_test }}/afile.txt + echo "test" + register: shell_result6 + +- name: Assert the multiline shell command with arguments in it run as expected + assert: + that: + - shell_result6 is changed + - shell_result6.rc == 0 + - shell_result6.cmd == 'echo "test"\n' + - shell_result6.stdout == 'test' + +- name: Execute a shell command using a multiline block where whitespaces matter + shell: | + cat <<EOF + One + Two + Three + EOF + register: shell_result7 + +- name: Assert the multiline shell command outputs with whitespaces preserved + assert: + that: + - shell_result7 is changed + - shell_result7.rc == 0 + - shell_result7.cmd == 'cat <<EOF\nOne\n Two\n Three\nEOF\n' + - shell_result7.stdout == 'One\n Two\n Three' + +- name: execute a shell command with no trailing newline to stdin + shell: cat > {{remote_tmp_dir_test }}/afile.txt + args: + stdin: test + stdin_add_newline: no + +- name: make sure content matches expected + copy: + dest: "{{remote_tmp_dir_test }}/afile.txt" + content: test + register: shell_result7 + failed_when: + - shell_result7 is failed or + shell_result7 is changed + +- name: execute a shell command with trailing newline to stdin + shell: cat > {{remote_tmp_dir_test }}/afile.txt + args: + stdin: test + stdin_add_newline: yes + +- name: make sure content matches expected + copy: + dest: "{{remote_tmp_dir_test }}/afile.txt" + content: | + test + register: shell_result8 + failed_when: + - shell_result8 is failed or + shell_result8 is changed + +- name: execute a shell command with trailing newline to stdin, default + shell: cat > {{remote_tmp_dir_test }}/afile.txt + args: + stdin: test + +- name: make sure content matches expected + copy: + dest: "{{remote_tmp_dir_test }}/afile.txt" + content: | + test + register: shell_result9 + failed_when: + - shell_result9 is failed or + shell_result9 is changed + +- name: remove the previously created file + file: + path: "{{ remote_tmp_dir_test }}/afile.txt" + state: absent + +- name: test check mode skip message + command: + cmd: "true" + check_mode: yes + register: result + +- name: assert check message exists + assert: + that: + - "'Command would have run if not in check mode' in result.msg" + - result.skipped + - not result.changed + +- name: test check mode creates/removes message + command: + cmd: "true" + creates: yes + check_mode: yes + register: result + +- name: assert check message exists + assert: + that: + - "'Command would have run if not in check mode' in result.msg" + - "'skipped' not in result" + - result.changed + +- name: command symlink handling + block: + - name: Create target folders + file: + path: '{{remote_tmp_dir}}/www_root/site' + state: directory + + - name: Create symlink + file: + path: '{{remote_tmp_dir}}/www' + state: link + src: '{{remote_tmp_dir}}/www_root' + + - name: check parent using chdir + shell: dirname "$PWD" + args: + chdir: '{{remote_tmp_dir}}/www/site' + register: parent_dir_chdir + + - name: check parent using cd + shell: cd "{{remote_tmp_dir}}/www/site" && dirname "$PWD" + register: parent_dir_cd + + - name: check expected outputs + assert: + that: + - parent_dir_chdir.stdout != parent_dir_cd.stdout + # These tests use endswith, to get around /private/tmp on macos + - 'parent_dir_cd.stdout.endswith(remote_tmp_dir ~ "/www")' + - 'parent_dir_chdir.stdout.endswith(remote_tmp_dir ~ "/www_root")' + +- name: Set print error command for Python 2 + set_fact: + print_error_command: print >> sys.stderr, msg + when: ansible_facts.python_version is version('3', '<') + +- name: Set print error command for Python 3 + set_fact: + print_error_command: print(msg, file=sys.stderr) + when: ansible_facts.python_version is version('3', '>=') + +- name: run command with strip + command: '{{ ansible_python_interpreter }} -c "import sys; msg=''hello \n \r''; print(msg); {{ print_error_command }}"' + register: command_strip + +- name: run command without strip + command: '{{ ansible_python_interpreter }} -c "import sys; msg=''hello \n \r''; print(msg); {{ print_error_command }}"' + args: + strip_empty_ends: no + register: command_no_strip + +- name: Verify strip behavior worked as expected + assert: + that: + - command_strip.stdout == 'hello \n ' + - command_strip.stderr == 'hello \n ' + - command_no_strip.stdout== 'hello \n \r\n' + - command_no_strip.stderr == 'hello \n \r\n' |