chef 11.4.4 → 11.6.0.hotfix.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.md +1 -1
- data/Rakefile +18 -1
- data/bin/chef-service-manager +37 -0
- data/distro/common/html/chef-client.8.html +4 -4
- data/distro/common/html/chef-expander.8.html +4 -4
- data/distro/common/html/chef-expanderctl.8.html +4 -4
- data/distro/common/html/chef-server-webui.8.html +4 -4
- data/distro/common/html/chef-server.8.html +4 -4
- data/distro/common/html/chef-shell.1.html +4 -4
- data/distro/common/html/chef-solo.8.html +12 -18
- data/distro/common/html/chef-solr.8.html +4 -4
- data/distro/common/html/knife-bootstrap.1.html +4 -4
- data/distro/common/html/knife-client.1.html +4 -4
- data/distro/common/html/knife-configure.1.html +4 -4
- data/distro/common/html/knife-cookbook-site.1.html +4 -4
- data/distro/common/html/knife-cookbook.1.html +7 -10
- data/distro/common/html/knife-data-bag.1.html +7 -10
- data/distro/common/html/knife-environment.1.html +6 -8
- data/distro/common/html/knife-exec.1.html +4 -4
- data/distro/common/html/knife-index.1.html +4 -4
- data/distro/common/html/knife-node.1.html +4 -4
- data/distro/common/html/knife-role.1.html +4 -4
- data/distro/common/html/knife-search.1.html +4 -4
- data/distro/common/html/knife-ssh.1.html +4 -4
- data/distro/common/html/knife-status.1.html +4 -4
- data/distro/common/html/knife-tag.1.html +4 -4
- data/distro/common/html/knife.1.html +4 -4
- data/distro/common/man/man1/chef-shell.1 +1 -1
- data/distro/common/man/man1/knife-bootstrap.1 +1 -1
- data/distro/common/man/man1/knife-client.1 +1 -1
- data/distro/common/man/man1/knife-configure.1 +1 -1
- data/distro/common/man/man1/knife-cookbook-site.1 +1 -1
- data/distro/common/man/man1/knife-cookbook.1 +2 -15
- data/distro/common/man/man1/knife-data-bag.1 +2 -15
- data/distro/common/man/man1/knife-environment.1 +2 -12
- data/distro/common/man/man1/knife-exec.1 +1 -1
- data/distro/common/man/man1/knife-index.1 +1 -1
- data/distro/common/man/man1/knife-node.1 +1 -1
- data/distro/common/man/man1/knife-role.1 +1 -1
- data/distro/common/man/man1/knife-search.1 +1 -1
- data/distro/common/man/man1/knife-ssh.1 +1 -1
- data/distro/common/man/man1/knife-status.1 +1 -1
- data/distro/common/man/man1/knife-tag.1 +1 -1
- data/distro/common/man/man1/knife.1 +1 -1
- data/distro/common/man/man8/chef-client.8 +1 -1
- data/distro/common/man/man8/chef-expander.8 +1 -1
- data/distro/common/man/man8/chef-expanderctl.8 +1 -1
- data/distro/common/man/man8/chef-server-webui.8 +1 -1
- data/distro/common/man/man8/chef-server.8 +1 -1
- data/distro/common/man/man8/chef-solo.8 +4 -36
- data/distro/common/man/man8/chef-solr.8 +1 -1
- data/distro/debian/etc/init.d/chef-client +4 -2
- data/distro/windows/service_manager.rb +2 -146
- data/lib/chef.rb +1 -1
- data/lib/chef/application.rb +5 -12
- data/lib/chef/application/apply.rb +2 -0
- data/lib/chef/application/client.rb +12 -12
- data/lib/chef/application/knife.rb +2 -2
- data/lib/chef/application/solo.rb +4 -5
- data/lib/chef/application/windows_service.rb +113 -56
- data/lib/chef/application/windows_service_manager.rb +179 -0
- data/lib/chef/chef_fs.rb +2 -4
- data/lib/chef/chef_fs/chef_fs_data_store.rb +371 -0
- data/lib/chef/chef_fs/command_line.rb +145 -93
- data/lib/chef/chef_fs/config.rb +205 -0
- data/lib/chef/chef_fs/data_handler/acl_data_handler.rb +26 -0
- data/lib/chef/chef_fs/data_handler/client_data_handler.rb +38 -0
- data/lib/chef/chef_fs/data_handler/container_data_handler.rb +29 -0
- data/lib/chef/chef_fs/data_handler/cookbook_data_handler.rb +38 -0
- data/lib/chef/chef_fs/data_handler/data_bag_item_data_handler.rb +56 -0
- data/lib/chef/chef_fs/data_handler/data_handler_base.rb +128 -0
- data/lib/chef/chef_fs/data_handler/environment_data_handler.rb +40 -0
- data/lib/chef/chef_fs/data_handler/group_data_handler.rb +51 -0
- data/lib/chef/chef_fs/data_handler/node_data_handler.rb +36 -0
- data/lib/chef/chef_fs/data_handler/role_data_handler.rb +40 -0
- data/lib/chef/chef_fs/data_handler/user_data_handler.rb +27 -0
- data/lib/chef/chef_fs/file_system.rb +195 -127
- data/lib/chef/chef_fs/file_system/acl_dir.rb +64 -0
- data/lib/chef/chef_fs/file_system/acl_entry.rb +58 -0
- data/lib/chef/chef_fs/file_system/acls_dir.rb +68 -0
- data/lib/chef/chef_fs/file_system/already_exists_error.rb +31 -0
- data/lib/chef/chef_fs/file_system/base_fs_object.rb +98 -39
- data/lib/chef/chef_fs/file_system/chef_repository_file_system_cookbook_dir.rb +85 -0
- data/lib/chef/chef_fs/file_system/chef_repository_file_system_cookbook_entry.rb +71 -0
- data/lib/chef/chef_fs/file_system/chef_repository_file_system_cookbooks_dir.rb +55 -0
- data/lib/chef/chef_fs/file_system/chef_repository_file_system_data_bags_dir.rb +36 -0
- data/lib/chef/chef_fs/file_system/chef_repository_file_system_entry.rb +14 -63
- data/lib/chef/chef_fs/file_system/chef_repository_file_system_root_dir.rb +93 -3
- data/lib/chef/chef_fs/file_system/chef_server_root_dir.rb +35 -9
- data/lib/chef/chef_fs/file_system/cookbook_dir.rb +67 -32
- data/lib/chef/chef_fs/file_system/cookbook_file.rb +13 -6
- data/lib/chef/chef_fs/file_system/cookbook_frozen_error.rb +31 -0
- data/lib/chef/chef_fs/file_system/cookbooks_acl_dir.rb +41 -0
- data/lib/chef/chef_fs/file_system/cookbooks_dir.rb +102 -21
- data/lib/chef/chef_fs/file_system/data_bag_dir.rb +12 -21
- data/lib/chef/chef_fs/file_system/data_bags_dir.rb +14 -8
- data/lib/chef/chef_fs/file_system/default_environment_cannot_be_modified_error.rb +36 -0
- data/lib/chef/chef_fs/file_system/environments_dir.rb +60 -0
- data/lib/chef/chef_fs/file_system/file_system_entry.rb +8 -8
- data/lib/chef/chef_fs/file_system/file_system_error.rb +3 -1
- data/lib/chef/chef_fs/file_system/memory_dir.rb +52 -0
- data/lib/chef/chef_fs/file_system/memory_file.rb +17 -0
- data/lib/chef/chef_fs/file_system/memory_root.rb +21 -0
- data/lib/chef/chef_fs/file_system/multiplexed_dir.rb +48 -0
- data/lib/chef/chef_fs/file_system/must_delete_recursively_error.rb +2 -2
- data/lib/chef/chef_fs/file_system/nodes_dir.rb +17 -9
- data/lib/chef/chef_fs/file_system/nonexistent_fs_object.rb +0 -4
- data/lib/chef/chef_fs/file_system/not_found_error.rb +2 -2
- data/lib/chef/chef_fs/file_system/operation_failed_error.rb +34 -0
- data/lib/chef/chef_fs/file_system/operation_not_allowed_error.rb +48 -0
- data/lib/chef/chef_fs/file_system/rest_list_dir.rb +42 -13
- data/lib/chef/chef_fs/file_system/rest_list_entry.rb +81 -27
- data/lib/chef/chef_fs/knife.rb +68 -29
- data/lib/chef/chef_fs/parallelizer.rb +129 -0
- data/lib/chef/chef_fs/path_utils.rb +29 -3
- data/lib/chef/chef_fs/raw_request.rb +79 -0
- data/lib/chef/client.rb +46 -20
- data/lib/chef/config.rb +59 -61
- data/lib/chef/cookbook/chefignore.rb +2 -1
- data/lib/chef/cookbook/synchronizer.rb +8 -6
- data/lib/chef/cookbook/syntax_check.rb +17 -2
- data/lib/chef/cookbook_uploader.rb +10 -1
- data/lib/chef/cookbook_version.rb +0 -109
- data/lib/chef/data_bag.rb +15 -6
- data/lib/chef/deprecation/mixin/template.rb +49 -0
- data/lib/chef/deprecation/provider/cookbook_file.rb +55 -0
- data/lib/chef/deprecation/provider/file.rb +197 -0
- data/lib/chef/deprecation/provider/remote_file.rb +86 -0
- data/lib/chef/deprecation/provider/template.rb +63 -0
- data/lib/chef/deprecation/warnings.rb +38 -0
- data/lib/chef/encrypted_data_bag_item.rb +153 -61
- data/lib/chef/environment.rb +34 -3
- data/lib/chef/event_dispatch/base.rb +3 -0
- data/lib/chef/exceptions.rb +27 -2
- data/lib/chef/file_access_control/unix.rb +64 -7
- data/lib/chef/file_access_control/windows.rb +22 -11
- data/lib/chef/file_content_management/content_base.rb +56 -0
- data/lib/chef/file_content_management/deploy.rb +38 -0
- data/lib/chef/file_content_management/deploy/cp.rb +48 -0
- data/lib/chef/file_content_management/deploy/mv_unix.rb +77 -0
- data/lib/chef/file_content_management/deploy/mv_windows.rb +95 -0
- data/lib/chef/file_content_management/tempfile.rb +61 -0
- data/lib/chef/formatters/doc.rb +1 -1
- data/lib/chef/formatters/error_descriptor.rb +5 -4
- data/lib/chef/formatters/error_inspectors/cookbook_resolve_error_inspector.rb +23 -3
- data/lib/chef/formatters/error_inspectors/registration_error_inspector.rb +4 -0
- data/lib/chef/json_compat.rb +3 -0
- data/lib/chef/knife.rb +12 -3
- data/lib/chef/knife/bootstrap.rb +46 -2
- data/lib/chef/knife/bootstrap/archlinux-gems.erb +3 -3
- data/lib/chef/knife/bootstrap/centos5-gems.erb +3 -3
- data/lib/chef/knife/bootstrap/chef-full.erb +4 -4
- data/lib/chef/knife/bootstrap/fedora13-gems.erb +3 -3
- data/lib/chef/knife/bootstrap/ubuntu10.04-apt.erb +3 -3
- data/lib/chef/knife/bootstrap/ubuntu10.04-gems.erb +3 -3
- data/lib/chef/knife/bootstrap/ubuntu12.04-gems.erb +3 -3
- data/lib/chef/knife/client_show.rb +2 -5
- data/lib/chef/knife/configure.rb +3 -3
- data/lib/chef/knife/cookbook_create.rb +6 -5
- data/lib/chef/knife/cookbook_download.rb +13 -5
- data/lib/chef/knife/cookbook_site_share.rb +1 -0
- data/lib/chef/knife/cookbook_test.rb +1 -0
- data/lib/chef/knife/cookbook_upload.rb +4 -9
- data/lib/chef/knife/core/bootstrap_context.rb +10 -4
- data/lib/chef/knife/core/generic_presenter.rb +16 -0
- data/lib/chef/knife/core/node_editor.rb +1 -1
- data/lib/chef/knife/core/subcommand_loader.rb +43 -12
- data/lib/chef/knife/core/ui.rb +19 -4
- data/lib/chef/knife/delete.rb +76 -9
- data/lib/chef/knife/deps.rb +139 -0
- data/lib/chef/knife/diff.rb +22 -5
- data/lib/chef/knife/download.rb +16 -3
- data/lib/chef/knife/edit.rb +76 -0
- data/lib/chef/knife/environment_show.rb +2 -7
- data/lib/chef/knife/list.rb +91 -47
- data/lib/chef/knife/node_run_list_set.rb +66 -0
- data/lib/chef/knife/node_show.rb +1 -7
- data/lib/chef/knife/raw.rb +20 -64
- data/lib/chef/knife/role_show.rb +2 -4
- data/lib/chef/knife/search.rb +5 -6
- data/lib/chef/knife/show.rb +34 -11
- data/lib/chef/knife/ssh.rb +8 -0
- data/lib/chef/knife/upload.rb +23 -4
- data/lib/chef/knife/user_show.rb +2 -5
- data/lib/chef/knife/xargs.rb +265 -0
- data/lib/chef/log.rb +2 -2
- data/lib/chef/mixin/file_class.rb +0 -9
- data/lib/chef/mixin/language_include_recipe.rb +1 -1
- data/lib/chef/mixin/params_validate.rb +19 -9
- data/lib/chef/mixin/template.rb +126 -36
- data/lib/chef/mixin/windows_architecture_helper.rb +91 -0
- data/lib/chef/monkey_patches/file.rb +26 -0
- data/lib/chef/monkey_patches/net-ssh-multi.rb +140 -0
- data/lib/chef/monkey_patches/securerandom.rb +44 -0
- data/lib/chef/monologger.rb +93 -0
- data/lib/chef/node.rb +4 -0
- data/lib/chef/platform.rb +4 -490
- data/lib/chef/platform/provider_mapping.rb +529 -0
- data/lib/chef/{monkey_patches/dir.rb → platform/query_helpers.rb} +25 -19
- data/lib/chef/provider.rb +12 -9
- data/lib/chef/provider/batch.rb +35 -0
- data/lib/chef/provider/cookbook_file.rb +9 -78
- data/lib/chef/provider/cookbook_file/content.rb +49 -0
- data/lib/chef/provider/deploy.rb +24 -20
- data/lib/chef/provider/deploy/revision.rb +27 -0
- data/lib/chef/provider/directory.rb +19 -22
- data/lib/chef/provider/execute.rb +22 -5
- data/lib/chef/provider/file.rb +299 -217
- data/lib/chef/provider/file/content.rb +39 -0
- data/lib/chef/provider/git.rb +76 -43
- data/lib/chef/provider/group/usermod.rb +2 -2
- data/lib/chef/provider/ifconfig.rb +25 -35
- data/lib/chef/provider/ifconfig/debian.rb +71 -0
- data/lib/chef/provider/ifconfig/redhat.rb +47 -0
- data/lib/chef/provider/link.rb +10 -3
- data/lib/chef/provider/mount.rb +1 -1
- data/lib/chef/provider/mount/mount.rb +8 -3
- data/lib/chef/provider/mount/windows.rb +4 -1
- data/lib/chef/provider/package/portage.rb +9 -4
- data/lib/chef/provider/package/rubygems.rb +45 -10
- data/lib/chef/provider/package/smartos.rb +47 -36
- data/lib/chef/provider/package/yum.rb +19 -12
- data/lib/chef/provider/package/zypper.rb +45 -55
- data/lib/chef/provider/powershell_script.rb +77 -0
- data/lib/chef/provider/remote_directory.rb +5 -6
- data/lib/chef/provider/remote_file.rb +12 -108
- data/lib/chef/provider/remote_file/cache_control_data.rb +165 -0
- data/lib/chef/provider/remote_file/content.rb +75 -0
- data/lib/chef/provider/remote_file/fetcher.rb +43 -0
- data/lib/chef/provider/remote_file/ftp.rb +183 -0
- data/lib/chef/provider/remote_file/http.rb +124 -0
- data/lib/chef/provider/remote_file/local_file.rb +47 -0
- data/lib/chef/provider/route.rb +6 -2
- data/lib/chef/provider/script.rb +14 -2
- data/lib/chef/provider/service/macosx.rb +16 -10
- data/lib/chef/provider/service/solaris.rb +6 -5
- data/lib/chef/provider/template.rb +16 -78
- data/lib/chef/provider/template/content.rb +61 -0
- data/lib/chef/provider/user/solaris.rb +90 -0
- data/lib/chef/provider/user/useradd.rb +76 -63
- data/lib/chef/provider/windows_script.rb +73 -0
- data/lib/chef/providers.rb +16 -0
- data/lib/chef/resource.rb +23 -2
- data/lib/chef/resource/batch.rb +31 -0
- data/lib/chef/resource/conditional.rb +4 -0
- data/lib/chef/resource/conditional_action_not_nothing.rb +48 -0
- data/lib/chef/resource/file.rb +31 -3
- data/lib/chef/resource/link.rb +17 -0
- data/lib/chef/resource/lwrp_base.rb +1 -1
- data/lib/chef/resource/mount.rb +29 -2
- data/lib/chef/resource/powershell_script.rb +31 -0
- data/lib/chef/resource/remote_file.rb +47 -1
- data/lib/chef/resource/route.rb +1 -1
- data/lib/chef/resource/template.rb +145 -0
- data/lib/chef/resource/windows_script.rb +62 -0
- data/lib/chef/resource_collection.rb +45 -11
- data/lib/chef/resource_reporter.rb +81 -52
- data/lib/chef/resources.rb +2 -0
- data/lib/chef/rest.rb +13 -4
- data/lib/chef/rest/rest_request.rb +5 -1
- data/lib/chef/run_context/cookbook_compiler.rb +3 -3
- data/lib/chef/run_list/run_list_expansion.rb +1 -1
- data/lib/chef/run_lock.rb +7 -1
- data/lib/chef/runner.rb +0 -1
- data/lib/chef/scan_access_control.rb +6 -1
- data/lib/chef/search/query.rb +2 -2
- data/lib/chef/shell/shell_session.rb +2 -2
- data/lib/chef/util/backup.rb +84 -0
- data/lib/chef/util/diff.rb +145 -0
- data/lib/chef/util/file_edit.rb +1 -1
- data/lib/chef/util/selinux.rb +100 -0
- data/lib/chef/util/windows/net_user.rb +14 -1
- data/lib/chef/util/windows/volume.rb +2 -2
- data/lib/chef/version.rb +1 -1
- data/lib/chef/version/platform.rb +42 -0
- data/lib/chef/version_class.rb +1 -1
- data/lib/chef/version_constraint.rb +6 -5
- data/lib/chef/version_constraint/platform.rb +26 -0
- data/lib/chef/win32/api/file.rb +8 -2
- data/lib/chef/win32/version.rb +25 -8
- data/spec/data/apt/chef-integration-test-1.0/debian/changelog +5 -0
- data/spec/data/apt/chef-integration-test-1.0/debian/compat +1 -0
- data/spec/data/apt/chef-integration-test-1.0/debian/control +13 -0
- data/spec/data/apt/chef-integration-test-1.0/debian/copyright +34 -0
- data/spec/data/apt/chef-integration-test-1.0/debian/files +1 -0
- data/spec/data/apt/chef-integration-test-1.0/debian/rules +13 -0
- data/spec/data/apt/chef-integration-test-1.0/debian/source/format +1 -0
- data/spec/data/apt/chef-integration-test-1.1/debian/changelog +11 -0
- data/spec/data/apt/chef-integration-test-1.1/debian/compat +1 -0
- data/spec/data/apt/chef-integration-test-1.1/debian/control +13 -0
- data/spec/data/apt/chef-integration-test-1.1/debian/copyright +34 -0
- data/spec/data/apt/chef-integration-test-1.1/debian/files +1 -0
- data/spec/data/apt/chef-integration-test-1.1/debian/rules +13 -0
- data/spec/data/apt/chef-integration-test-1.1/debian/source/format +1 -0
- data/spec/data/apt/chef-integration-test_1.0-1_amd64.changes +22 -0
- data/spec/data/apt/chef-integration-test_1.0-1_amd64.deb +0 -0
- data/spec/data/apt/chef-integration-test_1.0.orig.tar.gz +0 -0
- data/spec/data/apt/chef-integration-test_1.1-1_amd64.changes +22 -0
- data/spec/data/apt/chef-integration-test_1.1-1_amd64.deb +0 -0
- data/spec/data/apt/chef-integration-test_1.1.orig.tar.gz +0 -0
- data/spec/data/apt/var/www/apt/conf/distributions +7 -0
- data/spec/data/apt/var/www/apt/conf/incoming +4 -0
- data/spec/data/apt/var/www/apt/conf/pulls +3 -0
- data/spec/data/apt/var/www/apt/db/checksums.db +0 -0
- data/spec/data/apt/var/www/apt/db/contents.cache.db +0 -0
- data/spec/data/apt/var/www/apt/db/packages.db +0 -0
- data/spec/data/apt/var/www/apt/db/references.db +0 -0
- data/spec/data/apt/var/www/apt/db/release.caches.db +0 -0
- data/spec/data/apt/var/www/apt/db/version +4 -0
- data/spec/data/apt/var/www/apt/dists/sid/Release +19 -0
- data/spec/data/apt/var/www/apt/dists/sid/main/binary-amd64/Packages +16 -0
- data/spec/data/apt/var/www/apt/dists/sid/main/binary-amd64/Packages.gz +0 -0
- data/spec/data/apt/var/www/apt/dists/sid/main/binary-amd64/Release +5 -0
- data/spec/data/apt/var/www/apt/dists/sid/main/binary-i386/Packages +0 -0
- data/spec/data/apt/var/www/apt/pool/main/c/chef-integration-test/chef-integration-test_1.0-1_amd64.deb +0 -0
- data/spec/data/apt/var/www/apt/pool/main/c/chef-integration-test/chef-integration-test_1.1-1_amd64.deb +0 -0
- data/spec/data/bootstrap/encrypted_data_bag_secret +1 -0
- data/spec/data/bootstrap/secret.erb +9 -0
- data/spec/data/cookbooks/ignorken/recipes/default.rb +1 -0
- data/spec/data/cookbooks/ignorken/recipes/ignoreme.rb +2 -0
- data/spec/data/cookbooks/openldap/files/default/.dotfile +1 -0
- data/spec/data/cookbooks/openldap/files/default/.ssh/id_rsa +1 -0
- data/spec/data/cookbooks/openldap/files/default/remotedir/.a_dotdir/.a_dotfile_in_a_dotdir +1 -0
- data/spec/data/cookbooks/openldap/files/default/remotedir/remotesubdir/.a_dotfile +1 -0
- data/spec/data/cookbooks/openldap/templates/default/all_windows_line_endings.erb +4 -0
- data/spec/data/cookbooks/openldap/templates/default/helper_test.erb +1 -0
- data/spec/data/cookbooks/openldap/templates/default/helpers_via_partial_test.erb +1 -0
- data/spec/data/cookbooks/openldap/templates/default/no_windows_line_endings.erb +4 -0
- data/spec/data/cookbooks/openldap/templates/default/some_windows_line_endings.erb +4 -0
- data/spec/data/cookbooks/preseed/files/default/preseed-file.seed +1 -0
- data/spec/data/cookbooks/preseed/templates/default/preseed-template.seed +1 -0
- data/spec/data/file-providers-method-snapshot-chef-11-4.json +127 -0
- data/spec/data/git_bundles/example-repo.gitbundle +0 -0
- data/spec/data/knife-home/.chef/plugins/knife/example_home_subcommand.rb +0 -0
- data/spec/data/knife_subcommand/test_yourself.rb +8 -0
- data/spec/data/null_config.rb +1 -0
- data/spec/data/partial_one.erb +1 -1
- data/spec/data/remote_file/nyan_cat.png.gz +0 -0
- data/spec/functional/file_content_management/deploy_strategies_spec.rb +238 -0
- data/spec/functional/knife/exec_spec.rb +2 -2
- data/spec/functional/provider/remote_file/cache_control_data_spec.rb +101 -0
- data/spec/functional/resource/batch_spec.rb +64 -0
- data/spec/functional/resource/cookbook_file_spec.rb +2 -3
- data/spec/functional/resource/deploy_revision_spec.rb +180 -0
- data/spec/functional/resource/directory_spec.rb +2 -2
- data/spec/functional/resource/file_spec.rb +17 -1
- data/spec/functional/resource/git_spec.rb +259 -0
- data/spec/functional/resource/link_spec.rb +422 -388
- data/spec/functional/resource/package_spec.rb +297 -0
- data/spec/functional/resource/powershell_spec.rb +188 -0
- data/spec/functional/resource/registry_spec.rb +8 -4
- data/spec/functional/resource/remote_directory_spec.rb +2 -2
- data/spec/functional/resource/remote_file_spec.rb +97 -29
- data/spec/functional/resource/template_spec.rb +173 -17
- data/spec/functional/resource/user_spec.rb +547 -0
- data/spec/functional/run_lock_spec.rb +5 -0
- data/spec/functional/shell_spec.rb +2 -1
- data/spec/functional/win32/service_manager_spec.rb +269 -0
- data/spec/functional/win32/versions_spec.rb +78 -0
- data/spec/integration/knife/chef_repo_path_spec.rb +805 -0
- data/spec/integration/knife/chef_repository_file_system_spec.rb +276 -0
- data/spec/integration/knife/chefignore_spec.rb +271 -0
- data/spec/integration/knife/delete_spec.rb +944 -0
- data/spec/integration/knife/deps_spec.rb +648 -0
- data/spec/integration/knife/diff_spec.rb +536 -0
- data/spec/integration/knife/download_spec.rb +962 -0
- data/spec/integration/knife/list_spec.rb +633 -0
- data/spec/integration/knife/raw_spec.rb +166 -0
- data/spec/integration/knife/redirection_spec.rb +57 -0
- data/spec/integration/knife/show_spec.rb +158 -0
- data/spec/integration/knife/upload_spec.rb +1060 -0
- data/spec/integration/solo/solo_spec.rb +41 -0
- data/spec/spec_helper.rb +55 -1
- data/spec/support/chef_helpers.rb +32 -0
- data/spec/support/platform_helpers.rb +40 -0
- data/spec/support/platforms/win32/spec_service.rb +59 -0
- data/spec/support/shared/functional/directory_resource.rb +43 -16
- data/spec/support/shared/functional/file_resource.rb +661 -20
- data/spec/support/shared/functional/securable_resource.rb +109 -8
- data/spec/support/shared/functional/securable_resource_with_reporting.rb +39 -31
- data/spec/support/shared/integration/integration_helper.rb +166 -0
- data/spec/support/shared/integration/knife_support.rb +171 -0
- data/spec/support/shared/unit/execute_resource.rb +125 -0
- data/spec/support/shared/unit/file_system_support.rb +8 -48
- data/spec/support/shared/unit/provider/file.rb +609 -0
- data/spec/support/shared/unit/provider/useradd_based_user_provider.rb +407 -0
- data/spec/support/shared/unit/script_resource.rb +52 -0
- data/spec/support/shared/unit/windows_script_resource.rb +48 -0
- data/spec/tiny_server.rb +13 -11
- data/spec/unit/application/client_spec.rb +39 -1
- data/spec/unit/application/knife_spec.rb +12 -0
- data/spec/unit/application/solo_spec.rb +1 -1
- data/spec/unit/application_spec.rb +57 -2
- data/spec/unit/chef_fs/diff_spec.rb +30 -31
- data/spec/unit/chef_fs/file_pattern_spec.rb +2 -2
- data/spec/unit/chef_fs/file_system_spec.rb +2 -3
- data/spec/unit/client_spec.rb +20 -1
- data/spec/unit/config_spec.rb +70 -52
- data/spec/unit/cookbook/synchronizer_spec.rb +49 -1
- data/spec/unit/cookbook/syntax_check_spec.rb +28 -3
- data/spec/unit/cookbook_loader_spec.rb +3 -2
- data/spec/unit/daemon_spec.rb +7 -7
- data/spec/unit/data_bag_spec.rb +7 -0
- data/spec/unit/deprecation_spec.rb +86 -0
- data/spec/unit/encrypted_data_bag_item_spec.rb +183 -88
- data/spec/unit/environment_spec.rb +98 -0
- data/spec/unit/exceptions_spec.rb +6 -1
- data/spec/unit/file_access_control_spec.rb +21 -1
- data/spec/unit/file_content_management/deploy/cp_spec.rb +46 -0
- data/spec/unit/file_content_management/deploy/mv_unix_spec.rb +103 -0
- data/spec/unit/file_content_management/deploy/mv_windows_spec.rb +179 -0
- data/spec/unit/formatters/error_inspectors/cookbook_resolve_error_inspector_spec.rb +38 -2
- data/spec/unit/formatters/error_inspectors/resource_failure_inspector_spec.rb +3 -2
- data/spec/unit/knife/bootstrap_spec.rb +128 -29
- data/spec/unit/knife/configure_spec.rb +42 -26
- data/spec/unit/knife/cookbook_download_spec.rb +24 -3
- data/spec/unit/knife/cookbook_upload_spec.rb +8 -4
- data/spec/unit/knife/core/bootstrap_context_spec.rb +78 -61
- data/spec/unit/knife/core/subcommand_loader_spec.rb +20 -0
- data/spec/unit/knife/core/ui_spec.rb +41 -0
- data/spec/unit/knife/node_run_list_set_spec.rb +140 -0
- data/spec/unit/knife_spec.rb +21 -0
- data/spec/unit/mixin/enforce_ownership_and_permissions_spec.rb +1 -0
- data/spec/unit/mixin/params_validate_spec.rb +35 -0
- data/spec/unit/mixin/template_spec.rb +69 -57
- data/spec/unit/mixin/windows_architecture_helper_spec.rb +83 -0
- data/spec/unit/node_spec.rb +7 -0
- data/spec/unit/platform_spec.rb +15 -1
- data/spec/unit/provider/cookbook_file/content_spec.rb +40 -0
- data/spec/unit/provider/cookbook_file_spec.rb +26 -183
- data/spec/unit/provider/cron/solaris_spec.rb +1 -1
- data/spec/unit/provider/deploy/revision_spec.rb +19 -11
- data/spec/unit/provider/deploy_spec.rb +2 -2
- data/spec/unit/provider/directory_spec.rb +23 -23
- data/spec/unit/provider/execute_spec.rb +27 -1
- data/spec/unit/provider/file/content_spec.rb +101 -0
- data/spec/unit/provider/file_spec.rb +25 -484
- data/spec/unit/provider/git_spec.rb +224 -28
- data/spec/unit/provider/group/usermod_spec.rb +3 -1
- data/spec/unit/provider/ifconfig/debian_spec.rb +89 -0
- data/spec/unit/provider/ifconfig/redhat_spec.rb +71 -0
- data/spec/unit/provider/ifconfig_spec.rb +0 -33
- data/spec/unit/provider/mount/mount_spec.rb +33 -2
- data/spec/unit/provider/mount/windows_spec.rb +4 -1
- data/spec/unit/provider/mount_spec.rb +16 -6
- data/spec/unit/provider/package/portage_spec.rb +44 -0
- data/spec/unit/provider/package/rubygems_spec.rb +44 -1
- data/spec/unit/provider/package/smartos_spec.rb +3 -2
- data/spec/unit/provider/package/yum_spec.rb +36 -39
- data/spec/unit/provider/package/zypper_spec.rb +84 -22
- data/spec/unit/provider/package_spec.rb +0 -4
- data/spec/unit/provider/powershell_spec.rb +38 -0
- data/spec/unit/provider/remote_directory_spec.rb +0 -4
- data/spec/unit/provider/remote_file/cache_control_data_spec.rb +211 -0
- data/spec/unit/provider/remote_file/content_spec.rb +230 -0
- data/spec/unit/provider/remote_file/fetcher_spec.rb +75 -0
- data/spec/unit/provider/remote_file/ftp_spec.rb +224 -0
- data/spec/unit/provider/remote_file/http_spec.rb +319 -0
- data/spec/unit/provider/remote_file/local_file_spec.rb +60 -0
- data/spec/unit/provider/remote_file_spec.rb +33 -295
- data/spec/unit/provider/route_spec.rb +25 -9
- data/spec/unit/provider/service/macosx_spec.rb +176 -152
- data/spec/unit/provider/service/solaris_smf_service_spec.rb +21 -18
- data/spec/unit/provider/service/systemd_service_spec.rb +2 -2
- data/spec/unit/provider/service/upstart_service_spec.rb +2 -2
- data/spec/unit/provider/service_spec.rb +3 -3
- data/spec/unit/provider/template/content_spec.rb +78 -0
- data/spec/unit/provider/template_spec.rb +52 -184
- data/spec/unit/provider/user/solaris_spec.rb +80 -0
- data/spec/unit/provider/user/useradd_spec.rb +12 -358
- data/spec/unit/resource/batch_spec.rb +48 -0
- data/spec/unit/resource/conditional_action_not_nothing_spec.rb +45 -0
- data/spec/unit/resource/execute_spec.rb +3 -101
- data/spec/unit/resource/file_spec.rb +0 -5
- data/spec/unit/resource/group_spec.rb +9 -0
- data/spec/unit/resource/ifconfig_spec.rb +60 -1
- data/spec/unit/resource/link_spec.rb +1 -0
- data/spec/unit/resource/mount_spec.rb +37 -0
- data/spec/unit/resource/powershell_spec.rb +48 -0
- data/spec/unit/resource/remote_file_spec.rb +44 -4
- data/spec/unit/resource/route_spec.rb +1 -1
- data/spec/unit/resource/script_spec.rb +13 -36
- data/spec/unit/resource/template_spec.rb +111 -8
- data/spec/unit/resource/user_spec.rb +7 -0
- data/spec/unit/resource_collection_spec.rb +61 -32
- data/spec/unit/resource_reporter_spec.rb +115 -102
- data/spec/unit/resource_spec.rb +170 -1
- data/spec/unit/rest/auth_credentials_spec.rb +2 -2
- data/spec/unit/rest_spec.rb +6 -2
- data/spec/unit/run_context/cookbook_compiler_spec.rb +9 -0
- data/spec/unit/runner_spec.rb +1 -1
- data/spec/unit/scan_access_control_spec.rb +4 -2
- data/spec/unit/shell/shell_session_spec.rb +15 -2
- data/spec/unit/util/backup_spec.rb +149 -0
- data/spec/unit/util/diff_spec.rb +596 -0
- data/spec/unit/util/selinux_spec.rb +172 -0
- data/spec/unit/version/platform_spec.rb +61 -0
- data/spec/unit/version_constraint/platform_spec.rb +46 -0
- data/spec/unit/version_constraint_spec.rb +5 -0
- metadata +233 -10
- data/lib/chef/chef_fs/file_system/data_bag_item.rb +0 -59
- data/spec/unit/chef_fs/file_system/chef_server_root_dir_spec.rb +0 -237
- data/spec/unit/chef_fs/file_system/cookbooks_dir_spec.rb +0 -568
- data/spec/unit/chef_fs/file_system/data_bags_dir_spec.rb +0 -220
|
@@ -50,7 +50,7 @@ describe Chef::Provider::Package::Zypper do
|
|
|
50
50
|
end
|
|
51
51
|
|
|
52
52
|
it "should run zypper info with the package name" do
|
|
53
|
-
@provider.should_receive(:popen4).with("zypper info #{@new_resource.package_name}").and_return(@status)
|
|
53
|
+
@provider.should_receive(:popen4).with("zypper --non-interactive info #{@new_resource.package_name}").and_return(@status)
|
|
54
54
|
@provider.load_current_resource
|
|
55
55
|
end
|
|
56
56
|
|
|
@@ -92,34 +92,99 @@ describe Chef::Provider::Package::Zypper do
|
|
|
92
92
|
|
|
93
93
|
describe "install_package" do
|
|
94
94
|
it "should run zypper install with the package name and version" do
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
95
|
+
Chef::Config.stub(:[]).with(:zypper_check_gpg).and_return(true)
|
|
96
|
+
@provider.should_receive(:shell_out!).with(
|
|
97
|
+
"zypper --non-interactive install --auto-agree-with-licenses emacs=1.0")
|
|
98
|
+
@provider.install_package("emacs", "1.0")
|
|
99
|
+
end
|
|
100
|
+
it "should run zypper install without gpg checks" do
|
|
101
|
+
Chef::Config.stub(:[]).with(:zypper_check_gpg).and_return(false)
|
|
102
|
+
@provider.should_receive(:shell_out!).with(
|
|
103
|
+
"zypper --non-interactive --no-gpg-checks install "+
|
|
104
|
+
"--auto-agree-with-licenses emacs=1.0")
|
|
105
|
+
@provider.install_package("emacs", "1.0")
|
|
106
|
+
end
|
|
107
|
+
it "should warn about gpg checks on zypper install" do
|
|
108
|
+
Chef::Log.should_receive(:warn).with(
|
|
109
|
+
/All packages will be installed without gpg signature checks/)
|
|
110
|
+
@provider.should_receive(:shell_out!).with(
|
|
111
|
+
"zypper --non-interactive --no-gpg-checks install "+
|
|
112
|
+
"--auto-agree-with-licenses emacs=1.0")
|
|
98
113
|
@provider.install_package("emacs", "1.0")
|
|
99
114
|
end
|
|
100
115
|
end
|
|
101
116
|
|
|
102
117
|
describe "upgrade_package" do
|
|
103
118
|
it "should run zypper update with the package name and version" do
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
119
|
+
Chef::Config.stub(:[]).with(:zypper_check_gpg).and_return(true)
|
|
120
|
+
@provider.should_receive(:shell_out!).with(
|
|
121
|
+
"zypper --non-interactive install --auto-agree-with-licenses emacs=1.0")
|
|
122
|
+
@provider.upgrade_package("emacs", "1.0")
|
|
123
|
+
end
|
|
124
|
+
it "should run zypper update without gpg checks" do
|
|
125
|
+
Chef::Config.stub(:[]).with(:zypper_check_gpg).and_return(false)
|
|
126
|
+
@provider.should_receive(:shell_out!).with(
|
|
127
|
+
"zypper --non-interactive --no-gpg-checks install "+
|
|
128
|
+
"--auto-agree-with-licenses emacs=1.0")
|
|
129
|
+
@provider.upgrade_package("emacs", "1.0")
|
|
130
|
+
end
|
|
131
|
+
it "should warn about gpg checks on zypper upgrade" do
|
|
132
|
+
Chef::Log.should_receive(:warn).with(
|
|
133
|
+
/All packages will be installed without gpg signature checks/)
|
|
134
|
+
@provider.should_receive(:shell_out!).with(
|
|
135
|
+
"zypper --non-interactive --no-gpg-checks install "+
|
|
136
|
+
"--auto-agree-with-licenses emacs=1.0")
|
|
137
|
+
@provider.upgrade_package("emacs", "1.0")
|
|
138
|
+
end
|
|
139
|
+
it "should run zypper upgrade without gpg checks" do
|
|
140
|
+
@provider.should_receive(:shell_out!).with(
|
|
141
|
+
"zypper --non-interactive --no-gpg-checks install "+
|
|
142
|
+
"--auto-agree-with-licenses emacs=1.0")
|
|
143
|
+
|
|
107
144
|
@provider.upgrade_package("emacs", "1.0")
|
|
108
145
|
end
|
|
109
146
|
end
|
|
110
147
|
|
|
111
148
|
describe "remove_package" do
|
|
112
149
|
it "should run zypper remove with the package name" do
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
150
|
+
Chef::Config.stub(:[]).with(:zypper_check_gpg).and_return(true)
|
|
151
|
+
@provider.should_receive(:shell_out!).with(
|
|
152
|
+
"zypper --non-interactive remove emacs=1.0")
|
|
153
|
+
@provider.remove_package("emacs", "1.0")
|
|
154
|
+
end
|
|
155
|
+
it "should run zypper remove without gpg checks" do
|
|
156
|
+
Chef::Config.stub(:[]).with(:zypper_check_gpg).and_return(false)
|
|
157
|
+
@provider.should_receive(:shell_out!).with(
|
|
158
|
+
"zypper --non-interactive --no-gpg-checks remove emacs=1.0")
|
|
159
|
+
@provider.remove_package("emacs", "1.0")
|
|
160
|
+
end
|
|
161
|
+
it "should warn about gpg checks on zypper remove" do
|
|
162
|
+
Chef::Log.should_receive(:warn).with(
|
|
163
|
+
/All packages will be installed without gpg signature checks/)
|
|
164
|
+
@provider.should_receive(:shell_out!).with(
|
|
165
|
+
"zypper --non-interactive --no-gpg-checks remove emacs=1.0")
|
|
166
|
+
|
|
116
167
|
@provider.remove_package("emacs", "1.0")
|
|
117
168
|
end
|
|
118
169
|
end
|
|
119
170
|
|
|
120
171
|
describe "purge_package" do
|
|
121
172
|
it "should run remove_package with the name and version" do
|
|
122
|
-
@provider.should_receive(:
|
|
173
|
+
@provider.should_receive(:shell_out!).with(
|
|
174
|
+
"zypper --non-interactive --no-gpg-checks remove --clean-deps emacs=1.0")
|
|
175
|
+
@provider.purge_package("emacs", "1.0")
|
|
176
|
+
end
|
|
177
|
+
it "should run zypper purge without gpg checks" do
|
|
178
|
+
Chef::Config.stub(:[]).with(:zypper_check_gpg).and_return(false)
|
|
179
|
+
@provider.should_receive(:shell_out!).with(
|
|
180
|
+
"zypper --non-interactive --no-gpg-checks remove --clean-deps emacs=1.0")
|
|
181
|
+
@provider.purge_package("emacs", "1.0")
|
|
182
|
+
end
|
|
183
|
+
it "should warn about gpg checks on zypper purge" do
|
|
184
|
+
Chef::Log.should_receive(:warn).with(
|
|
185
|
+
/All packages will be installed without gpg signature checks/)
|
|
186
|
+
@provider.should_receive(:shell_out!).with(
|
|
187
|
+
"zypper --non-interactive --no-gpg-checks remove --clean-deps emacs=1.0")
|
|
123
188
|
@provider.purge_package("emacs", "1.0")
|
|
124
189
|
end
|
|
125
190
|
end
|
|
@@ -131,27 +196,24 @@ describe Chef::Provider::Package::Zypper do
|
|
|
131
196
|
|
|
132
197
|
describe "install_package" do
|
|
133
198
|
it "should run zypper install with the package name and version" do
|
|
134
|
-
@provider.should_receive(:
|
|
135
|
-
|
|
136
|
-
})
|
|
199
|
+
@provider.should_receive(:shell_out!).with(
|
|
200
|
+
"zypper --no-gpg-checks install --auto-agree-with-licenses -y emacs")
|
|
137
201
|
@provider.install_package("emacs", "1.0")
|
|
138
202
|
end
|
|
139
203
|
end
|
|
140
|
-
|
|
204
|
+
|
|
141
205
|
describe "upgrade_package" do
|
|
142
206
|
it "should run zypper update with the package name and version" do
|
|
143
|
-
@provider.should_receive(:
|
|
144
|
-
|
|
145
|
-
})
|
|
207
|
+
@provider.should_receive(:shell_out!).with(
|
|
208
|
+
"zypper --no-gpg-checks install --auto-agree-with-licenses -y emacs")
|
|
146
209
|
@provider.upgrade_package("emacs", "1.0")
|
|
147
210
|
end
|
|
148
211
|
end
|
|
149
|
-
|
|
212
|
+
|
|
150
213
|
describe "remove_package" do
|
|
151
214
|
it "should run zypper remove with the package name" do
|
|
152
|
-
@provider.should_receive(:
|
|
153
|
-
|
|
154
|
-
})
|
|
215
|
+
@provider.should_receive(:shell_out!).with(
|
|
216
|
+
"zypper --no-gpg-checks remove -y emacs")
|
|
155
217
|
@provider.remove_package("emacs", "1.0")
|
|
156
218
|
end
|
|
157
219
|
end
|
|
@@ -20,10 +20,6 @@ require 'spec_helper'
|
|
|
20
20
|
|
|
21
21
|
describe Chef::Provider::Package do
|
|
22
22
|
before do
|
|
23
|
-
#Terrible, but we need to implement a pseduo-filesystem for testing
|
|
24
|
-
#to not have this line. Only affects updating state fields.
|
|
25
|
-
Chef::Provider::CookbookFile.any_instance.stub(:update_new_file_state)
|
|
26
|
-
|
|
27
23
|
@node = Chef::Node.new
|
|
28
24
|
@events = Chef::EventDispatch::Dispatcher.new
|
|
29
25
|
@run_context = Chef::RunContext.new(@node, {}, @events)
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Author:: Adam Edwards (<adamed@opscode.com>)
|
|
3
|
+
# Copyright:: Copyright (c) 2013 Opscode, Inc.
|
|
4
|
+
# License:: Apache License, Version 2.0
|
|
5
|
+
#
|
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
7
|
+
# you may not use this file except in compliance with the License.
|
|
8
|
+
# You may obtain a copy of the License at
|
|
9
|
+
#
|
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
11
|
+
#
|
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
15
|
+
# See the License for the specific language governing permissions and
|
|
16
|
+
# limitations under the License.
|
|
17
|
+
#
|
|
18
|
+
|
|
19
|
+
require 'spec_helper'
|
|
20
|
+
describe Chef::Provider::PowershellScript, "action_run" do
|
|
21
|
+
|
|
22
|
+
before(:each) do
|
|
23
|
+
@node = Chef::Node.new
|
|
24
|
+
|
|
25
|
+
@node.default["kernel"] = Hash.new
|
|
26
|
+
@node.default["kernel"][:machine] = :x86_64.to_s
|
|
27
|
+
|
|
28
|
+
@run_context = Chef::RunContext.new(@node, {}, @events)
|
|
29
|
+
@new_resource = Chef::Resource::PowershellScript.new('run some powershell code', @run_context)
|
|
30
|
+
|
|
31
|
+
@provider = Chef::Provider::PowershellScript.new(@new_resource, @run_context)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
it "should set the -File flag as the last flag" do
|
|
35
|
+
@provider.flags.split(' ').pop.should == "-File"
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
end
|
|
@@ -28,9 +28,6 @@ end
|
|
|
28
28
|
describe Chef::Provider::RemoteDirectory do
|
|
29
29
|
before do
|
|
30
30
|
Chef::FileAccessControl.any_instance.stub(:set_all)
|
|
31
|
-
#Terrible, but we need to implement a pseduo-filesystem for testing
|
|
32
|
-
#to not have this line. Only affects updating state fields.
|
|
33
|
-
Chef::Provider::CookbookFile.any_instance.stub(:update_new_file_state)
|
|
34
31
|
|
|
35
32
|
@resource = Chef::Resource::RemoteDirectory.new(File.join(Dir.tmpdir, "tafty"))
|
|
36
33
|
# in CHEF_SPEC_DATA/cookbooks/openldap/files/default/remotedir
|
|
@@ -214,7 +211,6 @@ describe Chef::Provider::RemoteDirectory do
|
|
|
214
211
|
::File.open(@destination_dir + '/remotesubdir/remote_subdir_file1.txt', 'a') {|f| f.puts "blah blah blah" }
|
|
215
212
|
file1md5 = Digest::MD5.hexdigest(::File.read(@destination_dir + '/remote_dir_file1.txt'))
|
|
216
213
|
subdirfile1md5 = Digest::MD5.hexdigest(::File.read(@destination_dir + '/remotesubdir/remote_subdir_file1.txt'))
|
|
217
|
-
@provider.stub!(:update_new_file_state)
|
|
218
214
|
@provider.run_action(:create)
|
|
219
215
|
file1md5.eql?(Digest::MD5.hexdigest(::File.read(@destination_dir + '/remote_dir_file1.txt'))).should be_true
|
|
220
216
|
subdirfile1md5.eql?(Digest::MD5.hexdigest(::File.read(@destination_dir + '/remotesubdir/remote_subdir_file1.txt'))).should be_true
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Author:: Daniel DeLeo (<dan@opscode.com>)
|
|
3
|
+
# Copyright:: Copyright (c) 2013 Opscode, Inc.
|
|
4
|
+
# License:: Apache License, Version 2.0
|
|
5
|
+
#
|
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
7
|
+
# you may not use this file except in compliance with the License.
|
|
8
|
+
# You may obtain a copy of the License at
|
|
9
|
+
#
|
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
11
|
+
#
|
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
15
|
+
# See the License for the specific language governing permissions and
|
|
16
|
+
# limitations under the License.
|
|
17
|
+
#
|
|
18
|
+
|
|
19
|
+
require 'spec_helper'
|
|
20
|
+
require 'uri'
|
|
21
|
+
|
|
22
|
+
CACHE_FILE_TRUNCATED_FRIENDLY_FILE_NAME_LENGTH = 64
|
|
23
|
+
CACHE_FILE_MD5_HEX_LENGTH = 32
|
|
24
|
+
CACHE_FILE_JSON_FILE_EXTENSION_LENGTH = 5
|
|
25
|
+
CACHE_FILE_PATH_LIMIT =
|
|
26
|
+
CACHE_FILE_TRUNCATED_FRIENDLY_FILE_NAME_LENGTH +
|
|
27
|
+
1 +
|
|
28
|
+
CACHE_FILE_MD5_HEX_LENGTH +
|
|
29
|
+
CACHE_FILE_JSON_FILE_EXTENSION_LENGTH # {friendly}-{md5hex}.json == 102
|
|
30
|
+
|
|
31
|
+
describe Chef::Provider::RemoteFile::CacheControlData do
|
|
32
|
+
|
|
33
|
+
let(:uri) { URI.parse("http://www.google.com/robots.txt") }
|
|
34
|
+
|
|
35
|
+
subject(:cache_control_data) do
|
|
36
|
+
Chef::Provider::RemoteFile::CacheControlData.load_and_validate(uri, current_file_checksum)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
let(:cache_path) { "remote_file/http___www_google_com_robots_txt-9839677abeeadf0691026e0cabca2339.json" }
|
|
40
|
+
|
|
41
|
+
# the checksum of the file we have on disk already
|
|
42
|
+
let(:current_file_checksum) { "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" }
|
|
43
|
+
|
|
44
|
+
context "when loading data for an unknown URI" do
|
|
45
|
+
|
|
46
|
+
before do
|
|
47
|
+
Chef::FileCache.should_receive(:load).with(cache_path).and_raise(Chef::Exceptions::FileNotFound, "nope")
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
context "and there is no current copy of the file" do
|
|
51
|
+
let(:current_file_checksum) { nil }
|
|
52
|
+
|
|
53
|
+
it "returns empty cache control data" do
|
|
54
|
+
cache_control_data.etag.should be_nil
|
|
55
|
+
cache_control_data.mtime.should be_nil
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
it "returns empty cache control data" do
|
|
60
|
+
cache_control_data.etag.should be_nil
|
|
61
|
+
cache_control_data.mtime.should be_nil
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
context "and the URI contains a password" do
|
|
65
|
+
|
|
66
|
+
let(:uri) { URI.parse("http://bob:password@example.org/") }
|
|
67
|
+
let(:cache_path) { "remote_file/http___bob_XXXX_example_org_-f121caacb74c05a35bcefdf578ed5fc9.json" }
|
|
68
|
+
|
|
69
|
+
it "loads the cache data from a path based on a sanitized URI" do
|
|
70
|
+
Chef::Provider::RemoteFile::CacheControlData.load_and_validate(uri, current_file_checksum)
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
describe "when loading data for a known URI" do
|
|
76
|
+
|
|
77
|
+
# the checksum of the file last we fetched it.
|
|
78
|
+
let(:last_fetched_checksum) { "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" }
|
|
79
|
+
|
|
80
|
+
let(:etag) { "\"a-strong-identifier\"" }
|
|
81
|
+
let(:mtime) { "Tue, 21 May 2013 19:19:23 GMT" }
|
|
82
|
+
|
|
83
|
+
let(:cache_json_data) do
|
|
84
|
+
cache = {}
|
|
85
|
+
cache["etag"] = etag
|
|
86
|
+
cache["mtime"] = mtime
|
|
87
|
+
cache["checksum"] = last_fetched_checksum
|
|
88
|
+
cache.to_json
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
before do
|
|
92
|
+
Chef::FileCache.should_receive(:load).with(cache_path).and_return(cache_json_data)
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
context "and there is no on-disk copy of the file" do
|
|
96
|
+
let(:current_file_checksum) { nil }
|
|
97
|
+
|
|
98
|
+
it "returns empty cache control data" do
|
|
99
|
+
cache_control_data.etag.should be_nil
|
|
100
|
+
cache_control_data.mtime.should be_nil
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
context "and the cached checksum does not match the on-disk copy" do
|
|
105
|
+
let(:current_file_checksum) { "e2a8938cc31754f6c067b35aab1d0d4864272e9bf8504536ef3e79ebf8432305" }
|
|
106
|
+
|
|
107
|
+
it "returns empty cache control data" do
|
|
108
|
+
cache_control_data.etag.should be_nil
|
|
109
|
+
cache_control_data.mtime.should be_nil
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
context "and the cached checksum matches the on-disk copy" do
|
|
114
|
+
|
|
115
|
+
it "populates the cache control data" do
|
|
116
|
+
cache_control_data.etag.should == etag
|
|
117
|
+
cache_control_data.mtime.should == mtime
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
context "and the cached checksum data is corrupted" do
|
|
122
|
+
let(:cache_json_data) { '{"foo",,"bar" []}' }
|
|
123
|
+
|
|
124
|
+
it "returns empty cache control data" do
|
|
125
|
+
cache_control_data.etag.should be_nil
|
|
126
|
+
cache_control_data.mtime.should be_nil
|
|
127
|
+
end
|
|
128
|
+
end
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
describe "when saving to disk" do
|
|
132
|
+
|
|
133
|
+
let(:etag) { "\"a-strong-identifier\"" }
|
|
134
|
+
let(:mtime) { "Tue, 21 May 2013 19:19:23 GMT" }
|
|
135
|
+
let(:fetched_file_checksum) { "e2a8938cc31754f6c067b35aab1d0d4864272e9bf8504536ef3e79ebf8432305" }
|
|
136
|
+
|
|
137
|
+
let(:expected_serialization_data) do
|
|
138
|
+
data = {}
|
|
139
|
+
data["etag"] = etag
|
|
140
|
+
data["mtime"] = mtime
|
|
141
|
+
data["checksum"] = fetched_file_checksum
|
|
142
|
+
data
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
before do
|
|
146
|
+
cache_control_data.etag = etag
|
|
147
|
+
cache_control_data.mtime = mtime
|
|
148
|
+
cache_control_data.checksum = fetched_file_checksum
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
it "serializes its attributes to JSON" do
|
|
152
|
+
# we have to test this separately because ruby 1.8 hash order is unstable
|
|
153
|
+
# so we can't count on the order of the keys in the json format.
|
|
154
|
+
|
|
155
|
+
json_data = cache_control_data.json_data
|
|
156
|
+
Chef::JSONCompat.from_json(json_data).should == expected_serialization_data
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
it "writes data to the cache" do
|
|
160
|
+
json_data = cache_control_data.json_data
|
|
161
|
+
Chef::FileCache.should_receive(:store).with(cache_path, json_data)
|
|
162
|
+
cache_control_data.save
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
context "and the URI contains a password" do
|
|
166
|
+
|
|
167
|
+
let(:uri) { URI.parse("http://bob:password@example.org/") }
|
|
168
|
+
let(:cache_path) { "remote_file/http___bob_XXXX_example_org_-f121caacb74c05a35bcefdf578ed5fc9.json" }
|
|
169
|
+
|
|
170
|
+
it "writes the data to the cache with a sanitized path name" do
|
|
171
|
+
json_data = cache_control_data.json_data
|
|
172
|
+
Chef::FileCache.should_receive(:store).with(cache_path, json_data)
|
|
173
|
+
cache_control_data.save
|
|
174
|
+
end
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
# Cover the very long remote file path case -- see CHEF-4422 where
|
|
178
|
+
# local cache file names generated from the long uri exceeded
|
|
179
|
+
# local file system path limits resulting in exceptions from
|
|
180
|
+
# file system API's on both Windows and Unix systems.
|
|
181
|
+
context "and the URI results in a file cache path that exceeds #{CACHE_FILE_PATH_LIMIT} characters in length" do
|
|
182
|
+
let(:long_remote_path) { "http://www.bing.com/" + ('0' * (CACHE_FILE_TRUNCATED_FRIENDLY_FILE_NAME_LENGTH * 2 )) }
|
|
183
|
+
let(:uri) { URI.parse(long_remote_path) }
|
|
184
|
+
let(:truncated_remote_uri) { URI.parse(long_remote_path[0...CACHE_FILE_TRUNCATED_FRIENDLY_FILE_NAME_LENGTH]) }
|
|
185
|
+
let(:truncated_file_cache_path) do
|
|
186
|
+
cache_control_data_truncated = Chef::Provider::RemoteFile::CacheControlData.load_and_validate(truncated_remote_uri, current_file_checksum)
|
|
187
|
+
cache_control_data_truncated.send('sanitized_cache_file_basename')[0...CACHE_FILE_TRUNCATED_FRIENDLY_FILE_NAME_LENGTH]
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
it "truncates the file cache path to 102 characters" do
|
|
191
|
+
normalized_cache_path = cache_control_data.send('sanitized_cache_file_basename')
|
|
192
|
+
|
|
193
|
+
Chef::FileCache.should_receive(:store).with("remote_file/" + normalized_cache_path, cache_control_data.json_data)
|
|
194
|
+
|
|
195
|
+
cache_control_data.save
|
|
196
|
+
|
|
197
|
+
normalized_cache_path.length.should == CACHE_FILE_PATH_LIMIT
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
it "uses a file cache path that starts with the first #{CACHE_FILE_TRUNCATED_FRIENDLY_FILE_NAME_LENGTH} characters of the URI" do
|
|
201
|
+
normalized_cache_path = cache_control_data.send('sanitized_cache_file_basename')
|
|
202
|
+
|
|
203
|
+
truncated_file_cache_path.length.should == CACHE_FILE_TRUNCATED_FRIENDLY_FILE_NAME_LENGTH
|
|
204
|
+
normalized_cache_path.start_with?(truncated_file_cache_path).should == true
|
|
205
|
+
end
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
end
|
|
209
|
+
|
|
210
|
+
end
|
|
211
|
+
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Author:: Lamont Granquist (<lamont@opscode.com>)
|
|
3
|
+
# Copyright:: Copyright (c) 2013 Opscode, Inc.
|
|
4
|
+
# License:: Apache License, Version 2.0
|
|
5
|
+
#
|
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
7
|
+
# you may not use this file except in compliance with the License.
|
|
8
|
+
# You may obtain a copy of the License at
|
|
9
|
+
#
|
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
11
|
+
#
|
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
15
|
+
# See the License for the specific language governing permissions and
|
|
16
|
+
# limitations under the License.
|
|
17
|
+
#
|
|
18
|
+
|
|
19
|
+
require 'spec_helper'
|
|
20
|
+
|
|
21
|
+
describe Chef::Provider::RemoteFile::Content do
|
|
22
|
+
|
|
23
|
+
#
|
|
24
|
+
# mock setup
|
|
25
|
+
#
|
|
26
|
+
|
|
27
|
+
let(:current_resource) do
|
|
28
|
+
Chef::Resource::RemoteFile.new("remote-file-content-spec (current resource)")
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
let(:source) { [ "http://opscode.com/seattle.txt" ] }
|
|
32
|
+
|
|
33
|
+
let(:new_resource) do
|
|
34
|
+
r = Chef::Resource::RemoteFile.new("remote-file-content-spec (current resource)")
|
|
35
|
+
r.source(source)
|
|
36
|
+
r
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
let(:run_context) { mock("Chef::RunContext") }
|
|
40
|
+
|
|
41
|
+
#
|
|
42
|
+
# subject
|
|
43
|
+
#
|
|
44
|
+
let(:content) do
|
|
45
|
+
Chef::Provider::RemoteFile::Content.new(new_resource, current_resource, run_context)
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
describe "when the checksum of the current_resource matches the checksum set on the resource" do
|
|
49
|
+
before do
|
|
50
|
+
new_resource.stub!(:checksum).and_return("0fd012fdc96e96f8f7cf2046522a54aed0ce470224513e45da6bc1a17a4924aa")
|
|
51
|
+
current_resource.stub!(:checksum).and_return("0fd012fdc96e96f8f7cf2046522a54aed0ce470224513e45da6bc1a17a4924aa")
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
it "should return nil for the tempfile" do
|
|
55
|
+
content.tempfile.should be_nil
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
it "should not call any fetcher" do
|
|
59
|
+
Chef::Provider::RemoteFile::Fetcher.should_not_receive(:for_resource)
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
describe "when the checksum of the current_resource is a partial match for the checksum set on the resource" do
|
|
64
|
+
before do
|
|
65
|
+
new_resource.stub!(:checksum).and_return("0fd012fd")
|
|
66
|
+
current_resource.stub!(:checksum).and_return("0fd012fdc96e96f8f7cf2046522a54aed0ce470224513e45da6bc1a17a4924aa")
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
it "should return nil for the tempfile" do
|
|
70
|
+
content.tempfile.should be_nil
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
it "should not call any fetcher" do
|
|
74
|
+
Chef::Provider::RemoteFile::Fetcher.should_not_receive(:for_resource)
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
shared_examples_for "the resource needs fetching" do
|
|
79
|
+
before do
|
|
80
|
+
# FIXME: test one or the other nil, test both not nil and not equal, abuse the regexp a little
|
|
81
|
+
@uri = mock("URI")
|
|
82
|
+
URI.should_receive(:parse).with(new_resource.source[0]).and_return(@uri)
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
describe "when the fetcher returns nil for the tempfile" do
|
|
86
|
+
before do
|
|
87
|
+
http_fetcher = mock("Chef::Provider::RemoteFile::HTTP", :fetch => nil)
|
|
88
|
+
Chef::Provider::RemoteFile::Fetcher.should_receive(:for_resource).with(@uri, new_resource, current_resource).and_return(http_fetcher)
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
it "should return nil for the tempfile" do
|
|
92
|
+
content.tempfile.should be_nil
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
describe "when the fetcher returns a valid tempfile" do
|
|
97
|
+
|
|
98
|
+
let(:mtime) { Time.now }
|
|
99
|
+
let(:tempfile) { mock("Tempfile") }
|
|
100
|
+
let(:http_fetcher) { mock("Chef::Provider::RemoteFile::HTTP", :fetch => tempfile) }
|
|
101
|
+
|
|
102
|
+
before do
|
|
103
|
+
Chef::Provider::RemoteFile::Fetcher.should_receive(:for_resource).with(@uri, new_resource, current_resource).and_return(http_fetcher)
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
it "should return the tempfile object to the caller" do
|
|
107
|
+
content.tempfile.should == tempfile
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
describe "when the checksum are both nil" do
|
|
113
|
+
before do
|
|
114
|
+
new_resource.checksum.should be_nil
|
|
115
|
+
current_resource.checksum.should be_nil
|
|
116
|
+
end
|
|
117
|
+
it_behaves_like "the resource needs fetching"
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
describe "when the current_resource checksum is nil" do
|
|
121
|
+
before do
|
|
122
|
+
new_resource.stub!(:checksum).and_return("fd012fd")
|
|
123
|
+
current_resource.stub!(:checksum).and_return(nil)
|
|
124
|
+
end
|
|
125
|
+
it_behaves_like "the resource needs fetching"
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
describe "when the new_resource checksum is nil" do
|
|
129
|
+
before do
|
|
130
|
+
new_resource.stub!(:checksum).and_return(nil)
|
|
131
|
+
current_resource.stub!(:checksum).and_return("0fd012fdc96e96f8f7cf2046522a54aed0ce470224513e45da6bc1a17a4924aa")
|
|
132
|
+
end
|
|
133
|
+
it_behaves_like "the resource needs fetching"
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
describe "when the checksums are a partial match, but not to the leading portion" do
|
|
137
|
+
before do
|
|
138
|
+
new_resource.stub!(:checksum).and_return("fd012fd")
|
|
139
|
+
current_resource.stub!(:checksum).and_return("0fd012fdc96e96f8f7cf2046522a54aed0ce470224513e45da6bc1a17a4924aa")
|
|
140
|
+
end
|
|
141
|
+
it_behaves_like "the resource needs fetching"
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
describe "when the fetcher throws an exception" do
|
|
146
|
+
before do
|
|
147
|
+
new_resource.stub!(:checksum).and_return(nil)
|
|
148
|
+
current_resource.stub!(:checksum).and_return(nil)
|
|
149
|
+
@uri = mock("URI")
|
|
150
|
+
URI.should_receive(:parse).with(new_resource.source[0]).and_return(@uri)
|
|
151
|
+
http_fetcher = mock("Chef::Provider::RemoteFile::HTTP")
|
|
152
|
+
http_fetcher.should_receive(:fetch).and_raise(Errno::ECONNREFUSED)
|
|
153
|
+
Chef::Provider::RemoteFile::Fetcher.should_receive(:for_resource).with(@uri, new_resource, current_resource).and_return(http_fetcher)
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
it "should propagate the error back to the caller" do
|
|
157
|
+
lambda { content.tempfile }.should raise_error(Errno::ECONNREFUSED)
|
|
158
|
+
end
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
describe "when there is an array of sources and the first fails" do
|
|
162
|
+
|
|
163
|
+
let(:source) { [ "http://opscode.com/seattle.txt", "http://opscode.com/nyc.txt" ] }
|
|
164
|
+
before do
|
|
165
|
+
new_resource.stub!(:checksum).and_return(nil)
|
|
166
|
+
current_resource.stub!(:checksum).and_return(nil)
|
|
167
|
+
@uri0 = mock("URI0")
|
|
168
|
+
@uri1 = mock("URI1")
|
|
169
|
+
URI.should_receive(:parse).with(new_resource.source[0]).and_return(@uri0)
|
|
170
|
+
URI.should_receive(:parse).with(new_resource.source[1]).and_return(@uri1)
|
|
171
|
+
@http_fetcher_throws_exception = mock("Chef::Provider::RemoteFile::HTTP")
|
|
172
|
+
@http_fetcher_throws_exception.should_receive(:fetch).at_least(:once).and_raise(Errno::ECONNREFUSED)
|
|
173
|
+
Chef::Provider::RemoteFile::Fetcher.should_receive(:for_resource).with(@uri0, new_resource, current_resource).and_return(@http_fetcher_throws_exception)
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
describe "when the second url succeeds" do
|
|
177
|
+
before do
|
|
178
|
+
@tempfile = mock("Tempfile")
|
|
179
|
+
mtime = Time.now
|
|
180
|
+
http_fetcher_works = mock("Chef::Provider::RemoteFile::HTTP", :fetch => @tempfile)
|
|
181
|
+
Chef::Provider::RemoteFile::Fetcher.should_receive(:for_resource).with(@uri1, new_resource, current_resource).and_return(http_fetcher_works)
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
it "should return a valid tempfile" do
|
|
185
|
+
content.tempfile.should == @tempfile
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
it "should not mutate the new_resource" do
|
|
189
|
+
content.tempfile
|
|
190
|
+
new_resource.source.length.should == 2
|
|
191
|
+
end
|
|
192
|
+
end
|
|
193
|
+
|
|
194
|
+
describe "when both urls fail" do
|
|
195
|
+
before do
|
|
196
|
+
Chef::Provider::RemoteFile::Fetcher.should_receive(:for_resource).with(@uri1, new_resource, current_resource).and_return(@http_fetcher_throws_exception)
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
it "should propagate the error back to the caller" do
|
|
200
|
+
lambda { content.tempfile }.should raise_error(Errno::ECONNREFUSED)
|
|
201
|
+
end
|
|
202
|
+
end
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
describe "when there is an array of sources and the first succeeds" do
|
|
206
|
+
let(:source) { [ "http://opscode.com/seattle.txt", "http://opscode.com/nyc.txt" ] }
|
|
207
|
+
before do
|
|
208
|
+
new_resource.stub!(:checksum).and_return(nil)
|
|
209
|
+
current_resource.stub!(:checksum).and_return(nil)
|
|
210
|
+
@uri0 = mock("URI0")
|
|
211
|
+
URI.should_receive(:parse).with(new_resource.source[0]).and_return(@uri0)
|
|
212
|
+
URI.should_not_receive(:parse).with(new_resource.source[1])
|
|
213
|
+
@tempfile = mock("Tempfile")
|
|
214
|
+
mtime = Time.now
|
|
215
|
+
http_fetcher_works = mock("Chef::Provider::RemoteFile::HTTP", :fetch => @tempfile)
|
|
216
|
+
Chef::Provider::RemoteFile::Fetcher.should_receive(:for_resource).with(@uri0, new_resource, current_resource).and_return(http_fetcher_works)
|
|
217
|
+
end
|
|
218
|
+
|
|
219
|
+
it "should return a valid tempfile" do
|
|
220
|
+
content.tempfile.should == @tempfile
|
|
221
|
+
end
|
|
222
|
+
|
|
223
|
+
it "should not mutate the new_resource" do
|
|
224
|
+
content.tempfile
|
|
225
|
+
new_resource.source.length.should == 2
|
|
226
|
+
end
|
|
227
|
+
end
|
|
228
|
+
|
|
229
|
+
end
|
|
230
|
+
|