summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjctanner <tanner.jc@gmail.com>2016-05-31 22:35:59 -0400
committerjctanner <tanner.jc@gmail.com>2016-05-31 22:35:59 -0400
commitc52cea8db3ea8b589dbddf5714c468a11e1cd49e (patch)
tree1bcef7728afa46f3fc19463a431b0a6cba888cfc
parent10a07fcc268e314eac9c0cce11065650030ce51f (diff)
downloadansible-c52cea8db3ea8b589dbddf5714c468a11e1cd49e.tar.gz
Add a framework, fixtures and test for common synchronize scenarios. (#15983)
* Add a framework, fixtures and test for common synchronize scenarios. Addresses #15905
-rw-r--r--test/units/plugins/action/fixtures/synchronize/basic/meta.yaml17
-rw-r--r--test/units/plugins/action/fixtures/synchronize/basic/task_args_out.json5
-rw-r--r--test/units/plugins/action/fixtures/synchronize/basic/taskvars_in.json151
-rw-r--r--test/units/plugins/action/fixtures/synchronize/basic/taskvars_out.json156
-rw-r--r--test/units/plugins/action/fixtures/synchronize/basic_become/meta.yaml38
-rw-r--r--test/units/plugins/action/fixtures/synchronize/basic_become/task_args_out.json6
-rw-r--r--test/units/plugins/action/fixtures/synchronize/basic_become/task_vars_in.json151
-rw-r--r--test/units/plugins/action/fixtures/synchronize/basic_become/task_vars_out.json156
-rw-r--r--test/units/plugins/action/fixtures/synchronize/basic_become_cli/meta.yaml38
-rw-r--r--test/units/plugins/action/fixtures/synchronize/basic_become_cli/task_args_out.json6
-rw-r--r--test/units/plugins/action/fixtures/synchronize/basic_become_cli/task_vars_in.json151
-rw-r--r--test/units/plugins/action/fixtures/synchronize/basic_become_cli/task_vars_out.json156
-rw-r--r--test/units/plugins/action/fixtures/synchronize/basic_vagrant/meta.yaml29
-rw-r--r--test/units/plugins/action/fixtures/synchronize/basic_vagrant/task_args_out.json7
-rw-r--r--test/units/plugins/action/fixtures/synchronize/basic_vagrant/task_vars_in.json164
-rw-r--r--test/units/plugins/action/fixtures/synchronize/basic_vagrant/task_vars_out.json169
-rw-r--r--test/units/plugins/action/fixtures/synchronize/basic_vagrant_become_cli/meta.yaml32
-rw-r--r--test/units/plugins/action/fixtures/synchronize/basic_vagrant_become_cli/task_args_out.json7
-rw-r--r--test/units/plugins/action/fixtures/synchronize/basic_vagrant_become_cli/task_vars_in.json164
-rw-r--r--test/units/plugins/action/fixtures/synchronize/basic_vagrant_become_cli/task_vars_out.json169
-rw-r--r--test/units/plugins/action/fixtures/synchronize/basic_vagrant_sudo/meta.yaml29
-rw-r--r--test/units/plugins/action/fixtures/synchronize/basic_vagrant_sudo/task_args_out.json7
-rw-r--r--test/units/plugins/action/fixtures/synchronize/basic_vagrant_sudo/task_vars_in.json164
-rw-r--r--test/units/plugins/action/fixtures/synchronize/basic_vagrant_sudo/task_vars_out.json169
-rw-r--r--test/units/plugins/action/fixtures/synchronize/delegate_remote/meta.yaml26
-rw-r--r--test/units/plugins/action/fixtures/synchronize/delegate_remote/task_args_out.json5
-rw-r--r--test/units/plugins/action/fixtures/synchronize/delegate_remote/task_vars_in.json379
-rw-r--r--test/units/plugins/action/fixtures/synchronize/delegate_remote/task_vars_out.json387
-rw-r--r--test/units/plugins/action/fixtures/synchronize/delegate_remote_su/meta.yaml33
-rw-r--r--test/units/plugins/action/fixtures/synchronize/delegate_remote_su/task_args_out.json6
-rw-r--r--test/units/plugins/action/fixtures/synchronize/delegate_remote_su/task_vars_in.json379
-rw-r--r--test/units/plugins/action/fixtures/synchronize/delegate_remote_su/task_vars_out.json387
-rw-r--r--test/units/plugins/action/test_synchronize.py248
33 files changed, 3991 insertions, 0 deletions
diff --git a/test/units/plugins/action/fixtures/synchronize/basic/meta.yaml b/test/units/plugins/action/fixtures/synchronize/basic/meta.yaml
new file mode 100644
index 0000000000..d508bb373d
--- /dev/null
+++ b/test/units/plugins/action/fixtures/synchronize/basic/meta.yaml
@@ -0,0 +1,17 @@
+fixtures:
+ taskvars_in: taskvars_in.json
+ taskvars_out: taskvars_out.json
+connection:
+ transport: 'ssh'
+hostvars:
+ '127.0.0.1': {}
+ '::1': {}
+ 'localhost': {}
+asserts:
+ - "hasattr(SAM._connection, 'ismock')"
+ - "SAM._connection.transport == 'local'"
+ - "self._play_context.shell == 'sh'"
+ - "self.execute_called"
+ - "self.task.args['_local_rsync_path'] == 'rsync'"
+ - "self.task.args['src'] == '/tmp/deleteme'"
+ - "self.task.args['dest'] == 'root@el6host:/tmp/deleteme'"
diff --git a/test/units/plugins/action/fixtures/synchronize/basic/task_args_out.json b/test/units/plugins/action/fixtures/synchronize/basic/task_args_out.json
new file mode 100644
index 0000000000..93ae7bbb5d
--- /dev/null
+++ b/test/units/plugins/action/fixtures/synchronize/basic/task_args_out.json
@@ -0,0 +1,5 @@
+{
+ "dest": "root@el6host:/tmp/deleteme",
+ "src": "/tmp/deleteme",
+ "_local_rsync_path": "rsync"
+} \ No newline at end of file
diff --git a/test/units/plugins/action/fixtures/synchronize/basic/taskvars_in.json b/test/units/plugins/action/fixtures/synchronize/basic/taskvars_in.json
new file mode 100644
index 0000000000..9eb5d50ad1
--- /dev/null
+++ b/test/units/plugins/action/fixtures/synchronize/basic/taskvars_in.json
@@ -0,0 +1,151 @@
+{
+ "ansible_pipelining": false,
+ "ansible_docker_extra_args": "",
+ "ansible_scp_extra_args": "",
+ "ansible_user": "root",
+ "ansible_play_hosts": [
+ "el6host"
+ ],
+ "ansible_connection": "smart",
+ "ansible_ssh_common_args": "",
+ "environment": [],
+ "inventory_hostname": "el6host",
+ "vars": {
+ "ansible_check_mode": false,
+ "inventory_hostname": "el6host",
+ "inventory_file": "inventory",
+ "inventory_hostname_short": "el6host",
+ "playbook_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "role_names": [],
+ "inventory_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "environment": [],
+ "play_hosts": [
+ "el6host"
+ ],
+ "ansible_play_hosts": [
+ "el6host"
+ ],
+ "hostvars": {
+ "el6host": {
+ "inventory_file": "inventory",
+ "group_names": [
+ "ungrouped"
+ ],
+ "groups": {
+ "ungrouped": [
+ "el6host"
+ ],
+ "all": [
+ "el6host"
+ ]
+ },
+ "inventory_hostname": "el6host",
+ "inventory_hostname_short": "el6host",
+ "playbook_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "omit": "__omit_place_holder__03600813b83569c710bf5cb2a040d6e01da927c6",
+ "inventory_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "ansible_ssh_user": "root",
+ "ansible_check_mode": false,
+ "ansible_version": {
+ "major": 2,
+ "full": "2.2.0",
+ "string": "2.2.0",
+ "minor": 2,
+ "revision": 0
+ }
+ }
+ },
+ "groups": {
+ "ungrouped": [
+ "el6host"
+ ],
+ "all": [
+ "el6host"
+ ]
+ },
+ "group_names": [
+ "ungrouped"
+ ],
+ "omit": "__omit_place_holder__03600813b83569c710bf5cb2a040d6e01da927c6",
+ "ansible_version": {
+ "major": 2,
+ "full": "2.2.0",
+ "string": "2.2.0",
+ "minor": 2,
+ "revision": 0
+ },
+ "ansible_ssh_user": "root"
+ },
+ "ansible_accelerate_port": 5099,
+ "roledir": null,
+ "ansible_ssh_extra_args": "",
+ "ansible_ssh_host": "el6host",
+ "ansible_current_hosts": [
+ "el6host"
+ ],
+ "hostvars": {
+ "el6host": {
+ "inventory_file": "inventory",
+ "group_names": [
+ "ungrouped"
+ ],
+ "groups": {
+ "ungrouped": [
+ "el6host"
+ ],
+ "all": [
+ "el6host"
+ ]
+ },
+ "inventory_hostname": "el6host",
+ "inventory_hostname_short": "el6host",
+ "playbook_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "omit": "__omit_place_holder__03600813b83569c710bf5cb2a040d6e01da927c6",
+ "inventory_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "ansible_ssh_user": "root",
+ "ansible_check_mode": false,
+ "ansible_version": {
+ "major": 2,
+ "full": "2.2.0",
+ "string": "2.2.0",
+ "minor": 2,
+ "revision": 0
+ }
+ }
+ },
+ "group_names": [
+ "ungrouped"
+ ],
+ "ansible_version": {
+ "major": 2,
+ "full": "2.2.0",
+ "string": "2.2.0",
+ "minor": 2,
+ "revision": 0
+ },
+ "ansible_ssh_pipelining": false,
+ "inventory_file": "inventory",
+ "ansible_module_compression": "ZIP_DEFLATED",
+ "ansible_failed_hosts": [],
+ "ansible_check_mode": false,
+ "groups": {
+ "ungrouped": [
+ "el6host"
+ ],
+ "all": [
+ "el6host"
+ ]
+ },
+ "ansible_host": "el6host",
+ "ansible_shell_executable": "/bin/sh",
+ "inventory_hostname_short": "el6host",
+ "omit": "__omit_place_holder__03600813b83569c710bf5cb2a040d6e01da927c6",
+ "inventory_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "playbook_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "ansible_ssh_user": "root",
+ "role_names": [],
+ "play_hosts": [
+ "el6host"
+ ],
+ "ansible_sftp_extra_args": ""
+} \ No newline at end of file
diff --git a/test/units/plugins/action/fixtures/synchronize/basic/taskvars_out.json b/test/units/plugins/action/fixtures/synchronize/basic/taskvars_out.json
new file mode 100644
index 0000000000..01ebee2529
--- /dev/null
+++ b/test/units/plugins/action/fixtures/synchronize/basic/taskvars_out.json
@@ -0,0 +1,156 @@
+{
+ "ansible_pipelining": false,
+ "ansible_docker_extra_args": "",
+ "ansible_scp_extra_args": "",
+ "ansible_user": "root",
+ "ansible_play_hosts": [
+ "el6host"
+ ],
+ "ansible_connection": "smart",
+ "ansible_ssh_common_args": "",
+ "environment": [],
+ "inventory_hostname": "el6host",
+ "vars": {
+ "ansible_check_mode": false,
+ "inventory_hostname": "el6host",
+ "inventory_file": "inventory",
+ "inventory_hostname_short": "el6host",
+ "playbook_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "role_names": [],
+ "inventory_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "environment": [],
+ "play_hosts": [
+ "el6host"
+ ],
+ "ansible_play_hosts": [
+ "el6host"
+ ],
+ "hostvars": {
+ "el6host": {
+ "inventory_file": "inventory",
+ "group_names": [
+ "ungrouped"
+ ],
+ "groups": {
+ "ungrouped": [
+ "el6host",
+ "::1"
+ ],
+ "all": [
+ "el6host",
+ "::1"
+ ]
+ },
+ "inventory_hostname": "el6host",
+ "inventory_hostname_short": "el6host",
+ "playbook_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "omit": "__omit_place_holder__03600813b83569c710bf5cb2a040d6e01da927c6",
+ "inventory_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "ansible_ssh_user": "root",
+ "ansible_check_mode": false,
+ "ansible_version": {
+ "major": 2,
+ "full": "2.2.0",
+ "string": "2.2.0",
+ "minor": 2,
+ "revision": 0
+ }
+ }
+ },
+ "groups": {
+ "ungrouped": [
+ "el6host"
+ ],
+ "all": [
+ "el6host"
+ ]
+ },
+ "group_names": [
+ "ungrouped"
+ ],
+ "omit": "__omit_place_holder__03600813b83569c710bf5cb2a040d6e01da927c6",
+ "ansible_version": {
+ "major": 2,
+ "full": "2.2.0",
+ "string": "2.2.0",
+ "minor": 2,
+ "revision": 0
+ },
+ "ansible_ssh_user": "root"
+ },
+ "ansible_accelerate_port": 5099,
+ "roledir": null,
+ "ansible_ssh_extra_args": "",
+ "ansible_ssh_host": "el6host",
+ "ansible_current_hosts": [
+ "el6host"
+ ],
+ "hostvars": {
+ "el6host": {
+ "inventory_file": "inventory",
+ "group_names": [
+ "ungrouped"
+ ],
+ "groups": {
+ "ungrouped": [
+ "el6host",
+ "::1"
+ ],
+ "all": [
+ "el6host",
+ "::1"
+ ]
+ },
+ "inventory_hostname": "el6host",
+ "inventory_hostname_short": "el6host",
+ "playbook_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "omit": "__omit_place_holder__03600813b83569c710bf5cb2a040d6e01da927c6",
+ "inventory_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "ansible_ssh_user": "root",
+ "ansible_check_mode": false,
+ "ansible_version": {
+ "major": 2,
+ "full": "2.2.0",
+ "string": "2.2.0",
+ "minor": 2,
+ "revision": 0
+ }
+ }
+ },
+ "group_names": [
+ "ungrouped"
+ ],
+ "ansible_version": {
+ "major": 2,
+ "full": "2.2.0",
+ "string": "2.2.0",
+ "minor": 2,
+ "revision": 0
+ },
+ "ansible_ssh_pipelining": false,
+ "inventory_file": "inventory",
+ "ansible_module_compression": "ZIP_DEFLATED",
+ "ansible_failed_hosts": [],
+ "ansible_check_mode": false,
+ "groups": {
+ "ungrouped": [
+ "el6host"
+ ],
+ "all": [
+ "el6host"
+ ]
+ },
+ "ansible_host": "el6host",
+ "ansible_shell_executable": "/bin/sh",
+ "inventory_hostname_short": "el6host",
+ "omit": "__omit_place_holder__03600813b83569c710bf5cb2a040d6e01da927c6",
+ "ansible_python_interpreter": "/usr/bin/python",
+ "inventory_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "playbook_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "ansible_ssh_user": "root",
+ "role_names": [],
+ "play_hosts": [
+ "el6host"
+ ],
+ "ansible_sftp_extra_args": ""
+} \ No newline at end of file
diff --git a/test/units/plugins/action/fixtures/synchronize/basic_become/meta.yaml b/test/units/plugins/action/fixtures/synchronize/basic_become/meta.yaml
new file mode 100644
index 0000000000..24daa108cc
--- /dev/null
+++ b/test/units/plugins/action/fixtures/synchronize/basic_become/meta.yaml
@@ -0,0 +1,38 @@
+task_args:
+ src: /tmp/deleteme
+ dest: /tmp/deleteme
+ #rsync_path: rsync
+_task:
+ become: True
+ become_method: None
+fixtures:
+ taskvars_in: task_vars_in.json
+ taskvars_out: task_vars_out.json
+connection:
+ transport: 'ssh'
+_play_context:
+ become: True
+ become_method: sudo
+ remote_addr: el6host
+ remote_user: root
+hostvars:
+ '127.0.0.1': {}
+ '::1': {}
+ 'localhost': {}
+asserts:
+ - "hasattr(SAM._connection, 'ismock')"
+ - "SAM._connection.transport == 'local'"
+ - "self.execute_called"
+ - "self.task.args['_local_rsync_path'] == 'rsync'"
+ # this is a crucial aspect of this scenario ...
+ - "self.task.args['rsync_path'] == '\"sudo rsync\"'"
+ - "self.task.args['src'] == '/tmp/deleteme'"
+ - "self.task.args['dest'] == 'root@el6host:/tmp/deleteme'"
+ - "self.task.become == True"
+ - "self.task.become_user == None"
+ - "self._play_context.shell == 'sh'"
+ - "self._play_context.remote_addr == 'el6host'"
+ - "self._play_context.remote_user == 'root'"
+ - "self._play_context.become == False"
+ - "self._play_context.become_user == 'root'"
+ - "self._play_context.password == None"
diff --git a/test/units/plugins/action/fixtures/synchronize/basic_become/task_args_out.json b/test/units/plugins/action/fixtures/synchronize/basic_become/task_args_out.json
new file mode 100644
index 0000000000..c1aff9c33c
--- /dev/null
+++ b/test/units/plugins/action/fixtures/synchronize/basic_become/task_args_out.json
@@ -0,0 +1,6 @@
+{
+ "dest": "root@el6host:/tmp/deleteme",
+ "src": "/tmp/deleteme",
+ "rsync_path": "\"sudo rsync\"",
+ "_local_rsync_path": "rsync"
+} \ No newline at end of file
diff --git a/test/units/plugins/action/fixtures/synchronize/basic_become/task_vars_in.json b/test/units/plugins/action/fixtures/synchronize/basic_become/task_vars_in.json
new file mode 100644
index 0000000000..0f1f9784a7
--- /dev/null
+++ b/test/units/plugins/action/fixtures/synchronize/basic_become/task_vars_in.json
@@ -0,0 +1,151 @@
+{
+ "ansible_pipelining": false,
+ "ansible_docker_extra_args": "",
+ "ansible_scp_extra_args": "",
+ "ansible_user": "root",
+ "ansible_play_hosts": [
+ "el6host"
+ ],
+ "ansible_connection": "smart",
+ "ansible_ssh_common_args": "",
+ "environment": [],
+ "inventory_hostname": "el6host",
+ "vars": {
+ "ansible_check_mode": false,
+ "inventory_hostname": "el6host",
+ "inventory_file": "inventory",
+ "inventory_hostname_short": "el6host",
+ "playbook_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "role_names": [],
+ "inventory_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "environment": [],
+ "play_hosts": [
+ "el6host"
+ ],
+ "ansible_play_hosts": [
+ "el6host"
+ ],
+ "hostvars": {
+ "el6host": {
+ "inventory_file": "inventory",
+ "group_names": [
+ "ungrouped"
+ ],
+ "groups": {
+ "ungrouped": [
+ "el6host"
+ ],
+ "all": [
+ "el6host"
+ ]
+ },
+ "inventory_hostname": "el6host",
+ "inventory_hostname_short": "el6host",
+ "playbook_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "omit": "__omit_place_holder__b3ac1e6ebeed06f4be0c1edca3dca34036cf7f57",
+ "inventory_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "ansible_ssh_user": "root",
+ "ansible_check_mode": false,
+ "ansible_version": {
+ "major": 2,
+ "full": "2.2.0",
+ "string": "2.2.0",
+ "minor": 2,
+ "revision": 0
+ }
+ }
+ },
+ "groups": {
+ "ungrouped": [
+ "el6host"
+ ],
+ "all": [
+ "el6host"
+ ]
+ },
+ "group_names": [
+ "ungrouped"
+ ],
+ "omit": "__omit_place_holder__b3ac1e6ebeed06f4be0c1edca3dca34036cf7f57",
+ "ansible_version": {
+ "major": 2,
+ "full": "2.2.0",
+ "string": "2.2.0",
+ "minor": 2,
+ "revision": 0
+ },
+ "ansible_ssh_user": "root"
+ },
+ "ansible_accelerate_port": 5099,
+ "roledir": null,
+ "ansible_ssh_extra_args": "",
+ "ansible_ssh_host": "el6host",
+ "ansible_current_hosts": [
+ "el6host"
+ ],
+ "hostvars": {
+ "el6host": {
+ "inventory_file": "inventory",
+ "group_names": [
+ "ungrouped"
+ ],
+ "groups": {
+ "ungrouped": [
+ "el6host"
+ ],
+ "all": [
+ "el6host"
+ ]
+ },
+ "inventory_hostname": "el6host",
+ "inventory_hostname_short": "el6host",
+ "playbook_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "omit": "__omit_place_holder__b3ac1e6ebeed06f4be0c1edca3dca34036cf7f57",
+ "inventory_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "ansible_ssh_user": "root",
+ "ansible_check_mode": false,
+ "ansible_version": {
+ "major": 2,
+ "full": "2.2.0",
+ "string": "2.2.0",
+ "minor": 2,
+ "revision": 0
+ }
+ }
+ },
+ "group_names": [
+ "ungrouped"
+ ],
+ "ansible_version": {
+ "major": 2,
+ "full": "2.2.0",
+ "string": "2.2.0",
+ "minor": 2,
+ "revision": 0
+ },
+ "ansible_ssh_pipelining": false,
+ "inventory_file": "inventory",
+ "ansible_module_compression": "ZIP_DEFLATED",
+ "ansible_failed_hosts": [],
+ "ansible_check_mode": false,
+ "groups": {
+ "ungrouped": [
+ "el6host"
+ ],
+ "all": [
+ "el6host"
+ ]
+ },
+ "ansible_host": "el6host",
+ "ansible_shell_executable": "/bin/sh",
+ "inventory_hostname_short": "el6host",
+ "omit": "__omit_place_holder__b3ac1e6ebeed06f4be0c1edca3dca34036cf7f57",
+ "inventory_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "playbook_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "ansible_ssh_user": "root",
+ "role_names": [],
+ "play_hosts": [
+ "el6host"
+ ],
+ "ansible_sftp_extra_args": ""
+} \ No newline at end of file
diff --git a/test/units/plugins/action/fixtures/synchronize/basic_become/task_vars_out.json b/test/units/plugins/action/fixtures/synchronize/basic_become/task_vars_out.json
new file mode 100644
index 0000000000..75abced318
--- /dev/null
+++ b/test/units/plugins/action/fixtures/synchronize/basic_become/task_vars_out.json
@@ -0,0 +1,156 @@
+{
+ "ansible_pipelining": false,
+ "ansible_docker_extra_args": "",
+ "ansible_scp_extra_args": "",
+ "ansible_user": "root",
+ "ansible_play_hosts": [
+ "el6host"
+ ],
+ "ansible_connection": "smart",
+ "ansible_ssh_common_args": "",
+ "environment": [],
+ "inventory_hostname": "el6host",
+ "vars": {
+ "ansible_check_mode": false,
+ "inventory_hostname": "el6host",
+ "inventory_file": "inventory",
+ "inventory_hostname_short": "el6host",
+ "playbook_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "role_names": [],
+ "inventory_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "environment": [],
+ "play_hosts": [
+ "el6host"
+ ],
+ "ansible_play_hosts": [
+ "el6host"
+ ],
+ "hostvars": {
+ "el6host": {
+ "inventory_file": "inventory",
+ "group_names": [
+ "ungrouped"
+ ],
+ "groups": {
+ "ungrouped": [
+ "el6host",
+ "::1"
+ ],
+ "all": [
+ "el6host",
+ "::1"
+ ]
+ },
+ "inventory_hostname": "el6host",
+ "inventory_hostname_short": "el6host",
+ "playbook_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "omit": "__omit_place_holder__b3ac1e6ebeed06f4be0c1edca3dca34036cf7f57",
+ "inventory_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "ansible_ssh_user": "root",
+ "ansible_check_mode": false,
+ "ansible_version": {
+ "major": 2,
+ "full": "2.2.0",
+ "string": "2.2.0",
+ "minor": 2,
+ "revision": 0
+ }
+ }
+ },
+ "groups": {
+ "ungrouped": [
+ "el6host"
+ ],
+ "all": [
+ "el6host"
+ ]
+ },
+ "group_names": [
+ "ungrouped"
+ ],
+ "omit": "__omit_place_holder__b3ac1e6ebeed06f4be0c1edca3dca34036cf7f57",
+ "ansible_version": {
+ "major": 2,
+ "full": "2.2.0",
+ "string": "2.2.0",
+ "minor": 2,
+ "revision": 0
+ },
+ "ansible_ssh_user": "root"
+ },
+ "ansible_accelerate_port": 5099,
+ "roledir": null,
+ "ansible_ssh_extra_args": "",
+ "ansible_ssh_host": "el6host",
+ "ansible_current_hosts": [
+ "el6host"
+ ],
+ "hostvars": {
+ "el6host": {
+ "inventory_file": "inventory",
+ "group_names": [
+ "ungrouped"
+ ],
+ "groups": {
+ "ungrouped": [
+ "el6host",
+ "::1"
+ ],
+ "all": [
+ "el6host",
+ "::1"
+ ]
+ },
+ "inventory_hostname": "el6host",
+ "inventory_hostname_short": "el6host",
+ "playbook_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "omit": "__omit_place_holder__b3ac1e6ebeed06f4be0c1edca3dca34036cf7f57",
+ "inventory_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "ansible_ssh_user": "root",
+ "ansible_check_mode": false,
+ "ansible_version": {
+ "major": 2,
+ "full": "2.2.0",
+ "string": "2.2.0",
+ "minor": 2,
+ "revision": 0
+ }
+ }
+ },
+ "group_names": [
+ "ungrouped"
+ ],
+ "ansible_version": {
+ "major": 2,
+ "full": "2.2.0",
+ "string": "2.2.0",
+ "minor": 2,
+ "revision": 0
+ },
+ "ansible_ssh_pipelining": false,
+ "inventory_file": "inventory",
+ "ansible_module_compression": "ZIP_DEFLATED",
+ "ansible_failed_hosts": [],
+ "ansible_check_mode": false,
+ "groups": {
+ "ungrouped": [
+ "el6host"
+ ],
+ "all": [
+ "el6host"
+ ]
+ },
+ "ansible_host": "el6host",
+ "ansible_shell_executable": "/bin/sh",
+ "inventory_hostname_short": "el6host",
+ "omit": "__omit_place_holder__b3ac1e6ebeed06f4be0c1edca3dca34036cf7f57",
+ "ansible_python_interpreter": "/usr/bin/python",
+ "inventory_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "playbook_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "ansible_ssh_user": "root",
+ "role_names": [],
+ "play_hosts": [
+ "el6host"
+ ],
+ "ansible_sftp_extra_args": ""
+} \ No newline at end of file
diff --git a/test/units/plugins/action/fixtures/synchronize/basic_become_cli/meta.yaml b/test/units/plugins/action/fixtures/synchronize/basic_become_cli/meta.yaml
new file mode 100644
index 0000000000..f4399be30c
--- /dev/null
+++ b/test/units/plugins/action/fixtures/synchronize/basic_become_cli/meta.yaml
@@ -0,0 +1,38 @@
+task_args:
+ src: /tmp/deleteme
+ dest: /tmp/deleteme
+ #rsync_path: rsync
+_task:
+ become: None
+ become_method: None
+fixtures:
+ taskvars_in: task_vars_in.json
+ taskvars_out: task_vars_out.json
+connection:
+ transport: 'ssh'
+_play_context:
+ become: True
+ become_method: sudo
+ remote_addr: el6host
+ remote_user: root
+hostvars:
+ '127.0.0.1': {}
+ '::1': {}
+ 'localhost': {}
+asserts:
+ - "hasattr(SAM._connection, 'ismock')"
+ - "SAM._connection.transport == 'local'"
+ - "self.execute_called"
+ - "self.task.args['_local_rsync_path'] == 'rsync'"
+ # this is a crucial aspect of this scenario ...
+ - "self.task.args['rsync_path'] == '\"sudo rsync\"'"
+ - "self.task.args['src'] == '/tmp/deleteme'"
+ - "self.task.args['dest'] == 'root@el6host:/tmp/deleteme'"
+ - "self.task.become == None"
+ - "self.task.become_user == None"
+ - "self._play_context.shell == 'sh'"
+ - "self._play_context.remote_addr == 'el6host'"
+ - "self._play_context.remote_user == 'root'"
+ - "self._play_context.become == False"
+ - "self._play_context.become_user == 'root'"
+ - "self._play_context.password == None"
diff --git a/test/units/plugins/action/fixtures/synchronize/basic_become_cli/task_args_out.json b/test/units/plugins/action/fixtures/synchronize/basic_become_cli/task_args_out.json
new file mode 100644
index 0000000000..c1aff9c33c
--- /dev/null
+++ b/test/units/plugins/action/fixtures/synchronize/basic_become_cli/task_args_out.json
@@ -0,0 +1,6 @@
+{
+ "dest": "root@el6host:/tmp/deleteme",
+ "src": "/tmp/deleteme",
+ "rsync_path": "\"sudo rsync\"",
+ "_local_rsync_path": "rsync"
+} \ No newline at end of file
diff --git a/test/units/plugins/action/fixtures/synchronize/basic_become_cli/task_vars_in.json b/test/units/plugins/action/fixtures/synchronize/basic_become_cli/task_vars_in.json
new file mode 100644
index 0000000000..0f1f9784a7
--- /dev/null
+++ b/test/units/plugins/action/fixtures/synchronize/basic_become_cli/task_vars_in.json
@@ -0,0 +1,151 @@
+{
+ "ansible_pipelining": false,
+ "ansible_docker_extra_args": "",
+ "ansible_scp_extra_args": "",
+ "ansible_user": "root",
+ "ansible_play_hosts": [
+ "el6host"
+ ],
+ "ansible_connection": "smart",
+ "ansible_ssh_common_args": "",
+ "environment": [],
+ "inventory_hostname": "el6host",
+ "vars": {
+ "ansible_check_mode": false,
+ "inventory_hostname": "el6host",
+ "inventory_file": "inventory",
+ "inventory_hostname_short": "el6host",
+ "playbook_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "role_names": [],
+ "inventory_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "environment": [],
+ "play_hosts": [
+ "el6host"
+ ],
+ "ansible_play_hosts": [
+ "el6host"
+ ],
+ "hostvars": {
+ "el6host": {
+ "inventory_file": "inventory",
+ "group_names": [
+ "ungrouped"
+ ],
+ "groups": {
+ "ungrouped": [
+ "el6host"
+ ],
+ "all": [
+ "el6host"
+ ]
+ },
+ "inventory_hostname": "el6host",
+ "inventory_hostname_short": "el6host",
+ "playbook_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "omit": "__omit_place_holder__b3ac1e6ebeed06f4be0c1edca3dca34036cf7f57",
+ "inventory_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "ansible_ssh_user": "root",
+ "ansible_check_mode": false,
+ "ansible_version": {
+ "major": 2,
+ "full": "2.2.0",
+ "string": "2.2.0",
+ "minor": 2,
+ "revision": 0
+ }
+ }
+ },
+ "groups": {
+ "ungrouped": [
+ "el6host"
+ ],
+ "all": [
+ "el6host"
+ ]
+ },
+ "group_names": [
+ "ungrouped"
+ ],
+ "omit": "__omit_place_holder__b3ac1e6ebeed06f4be0c1edca3dca34036cf7f57",
+ "ansible_version": {
+ "major": 2,
+ "full": "2.2.0",
+ "string": "2.2.0",
+ "minor": 2,
+ "revision": 0
+ },
+ "ansible_ssh_user": "root"
+ },
+ "ansible_accelerate_port": 5099,
+ "roledir": null,
+ "ansible_ssh_extra_args": "",
+ "ansible_ssh_host": "el6host",
+ "ansible_current_hosts": [
+ "el6host"
+ ],
+ "hostvars": {
+ "el6host": {
+ "inventory_file": "inventory",
+ "group_names": [
+ "ungrouped"
+ ],
+ "groups": {
+ "ungrouped": [
+ "el6host"
+ ],
+ "all": [
+ "el6host"
+ ]
+ },
+ "inventory_hostname": "el6host",
+ "inventory_hostname_short": "el6host",
+ "playbook_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "omit": "__omit_place_holder__b3ac1e6ebeed06f4be0c1edca3dca34036cf7f57",
+ "inventory_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "ansible_ssh_user": "root",
+ "ansible_check_mode": false,
+ "ansible_version": {
+ "major": 2,
+ "full": "2.2.0",
+ "string": "2.2.0",
+ "minor": 2,
+ "revision": 0
+ }
+ }
+ },
+ "group_names": [
+ "ungrouped"
+ ],
+ "ansible_version": {
+ "major": 2,
+ "full": "2.2.0",
+ "string": "2.2.0",
+ "minor": 2,
+ "revision": 0
+ },
+ "ansible_ssh_pipelining": false,
+ "inventory_file": "inventory",
+ "ansible_module_compression": "ZIP_DEFLATED",
+ "ansible_failed_hosts": [],
+ "ansible_check_mode": false,
+ "groups": {
+ "ungrouped": [
+ "el6host"
+ ],
+ "all": [
+ "el6host"
+ ]
+ },
+ "ansible_host": "el6host",
+ "ansible_shell_executable": "/bin/sh",
+ "inventory_hostname_short": "el6host",
+ "omit": "__omit_place_holder__b3ac1e6ebeed06f4be0c1edca3dca34036cf7f57",
+ "inventory_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "playbook_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "ansible_ssh_user": "root",
+ "role_names": [],
+ "play_hosts": [
+ "el6host"
+ ],
+ "ansible_sftp_extra_args": ""
+} \ No newline at end of file
diff --git a/test/units/plugins/action/fixtures/synchronize/basic_become_cli/task_vars_out.json b/test/units/plugins/action/fixtures/synchronize/basic_become_cli/task_vars_out.json
new file mode 100644
index 0000000000..75abced318
--- /dev/null
+++ b/test/units/plugins/action/fixtures/synchronize/basic_become_cli/task_vars_out.json
@@ -0,0 +1,156 @@
+{
+ "ansible_pipelining": false,
+ "ansible_docker_extra_args": "",
+ "ansible_scp_extra_args": "",
+ "ansible_user": "root",
+ "ansible_play_hosts": [
+ "el6host"
+ ],
+ "ansible_connection": "smart",
+ "ansible_ssh_common_args": "",
+ "environment": [],
+ "inventory_hostname": "el6host",
+ "vars": {
+ "ansible_check_mode": false,
+ "inventory_hostname": "el6host",
+ "inventory_file": "inventory",
+ "inventory_hostname_short": "el6host",
+ "playbook_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "role_names": [],
+ "inventory_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "environment": [],
+ "play_hosts": [
+ "el6host"
+ ],
+ "ansible_play_hosts": [
+ "el6host"
+ ],
+ "hostvars": {
+ "el6host": {
+ "inventory_file": "inventory",
+ "group_names": [
+ "ungrouped"
+ ],
+ "groups": {
+ "ungrouped": [
+ "el6host",
+ "::1"
+ ],
+ "all": [
+ "el6host",
+ "::1"
+ ]
+ },
+ "inventory_hostname": "el6host",
+ "inventory_hostname_short": "el6host",
+ "playbook_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "omit": "__omit_place_holder__b3ac1e6ebeed06f4be0c1edca3dca34036cf7f57",
+ "inventory_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "ansible_ssh_user": "root",
+ "ansible_check_mode": false,
+ "ansible_version": {
+ "major": 2,
+ "full": "2.2.0",
+ "string": "2.2.0",
+ "minor": 2,
+ "revision": 0
+ }
+ }
+ },
+ "groups": {
+ "ungrouped": [
+ "el6host"
+ ],
+ "all": [
+ "el6host"
+ ]
+ },
+ "group_names": [
+ "ungrouped"
+ ],
+ "omit": "__omit_place_holder__b3ac1e6ebeed06f4be0c1edca3dca34036cf7f57",
+ "ansible_version": {
+ "major": 2,
+ "full": "2.2.0",
+ "string": "2.2.0",
+ "minor": 2,
+ "revision": 0
+ },
+ "ansible_ssh_user": "root"
+ },
+ "ansible_accelerate_port": 5099,
+ "roledir": null,
+ "ansible_ssh_extra_args": "",
+ "ansible_ssh_host": "el6host",
+ "ansible_current_hosts": [
+ "el6host"
+ ],
+ "hostvars": {
+ "el6host": {
+ "inventory_file": "inventory",
+ "group_names": [
+ "ungrouped"
+ ],
+ "groups": {
+ "ungrouped": [
+ "el6host",
+ "::1"
+ ],
+ "all": [
+ "el6host",
+ "::1"
+ ]
+ },
+ "inventory_hostname": "el6host",
+ "inventory_hostname_short": "el6host",
+ "playbook_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "omit": "__omit_place_holder__b3ac1e6ebeed06f4be0c1edca3dca34036cf7f57",
+ "inventory_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "ansible_ssh_user": "root",
+ "ansible_check_mode": false,
+ "ansible_version": {
+ "major": 2,
+ "full": "2.2.0",
+ "string": "2.2.0",
+ "minor": 2,
+ "revision": 0
+ }
+ }
+ },
+ "group_names": [
+ "ungrouped"
+ ],
+ "ansible_version": {
+ "major": 2,
+ "full": "2.2.0",
+ "string": "2.2.0",
+ "minor": 2,
+ "revision": 0
+ },
+ "ansible_ssh_pipelining": false,
+ "inventory_file": "inventory",
+ "ansible_module_compression": "ZIP_DEFLATED",
+ "ansible_failed_hosts": [],
+ "ansible_check_mode": false,
+ "groups": {
+ "ungrouped": [
+ "el6host"
+ ],
+ "all": [
+ "el6host"
+ ]
+ },
+ "ansible_host": "el6host",
+ "ansible_shell_executable": "/bin/sh",
+ "inventory_hostname_short": "el6host",
+ "omit": "__omit_place_holder__b3ac1e6ebeed06f4be0c1edca3dca34036cf7f57",
+ "ansible_python_interpreter": "/usr/bin/python",
+ "inventory_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "playbook_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "ansible_ssh_user": "root",
+ "role_names": [],
+ "play_hosts": [
+ "el6host"
+ ],
+ "ansible_sftp_extra_args": ""
+} \ No newline at end of file
diff --git a/test/units/plugins/action/fixtures/synchronize/basic_vagrant/meta.yaml b/test/units/plugins/action/fixtures/synchronize/basic_vagrant/meta.yaml
new file mode 100644
index 0000000000..904a21a8ee
--- /dev/null
+++ b/test/units/plugins/action/fixtures/synchronize/basic_vagrant/meta.yaml
@@ -0,0 +1,29 @@
+task_args:
+ src: /tmp/deleteme
+ dest: /tmp/deleteme
+fixtures:
+ taskvars_in: task_vars_in.json
+ taskvars_out: task_vars_out.json
+connection:
+ transport: 'ssh'
+_play_context:
+ remote_addr: '127.0.0.1'
+ remote_user: vagrant
+hostvars:
+ '127.0.0.1': {}
+ '::1': {}
+ 'localhost': {}
+asserts:
+ - "hasattr(SAM._connection, 'ismock')"
+ - "SAM._connection.transport == 'local'"
+ - "self.execute_called"
+ - "self.task.args['_local_rsync_path'] == 'rsync'"
+ - "self.task.args['dest_port'] == 2202"
+ - "self.task.args['src'] == '/tmp/deleteme'"
+ - "self.task.args['dest'] == '/tmp/deleteme'"
+ - "self._play_context.shell == 'sh'"
+ - "self._play_context.remote_addr == '127.0.0.1'"
+ - "self._play_context.remote_user == 'vagrant'"
+ - "self._play_context.become == False"
+ - "self._play_context.become_user == 'root'"
+ - "self._play_context.password == None"
diff --git a/test/units/plugins/action/fixtures/synchronize/basic_vagrant/task_args_out.json b/test/units/plugins/action/fixtures/synchronize/basic_vagrant/task_args_out.json
new file mode 100644
index 0000000000..48ea779d06
--- /dev/null
+++ b/test/units/plugins/action/fixtures/synchronize/basic_vagrant/task_args_out.json
@@ -0,0 +1,7 @@
+{
+ "dest": "/tmp/deleteme",
+ "src": "/tmp/deleteme",
+ "private_key": "/home/jtanner/workspace/issues/AP-15905/.vagrant/machines/default/virtualbox/private_key",
+ "dest_port": 2202,
+ "_local_rsync_path": "rsync"
+}
diff --git a/test/units/plugins/action/fixtures/synchronize/basic_vagrant/task_vars_in.json b/test/units/plugins/action/fixtures/synchronize/basic_vagrant/task_vars_in.json
new file mode 100644
index 0000000000..a43a2db4c7
--- /dev/null
+++ b/test/units/plugins/action/fixtures/synchronize/basic_vagrant/task_vars_in.json
@@ -0,0 +1,164 @@
+{
+ "ansible_pipelining": false,
+ "ansible_docker_extra_args": "",
+ "ansible_scp_extra_args": "",
+ "ansible_user": "vagrant",
+ "ansible_play_hosts": [
+ "default"
+ ],
+ "ansible_connection": "ssh",
+ "ansible_ssh_common_args": "",
+ "ansible_ssh_host": "127.0.0.1",
+ "inventory_hostname": "default",
+ "ansible_ssh_private_key_file": "/home/jtanner/workspace/issues/AP-15905/.vagrant/machines/default/virtualbox/private_key",
+ "vars": {
+ "ansible_check_mode": false,
+ "environment": [],
+ "inventory_hostname": "default",
+ "inventory_file": null,
+ "ansible_ssh_private_key_file": "/home/jtanner/workspace/issues/AP-15905/.vagrant/machines/default/virtualbox/private_key",
+ "inventory_hostname_short": "default",
+ "playbook_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "role_names": [],
+ "inventory_dir": "/home/jtanner/workspace/issues/AP-15905/.vagrant/provisioners/ansible/inventory",
+ "ansible_ssh_host": "127.0.0.1",
+ "play_hosts": [
+ "default"
+ ],
+ "ansible_play_hosts": [
+ "default"
+ ],
+ "hostvars": {
+ "default": {
+ "inventory_file": null,
+ "ansible_check_mode": false,
+ "groups": {
+ "ungrouped": [
+ "default"
+ ],
+ "all": [
+ "default"
+ ]
+ },
+ "ansible_ssh_port": 2202,
+ "inventory_hostname": "default",
+ "ansible_ssh_private_key_file": "/home/jtanner/workspace/issues/AP-15905/.vagrant/machines/default/virtualbox/private_key",
+ "inventory_hostname_short": "default",
+ "playbook_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "omit": "__omit_place_holder__06c4a1b11530cabdf4248804078c1ddacfb88b5e",
+ "inventory_dir": "/home/jtanner/workspace/issues/AP-15905/.vagrant/provisioners/ansible/inventory",
+ "ansible_ssh_host": "127.0.0.1",
+ "ansible_ssh_user": "vagrant",
+ "group_names": [
+ "ungrouped"
+ ],
+ "ansible_version": {
+ "major": 2,
+ "full": "2.2.0",
+ "string": "2.2.0",
+ "minor": 2,
+ "revision": 0
+ }
+ }
+ },
+ "groups": {
+ "ungrouped": [
+ "default"
+ ],
+ "all": [
+ "default"
+ ]
+ },
+ "group_names": [
+ "ungrouped"
+ ],
+ "omit": "__omit_place_holder__06c4a1b11530cabdf4248804078c1ddacfb88b5e",
+ "ansible_ssh_port": 2202,
+ "ansible_version": {
+ "major": 2,
+ "full": "2.2.0",
+ "string": "2.2.0",
+ "minor": 2,
+ "revision": 0
+ },
+ "ansible_ssh_user": "vagrant"
+ },
+ "ansible_accelerate_port": 5099,
+ "roledir": null,
+ "ansible_ssh_extra_args": "",
+ "environment": [],
+ "ansible_current_hosts": [
+ "default"
+ ],
+ "hostvars": {
+ "default": {
+ "inventory_file": null,
+ "ansible_check_mode": false,
+ "groups": {
+ "ungrouped": [
+ "default"
+ ],
+ "all": [
+ "default"
+ ]
+ },
+ "ansible_ssh_port": 2202,
+ "inventory_hostname": "default",
+ "ansible_ssh_private_key_file": "/home/jtanner/workspace/issues/AP-15905/.vagrant/machines/default/virtualbox/private_key",
+ "inventory_hostname_short": "default",
+ "playbook_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "omit": "__omit_place_holder__06c4a1b11530cabdf4248804078c1ddacfb88b5e",
+ "inventory_dir": "/home/jtanner/workspace/issues/AP-15905/.vagrant/provisioners/ansible/inventory",
+ "ansible_ssh_host": "127.0.0.1",
+ "ansible_ssh_user": "vagrant",
+ "group_names": [
+ "ungrouped"
+ ],
+ "ansible_version": {
+ "major": 2,
+ "full": "2.2.0",
+ "string": "2.2.0",
+ "minor": 2,
+ "revision": 0
+ }
+ }
+ },
+ "group_names": [
+ "ungrouped"
+ ],
+ "ansible_version": {
+ "major": 2,
+ "full": "2.2.0",
+ "string": "2.2.0",
+ "minor": 2,
+ "revision": 0
+ },
+ "ansible_ssh_pipelining": false,
+ "inventory_file": null,
+ "ansible_module_compression": "ZIP_DEFLATED",
+ "ansible_failed_hosts": [],
+ "ansible_check_mode": false,
+ "ansible_port": 2202,
+ "ansible_private_key_file": "/home/jtanner/workspace/issues/AP-15905/.vagrant/machines/default/virtualbox/private_key",
+ "groups": {
+ "ungrouped": [
+ "default"
+ ],
+ "all": [
+ "default"
+ ]
+ },
+ "ansible_ssh_port": 2202,
+ "ansible_host": "127.0.0.1",
+ "ansible_shell_executable": "/bin/sh",
+ "inventory_hostname_short": "default",
+ "omit": "__omit_place_holder__06c4a1b11530cabdf4248804078c1ddacfb88b5e",
+ "inventory_dir": "/home/jtanner/workspace/issues/AP-15905/.vagrant/provisioners/ansible/inventory",
+ "playbook_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "ansible_ssh_user": "vagrant",
+ "role_names": [],
+ "play_hosts": [
+ "default"
+ ],
+ "ansible_sftp_extra_args": ""
+} \ No newline at end of file
diff --git a/test/units/plugins/action/fixtures/synchronize/basic_vagrant/task_vars_out.json b/test/units/plugins/action/fixtures/synchronize/basic_vagrant/task_vars_out.json
new file mode 100644
index 0000000000..26ea5d46c1
--- /dev/null
+++ b/test/units/plugins/action/fixtures/synchronize/basic_vagrant/task_vars_out.json
@@ -0,0 +1,169 @@
+{
+ "ansible_pipelining": false,
+ "ansible_docker_extra_args": "",
+ "ansible_scp_extra_args": "",
+ "ansible_user": "vagrant",
+ "ansible_play_hosts": [
+ "default"
+ ],
+ "ansible_connection": "ssh",
+ "ansible_ssh_common_args": "",
+ "ansible_ssh_host": "127.0.0.1",
+ "inventory_hostname": "default",
+ "ansible_ssh_private_key_file": "/home/jtanner/workspace/issues/AP-15905/.vagrant/machines/default/virtualbox/private_key",
+ "vars": {
+ "ansible_check_mode": false,
+ "environment": [],
+ "inventory_hostname": "default",
+ "inventory_file": null,
+ "ansible_ssh_private_key_file": "/home/jtanner/workspace/issues/AP-15905/.vagrant/machines/default/virtualbox/private_key",
+ "inventory_hostname_short": "default",
+ "playbook_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "role_names": [],
+ "inventory_dir": "/home/jtanner/workspace/issues/AP-15905/.vagrant/provisioners/ansible/inventory",
+ "ansible_ssh_host": "127.0.0.1",
+ "play_hosts": [
+ "default"
+ ],
+ "ansible_play_hosts": [
+ "default"
+ ],
+ "hostvars": {
+ "default": {
+ "inventory_file": null,
+ "ansible_check_mode": false,
+ "groups": {
+ "ungrouped": [
+ "default",
+ "::1"
+ ],
+ "all": [
+ "default",
+ "::1"
+ ]
+ },
+ "ansible_ssh_port": 2202,
+ "inventory_hostname": "default",
+ "ansible_ssh_private_key_file": "/home/jtanner/workspace/issues/AP-15905/.vagrant/machines/default/virtualbox/private_key",
+ "inventory_hostname_short": "default",
+ "playbook_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "omit": "__omit_place_holder__06c4a1b11530cabdf4248804078c1ddacfb88b5e",
+ "inventory_dir": "/home/jtanner/workspace/issues/AP-15905/.vagrant/provisioners/ansible/inventory",
+ "ansible_ssh_host": "127.0.0.1",
+ "ansible_ssh_user": "vagrant",
+ "group_names": [
+ "ungrouped"
+ ],
+ "ansible_version": {
+ "major": 2,
+ "full": "2.2.0",
+ "string": "2.2.0",
+ "minor": 2,
+ "revision": 0
+ }
+ }
+ },
+ "groups": {
+ "ungrouped": [
+ "default"
+ ],
+ "all": [
+ "default"
+ ]
+ },
+ "group_names": [
+ "ungrouped"
+ ],
+ "omit": "__omit_place_holder__06c4a1b11530cabdf4248804078c1ddacfb88b5e",
+ "ansible_ssh_port": 2202,
+ "ansible_version": {
+ "major": 2,
+ "full": "2.2.0",
+ "string": "2.2.0",
+ "minor": 2,
+ "revision": 0
+ },
+ "ansible_ssh_user": "vagrant"
+ },
+ "ansible_accelerate_port": 5099,
+ "roledir": null,
+ "ansible_ssh_extra_args": "",
+ "environment": [],
+ "ansible_current_hosts": [
+ "default"
+ ],
+ "hostvars": {
+ "default": {
+ "inventory_file": null,
+ "ansible_check_mode": false,
+ "groups": {
+ "ungrouped": [
+ "default",
+ "::1"
+ ],
+ "all": [
+ "default",
+ "::1"
+ ]
+ },
+ "ansible_ssh_port": 2202,
+ "inventory_hostname": "default",
+ "ansible_ssh_private_key_file": "/home/jtanner/workspace/issues/AP-15905/.vagrant/machines/default/virtualbox/private_key",
+ "inventory_hostname_short": "default",
+ "playbook_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "omit": "__omit_place_holder__06c4a1b11530cabdf4248804078c1ddacfb88b5e",
+ "inventory_dir": "/home/jtanner/workspace/issues/AP-15905/.vagrant/provisioners/ansible/inventory",
+ "ansible_ssh_host": "127.0.0.1",
+ "ansible_ssh_user": "vagrant",
+ "group_names": [
+ "ungrouped"
+ ],
+ "ansible_version": {
+ "major": 2,
+ "full": "2.2.0",
+ "string": "2.2.0",
+ "minor": 2,
+ "revision": 0
+ }
+ }
+ },
+ "group_names": [
+ "ungrouped"
+ ],
+ "ansible_version": {
+ "major": 2,
+ "full": "2.2.0",
+ "string": "2.2.0",
+ "minor": 2,
+ "revision": 0
+ },
+ "ansible_ssh_pipelining": false,
+ "inventory_file": null,
+ "ansible_module_compression": "ZIP_DEFLATED",
+ "ansible_failed_hosts": [],
+ "ansible_check_mode": false,
+ "ansible_port": 2202,
+ "ansible_private_key_file": "/home/jtanner/workspace/issues/AP-15905/.vagrant/machines/default/virtualbox/private_key",
+ "groups": {
+ "ungrouped": [
+ "default"
+ ],
+ "all": [
+ "default"
+ ]
+ },
+ "ansible_ssh_port": 2202,
+ "ansible_host": "127.0.0.1",
+ "ansible_shell_executable": "/bin/sh",
+ "inventory_hostname_short": "default",
+ "omit": "__omit_place_holder__06c4a1b11530cabdf4248804078c1ddacfb88b5e",
+ "ansible_python_interpreter": "/usr/bin/python",
+ "inventory_dir": "/home/jtanner/workspace/issues/AP-15905/.vagrant/provisioners/ansible/inventory",
+ "playbook_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "ansible_ssh_user": "vagrant",
+ "role_names": [],
+ "play_hosts": [
+ "default"
+ ],
+ "ansible_sftp_extra_args": ""
+} \ No newline at end of file
diff --git a/test/units/plugins/action/fixtures/synchronize/basic_vagrant_become_cli/meta.yaml b/test/units/plugins/action/fixtures/synchronize/basic_vagrant_become_cli/meta.yaml
new file mode 100644
index 0000000000..89f1eeee11
--- /dev/null
+++ b/test/units/plugins/action/fixtures/synchronize/basic_vagrant_become_cli/meta.yaml
@@ -0,0 +1,32 @@
+task:
+ #become: None
+task_args:
+ src: /tmp/deleteme
+ dest: /tmp/deleteme
+fixtures:
+ taskvars_in: task_vars_in.json
+ taskvars_out: task_vars_out.json
+connection:
+ transport: 'ssh'
+_play_context:
+ become: True
+ remote_addr: '127.0.0.1'
+ remote_user: vagrant
+hostvars:
+ '127.0.0.1': {}
+ '::1': {}
+ 'localhost': {}
+asserts:
+ - "hasattr(SAM._connection, 'ismock')"
+ - "SAM._connection.transport == 'local'"
+ - "self.execute_called"
+ - "self.task.args['_local_rsync_path'] == 'rsync'"
+ - "self.task.args['dest_port'] == 2202"
+ - "self.task.args['src'] == '/tmp/deleteme'"
+ - "self.task.args['dest'] == '/tmp/deleteme'"
+ - "self._play_context.shell == 'sh'"
+ - "self._play_context.remote_addr == '127.0.0.1'"
+ - "self._play_context.remote_user == 'vagrant'"
+ - "self._play_context.become == False"
+ - "self._play_context.become_user == 'root'"
+ - "self._play_context.password == None"
diff --git a/test/units/plugins/action/fixtures/synchronize/basic_vagrant_become_cli/task_args_out.json b/test/units/plugins/action/fixtures/synchronize/basic_vagrant_become_cli/task_args_out.json
new file mode 100644
index 0000000000..9c77ccf8ae
--- /dev/null
+++ b/test/units/plugins/action/fixtures/synchronize/basic_vagrant_become_cli/task_args_out.json
@@ -0,0 +1,7 @@
+{
+ "dest": "/tmp/deleteme",
+ "src": "/tmp/deleteme",
+ "private_key": "/home/jtanner/workspace/issues/AP-15905/.vagrant/machines/default/virtualbox/private_key",
+ "dest_port": 2202,
+ "_local_rsync_path": "rsync"
+} \ No newline at end of file
diff --git a/test/units/plugins/action/fixtures/synchronize/basic_vagrant_become_cli/task_vars_in.json b/test/units/plugins/action/fixtures/synchronize/basic_vagrant_become_cli/task_vars_in.json
new file mode 100644
index 0000000000..1ecbda5b60
--- /dev/null
+++ b/test/units/plugins/action/fixtures/synchronize/basic_vagrant_become_cli/task_vars_in.json
@@ -0,0 +1,164 @@
+{
+ "ansible_pipelining": false,
+ "ansible_docker_extra_args": "",
+ "ansible_scp_extra_args": "",
+ "ansible_user": "vagrant",
+ "ansible_play_hosts": [
+ "default"
+ ],
+ "ansible_connection": "ssh",
+ "ansible_ssh_common_args": "",
+ "ansible_ssh_host": "127.0.0.1",
+ "inventory_hostname": "default",
+ "ansible_ssh_private_key_file": "/home/jtanner/workspace/issues/AP-15905/.vagrant/machines/default/virtualbox/private_key",
+ "vars": {
+ "ansible_check_mode": false,
+ "environment": [],
+ "inventory_hostname": "default",
+ "inventory_file": null,
+ "ansible_ssh_private_key_file": "/home/jtanner/workspace/issues/AP-15905/.vagrant/machines/default/virtualbox/private_key",
+ "inventory_hostname_short": "default",
+ "playbook_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "role_names": [],
+ "inventory_dir": "/home/jtanner/workspace/issues/AP-15905/.vagrant/provisioners/ansible/inventory",
+ "ansible_ssh_host": "127.0.0.1",
+ "play_hosts": [
+ "default"
+ ],
+ "ansible_play_hosts": [
+ "default"
+ ],
+ "hostvars": {
+ "default": {
+ "inventory_file": null,
+ "ansible_check_mode": false,
+ "groups": {
+ "ungrouped": [
+ "default"
+ ],
+ "all": [
+ "default"
+ ]
+ },
+ "ansible_ssh_port": 2202,
+ "inventory_hostname": "default",
+ "ansible_ssh_private_key_file": "/home/jtanner/workspace/issues/AP-15905/.vagrant/machines/default/virtualbox/private_key",
+ "inventory_hostname_short": "default",
+ "playbook_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "omit": "__omit_place_holder__c360b80aa60ddd99087425dcd3a2094cdd5b8474",
+ "inventory_dir": "/home/jtanner/workspace/issues/AP-15905/.vagrant/provisioners/ansible/inventory",
+ "ansible_ssh_host": "127.0.0.1",
+ "ansible_ssh_user": "vagrant",
+ "group_names": [
+ "ungrouped"
+ ],
+ "ansible_version": {
+ "major": 2,
+ "full": "2.2.0",
+ "string": "2.2.0",
+ "minor": 2,
+ "revision": 0
+ }
+ }
+ },
+ "groups": {
+ "ungrouped": [
+ "default"
+ ],
+ "all": [
+ "default"
+ ]
+ },
+ "group_names": [
+ "ungrouped"
+ ],
+ "omit": "__omit_place_holder__c360b80aa60ddd99087425dcd3a2094cdd5b8474",
+ "ansible_ssh_port": 2202,
+ "ansible_version": {
+ "major": 2,
+ "full": "2.2.0",
+ "string": "2.2.0",
+ "minor": 2,
+ "revision": 0
+ },
+ "ansible_ssh_user": "vagrant"
+ },
+ "ansible_accelerate_port": 5099,
+ "roledir": null,
+ "ansible_ssh_extra_args": "",
+ "environment": [],
+ "ansible_current_hosts": [
+ "default"
+ ],
+ "hostvars": {
+ "default": {
+ "inventory_file": null,
+ "ansible_check_mode": false,
+ "groups": {
+ "ungrouped": [
+ "default"
+ ],
+ "all": [
+ "default"
+ ]
+ },
+ "ansible_ssh_port": 2202,
+ "inventory_hostname": "default",
+ "ansible_ssh_private_key_file": "/home/jtanner/workspace/issues/AP-15905/.vagrant/machines/default/virtualbox/private_key",
+ "inventory_hostname_short": "default",
+ "playbook_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "omit": "__omit_place_holder__c360b80aa60ddd99087425dcd3a2094cdd5b8474",
+ "inventory_dir": "/home/jtanner/workspace/issues/AP-15905/.vagrant/provisioners/ansible/inventory",
+ "ansible_ssh_host": "127.0.0.1",
+ "ansible_ssh_user": "vagrant",
+ "group_names": [
+ "ungrouped"
+ ],
+ "ansible_version": {
+ "major": 2,
+ "full": "2.2.0",
+ "string": "2.2.0",
+ "minor": 2,
+ "revision": 0
+ }
+ }
+ },
+ "group_names": [
+ "ungrouped"
+ ],
+ "ansible_version": {
+ "major": 2,
+ "full": "2.2.0",
+ "string": "2.2.0",
+ "minor": 2,
+ "revision": 0
+ },
+ "ansible_ssh_pipelining": false,
+ "inventory_file": null,
+ "ansible_module_compression": "ZIP_DEFLATED",
+ "ansible_failed_hosts": [],
+ "ansible_check_mode": false,
+ "ansible_port": 2202,
+ "ansible_private_key_file": "/home/jtanner/workspace/issues/AP-15905/.vagrant/machines/default/virtualbox/private_key",
+ "groups": {
+ "ungrouped": [
+ "default"
+ ],
+ "all": [
+ "default"
+ ]
+ },
+ "ansible_ssh_port": 2202,
+ "ansible_host": "127.0.0.1",
+ "ansible_shell_executable": "/bin/sh",
+ "inventory_hostname_short": "default",
+ "omit": "__omit_place_holder__c360b80aa60ddd99087425dcd3a2094cdd5b8474",
+ "inventory_dir": "/home/jtanner/workspace/issues/AP-15905/.vagrant/provisioners/ansible/inventory",
+ "playbook_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "ansible_ssh_user": "vagrant",
+ "role_names": [],
+ "play_hosts": [
+ "default"
+ ],
+ "ansible_sftp_extra_args": ""
+} \ No newline at end of file
diff --git a/test/units/plugins/action/fixtures/synchronize/basic_vagrant_become_cli/task_vars_out.json b/test/units/plugins/action/fixtures/synchronize/basic_vagrant_become_cli/task_vars_out.json
new file mode 100644
index 0000000000..a1cf5f28fc
--- /dev/null
+++ b/test/units/plugins/action/fixtures/synchronize/basic_vagrant_become_cli/task_vars_out.json
@@ -0,0 +1,169 @@
+{
+ "ansible_pipelining": false,
+ "ansible_docker_extra_args": "",
+ "ansible_scp_extra_args": "",
+ "ansible_user": "vagrant",
+ "ansible_play_hosts": [
+ "default"
+ ],
+ "ansible_connection": "ssh",
+ "ansible_ssh_common_args": "",
+ "ansible_ssh_host": "127.0.0.1",
+ "inventory_hostname": "default",
+ "ansible_ssh_private_key_file": "/home/jtanner/workspace/issues/AP-15905/.vagrant/machines/default/virtualbox/private_key",
+ "vars": {
+ "ansible_check_mode": false,
+ "environment": [],
+ "inventory_hostname": "default",
+ "inventory_file": null,
+ "ansible_ssh_private_key_file": "/home/jtanner/workspace/issues/AP-15905/.vagrant/machines/default/virtualbox/private_key",
+ "inventory_hostname_short": "default",
+ "playbook_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "role_names": [],
+ "inventory_dir": "/home/jtanner/workspace/issues/AP-15905/.vagrant/provisioners/ansible/inventory",
+ "ansible_ssh_host": "127.0.0.1",
+ "play_hosts": [
+ "default"
+ ],
+ "ansible_play_hosts": [
+ "default"
+ ],
+ "hostvars": {
+ "default": {
+ "inventory_file": null,
+ "ansible_check_mode": false,
+ "groups": {
+ "ungrouped": [
+ "default",
+ "::1"
+ ],
+ "all": [
+ "default",
+ "::1"
+ ]
+ },
+ "ansible_ssh_port": 2202,
+ "inventory_hostname": "default",
+ "ansible_ssh_private_key_file": "/home/jtanner/workspace/issues/AP-15905/.vagrant/machines/default/virtualbox/private_key",
+ "inventory_hostname_short": "default",
+ "playbook_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "omit": "__omit_place_holder__c360b80aa60ddd99087425dcd3a2094cdd5b8474",
+ "inventory_dir": "/home/jtanner/workspace/issues/AP-15905/.vagrant/provisioners/ansible/inventory",
+ "ansible_ssh_host": "127.0.0.1",
+ "ansible_ssh_user": "vagrant",
+ "group_names": [
+ "ungrouped"
+ ],
+ "ansible_version": {
+ "major": 2,
+ "full": "2.2.0",
+ "string": "2.2.0",
+ "minor": 2,
+ "revision": 0
+ }
+ }
+ },
+ "groups": {
+ "ungrouped": [
+ "default"
+ ],
+ "all": [
+ "default"
+ ]
+ },
+ "group_names": [
+ "ungrouped"
+ ],
+ "omit": "__omit_place_holder__c360b80aa60ddd99087425dcd3a2094cdd5b8474",
+ "ansible_ssh_port": 2202,
+ "ansible_version": {
+ "major": 2,
+ "full": "2.2.0",
+ "string": "2.2.0",
+ "minor": 2,
+ "revision": 0
+ },
+ "ansible_ssh_user": "vagrant"
+ },
+ "ansible_accelerate_port": 5099,
+ "roledir": null,
+ "ansible_ssh_extra_args": "",
+ "environment": [],
+ "ansible_current_hosts": [
+ "default"
+ ],
+ "hostvars": {
+ "default": {
+ "inventory_file": null,
+ "ansible_check_mode": false,
+ "groups": {
+ "ungrouped": [
+ "default",
+ "::1"
+ ],
+ "all": [
+ "default",
+ "::1"
+ ]
+ },
+ "ansible_ssh_port": 2202,
+ "inventory_hostname": "default",
+ "ansible_ssh_private_key_file": "/home/jtanner/workspace/issues/AP-15905/.vagrant/machines/default/virtualbox/private_key",
+ "inventory_hostname_short": "default",
+ "playbook_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "omit": "__omit_place_holder__c360b80aa60ddd99087425dcd3a2094cdd5b8474",
+ "inventory_dir": "/home/jtanner/workspace/issues/AP-15905/.vagrant/provisioners/ansible/inventory",
+ "ansible_ssh_host": "127.0.0.1",
+ "ansible_ssh_user": "vagrant",
+ "group_names": [
+ "ungrouped"
+ ],
+ "ansible_version": {
+ "major": 2,
+ "full": "2.2.0",
+ "string": "2.2.0",
+ "minor": 2,
+ "revision": 0
+ }
+ }
+ },
+ "group_names": [
+ "ungrouped"
+ ],
+ "ansible_version": {
+ "major": 2,
+ "full": "2.2.0",
+ "string": "2.2.0",
+ "minor": 2,
+ "revision": 0
+ },
+ "ansible_ssh_pipelining": false,
+ "inventory_file": null,
+ "ansible_module_compression": "ZIP_DEFLATED",
+ "ansible_failed_hosts": [],
+ "ansible_check_mode": false,
+ "ansible_port": 2202,
+ "ansible_private_key_file": "/home/jtanner/workspace/issues/AP-15905/.vagrant/machines/default/virtualbox/private_key",
+ "groups": {
+ "ungrouped": [
+ "default"
+ ],
+ "all": [
+ "default"
+ ]
+ },
+ "ansible_ssh_port": 2202,
+ "ansible_host": "127.0.0.1",
+ "ansible_shell_executable": "/bin/sh",
+ "inventory_hostname_short": "default",
+ "omit": "__omit_place_holder__c360b80aa60ddd99087425dcd3a2094cdd5b8474",
+ "ansible_python_interpreter": "/usr/bin/python",
+ "inventory_dir": "/home/jtanner/workspace/issues/AP-15905/.vagrant/provisioners/ansible/inventory",
+ "playbook_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "ansible_ssh_user": "vagrant",
+ "role_names": [],
+ "play_hosts": [
+ "default"
+ ],
+ "ansible_sftp_extra_args": ""
+} \ No newline at end of file
diff --git a/test/units/plugins/action/fixtures/synchronize/basic_vagrant_sudo/meta.yaml b/test/units/plugins/action/fixtures/synchronize/basic_vagrant_sudo/meta.yaml
new file mode 100644
index 0000000000..904a21a8ee
--- /dev/null
+++ b/test/units/plugins/action/fixtures/synchronize/basic_vagrant_sudo/meta.yaml
@@ -0,0 +1,29 @@
+task_args:
+ src: /tmp/deleteme
+ dest: /tmp/deleteme
+fixtures:
+ taskvars_in: task_vars_in.json
+ taskvars_out: task_vars_out.json
+connection:
+ transport: 'ssh'
+_play_context:
+ remote_addr: '127.0.0.1'
+ remote_user: vagrant
+hostvars:
+ '127.0.0.1': {}
+ '::1': {}
+ 'localhost': {}
+asserts:
+ - "hasattr(SAM._connection, 'ismock')"
+ - "SAM._connection.transport == 'local'"
+ - "self.execute_called"
+ - "self.task.args['_local_rsync_path'] == 'rsync'"
+ - "self.task.args['dest_port'] == 2202"
+ - "self.task.args['src'] == '/tmp/deleteme'"
+ - "self.task.args['dest'] == '/tmp/deleteme'"
+ - "self._play_context.shell == 'sh'"
+ - "self._play_context.remote_addr == '127.0.0.1'"
+ - "self._play_context.remote_user == 'vagrant'"
+ - "self._play_context.become == False"
+ - "self._play_context.become_user == 'root'"
+ - "self._play_context.password == None"
diff --git a/test/units/plugins/action/fixtures/synchronize/basic_vagrant_sudo/task_args_out.json b/test/units/plugins/action/fixtures/synchronize/basic_vagrant_sudo/task_args_out.json
new file mode 100644
index 0000000000..9c77ccf8ae
--- /dev/null
+++ b/test/units/plugins/action/fixtures/synchronize/basic_vagrant_sudo/task_args_out.json
@@ -0,0 +1,7 @@
+{
+ "dest": "/tmp/deleteme",
+ "src": "/tmp/deleteme",
+ "private_key": "/home/jtanner/workspace/issues/AP-15905/.vagrant/machines/default/virtualbox/private_key",
+ "dest_port": 2202,
+ "_local_rsync_path": "rsync"
+} \ No newline at end of file
diff --git a/test/units/plugins/action/fixtures/synchronize/basic_vagrant_sudo/task_vars_in.json b/test/units/plugins/action/fixtures/synchronize/basic_vagrant_sudo/task_vars_in.json
new file mode 100644
index 0000000000..1ecbda5b60
--- /dev/null
+++ b/test/units/plugins/action/fixtures/synchronize/basic_vagrant_sudo/task_vars_in.json
@@ -0,0 +1,164 @@
+{
+ "ansible_pipelining": false,
+ "ansible_docker_extra_args": "",
+ "ansible_scp_extra_args": "",
+ "ansible_user": "vagrant",
+ "ansible_play_hosts": [
+ "default"
+ ],
+ "ansible_connection": "ssh",
+ "ansible_ssh_common_args": "",
+ "ansible_ssh_host": "127.0.0.1",
+ "inventory_hostname": "default",
+ "ansible_ssh_private_key_file": "/home/jtanner/workspace/issues/AP-15905/.vagrant/machines/default/virtualbox/private_key",
+ "vars": {
+ "ansible_check_mode": false,
+ "environment": [],
+ "inventory_hostname": "default",
+ "inventory_file": null,
+ "ansible_ssh_private_key_file": "/home/jtanner/workspace/issues/AP-15905/.vagrant/machines/default/virtualbox/private_key",
+ "inventory_hostname_short": "default",
+ "playbook_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "role_names": [],
+ "inventory_dir": "/home/jtanner/workspace/issues/AP-15905/.vagrant/provisioners/ansible/inventory",
+ "ansible_ssh_host": "127.0.0.1",
+ "play_hosts": [
+ "default"
+ ],
+ "ansible_play_hosts": [
+ "default"
+ ],
+ "hostvars": {
+ "default": {
+ "inventory_file": null,
+ "ansible_check_mode": false,
+ "groups": {
+ "ungrouped": [
+ "default"
+ ],
+ "all": [
+ "default"
+ ]
+ },
+ "ansible_ssh_port": 2202,
+ "inventory_hostname": "default",
+ "ansible_ssh_private_key_file": "/home/jtanner/workspace/issues/AP-15905/.vagrant/machines/default/virtualbox/private_key",
+ "inventory_hostname_short": "default",
+ "playbook_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "omit": "__omit_place_holder__c360b80aa60ddd99087425dcd3a2094cdd5b8474",
+ "inventory_dir": "/home/jtanner/workspace/issues/AP-15905/.vagrant/provisioners/ansible/inventory",
+ "ansible_ssh_host": "127.0.0.1",
+ "ansible_ssh_user": "vagrant",
+ "group_names": [
+ "ungrouped"
+ ],
+ "ansible_version": {
+ "major": 2,
+ "full": "2.2.0",
+ "string": "2.2.0",
+ "minor": 2,
+ "revision": 0
+ }
+ }
+ },
+ "groups": {
+ "ungrouped": [
+ "default"
+ ],
+ "all": [
+ "default"
+ ]
+ },
+ "group_names": [
+ "ungrouped"
+ ],
+ "omit": "__omit_place_holder__c360b80aa60ddd99087425dcd3a2094cdd5b8474",
+ "ansible_ssh_port": 2202,
+ "ansible_version": {
+ "major": 2,
+ "full": "2.2.0",
+ "string": "2.2.0",
+ "minor": 2,
+ "revision": 0
+ },
+ "ansible_ssh_user": "vagrant"
+ },
+ "ansible_accelerate_port": 5099,
+ "roledir": null,
+ "ansible_ssh_extra_args": "",
+ "environment": [],
+ "ansible_current_hosts": [
+ "default"
+ ],
+ "hostvars": {
+ "default": {
+ "inventory_file": null,
+ "ansible_check_mode": false,
+ "groups": {
+ "ungrouped": [
+ "default"
+ ],
+ "all": [
+ "default"
+ ]
+ },
+ "ansible_ssh_port": 2202,
+ "inventory_hostname": "default",
+ "ansible_ssh_private_key_file": "/home/jtanner/workspace/issues/AP-15905/.vagrant/machines/default/virtualbox/private_key",
+ "inventory_hostname_short": "default",
+ "playbook_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "omit": "__omit_place_holder__c360b80aa60ddd99087425dcd3a2094cdd5b8474",
+ "inventory_dir": "/home/jtanner/workspace/issues/AP-15905/.vagrant/provisioners/ansible/inventory",
+ "ansible_ssh_host": "127.0.0.1",
+ "ansible_ssh_user": "vagrant",
+ "group_names": [
+ "ungrouped"
+ ],
+ "ansible_version": {
+ "major": 2,
+ "full": "2.2.0",
+ "string": "2.2.0",
+ "minor": 2,
+ "revision": 0
+ }
+ }
+ },
+ "group_names": [
+ "ungrouped"
+ ],
+ "ansible_version": {
+ "major": 2,
+ "full": "2.2.0",
+ "string": "2.2.0",
+ "minor": 2,
+ "revision": 0
+ },
+ "ansible_ssh_pipelining": false,
+ "inventory_file": null,
+ "ansible_module_compression": "ZIP_DEFLATED",
+ "ansible_failed_hosts": [],
+ "ansible_check_mode": false,
+ "ansible_port": 2202,
+ "ansible_private_key_file": "/home/jtanner/workspace/issues/AP-15905/.vagrant/machines/default/virtualbox/private_key",
+ "groups": {
+ "ungrouped": [
+ "default"
+ ],
+ "all": [
+ "default"
+ ]
+ },
+ "ansible_ssh_port": 2202,
+ "ansible_host": "127.0.0.1",
+ "ansible_shell_executable": "/bin/sh",
+ "inventory_hostname_short": "default",
+ "omit": "__omit_place_holder__c360b80aa60ddd99087425dcd3a2094cdd5b8474",
+ "inventory_dir": "/home/jtanner/workspace/issues/AP-15905/.vagrant/provisioners/ansible/inventory",
+ "playbook_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "ansible_ssh_user": "vagrant",
+ "role_names": [],
+ "play_hosts": [
+ "default"
+ ],
+ "ansible_sftp_extra_args": ""
+} \ No newline at end of file
diff --git a/test/units/plugins/action/fixtures/synchronize/basic_vagrant_sudo/task_vars_out.json b/test/units/plugins/action/fixtures/synchronize/basic_vagrant_sudo/task_vars_out.json
new file mode 100644
index 0000000000..a1cf5f28fc
--- /dev/null
+++ b/test/units/plugins/action/fixtures/synchronize/basic_vagrant_sudo/task_vars_out.json
@@ -0,0 +1,169 @@
+{
+ "ansible_pipelining": false,
+ "ansible_docker_extra_args": "",
+ "ansible_scp_extra_args": "",
+ "ansible_user": "vagrant",
+ "ansible_play_hosts": [
+ "default"
+ ],
+ "ansible_connection": "ssh",
+ "ansible_ssh_common_args": "",
+ "ansible_ssh_host": "127.0.0.1",
+ "inventory_hostname": "default",
+ "ansible_ssh_private_key_file": "/home/jtanner/workspace/issues/AP-15905/.vagrant/machines/default/virtualbox/private_key",
+ "vars": {
+ "ansible_check_mode": false,
+ "environment": [],
+ "inventory_hostname": "default",
+ "inventory_file": null,
+ "ansible_ssh_private_key_file": "/home/jtanner/workspace/issues/AP-15905/.vagrant/machines/default/virtualbox/private_key",
+ "inventory_hostname_short": "default",
+ "playbook_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "role_names": [],
+ "inventory_dir": "/home/jtanner/workspace/issues/AP-15905/.vagrant/provisioners/ansible/inventory",
+ "ansible_ssh_host": "127.0.0.1",
+ "play_hosts": [
+ "default"
+ ],
+ "ansible_play_hosts": [
+ "default"
+ ],
+ "hostvars": {
+ "default": {
+ "inventory_file": null,
+ "ansible_check_mode": false,
+ "groups": {
+ "ungrouped": [
+ "default",
+ "::1"
+ ],
+ "all": [
+ "default",
+ "::1"
+ ]
+ },
+ "ansible_ssh_port": 2202,
+ "inventory_hostname": "default",
+ "ansible_ssh_private_key_file": "/home/jtanner/workspace/issues/AP-15905/.vagrant/machines/default/virtualbox/private_key",
+ "inventory_hostname_short": "default",
+ "playbook_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "omit": "__omit_place_holder__c360b80aa60ddd99087425dcd3a2094cdd5b8474",
+ "inventory_dir": "/home/jtanner/workspace/issues/AP-15905/.vagrant/provisioners/ansible/inventory",
+ "ansible_ssh_host": "127.0.0.1",
+ "ansible_ssh_user": "vagrant",
+ "group_names": [
+ "ungrouped"
+ ],
+ "ansible_version": {
+ "major": 2,
+ "full": "2.2.0",
+ "string": "2.2.0",
+ "minor": 2,
+ "revision": 0
+ }
+ }
+ },
+ "groups": {
+ "ungrouped": [
+ "default"
+ ],
+ "all": [
+ "default"
+ ]
+ },
+ "group_names": [
+ "ungrouped"
+ ],
+ "omit": "__omit_place_holder__c360b80aa60ddd99087425dcd3a2094cdd5b8474",
+ "ansible_ssh_port": 2202,
+ "ansible_version": {
+ "major": 2,
+ "full": "2.2.0",
+ "string": "2.2.0",
+ "minor": 2,
+ "revision": 0
+ },
+ "ansible_ssh_user": "vagrant"
+ },
+ "ansible_accelerate_port": 5099,
+ "roledir": null,
+ "ansible_ssh_extra_args": "",
+ "environment": [],
+ "ansible_current_hosts": [
+ "default"
+ ],
+ "hostvars": {
+ "default": {
+ "inventory_file": null,
+ "ansible_check_mode": false,
+ "groups": {
+ "ungrouped": [
+ "default",
+ "::1"
+ ],
+ "all": [
+ "default",
+ "::1"
+ ]
+ },
+ "ansible_ssh_port": 2202,
+ "inventory_hostname": "default",
+ "ansible_ssh_private_key_file": "/home/jtanner/workspace/issues/AP-15905/.vagrant/machines/default/virtualbox/private_key",
+ "inventory_hostname_short": "default",
+ "playbook_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "omit": "__omit_place_holder__c360b80aa60ddd99087425dcd3a2094cdd5b8474",
+ "inventory_dir": "/home/jtanner/workspace/issues/AP-15905/.vagrant/provisioners/ansible/inventory",
+ "ansible_ssh_host": "127.0.0.1",
+ "ansible_ssh_user": "vagrant",
+ "group_names": [
+ "ungrouped"
+ ],
+ "ansible_version": {
+ "major": 2,
+ "full": "2.2.0",
+ "string": "2.2.0",
+ "minor": 2,
+ "revision": 0
+ }
+ }
+ },
+ "group_names": [
+ "ungrouped"
+ ],
+ "ansible_version": {
+ "major": 2,
+ "full": "2.2.0",
+ "string": "2.2.0",
+ "minor": 2,
+ "revision": 0
+ },
+ "ansible_ssh_pipelining": false,
+ "inventory_file": null,
+ "ansible_module_compression": "ZIP_DEFLATED",
+ "ansible_failed_hosts": [],
+ "ansible_check_mode": false,
+ "ansible_port": 2202,
+ "ansible_private_key_file": "/home/jtanner/workspace/issues/AP-15905/.vagrant/machines/default/virtualbox/private_key",
+ "groups": {
+ "ungrouped": [
+ "default"
+ ],
+ "all": [
+ "default"
+ ]
+ },
+ "ansible_ssh_port": 2202,
+ "ansible_host": "127.0.0.1",
+ "ansible_shell_executable": "/bin/sh",
+ "inventory_hostname_short": "default",
+ "omit": "__omit_place_holder__c360b80aa60ddd99087425dcd3a2094cdd5b8474",
+ "ansible_python_interpreter": "/usr/bin/python",
+ "inventory_dir": "/home/jtanner/workspace/issues/AP-15905/.vagrant/provisioners/ansible/inventory",
+ "playbook_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "ansible_ssh_user": "vagrant",
+ "role_names": [],
+ "play_hosts": [
+ "default"
+ ],
+ "ansible_sftp_extra_args": ""
+} \ No newline at end of file
diff --git a/test/units/plugins/action/fixtures/synchronize/delegate_remote/meta.yaml b/test/units/plugins/action/fixtures/synchronize/delegate_remote/meta.yaml
new file mode 100644
index 0000000000..49c96786ff
--- /dev/null
+++ b/test/units/plugins/action/fixtures/synchronize/delegate_remote/meta.yaml
@@ -0,0 +1,26 @@
+fixtures:
+ taskvars_in: task_vars_in.json
+ taskvars_out: task_vars_out.json
+task_args:
+ src: /tmp/deleteme
+ dest: /tmp/deleteme
+_task:
+ delegate_to: u1404
+_play_context:
+ shell: None
+ remote_addr: u1404
+ remote_user: root
+connection:
+ transport: 'ssh'
+hostvars:
+ '127.0.0.1': {}
+ '::1': {}
+ 'localhost': {}
+asserts:
+ - "hasattr(SAM._connection, 'ismock')"
+ - "SAM._connection.transport == 'ssh'"
+ - "self._play_context.shell == None"
+ - "self.execute_called"
+ - "self.task.args['_local_rsync_path'] == 'rsync'"
+ - "self.task.args['src'] == '/tmp/deleteme'"
+ - "self.task.args['dest'] == 'el6host:/tmp/deleteme'"
diff --git a/test/units/plugins/action/fixtures/synchronize/delegate_remote/task_args_out.json b/test/units/plugins/action/fixtures/synchronize/delegate_remote/task_args_out.json
new file mode 100644
index 0000000000..7b2ac0299d
--- /dev/null
+++ b/test/units/plugins/action/fixtures/synchronize/delegate_remote/task_args_out.json
@@ -0,0 +1,5 @@
+{
+ "dest": "el6host:/tmp/deleteme",
+ "src": "/tmp/deleteme",
+ "_local_rsync_path": "rsync"
+} \ No newline at end of file
diff --git a/test/units/plugins/action/fixtures/synchronize/delegate_remote/task_vars_in.json b/test/units/plugins/action/fixtures/synchronize/delegate_remote/task_vars_in.json
new file mode 100644
index 0000000000..b8893eef85
--- /dev/null
+++ b/test/units/plugins/action/fixtures/synchronize/delegate_remote/task_vars_in.json
@@ -0,0 +1,379 @@
+{
+ "ansible_pipelining": false,
+ "ansible_docker_extra_args": "",
+ "ansible_scp_extra_args": "",
+ "ansible_user": "root",
+ "ansible_play_hosts": [
+ "el6host"
+ ],
+ "ansible_connection": "smart",
+ "ansible_ssh_common_args": "",
+ "environment": [],
+ "inventory_hostname": "el6host",
+ "vars": {
+ "ansible_check_mode": false,
+ "inventory_hostname": "el6host",
+ "inventory_file": "inventory",
+ "ansible_delegated_vars": {
+ "u1404": {
+ "inventory_hostname": "u1404",
+ "inventory_file": "inventory",
+ "vars": {
+ "inventory_file": "inventory",
+ "role_names": [],
+ "ansible_play_hosts": [
+ "el6host"
+ ],
+ "groups": {
+ "ungrouped": [
+ "el6host",
+ "u1404"
+ ],
+ "all": [
+ "el6host",
+ "u1404"
+ ]
+ },
+ "ansible_check_mode": false,
+ "inventory_hostname": "u1404",
+ "inventory_hostname_short": "u1404",
+ "playbook_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "omit": "__omit_place_holder__2433ce0463ffd13b68850ce9cdd98a1cde088e22",
+ "inventory_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "environment": [],
+ "ansible_ssh_user": "root",
+ "group_names": [
+ "ungrouped"
+ ],
+ "play_hosts": [
+ "el6host"
+ ],
+ "ansible_version": {
+ "major": 2,
+ "full": "2.2.0",
+ "string": "2.2.0",
+ "minor": 2,
+ "revision": 0
+ }
+ },
+ "inventory_hostname_short": "u1404",
+ "playbook_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "group_names": [
+ "ungrouped"
+ ],
+ "inventory_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "omit": "__omit_place_holder__2433ce0463ffd13b68850ce9cdd98a1cde088e22",
+ "ansible_host": "u1404",
+ "environment": [],
+ "ansible_play_hosts": [
+ "el6host"
+ ],
+ "groups": {
+ "ungrouped": [
+ "el6host",
+ "u1404"
+ ],
+ "all": [
+ "el6host",
+ "u1404"
+ ]
+ },
+ "ansible_check_mode": false,
+ "play_hosts": [
+ "el6host"
+ ],
+ "role_names": [],
+ "ansible_port": null,
+ "ansible_version": {
+ "major": 2,
+ "full": "2.2.0",
+ "string": "2.2.0",
+ "minor": 2,
+ "revision": 0
+ },
+ "ansible_ssh_user": "root"
+ }
+ },
+ "inventory_hostname_short": "el6host",
+ "playbook_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "role_names": [],
+ "inventory_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "environment": [],
+ "play_hosts": [
+ "el6host"
+ ],
+ "ansible_play_hosts": [
+ "el6host"
+ ],
+ "hostvars": {
+ "el6host": {
+ "inventory_file": "inventory",
+ "group_names": [
+ "ungrouped"
+ ],
+ "groups": {
+ "ungrouped": [
+ "el6host",
+ "u1404"
+ ],
+ "all": [
+ "el6host",
+ "u1404"
+ ]
+ },
+ "inventory_hostname": "el6host",
+ "inventory_hostname_short": "el6host",
+ "playbook_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "omit": "__omit_place_holder__2433ce0463ffd13b68850ce9cdd98a1cde088e22",
+ "inventory_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "ansible_ssh_user": "root",
+ "ansible_check_mode": false,
+ "ansible_version": {
+ "major": 2,
+ "full": "2.2.0",
+ "string": "2.2.0",
+ "minor": 2,
+ "revision": 0
+ }
+ },
+ "u1404": {
+ "inventory_file": "inventory",
+ "group_names": [
+ "ungrouped"
+ ],
+ "groups": {
+ "ungrouped": [
+ "el6host",
+ "u1404"
+ ],
+ "all": [
+ "el6host",
+ "u1404"
+ ]
+ },
+ "inventory_hostname": "u1404",
+ "inventory_hostname_short": "u1404",
+ "playbook_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "omit": "__omit_place_holder__2433ce0463ffd13b68850ce9cdd98a1cde088e22",
+ "inventory_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "ansible_ssh_user": "root",
+ "ansible_check_mode": false,
+ "ansible_version": {
+ "major": 2,
+ "full": "2.2.0",
+ "string": "2.2.0",
+ "minor": 2,
+ "revision": 0
+ }
+ }
+ },
+ "groups": {
+ "ungrouped": [
+ "el6host",
+ "u1404"
+ ],
+ "all": [
+ "el6host",
+ "u1404"
+ ]
+ },
+ "group_names": [
+ "ungrouped"
+ ],
+ "omit": "__omit_place_holder__2433ce0463ffd13b68850ce9cdd98a1cde088e22",
+ "ansible_version": {
+ "major": 2,
+ "full": "2.2.0",
+ "string": "2.2.0",
+ "minor": 2,
+ "revision": 0
+ },
+ "ansible_ssh_user": "root"
+ },
+ "ansible_accelerate_port": 5099,
+ "roledir": null,
+ "ansible_ssh_extra_args": "",
+ "ansible_ssh_host": "u1404",
+ "ansible_current_hosts": [
+ "el6host"
+ ],
+ "hostvars": {
+ "el6host": {
+ "inventory_file": "inventory",
+ "group_names": [
+ "ungrouped"
+ ],
+ "groups": {
+ "ungrouped": [
+ "el6host",
+ "u1404"
+ ],
+ "all": [
+ "el6host",
+ "u1404"
+ ]
+ },
+ "inventory_hostname": "el6host",
+ "inventory_hostname_short": "el6host",
+ "playbook_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "omit": "__omit_place_holder__2433ce0463ffd13b68850ce9cdd98a1cde088e22",
+ "inventory_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "ansible_ssh_user": "root",
+ "ansible_check_mode": false,
+ "ansible_version": {
+ "major": 2,
+ "full": "2.2.0",
+ "string": "2.2.0",
+ "minor": 2,
+ "revision": 0
+ }
+ },
+ "u1404": {
+ "inventory_file": "inventory",
+ "group_names": [
+ "ungrouped"
+ ],
+ "groups": {
+ "ungrouped": [
+ "el6host",
+ "u1404"
+ ],
+ "all": [
+ "el6host",
+ "u1404"
+ ]
+ },
+ "inventory_hostname": "u1404",
+ "inventory_hostname_short": "u1404",
+ "playbook_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "omit": "__omit_place_holder__2433ce0463ffd13b68850ce9cdd98a1cde088e22",
+ "inventory_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "ansible_ssh_user": "root",
+ "ansible_check_mode": false,
+ "ansible_version": {
+ "major": 2,
+ "full": "2.2.0",
+ "string": "2.2.0",
+ "minor": 2,
+ "revision": 0
+ }
+ }
+ },
+ "group_names": [
+ "ungrouped"
+ ],
+ "ansible_version": {
+ "major": 2,
+ "full": "2.2.0",
+ "string": "2.2.0",
+ "minor": 2,
+ "revision": 0
+ },
+ "ansible_ssh_pipelining": false,
+ "inventory_file": "inventory",
+ "ansible_delegated_vars": {
+ "u1404": {
+ "inventory_hostname": "u1404",
+ "inventory_file": "inventory",
+ "vars": {
+ "ansible_check_mode": false,
+ "inventory_hostname": "u1404",
+ "inventory_file": "inventory",
+ "inventory_hostname_short": "u1404",
+ "playbook_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "omit": "__omit_place_holder__2433ce0463ffd13b68850ce9cdd98a1cde088e22",
+ "inventory_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "environment": [],
+ "ansible_ssh_user": "root",
+ "ansible_play_hosts": [
+ "el6host"
+ ],
+ "groups": {
+ "ungrouped": [
+ "el6host",
+ "u1404"
+ ],
+ "all": [
+ "el6host",
+ "u1404"
+ ]
+ },
+ "group_names": [
+ "ungrouped"
+ ],
+ "play_hosts": [
+ "el6host"
+ ],
+ "ansible_version": {
+ "major": 2,
+ "full": "2.2.0",
+ "string": "2.2.0",
+ "minor": 2,
+ "revision": 0
+ },
+ "role_names": []
+ },
+ "inventory_hostname_short": "u1404",
+ "playbook_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "group_names": [
+ "ungrouped"
+ ],
+ "inventory_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "omit": "__omit_place_holder__2433ce0463ffd13b68850ce9cdd98a1cde088e22",
+ "ansible_host": "u1404",
+ "environment": [],
+ "ansible_play_hosts": [
+ "el6host"
+ ],
+ "groups": {
+ "ungrouped": [
+ "el6host",
+ "u1404"
+ ],
+ "all": [
+ "el6host",
+ "u1404"
+ ]
+ },
+ "ansible_check_mode": false,
+ "play_hosts": [
+ "el6host"
+ ],
+ "role_names": [],
+ "ansible_port": null,
+ "ansible_version": {
+ "major": 2,
+ "full": "2.2.0",
+ "string": "2.2.0",
+ "minor": 2,
+ "revision": 0
+ },
+ "ansible_ssh_user": "root"
+ }
+ },
+ "ansible_module_compression": "ZIP_DEFLATED",
+ "ansible_failed_hosts": [],
+ "ansible_check_mode": false,
+ "groups": {
+ "ungrouped": [
+ "el6host",
+ "u1404"
+ ],
+ "all": [
+ "el6host",
+ "u1404"
+ ]
+ },
+ "ansible_host": "u1404",
+ "ansible_shell_executable": "/bin/sh",
+ "inventory_hostname_short": "el6host",
+ "omit": "__omit_place_holder__2433ce0463ffd13b68850ce9cdd98a1cde088e22",
+ "inventory_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "playbook_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "ansible_ssh_user": "root",
+ "role_names": [],
+ "play_hosts": [
+ "el6host"
+ ],
+ "ansible_sftp_extra_args": ""
+} \ No newline at end of file
diff --git a/test/units/plugins/action/fixtures/synchronize/delegate_remote/task_vars_out.json b/test/units/plugins/action/fixtures/synchronize/delegate_remote/task_vars_out.json
new file mode 100644
index 0000000000..0b551f041d
--- /dev/null
+++ b/test/units/plugins/action/fixtures/synchronize/delegate_remote/task_vars_out.json
@@ -0,0 +1,387 @@
+{
+ "ansible_pipelining": false,
+ "ansible_docker_extra_args": "",
+ "ansible_scp_extra_args": "",
+ "ansible_user": "root",
+ "ansible_play_hosts": [
+ "el6host"
+ ],
+ "ansible_connection": "smart",
+ "ansible_ssh_common_args": "",
+ "environment": [],
+ "inventory_hostname": "el6host",
+ "vars": {
+ "ansible_check_mode": false,
+ "inventory_hostname": "el6host",
+ "inventory_file": "inventory",
+ "ansible_delegated_vars": {
+ "u1404": {
+ "inventory_hostname": "u1404",
+ "inventory_file": "inventory",
+ "vars": {
+ "inventory_file": "inventory",
+ "role_names": [],
+ "ansible_play_hosts": [
+ "el6host"
+ ],
+ "groups": {
+ "ungrouped": [
+ "el6host",
+ "u1404"
+ ],
+ "all": [
+ "el6host",
+ "u1404"
+ ]
+ },
+ "ansible_check_mode": false,
+ "inventory_hostname": "u1404",
+ "inventory_hostname_short": "u1404",
+ "playbook_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "omit": "__omit_place_holder__2433ce0463ffd13b68850ce9cdd98a1cde088e22",
+ "inventory_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "environment": [],
+ "ansible_ssh_user": "root",
+ "group_names": [
+ "ungrouped"
+ ],
+ "play_hosts": [
+ "el6host"
+ ],
+ "ansible_version": {
+ "major": 2,
+ "full": "2.2.0",
+ "string": "2.2.0",
+ "minor": 2,
+ "revision": 0
+ }
+ },
+ "inventory_hostname_short": "u1404",
+ "playbook_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "group_names": [
+ "ungrouped"
+ ],
+ "inventory_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "omit": "__omit_place_holder__2433ce0463ffd13b68850ce9cdd98a1cde088e22",
+ "ansible_host": "u1404",
+ "environment": [],
+ "ansible_play_hosts": [
+ "el6host"
+ ],
+ "groups": {
+ "ungrouped": [
+ "el6host",
+ "u1404"
+ ],
+ "all": [
+ "el6host",
+ "u1404"
+ ]
+ },
+ "ansible_check_mode": false,
+ "play_hosts": [
+ "el6host"
+ ],
+ "role_names": [],
+ "ansible_port": null,
+ "ansible_version": {
+ "major": 2,
+ "full": "2.2.0",
+ "string": "2.2.0",
+ "minor": 2,
+ "revision": 0
+ },
+ "ansible_ssh_user": "root"
+ }
+ },
+ "inventory_hostname_short": "el6host",
+ "playbook_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "role_names": [],
+ "inventory_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "environment": [],
+ "play_hosts": [
+ "el6host"
+ ],
+ "ansible_play_hosts": [
+ "el6host"
+ ],
+ "hostvars": {
+ "el6host": {
+ "inventory_file": "inventory",
+ "group_names": [
+ "ungrouped"
+ ],
+ "groups": {
+ "ungrouped": [
+ "el6host",
+ "u1404",
+ "::1"
+ ],
+ "all": [
+ "el6host",
+ "u1404",
+ "::1"
+ ]
+ },
+ "inventory_hostname": "el6host",
+ "inventory_hostname_short": "el6host",
+ "playbook_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "omit": "__omit_place_holder__2433ce0463ffd13b68850ce9cdd98a1cde088e22",
+ "inventory_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "ansible_ssh_user": "root",
+ "ansible_check_mode": false,
+ "ansible_version": {
+ "major": 2,
+ "full": "2.2.0",
+ "string": "2.2.0",
+ "minor": 2,
+ "revision": 0
+ }
+ },
+ "u1404": {
+ "inventory_file": "inventory",
+ "group_names": [
+ "ungrouped"
+ ],
+ "groups": {
+ "ungrouped": [
+ "el6host",
+ "u1404",
+ "::1"
+ ],
+ "all": [
+ "el6host",
+ "u1404",
+ "::1"
+ ]
+ },
+ "inventory_hostname": "u1404",
+ "inventory_hostname_short": "u1404",
+ "playbook_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "omit": "__omit_place_holder__2433ce0463ffd13b68850ce9cdd98a1cde088e22",
+ "inventory_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "ansible_ssh_user": "root",
+ "ansible_check_mode": false,
+ "ansible_version": {
+ "major": 2,
+ "full": "2.2.0",
+ "string": "2.2.0",
+ "minor": 2,
+ "revision": 0
+ }
+ }
+ },
+ "groups": {
+ "ungrouped": [
+ "el6host",
+ "u1404"
+ ],
+ "all": [
+ "el6host",
+ "u1404"
+ ]
+ },
+ "group_names": [
+ "ungrouped"
+ ],
+ "omit": "__omit_place_holder__2433ce0463ffd13b68850ce9cdd98a1cde088e22",
+ "ansible_version": {
+ "major": 2,
+ "full": "2.2.0",
+ "string": "2.2.0",
+ "minor": 2,
+ "revision": 0
+ },
+ "ansible_ssh_user": "root"
+ },
+ "ansible_accelerate_port": 5099,
+ "roledir": null,
+ "ansible_ssh_extra_args": "",
+ "ansible_ssh_host": "u1404",
+ "ansible_current_hosts": [
+ "el6host"
+ ],
+ "hostvars": {
+ "el6host": {
+ "inventory_file": "inventory",
+ "group_names": [
+ "ungrouped"
+ ],
+ "groups": {
+ "ungrouped": [
+ "el6host",
+ "u1404",
+ "::1"
+ ],
+ "all": [
+ "el6host",
+ "u1404",
+ "::1"
+ ]
+ },
+ "inventory_hostname": "el6host",
+ "inventory_hostname_short": "el6host",
+ "playbook_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "omit": "__omit_place_holder__2433ce0463ffd13b68850ce9cdd98a1cde088e22",
+ "inventory_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "ansible_ssh_user": "root",
+ "ansible_check_mode": false,
+ "ansible_version": {
+ "major": 2,
+ "full": "2.2.0",
+ "string": "2.2.0",
+ "minor": 2,
+ "revision": 0
+ }
+ },
+ "u1404": {
+ "inventory_file": "inventory",
+ "group_names": [
+ "ungrouped"
+ ],
+ "groups": {
+ "ungrouped": [
+ "el6host",
+ "u1404",
+ "::1"
+ ],
+ "all": [
+ "el6host",
+ "u1404",
+ "::1"
+ ]
+ },
+ "inventory_hostname": "u1404",
+ "inventory_hostname_short": "u1404",
+ "playbook_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "omit": "__omit_place_holder__2433ce0463ffd13b68850ce9cdd98a1cde088e22",
+ "inventory_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "ansible_ssh_user": "root",
+ "ansible_check_mode": false,
+ "ansible_version": {
+ "major": 2,
+ "full": "2.2.0",
+ "string": "2.2.0",
+ "minor": 2,
+ "revision": 0
+ }
+ }
+ },
+ "group_names": [
+ "ungrouped"
+ ],
+ "ansible_version": {
+ "major": 2,
+ "full": "2.2.0",
+ "string": "2.2.0",
+ "minor": 2,
+ "revision": 0
+ },
+ "ansible_ssh_pipelining": false,
+ "inventory_file": "inventory",
+ "ansible_delegated_vars": {
+ "u1404": {
+ "inventory_hostname": "u1404",
+ "inventory_file": "inventory",
+ "vars": {
+ "ansible_check_mode": false,
+ "inventory_hostname": "u1404",
+ "inventory_file": "inventory",
+ "inventory_hostname_short": "u1404",
+ "playbook_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "omit": "__omit_place_holder__2433ce0463ffd13b68850ce9cdd98a1cde088e22",
+ "inventory_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "environment": [],
+ "ansible_ssh_user": "root",
+ "ansible_play_hosts": [
+ "el6host"
+ ],
+ "groups": {
+ "ungrouped": [
+ "el6host",
+ "u1404"
+ ],
+ "all": [
+ "el6host",
+ "u1404"
+ ]
+ },
+ "group_names": [
+ "ungrouped"
+ ],
+ "play_hosts": [
+ "el6host"
+ ],
+ "ansible_version": {
+ "major": 2,
+ "full": "2.2.0",
+ "string": "2.2.0",
+ "minor": 2,
+ "revision": 0
+ },
+ "role_names": []
+ },
+ "inventory_hostname_short": "u1404",
+ "playbook_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "group_names": [
+ "ungrouped"
+ ],
+ "inventory_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "omit": "__omit_place_holder__2433ce0463ffd13b68850ce9cdd98a1cde088e22",
+ "ansible_host": "u1404",
+ "environment": [],
+ "ansible_play_hosts": [
+ "el6host"
+ ],
+ "groups": {
+ "ungrouped": [
+ "el6host",
+ "u1404"
+ ],
+ "all": [
+ "el6host",
+ "u1404"
+ ]
+ },
+ "ansible_check_mode": false,
+ "play_hosts": [
+ "el6host"
+ ],
+ "role_names": [],
+ "ansible_port": null,
+ "ansible_version": {
+ "major": 2,
+ "full": "2.2.0",
+ "string": "2.2.0",
+ "minor": 2,
+ "revision": 0
+ },
+ "ansible_ssh_user": "root"
+ }
+ },
+ "ansible_module_compression": "ZIP_DEFLATED",
+ "ansible_failed_hosts": [],
+ "ansible_check_mode": false,
+ "groups": {
+ "ungrouped": [
+ "el6host",
+ "u1404"
+ ],
+ "all": [
+ "el6host",
+ "u1404"
+ ]
+ },
+ "ansible_host": "u1404",
+ "ansible_shell_executable": "/bin/sh",
+ "inventory_hostname_short": "el6host",
+ "omit": "__omit_place_holder__2433ce0463ffd13b68850ce9cdd98a1cde088e22",
+ "inventory_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "playbook_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "ansible_ssh_user": "root",
+ "role_names": [],
+ "play_hosts": [
+ "el6host"
+ ],
+ "ansible_sftp_extra_args": ""
+} \ No newline at end of file
diff --git a/test/units/plugins/action/fixtures/synchronize/delegate_remote_su/meta.yaml b/test/units/plugins/action/fixtures/synchronize/delegate_remote_su/meta.yaml
new file mode 100644
index 0000000000..0abc8bf6c4
--- /dev/null
+++ b/test/units/plugins/action/fixtures/synchronize/delegate_remote_su/meta.yaml
@@ -0,0 +1,33 @@
+fixtures:
+ taskvars_in: task_vars_in.json
+ taskvars_out: task_vars_out.json
+task_args:
+ src: /tmp/deleteme
+ dest: /tmp/deleteme
+_task:
+ delegate_to: u1404
+_play_context:
+ become: True
+ become_user: None #if ! None|root, different testcase
+ become_method: su
+ shell: None
+ remote_addr: u1404
+ remote_user: root
+connection:
+ transport: 'ssh'
+hostvars:
+ '127.0.0.1': {}
+ '::1': {}
+ 'localhost': {}
+asserts:
+ - "hasattr(SAM._connection, 'ismock')"
+ - "SAM._connection.transport == 'ssh'"
+ - "self._play_context.shell == None"
+ - "self._play_context.remote_addr == 'u1404'"
+ - "self._play_context.remote_user == 'root'"
+ - "not self._play_context.become"
+ - "self._play_context.become_method == 'su'"
+ - "self.execute_called"
+ - "self.task.args['_local_rsync_path'] == 'rsync'"
+ - "self.task.args['src'] == '/tmp/deleteme'"
+ - "self.task.args['dest'] == 'el6host:/tmp/deleteme'"
diff --git a/test/units/plugins/action/fixtures/synchronize/delegate_remote_su/task_args_out.json b/test/units/plugins/action/fixtures/synchronize/delegate_remote_su/task_args_out.json
new file mode 100644
index 0000000000..f1f25ddac1
--- /dev/null
+++ b/test/units/plugins/action/fixtures/synchronize/delegate_remote_su/task_args_out.json
@@ -0,0 +1,6 @@
+{
+ "dest": "el6host:/tmp/deleteme",
+ "src": "/tmp/deleteme",
+ "rsync_path": "\"sudo rsync\"",
+ "_local_rsync_path": "rsync"
+} \ No newline at end of file
diff --git a/test/units/plugins/action/fixtures/synchronize/delegate_remote_su/task_vars_in.json b/test/units/plugins/action/fixtures/synchronize/delegate_remote_su/task_vars_in.json
new file mode 100644
index 0000000000..634bcb3ffe
--- /dev/null
+++ b/test/units/plugins/action/fixtures/synchronize/delegate_remote_su/task_vars_in.json
@@ -0,0 +1,379 @@
+{
+ "ansible_pipelining": false,
+ "ansible_docker_extra_args": "",
+ "ansible_scp_extra_args": "",
+ "ansible_user": "root",
+ "ansible_play_hosts": [
+ "el6host"
+ ],
+ "ansible_connection": "smart",
+ "ansible_ssh_common_args": "",
+ "environment": [],
+ "inventory_hostname": "el6host",
+ "vars": {
+ "ansible_check_mode": false,
+ "inventory_hostname": "el6host",
+ "inventory_file": "inventory",
+ "ansible_delegated_vars": {
+ "u1404": {
+ "inventory_hostname": "u1404",
+ "inventory_file": "inventory",
+ "vars": {
+ "inventory_file": "inventory",
+ "role_names": [],
+ "ansible_play_hosts": [
+ "el6host"
+ ],
+ "groups": {
+ "ungrouped": [
+ "el6host",
+ "u1404"
+ ],
+ "all": [
+ "el6host",
+ "u1404"
+ ]
+ },
+ "ansible_check_mode": false,
+ "inventory_hostname": "u1404",
+ "inventory_hostname_short": "u1404",
+ "playbook_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "omit": "__omit_place_holder__32a8706cee222390e0d92197fb49cc967bfafb57",
+ "inventory_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "environment": [],
+ "ansible_ssh_user": "root",
+ "group_names": [
+ "ungrouped"
+ ],
+ "play_hosts": [
+ "el6host"
+ ],
+ "ansible_version": {
+ "major": 2,
+ "full": "2.2.0",
+ "string": "2.2.0",
+ "minor": 2,
+ "revision": 0
+ }
+ },
+ "inventory_hostname_short": "u1404",
+ "playbook_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "group_names": [
+ "ungrouped"
+ ],
+ "inventory_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "omit": "__omit_place_holder__32a8706cee222390e0d92197fb49cc967bfafb57",
+ "ansible_host": "u1404",
+ "environment": [],
+ "ansible_play_hosts": [
+ "el6host"
+ ],
+ "groups": {
+ "ungrouped": [
+ "el6host",
+ "u1404"
+ ],
+ "all": [
+ "el6host",
+ "u1404"
+ ]
+ },
+ "ansible_check_mode": false,
+ "play_hosts": [
+ "el6host"
+ ],
+ "role_names": [],
+ "ansible_port": null,
+ "ansible_version": {
+ "major": 2,
+ "full": "2.2.0",
+ "string": "2.2.0",
+ "minor": 2,
+ "revision": 0
+ },
+ "ansible_ssh_user": "root"
+ }
+ },
+ "inventory_hostname_short": "el6host",
+ "playbook_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "role_names": [],
+ "inventory_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "environment": [],
+ "play_hosts": [
+ "el6host"
+ ],
+ "ansible_play_hosts": [
+ "el6host"
+ ],
+ "hostvars": {
+ "el6host": {
+ "inventory_file": "inventory",
+ "group_names": [
+ "ungrouped"
+ ],
+ "groups": {
+ "ungrouped": [
+ "el6host",
+ "u1404"
+ ],
+ "all": [
+ "el6host",
+ "u1404"
+ ]
+ },
+ "inventory_hostname": "el6host",
+ "inventory_hostname_short": "el6host",
+ "playbook_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "omit": "__omit_place_holder__32a8706cee222390e0d92197fb49cc967bfafb57",
+ "inventory_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "ansible_ssh_user": "root",
+ "ansible_check_mode": false,
+ "ansible_version": {
+ "major": 2,
+ "full": "2.2.0",
+ "string": "2.2.0",
+ "minor": 2,
+ "revision": 0
+ }
+ },
+ "u1404": {
+ "inventory_file": "inventory",
+ "group_names": [
+ "ungrouped"
+ ],
+ "groups": {
+ "ungrouped": [
+ "el6host",
+ "u1404"
+ ],
+ "all": [
+ "el6host",
+ "u1404"
+ ]
+ },
+ "inventory_hostname": "u1404",
+ "inventory_hostname_short": "u1404",
+ "playbook_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "omit": "__omit_place_holder__32a8706cee222390e0d92197fb49cc967bfafb57",
+ "inventory_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "ansible_ssh_user": "root",
+ "ansible_check_mode": false,
+ "ansible_version": {
+ "major": 2,
+ "full": "2.2.0",
+ "string": "2.2.0",
+ "minor": 2,
+ "revision": 0
+ }
+ }
+ },
+ "groups": {
+ "ungrouped": [
+ "el6host",
+ "u1404"
+ ],
+ "all": [
+ "el6host",
+ "u1404"
+ ]
+ },
+ "group_names": [
+ "ungrouped"
+ ],
+ "omit": "__omit_place_holder__32a8706cee222390e0d92197fb49cc967bfafb57",
+ "ansible_version": {
+ "major": 2,
+ "full": "2.2.0",
+ "string": "2.2.0",
+ "minor": 2,
+ "revision": 0
+ },
+ "ansible_ssh_user": "root"
+ },
+ "ansible_accelerate_port": 5099,
+ "roledir": null,
+ "ansible_ssh_extra_args": "",
+ "ansible_ssh_host": "u1404",
+ "ansible_current_hosts": [
+ "el6host"
+ ],
+ "hostvars": {
+ "el6host": {
+ "inventory_file": "inventory",
+ "group_names": [
+ "ungrouped"
+ ],
+ "groups": {
+ "ungrouped": [
+ "el6host",
+ "u1404"
+ ],
+ "all": [
+ "el6host",
+ "u1404"
+ ]
+ },
+ "inventory_hostname": "el6host",
+ "inventory_hostname_short": "el6host",
+ "playbook_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "omit": "__omit_place_holder__32a8706cee222390e0d92197fb49cc967bfafb57",
+ "inventory_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "ansible_ssh_user": "root",
+ "ansible_check_mode": false,
+ "ansible_version": {
+ "major": 2,
+ "full": "2.2.0",
+ "string": "2.2.0",
+ "minor": 2,
+ "revision": 0
+ }
+ },
+ "u1404": {
+ "inventory_file": "inventory",
+ "group_names": [
+ "ungrouped"
+ ],
+ "groups": {
+ "ungrouped": [
+ "el6host",
+ "u1404"
+ ],
+ "all": [
+ "el6host",
+ "u1404"
+ ]
+ },
+ "inventory_hostname": "u1404",
+ "inventory_hostname_short": "u1404",
+ "playbook_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "omit": "__omit_place_holder__32a8706cee222390e0d92197fb49cc967bfafb57",
+ "inventory_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "ansible_ssh_user": "root",
+ "ansible_check_mode": false,
+ "ansible_version": {
+ "major": 2,
+ "full": "2.2.0",
+ "string": "2.2.0",
+ "minor": 2,
+ "revision": 0
+ }
+ }
+ },
+ "group_names": [
+ "ungrouped"
+ ],
+ "ansible_version": {
+ "major": 2,
+ "full": "2.2.0",
+ "string": "2.2.0",
+ "minor": 2,
+ "revision": 0
+ },
+ "ansible_ssh_pipelining": false,
+ "inventory_file": "inventory",
+ "ansible_delegated_vars": {
+ "u1404": {
+ "inventory_hostname": "u1404",
+ "inventory_file": "inventory",
+ "vars": {
+ "ansible_check_mode": false,
+ "inventory_hostname": "u1404",
+ "inventory_file": "inventory",
+ "inventory_hostname_short": "u1404",
+ "playbook_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "omit": "__omit_place_holder__32a8706cee222390e0d92197fb49cc967bfafb57",
+ "inventory_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "environment": [],
+ "ansible_ssh_user": "root",
+ "ansible_play_hosts": [
+ "el6host"
+ ],
+ "groups": {
+ "ungrouped": [
+ "el6host",
+ "u1404"
+ ],
+ "all": [
+ "el6host",
+ "u1404"
+ ]
+ },
+ "group_names": [
+ "ungrouped"
+ ],
+ "play_hosts": [
+ "el6host"
+ ],
+ "ansible_version": {
+ "major": 2,
+ "full": "2.2.0",
+ "string": "2.2.0",
+ "minor": 2,
+ "revision": 0
+ },
+ "role_names": []
+ },
+ "inventory_hostname_short": "u1404",
+ "playbook_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "group_names": [
+ "ungrouped"
+ ],
+ "inventory_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "omit": "__omit_place_holder__32a8706cee222390e0d92197fb49cc967bfafb57",
+ "ansible_host": "u1404",
+ "environment": [],
+ "ansible_play_hosts": [
+ "el6host"
+ ],
+ "groups": {
+ "ungrouped": [
+ "el6host",
+ "u1404"
+ ],
+ "all": [
+ "el6host",
+ "u1404"
+ ]
+ },
+ "ansible_check_mode": false,
+ "play_hosts": [
+ "el6host"
+ ],
+ "role_names": [],
+ "ansible_port": null,
+ "ansible_version": {
+ "major": 2,
+ "full": "2.2.0",
+ "string": "2.2.0",
+ "minor": 2,
+ "revision": 0
+ },
+ "ansible_ssh_user": "root"
+ }
+ },
+ "ansible_module_compression": "ZIP_DEFLATED",
+ "ansible_failed_hosts": [],
+ "ansible_check_mode": false,
+ "groups": {
+ "ungrouped": [
+ "el6host",
+ "u1404"
+ ],
+ "all": [
+ "el6host",
+ "u1404"
+ ]
+ },
+ "ansible_host": "u1404",
+ "ansible_shell_executable": "/bin/sh",
+ "inventory_hostname_short": "el6host",
+ "omit": "__omit_place_holder__32a8706cee222390e0d92197fb49cc967bfafb57",
+ "inventory_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "playbook_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "ansible_ssh_user": "root",
+ "role_names": [],
+ "play_hosts": [
+ "el6host"
+ ],
+ "ansible_sftp_extra_args": ""
+} \ No newline at end of file
diff --git a/test/units/plugins/action/fixtures/synchronize/delegate_remote_su/task_vars_out.json b/test/units/plugins/action/fixtures/synchronize/delegate_remote_su/task_vars_out.json
new file mode 100644
index 0000000000..54707ce830
--- /dev/null
+++ b/test/units/plugins/action/fixtures/synchronize/delegate_remote_su/task_vars_out.json
@@ -0,0 +1,387 @@
+{
+ "ansible_pipelining": false,
+ "ansible_docker_extra_args": "",
+ "ansible_scp_extra_args": "",
+ "ansible_user": "root",
+ "ansible_play_hosts": [
+ "el6host"
+ ],
+ "ansible_connection": "smart",
+ "ansible_ssh_common_args": "",
+ "environment": [],
+ "inventory_hostname": "el6host",
+ "vars": {
+ "ansible_check_mode": false,
+ "inventory_hostname": "el6host",
+ "inventory_file": "inventory",
+ "ansible_delegated_vars": {
+ "u1404": {
+ "inventory_hostname": "u1404",
+ "inventory_file": "inventory",
+ "vars": {
+ "inventory_file": "inventory",
+ "role_names": [],
+ "ansible_play_hosts": [
+ "el6host"
+ ],
+ "groups": {
+ "ungrouped": [
+ "el6host",
+ "u1404"
+ ],
+ "all": [
+ "el6host",
+ "u1404"
+ ]
+ },
+ "ansible_check_mode": false,
+ "inventory_hostname": "u1404",
+ "inventory_hostname_short": "u1404",
+ "playbook_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "omit": "__omit_place_holder__32a8706cee222390e0d92197fb49cc967bfafb57",
+ "inventory_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "environment": [],
+ "ansible_ssh_user": "root",
+ "group_names": [
+ "ungrouped"
+ ],
+ "play_hosts": [
+ "el6host"
+ ],
+ "ansible_version": {
+ "major": 2,
+ "full": "2.2.0",
+ "string": "2.2.0",
+ "minor": 2,
+ "revision": 0
+ }
+ },
+ "inventory_hostname_short": "u1404",
+ "playbook_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "group_names": [
+ "ungrouped"
+ ],
+ "inventory_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "omit": "__omit_place_holder__32a8706cee222390e0d92197fb49cc967bfafb57",
+ "ansible_host": "u1404",
+ "environment": [],
+ "ansible_play_hosts": [
+ "el6host"
+ ],
+ "groups": {
+ "ungrouped": [
+ "el6host",
+ "u1404"
+ ],
+ "all": [
+ "el6host",
+ "u1404"
+ ]
+ },
+ "ansible_check_mode": false,
+ "play_hosts": [
+ "el6host"
+ ],
+ "role_names": [],
+ "ansible_port": null,
+ "ansible_version": {
+ "major": 2,
+ "full": "2.2.0",
+ "string": "2.2.0",
+ "minor": 2,
+ "revision": 0
+ },
+ "ansible_ssh_user": "root"
+ }
+ },
+ "inventory_hostname_short": "el6host",
+ "playbook_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "role_names": [],
+ "inventory_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "environment": [],
+ "play_hosts": [
+ "el6host"
+ ],
+ "ansible_play_hosts": [
+ "el6host"
+ ],
+ "hostvars": {
+ "el6host": {
+ "inventory_file": "inventory",
+ "group_names": [
+ "ungrouped"
+ ],
+ "groups": {
+ "ungrouped": [
+ "el6host",
+ "u1404",
+ "::1"
+ ],
+ "all": [
+ "el6host",
+ "u1404",
+ "::1"
+ ]
+ },
+ "inventory_hostname": "el6host",
+ "inventory_hostname_short": "el6host",
+ "playbook_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "omit": "__omit_place_holder__32a8706cee222390e0d92197fb49cc967bfafb57",
+ "inventory_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "ansible_ssh_user": "root",
+ "ansible_check_mode": false,
+ "ansible_version": {
+ "major": 2,
+ "full": "2.2.0",
+ "string": "2.2.0",
+ "minor": 2,
+ "revision": 0
+ }
+ },
+ "u1404": {
+ "inventory_file": "inventory",
+ "group_names": [
+ "ungrouped"
+ ],
+ "groups": {
+ "ungrouped": [
+ "el6host",
+ "u1404",
+ "::1"
+ ],
+ "all": [
+ "el6host",
+ "u1404",
+ "::1"
+ ]
+ },
+ "inventory_hostname": "u1404",
+ "inventory_hostname_short": "u1404",
+ "playbook_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "omit": "__omit_place_holder__32a8706cee222390e0d92197fb49cc967bfafb57",
+ "inventory_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "ansible_ssh_user": "root",
+ "ansible_check_mode": false,
+ "ansible_version": {
+ "major": 2,
+ "full": "2.2.0",
+ "string": "2.2.0",
+ "minor": 2,
+ "revision": 0
+ }
+ }
+ },
+ "groups": {
+ "ungrouped": [
+ "el6host",
+ "u1404"
+ ],
+ "all": [
+ "el6host",
+ "u1404"
+ ]
+ },
+ "group_names": [
+ "ungrouped"
+ ],
+ "omit": "__omit_place_holder__32a8706cee222390e0d92197fb49cc967bfafb57",
+ "ansible_version": {
+ "major": 2,
+ "full": "2.2.0",
+ "string": "2.2.0",
+ "minor": 2,
+ "revision": 0
+ },
+ "ansible_ssh_user": "root"
+ },
+ "ansible_accelerate_port": 5099,
+ "roledir": null,
+ "ansible_ssh_extra_args": "",
+ "ansible_ssh_host": "u1404",
+ "ansible_current_hosts": [
+ "el6host"
+ ],
+ "hostvars": {
+ "el6host": {
+ "inventory_file": "inventory",
+ "group_names": [
+ "ungrouped"
+ ],
+ "groups": {
+ "ungrouped": [
+ "el6host",
+ "u1404",
+ "::1"
+ ],
+ "all": [
+ "el6host",
+ "u1404",
+ "::1"
+ ]
+ },
+ "inventory_hostname": "el6host",
+ "inventory_hostname_short": "el6host",
+ "playbook_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "omit": "__omit_place_holder__32a8706cee222390e0d92197fb49cc967bfafb57",
+ "inventory_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "ansible_ssh_user": "root",
+ "ansible_check_mode": false,
+ "ansible_version": {
+ "major": 2,
+ "full": "2.2.0",
+ "string": "2.2.0",
+ "minor": 2,
+ "revision": 0
+ }
+ },
+ "u1404": {
+ "inventory_file": "inventory",
+ "group_names": [
+ "ungrouped"
+ ],
+ "groups": {
+ "ungrouped": [
+ "el6host",
+ "u1404",
+ "::1"
+ ],
+ "all": [
+ "el6host",
+ "u1404",
+ "::1"
+ ]
+ },
+ "inventory_hostname": "u1404",
+ "inventory_hostname_short": "u1404",
+ "playbook_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "omit": "__omit_place_holder__32a8706cee222390e0d92197fb49cc967bfafb57",
+ "inventory_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "ansible_ssh_user": "root",
+ "ansible_check_mode": false,
+ "ansible_version": {
+ "major": 2,
+ "full": "2.2.0",
+ "string": "2.2.0",
+ "minor": 2,
+ "revision": 0
+ }
+ }
+ },
+ "group_names": [
+ "ungrouped"
+ ],
+ "ansible_version": {
+ "major": 2,
+ "full": "2.2.0",
+ "string": "2.2.0",
+ "minor": 2,
+ "revision": 0
+ },
+ "ansible_ssh_pipelining": false,
+ "inventory_file": "inventory",
+ "ansible_delegated_vars": {
+ "u1404": {
+ "inventory_hostname": "u1404",
+ "inventory_file": "inventory",
+ "vars": {
+ "ansible_check_mode": false,
+ "inventory_hostname": "u1404",
+ "inventory_file": "inventory",
+ "inventory_hostname_short": "u1404",
+ "playbook_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "omit": "__omit_place_holder__32a8706cee222390e0d92197fb49cc967bfafb57",
+ "inventory_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "environment": [],
+ "ansible_ssh_user": "root",
+ "ansible_play_hosts": [
+ "el6host"
+ ],
+ "groups": {
+ "ungrouped": [
+ "el6host",
+ "u1404"
+ ],
+ "all": [
+ "el6host",
+ "u1404"
+ ]
+ },
+ "group_names": [
+ "ungrouped"
+ ],
+ "play_hosts": [
+ "el6host"
+ ],
+ "ansible_version": {
+ "major": 2,
+ "full": "2.2.0",
+ "string": "2.2.0",
+ "minor": 2,
+ "revision": 0
+ },
+ "role_names": []
+ },
+ "inventory_hostname_short": "u1404",
+ "playbook_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "group_names": [
+ "ungrouped"
+ ],
+ "inventory_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "omit": "__omit_place_holder__32a8706cee222390e0d92197fb49cc967bfafb57",
+ "ansible_host": "u1404",
+ "environment": [],
+ "ansible_play_hosts": [
+ "el6host"
+ ],
+ "groups": {
+ "ungrouped": [
+ "el6host",
+ "u1404"
+ ],
+ "all": [
+ "el6host",
+ "u1404"
+ ]
+ },
+ "ansible_check_mode": false,
+ "play_hosts": [
+ "el6host"
+ ],
+ "role_names": [],
+ "ansible_port": null,
+ "ansible_version": {
+ "major": 2,
+ "full": "2.2.0",
+ "string": "2.2.0",
+ "minor": 2,
+ "revision": 0
+ },
+ "ansible_ssh_user": "root"
+ }
+ },
+ "ansible_module_compression": "ZIP_DEFLATED",
+ "ansible_failed_hosts": [],
+ "ansible_check_mode": false,
+ "groups": {
+ "ungrouped": [
+ "el6host",
+ "u1404"
+ ],
+ "all": [
+ "el6host",
+ "u1404"
+ ]
+ },
+ "ansible_host": "u1404",
+ "ansible_shell_executable": "/bin/sh",
+ "inventory_hostname_short": "el6host",
+ "omit": "__omit_place_holder__32a8706cee222390e0d92197fb49cc967bfafb57",
+ "inventory_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "playbook_dir": "/home/jtanner/workspace/issues/AP-15905",
+ "ansible_ssh_user": "root",
+ "role_names": [],
+ "play_hosts": [
+ "el6host"
+ ],
+ "ansible_sftp_extra_args": ""
+} \ No newline at end of file
diff --git a/test/units/plugins/action/test_synchronize.py b/test/units/plugins/action/test_synchronize.py
new file mode 100644
index 0000000000..a22107d0a8
--- /dev/null
+++ b/test/units/plugins/action/test_synchronize.py
@@ -0,0 +1,248 @@
+#!/usr/bin/env python
+
+'''
+(Epdb) pprint(DeepDiff(self.final_task_vars, out_task_vars), indent=2)
+{ 'dic_item_added': set([u"root['ansible_python_interpreter']"]),
+ 'dic_item_removed': set([ u"root['hostvars']['127.0.0.1']",
+ u"root['hostvars']['::1']",
+ u"root['hostvars']['localhost']"]),
+ 'iterable_item_added': { u"root['hostvars']['el6host']['groups']['all'][1]": u'::1',
+ u"root['hostvars']['el6host']['groups']['ungrouped'][1]": u'::1',
+ u"root['vars']['hostvars']['el6host']['groups']['all'][1]": u'::1',
+ u"root['vars']['hostvars']['el6host']['groups']['ungrouped'][1]": u'::1'}}
+'''
+
+import json
+import os
+import sys
+import unittest
+import yaml
+
+from pprint import pprint
+from ansible import plugins
+import ansible.plugins
+from ansible.compat.tests.mock import patch, MagicMock
+from ansible.plugins.action.synchronize import ActionModule
+
+# Getting the incoming and outgoing task vars from the plugin's run method
+
+'''
+import copy
+safe_vars = {}
+for k,v in task_vars.iteritems():
+ if k not in ['vars', 'hostvars']:
+ safe_vars[k] = copy.deepcopy(v)
+ else:
+ sdata = str(v)
+ newv = eval(sdata)
+ safe_vars[k] = newv
+
+import json
+with open('task_vars.json', 'wb') as f:
+ f.write(json.dumps(safe_vars, indent=2))
+'''
+
+
+
+
+class TaskMock(object):
+ args = {'src': u'/tmp/deleteme',
+ 'dest': '/tmp/deleteme',
+ 'rsync_path': 'rsync'}
+ async = None
+ become = None
+ become_user = None
+ become_method = None
+
+class StdinMock(object):
+ shell = None
+
+class ConnectionMock(object):
+ ismock = True
+ _play_context = None
+ #transport = 'ssh'
+ transport = None
+ _new_stdin = StdinMock()
+
+class PlayContextMock(object):
+ shell = None
+ private_key_file = None
+ become = False
+ become_user = 'root'
+ become_method = None
+ check_mode = False
+ no_log = None
+ diff = None
+ remote_addr = None
+ remote_user = None
+ password = None
+
+class ModuleLoaderMock(object):
+ def find_plugin(self, module_name, mod_type):
+ pass
+
+class SharedLoaderMock(object):
+ module_loader = ModuleLoaderMock()
+
+class SynchronizeTester(object):
+
+ ''' A wrapper for mocking out synchronize environments '''
+
+ task = TaskMock()
+ connection = ConnectionMock()
+ _play_context = PlayContextMock()
+ loader = None
+ templar = None
+ shared_loader_obj = SharedLoaderMock()
+
+ final_task_vars = None
+ execute_called = False
+
+
+ def _execute_module(self, module_name, task_vars=None):
+ self.execute_called = True
+ self.final_task_vars = task_vars
+ return {}
+
+ def runtest(self, fixturepath='fixtures/synchronize/basic'):
+
+ metapath = os.path.join(fixturepath, 'meta.yaml')
+ with open(metapath, 'rb') as f:
+ fdata = f.read()
+ test_meta = yaml.load(fdata)
+
+ # load inital play context vars
+ if '_play_context' in test_meta:
+ if test_meta['_play_context']:
+ self.task.args = {}
+ for k,v in test_meta['_play_context'].items():
+ if v == 'None':
+ v = None
+ setattr(self._play_context, k, v)
+
+ # load inital task context vars
+ if '_task' in test_meta:
+ if test_meta['_task']:
+ self.task.args = {}
+ for k,v in test_meta['_task'].items():
+ #import epdb; epdb.st()
+ if v == 'None':
+ v = None
+ setattr(self.task, k, v)
+
+ # load inital task vars
+ if 'task_args' in test_meta:
+ if test_meta['task_args']:
+ self.task.args = {}
+ for k,v in test_meta['task_args'].items():
+ self.task.args[k] = v
+
+ # load inital task vars
+ invarspath = os.path.join(fixturepath,
+ test_meta.get('fixtures', {}).get('taskvars_in', 'taskvars_in.json'))
+ with open(invarspath, 'rb') as f:
+ fdata = f.read()
+ fdata = fdata.decode("utf-8")
+ in_task_vars = json.loads(fdata)
+
+ # load expected final task vars
+ outvarspath = os.path.join(fixturepath,
+ test_meta.get('fixtures', {}).get('taskvars_out', 'taskvars_out.json'))
+ with open(outvarspath, 'rb') as f:
+ fdata = f.read()
+ fdata = fdata.decode("utf-8")
+ out_task_vars = json.loads(fdata)
+
+ # fixup the connection
+ for k,v in test_meta['connection'].items():
+ setattr(self.connection, k, v)
+
+ # fixup the hostvars
+ if test_meta['hostvars']:
+ for k,v in test_meta['hostvars'].items():
+ in_task_vars['hostvars'][k] = v
+
+ # initalize and run the module
+ SAM = ActionModule(self.task, self.connection, self._play_context,
+ self.loader, self.templar, self.shared_loader_obj)
+ SAM._execute_module = self._execute_module
+ result = SAM.run(task_vars=in_task_vars)
+
+ # run assertions
+ for check in test_meta['asserts']:
+ value = eval(check)
+ #if not value:
+ # print(check, value)
+ # import epdb; epdb.st()
+ assert value, check
+
+
+class FakePluginLoader(object):
+ mocked = True
+
+ @staticmethod
+ def get(transport, play_context, new_stdin):
+ conn = ConnectionMock()
+ conn.transport = transport
+ conn._play_context = play_context
+ conn._new_stdin = new_stdin
+ return conn
+
+
+class TestSynchronizeAction(unittest.TestCase):
+
+
+ fixturedir = os.path.dirname(__file__)
+ fixturedir = os.path.join(fixturedir, 'fixtures', 'synchronize')
+ #print(basedir)
+
+
+ @patch('ansible.plugins.action.synchronize.connection_loader', FakePluginLoader)
+ def test_basic(self):
+ x = SynchronizeTester()
+ x.runtest(fixturepath=os.path.join(self.fixturedir,'basic'))
+
+ @patch('ansible.plugins.action.synchronize.connection_loader', FakePluginLoader)
+ def test_basic_become(self):
+ x = SynchronizeTester()
+ x.runtest(fixturepath=os.path.join(self.fixturedir,'basic_become'))
+
+ @patch('ansible.plugins.action.synchronize.connection_loader', FakePluginLoader)
+ def test_basic_become_cli(self):
+ # --become on the cli sets _play_context.become
+ x = SynchronizeTester()
+ x.runtest(fixturepath=os.path.join(self.fixturedir,'basic_become_cli'))
+
+ @patch('ansible.plugins.action.synchronize.connection_loader', FakePluginLoader)
+ def test_basic_vagrant(self):
+ # simple vagrant example
+ x = SynchronizeTester()
+ x.runtest(fixturepath=os.path.join(self.fixturedir,'basic_vagrant'))
+
+ @patch('ansible.plugins.action.synchronize.connection_loader', FakePluginLoader)
+ def test_basic_vagrant_sudo(self):
+ # vagrant plus sudo
+ x = SynchronizeTester()
+ x.runtest(fixturepath=os.path.join(self.fixturedir,'basic_vagrant_sudo'))
+
+ @patch('ansible.plugins.action.synchronize.connection_loader', FakePluginLoader)
+ def test_basic_vagrant_become_cli(self):
+ # vagrant plus sudo
+ x = SynchronizeTester()
+ x.runtest(fixturepath=os.path.join(self.fixturedir,'basic_vagrant_become_cli'))
+
+ @patch('ansible.plugins.action.synchronize.connection_loader', FakePluginLoader)
+ def test_delegate_remote(self):
+ # delegate to other remote host
+ x = SynchronizeTester()
+ x.runtest(fixturepath=os.path.join(self.fixturedir,'delegate_remote'))
+
+ @patch('ansible.plugins.action.synchronize.connection_loader', FakePluginLoader)
+ def test_delegate_remote_su(self):
+ # delegate to other remote host with su enabled
+ x = SynchronizeTester()
+ x.runtest(fixturepath=os.path.join(self.fixturedir,'delegate_remote_su'))
+
+
+if __name__ == "__main__":
+ SynchronizeTester().runtest()