diff options
Diffstat (limited to 'test/integration/targets/uri')
41 files changed, 412 insertions, 0 deletions
diff --git a/test/integration/targets/uri/files/README b/test/integration/targets/uri/files/README new file mode 100644 index 0000000000..ef7791262b --- /dev/null +++ b/test/integration/targets/uri/files/README @@ -0,0 +1,9 @@ +The files were taken from http://www.json.org/JSON_checker/ +> If the JSON_checker is working correctly, it must accept all of the pass*.json files and reject all of the fail*.json files. + +Difference with JSON_checker dataset: + - *${n}.json renamed to *${n-1}.json to be 0-based + - fail0.json renamed to pass3.json as python json module allows JSON payload to be string + - fail17.json renamed to pass4.json as python json module has no problems with deep structures + - fail32.json renamed to fail0.json to fill gap + - fail31.json renamed to fail17.json to fill gap diff --git a/test/integration/targets/uri/files/fail0.json b/test/integration/targets/uri/files/fail0.json new file mode 100644 index 0000000000..ca5eb19dc9 --- /dev/null +++ b/test/integration/targets/uri/files/fail0.json @@ -0,0 +1 @@ +["mismatch"}
\ No newline at end of file diff --git a/test/integration/targets/uri/files/fail1.json b/test/integration/targets/uri/files/fail1.json new file mode 100644 index 0000000000..6b7c11e5a5 --- /dev/null +++ b/test/integration/targets/uri/files/fail1.json @@ -0,0 +1 @@ +["Unclosed array"
\ No newline at end of file diff --git a/test/integration/targets/uri/files/fail10.json b/test/integration/targets/uri/files/fail10.json new file mode 100644 index 0000000000..76eb95b458 --- /dev/null +++ b/test/integration/targets/uri/files/fail10.json @@ -0,0 +1 @@ +{"Illegal expression": 1 + 2}
\ No newline at end of file diff --git a/test/integration/targets/uri/files/fail11.json b/test/integration/targets/uri/files/fail11.json new file mode 100644 index 0000000000..77580a4522 --- /dev/null +++ b/test/integration/targets/uri/files/fail11.json @@ -0,0 +1 @@ +{"Illegal invocation": alert()}
\ No newline at end of file diff --git a/test/integration/targets/uri/files/fail12.json b/test/integration/targets/uri/files/fail12.json new file mode 100644 index 0000000000..379406b59b --- /dev/null +++ b/test/integration/targets/uri/files/fail12.json @@ -0,0 +1 @@ +{"Numbers cannot have leading zeroes": 013}
\ No newline at end of file diff --git a/test/integration/targets/uri/files/fail13.json b/test/integration/targets/uri/files/fail13.json new file mode 100644 index 0000000000..0ed366b38a --- /dev/null +++ b/test/integration/targets/uri/files/fail13.json @@ -0,0 +1 @@ +{"Numbers cannot be hex": 0x14}
\ No newline at end of file diff --git a/test/integration/targets/uri/files/fail14.json b/test/integration/targets/uri/files/fail14.json new file mode 100644 index 0000000000..fc8376b605 --- /dev/null +++ b/test/integration/targets/uri/files/fail14.json @@ -0,0 +1 @@ +["Illegal backslash escape: \x15"]
\ No newline at end of file diff --git a/test/integration/targets/uri/files/fail15.json b/test/integration/targets/uri/files/fail15.json new file mode 100644 index 0000000000..3fe21d4b53 --- /dev/null +++ b/test/integration/targets/uri/files/fail15.json @@ -0,0 +1 @@ +[\naked]
\ No newline at end of file diff --git a/test/integration/targets/uri/files/fail16.json b/test/integration/targets/uri/files/fail16.json new file mode 100644 index 0000000000..62b9214aed --- /dev/null +++ b/test/integration/targets/uri/files/fail16.json @@ -0,0 +1 @@ +["Illegal backslash escape: \017"]
\ No newline at end of file diff --git a/test/integration/targets/uri/files/fail17.json b/test/integration/targets/uri/files/fail17.json new file mode 100644 index 0000000000..45cba7396f --- /dev/null +++ b/test/integration/targets/uri/files/fail17.json @@ -0,0 +1 @@ +{"Comma instead if closing brace": true,
\ No newline at end of file diff --git a/test/integration/targets/uri/files/fail18.json b/test/integration/targets/uri/files/fail18.json new file mode 100644 index 0000000000..3b9c46fa9a --- /dev/null +++ b/test/integration/targets/uri/files/fail18.json @@ -0,0 +1 @@ +{"Missing colon" null}
\ No newline at end of file diff --git a/test/integration/targets/uri/files/fail19.json b/test/integration/targets/uri/files/fail19.json new file mode 100644 index 0000000000..27c1af3e72 --- /dev/null +++ b/test/integration/targets/uri/files/fail19.json @@ -0,0 +1 @@ +{"Double colon":: null}
\ No newline at end of file diff --git a/test/integration/targets/uri/files/fail2.json b/test/integration/targets/uri/files/fail2.json new file mode 100644 index 0000000000..168c81eb78 --- /dev/null +++ b/test/integration/targets/uri/files/fail2.json @@ -0,0 +1 @@ +{unquoted_key: "keys must be quoted"}
\ No newline at end of file diff --git a/test/integration/targets/uri/files/fail20.json b/test/integration/targets/uri/files/fail20.json new file mode 100644 index 0000000000..62474573b2 --- /dev/null +++ b/test/integration/targets/uri/files/fail20.json @@ -0,0 +1 @@ +{"Comma instead of colon", null}
\ No newline at end of file diff --git a/test/integration/targets/uri/files/fail21.json b/test/integration/targets/uri/files/fail21.json new file mode 100644 index 0000000000..a7752581bc --- /dev/null +++ b/test/integration/targets/uri/files/fail21.json @@ -0,0 +1 @@ +["Colon instead of comma": false]
\ No newline at end of file diff --git a/test/integration/targets/uri/files/fail22.json b/test/integration/targets/uri/files/fail22.json new file mode 100644 index 0000000000..494add1ca1 --- /dev/null +++ b/test/integration/targets/uri/files/fail22.json @@ -0,0 +1 @@ +["Bad value", truth]
\ No newline at end of file diff --git a/test/integration/targets/uri/files/fail23.json b/test/integration/targets/uri/files/fail23.json new file mode 100644 index 0000000000..caff239bfc --- /dev/null +++ b/test/integration/targets/uri/files/fail23.json @@ -0,0 +1 @@ +['single quote']
\ No newline at end of file diff --git a/test/integration/targets/uri/files/fail24.json b/test/integration/targets/uri/files/fail24.json new file mode 100644 index 0000000000..8b7ad23e01 --- /dev/null +++ b/test/integration/targets/uri/files/fail24.json @@ -0,0 +1 @@ +[" tab character in string "]
\ No newline at end of file diff --git a/test/integration/targets/uri/files/fail25.json b/test/integration/targets/uri/files/fail25.json new file mode 100644 index 0000000000..845d26a6a5 --- /dev/null +++ b/test/integration/targets/uri/files/fail25.json @@ -0,0 +1 @@ +["tab\ character\ in\ string\ "]
\ No newline at end of file diff --git a/test/integration/targets/uri/files/fail26.json b/test/integration/targets/uri/files/fail26.json new file mode 100644 index 0000000000..6b01a2ca4a --- /dev/null +++ b/test/integration/targets/uri/files/fail26.json @@ -0,0 +1,2 @@ +["line +break"]
\ No newline at end of file diff --git a/test/integration/targets/uri/files/fail27.json b/test/integration/targets/uri/files/fail27.json new file mode 100644 index 0000000000..621a0101c6 --- /dev/null +++ b/test/integration/targets/uri/files/fail27.json @@ -0,0 +1,2 @@ +["line\ +break"]
\ No newline at end of file diff --git a/test/integration/targets/uri/files/fail28.json b/test/integration/targets/uri/files/fail28.json new file mode 100644 index 0000000000..47ec421bb6 --- /dev/null +++ b/test/integration/targets/uri/files/fail28.json @@ -0,0 +1 @@ +[0e]
\ No newline at end of file diff --git a/test/integration/targets/uri/files/fail29.json b/test/integration/targets/uri/files/fail29.json new file mode 100644 index 0000000000..8ab0bc4b8b --- /dev/null +++ b/test/integration/targets/uri/files/fail29.json @@ -0,0 +1 @@ +[0e+]
\ No newline at end of file diff --git a/test/integration/targets/uri/files/fail3.json b/test/integration/targets/uri/files/fail3.json new file mode 100644 index 0000000000..9de168bf34 --- /dev/null +++ b/test/integration/targets/uri/files/fail3.json @@ -0,0 +1 @@ +["extra comma",]
\ No newline at end of file diff --git a/test/integration/targets/uri/files/fail30.json b/test/integration/targets/uri/files/fail30.json new file mode 100644 index 0000000000..1cce602b51 --- /dev/null +++ b/test/integration/targets/uri/files/fail30.json @@ -0,0 +1 @@ +[0e+-1]
\ No newline at end of file diff --git a/test/integration/targets/uri/files/fail4.json b/test/integration/targets/uri/files/fail4.json new file mode 100644 index 0000000000..ddf3ce3d24 --- /dev/null +++ b/test/integration/targets/uri/files/fail4.json @@ -0,0 +1 @@ +["double extra comma",,]
\ No newline at end of file diff --git a/test/integration/targets/uri/files/fail5.json b/test/integration/targets/uri/files/fail5.json new file mode 100644 index 0000000000..ed91580e1b --- /dev/null +++ b/test/integration/targets/uri/files/fail5.json @@ -0,0 +1 @@ +[ , "<-- missing value"]
\ No newline at end of file diff --git a/test/integration/targets/uri/files/fail6.json b/test/integration/targets/uri/files/fail6.json new file mode 100644 index 0000000000..8a96af3e4e --- /dev/null +++ b/test/integration/targets/uri/files/fail6.json @@ -0,0 +1 @@ +["Comma after the close"],
\ No newline at end of file diff --git a/test/integration/targets/uri/files/fail7.json b/test/integration/targets/uri/files/fail7.json new file mode 100644 index 0000000000..b28479c6ec --- /dev/null +++ b/test/integration/targets/uri/files/fail7.json @@ -0,0 +1 @@ +["Extra close"]]
\ No newline at end of file diff --git a/test/integration/targets/uri/files/fail8.json b/test/integration/targets/uri/files/fail8.json new file mode 100644 index 0000000000..5815574f36 --- /dev/null +++ b/test/integration/targets/uri/files/fail8.json @@ -0,0 +1 @@ +{"Extra comma": true,}
\ No newline at end of file diff --git a/test/integration/targets/uri/files/fail9.json b/test/integration/targets/uri/files/fail9.json new file mode 100644 index 0000000000..5d8c0047bd --- /dev/null +++ b/test/integration/targets/uri/files/fail9.json @@ -0,0 +1 @@ +{"Extra value after close": true} "misplaced quoted value"
\ No newline at end of file diff --git a/test/integration/targets/uri/files/pass0.json b/test/integration/targets/uri/files/pass0.json new file mode 100644 index 0000000000..70e2685436 --- /dev/null +++ b/test/integration/targets/uri/files/pass0.json @@ -0,0 +1,58 @@ +[ + "JSON Test Pattern pass1", + {"object with 1 member":["array with 1 element"]}, + {}, + [], + -42, + true, + false, + null, + { + "integer": 1234567890, + "real": -9876.543210, + "e": 0.123456789e-12, + "E": 1.234567890E+34, + "": 23456789012E66, + "zero": 0, + "one": 1, + "space": " ", + "quote": "\"", + "backslash": "\\", + "controls": "\b\f\n\r\t", + "slash": "/ & \/", + "alpha": "abcdefghijklmnopqrstuvwyz", + "ALPHA": "ABCDEFGHIJKLMNOPQRSTUVWYZ", + "digit": "0123456789", + "0123456789": "digit", + "special": "`1~!@#$%^&*()_+-={':[,]}|;.</>?", + "hex": "\u0123\u4567\u89AB\uCDEF\uabcd\uef4A", + "true": true, + "false": false, + "null": null, + "array":[ ], + "object":{ }, + "address": "50 St. James Street", + "url": "http://www.JSON.org/", + "comment": "// /* <!-- --", + "# -- --> */": " ", + " s p a c e d " :[1,2 , 3 + +, + +4 , 5 , 6 ,7 ],"compact":[1,2,3,4,5,6,7], + "jsontext": "{\"object with 1 member\":[\"array with 1 element\"]}", + "quotes": "" \u0022 %22 0x22 034 "", + "\/\\\"\uCAFE\uBABE\uAB98\uFCDE\ubcda\uef4A\b\f\n\r\t`1~!@#$%^&*()_+-=[]{}|;:',./<>?" +: "A key can be any string" + }, + 0.5 ,98.6 +, +99.44 +, + +1066, +1e1, +0.1e1, +1e-1, +1e00,2e+00,2e-00 +,"rosebud"]
\ No newline at end of file diff --git a/test/integration/targets/uri/files/pass1.json b/test/integration/targets/uri/files/pass1.json new file mode 100644 index 0000000000..d3c63c7ad8 --- /dev/null +++ b/test/integration/targets/uri/files/pass1.json @@ -0,0 +1 @@ +[[[[[[[[[[[[[[[[[[["Not too deep"]]]]]]]]]]]]]]]]]]]
\ No newline at end of file diff --git a/test/integration/targets/uri/files/pass2.json b/test/integration/targets/uri/files/pass2.json new file mode 100644 index 0000000000..4528d51f1a --- /dev/null +++ b/test/integration/targets/uri/files/pass2.json @@ -0,0 +1,6 @@ +{ + "JSON Test Pattern pass3": { + "The outermost value": "must be an object or array.", + "In this test": "It is an object." + } +} diff --git a/test/integration/targets/uri/files/pass3.json b/test/integration/targets/uri/files/pass3.json new file mode 100644 index 0000000000..6216b865f1 --- /dev/null +++ b/test/integration/targets/uri/files/pass3.json @@ -0,0 +1 @@ +"A JSON payload should be an object or array, not a string."
\ No newline at end of file diff --git a/test/integration/targets/uri/files/pass4.json b/test/integration/targets/uri/files/pass4.json new file mode 100644 index 0000000000..edac92716f --- /dev/null +++ b/test/integration/targets/uri/files/pass4.json @@ -0,0 +1 @@ +[[[[[[[[[[[[[[[[[[[["Too deep"]]]]]]]]]]]]]]]]]]]]
\ No newline at end of file diff --git a/test/integration/targets/uri/files/testserver.py b/test/integration/targets/uri/files/testserver.py new file mode 100644 index 0000000000..d0d24a0050 --- /dev/null +++ b/test/integration/targets/uri/files/testserver.py @@ -0,0 +1,7 @@ +import mimetypes + +if __name__ == '__main__': + mimetypes.init() + mimetypes.add_type('application/json', '.json') + import SimpleHTTPServer + SimpleHTTPServer.test() diff --git a/test/integration/targets/uri/meta/main.yml b/test/integration/targets/uri/meta/main.yml new file mode 100644 index 0000000000..a5f3f70736 --- /dev/null +++ b/test/integration/targets/uri/meta/main.yml @@ -0,0 +1,3 @@ +dependencies: + - prepare_tests + - prepare_http_tests diff --git a/test/integration/targets/uri/tasks/main.yml b/test/integration/targets/uri/tasks/main.yml new file mode 100644 index 0000000000..bfb193a26b --- /dev/null +++ b/test/integration/targets/uri/tasks/main.yml @@ -0,0 +1,279 @@ +# test code for the uri module +# (c) 2014, Leonid Evdokimov <leon@darkk.net.ru> + +# 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/>. + +- name: set role facts + set_fact: + http_port: 15260 + files_dir: '{{ output_dir|expanduser }}/files' + checkout_dir: '{{ output_dir }}/git' + +- name: create a directory to serve files from + file: + dest: "{{ files_dir }}" + state: directory + +- copy: + src: "{{ item }}" + dest: "{{files_dir}}/{{ item }}" + with_sequence: start=0 end=4 format=pass%d.json + +- copy: + src: "{{ item }}" + dest: "{{files_dir}}/{{ item }}" + with_sequence: start=0 end=30 format=fail%d.json + +- copy: + src: "testserver.py" + dest: "{{ output_dir }}/testserver.py" + +- name: start SimpleHTTPServer + shell: cd {{ files_dir }} && {{ ansible_python.executable }} {{ output_dir}}/testserver.py {{ http_port }} + async: 60 # this test set takes ~15 seconds to run + poll: 0 + +- wait_for: port={{ http_port }} + + +- name: checksum pass_json + stat: path={{ files_dir }}/{{ item }}.json get_checksum=yes + register: pass_checksum + with_sequence: start=0 end=4 format=pass%d + +- name: fetch pass_json + uri: return_content=yes url=http://localhost:{{ http_port }}/{{ item }}.json + register: pass + with_sequence: start=0 end=4 format=pass%d + +- name: check pass_json + assert: + that: + - '"json" in item.1' + - item.0.stat.checksum == item.1.content | checksum + with_together: + - "{{pass_checksum.results}}" + - "{{pass.results}}" + + +- name: checksum fail_json + stat: path={{ files_dir }}/{{ item }}.json get_checksum=yes + register: fail_checksum + with_sequence: start=0 end=30 format=fail%d + +- name: fetch fail_json + uri: return_content=yes url=http://localhost:{{ http_port }}/{{ item }}.json + register: fail + with_sequence: start=0 end=30 format=fail%d + +- name: check fail_json + assert: + that: + - item.0.stat.checksum == item.1.content | checksum + - '"json" not in item.1' + with_together: + - "{{fail_checksum.results}}" + - "{{fail.results}}" + +- name: test https fetch to a site with mismatched hostname and certificate + uri: + url: "https://{{ badssl_host }}/" + dest: "{{ output_dir }}/shouldnotexist.html" + ignore_errors: True + register: result + +- stat: + path: "{{ output_dir }}/shouldnotexist.html" + register: stat_result + +- name: Assert that the file was not downloaded + assert: + that: + - "result.failed == true" + - "'Failed to validate the SSL certificate' in result.msg" + - "stat_result.stat.exists == false" + +- name: Clean up any cruft from the results directory + file: + name: "{{ output_dir }}/kreitz.html" + state: absent + +- name: test https fetch to a site with mismatched hostname and certificate and validate_certs=no + uri: + url: "https://{{ badssl_host }}/" + dest: "{{ output_dir }}/kreitz.html" + validate_certs: no + register: result + +- stat: + path: "{{ output_dir }}/kreitz.html" + register: stat_result + +- name: Assert that the file was downloaded + assert: + that: + - "stat_result.stat.exists == true" + - "result.changed == true" + +- name: test redirect without follow_redirects + uri: + url: 'http://{{ httpbin_host }}/redirect/2' + follow_redirects: 'none' + status_code: 302 + register: result + +- name: Assert location header + assert: + that: + - 'result.location|default("") == "http://{{ httpbin_host }}/relative-redirect/1"' + +- name: Check SSL with redirect + uri: + url: 'https://{{ httpbin_host }}/redirect/2' + register: result + +- name: Assert SSL with redirect + assert: + that: + - 'result.url|default("") == "https://{{ httpbin_host }}/get"' + +- name: redirect to bad SSL site + uri: + url: 'http://{{ badssl_host }}' + register: result + ignore_errors: true + +- name: Ensure bad SSL site reidrect fails + assert: + that: + - result|failed + - 'badssl_host in result.msg' + +- name: test basic auth + uri: + url: 'http://{{ httpbin_host }}/basic-auth/user/passwd' + user: user + password: passwd + +- name: test basic forced auth + uri: + url: 'http://{{ httpbin_host }}/hidden-basic-auth/user/passwd' + force_basic_auth: true + user: user + password: passwd + +- name: test PUT + uri: + url: 'http://{{ httpbin_host }}/put' + method: PUT + body: 'foo=bar' + +- name: test OPTIONS + uri: + url: 'http://{{ httpbin_host }}/' + method: OPTIONS + register: result + +- name: Assert we got an allow header + assert: + that: + - 'result.allow|default("") == "HEAD, OPTIONS, GET"' + +# Ubuntu12.04 doesn't have python-urllib3, this makes handling required dependencies a pain across all variations +# We'll use this to just skip 12.04 on those tests. We should be sufficiently covered with other OSes and versions +- name: Set fact if running on Ubuntu 12.04 + set_fact: + is_ubuntu_precise: "{{ ansible_distribution == 'Ubuntu' and ansible_distribution_release == 'precise' }}" + +# These tests are just side effects of how the site is hosted. It's not +# specifically a test site. So the tests may break due to the hosting +# changing. Eventually we need to standup a webserver with SNI as part of the +# test run. +- name: Test that SNI succeeds on python versions that have SNI + uri: + url: 'https://{{ sni_host }}/' + return_content: true + when: ansible_python.has_sslcontext + register: result + +- name: Assert SNI verification succeeds on new python + assert: + that: + - result|success + - 'sni_host == result.content' + when: ansible_python.has_sslcontext + +- name: Verify SNI verification fails on old python without urllib3 contrib + uri: + url: 'https://{{ sni_host }}' + ignore_errors: true + when: not ansible_python.has_sslcontext + register: result + +- name: Assert SNI verification fails on old python + assert: + that: + - result|failed + when: not result|skipped + +- name: install OS packages that are needed for SNI on old python + package: + name: "{{ item }}" + with_items: "{{ uri_os_packages[ansible_os_family] | default([]) }}" + when: not ansible_python.has_sslcontext and not is_ubuntu_precise|bool + +- name: install python modules for Older Python SNI verification + pip: + name: "{{ item }}" + with_items: + - ndg-httpsclient + when: not ansible_python.has_sslcontext and not is_ubuntu_precise|bool + +- name: Verify SNI verification succeeds on old python with urllib3 contrib + uri: + url: 'https://{{ sni_host }}' + return_content: true + when: not ansible_python.has_sslcontext and not is_ubuntu_precise|bool + register: result + +- name: Assert SNI verification succeeds on old python + assert: + that: + - result|success + - 'sni_host == result.content' + when: not ansible_python.has_sslcontext and not is_ubuntu_precise|bool + +- name: Uninstall ndg-httpsclient and urllib3 + pip: + name: "{{ item }}" + state: absent + with_items: + - ndg-httpsclient + when: not ansible_python.has_sslcontext and not is_ubuntu_precise|bool + +- name: uninstall OS packages that are needed for SNI on old python + package: + name: "{{ item }}" + state: absent + with_items: "{{ uri_os_packages[ansible_os_family] | default([]) }}" + when: not ansible_python.has_sslcontext and not is_ubuntu_precise|bool + +- name: validate the status_codes are correct + uri: + url: "https://{{ httpbin_host }}/status/202" + status_code: 202 + method: POST + body: foo diff --git a/test/integration/targets/uri/vars/main.yml b/test/integration/targets/uri/vars/main.yml new file mode 100644 index 0000000000..b819276f65 --- /dev/null +++ b/test/integration/targets/uri/vars/main.yml @@ -0,0 +1,14 @@ +uri_os_packages: + RedHat: + - python-pyasn1 + - pyOpenSSL + - python-urllib3 + Debian: + - python-pyasn1 + - python-openssl + - python-urllib3 + +# Needs to be a url to a site that is hosted using SNI. +# Eventually we should make this a test server that we stand up as part of the test run. +#SNI_URI: 'https://sni.velox.ch' +SNI_URI: "https://www.mnot.net/blog/2014/05/09/if_you_can_read_this_youre_sniing" |