puppet 4.3.2 → 4.4.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of puppet might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/COMMITTERS.md +2 -2
- data/CONTRIBUTING.md +6 -6
- data/LICENSE +1 -1
- data/README.md +8 -9
- data/conf/auth.conf +2 -2
- data/ext/README.environment +1 -1
- data/ext/debian/README.source +1 -1
- data/ext/debian/control +1 -1
- data/ext/debian/copyright +4 -4
- data/ext/debian/puppetmaster.README.debian +11 -9
- data/ext/emacs/puppet-mode.el +1 -1
- data/ext/envpuppet +2 -2
- data/ext/ips/puppetagent.xml +1 -1
- data/ext/ips/puppetmaster.xml +1 -1
- data/ext/project_data.yaml +8 -0
- data/ext/puppet-test +3 -3
- data/ext/rack/example-passenger-vhost.conf +1 -1
- data/ext/redhat/puppet.spec.erb +2 -2
- data/ext/regexp_nodes/regexp_nodes.rb +1 -1
- data/ext/solaris/pkginfo +1 -1
- data/ext/solaris/smf/puppet.xml +1 -1
- data/ext/suse/puppet.spec +2 -2
- data/ext/upload_facts.rb +1 -1
- data/ext/windows/puppet_interactive.bat +6 -0
- data/ext/windows/puppet_shell.bat +9 -0
- data/ext/windows/run_puppet_interactive.bat +9 -0
- data/ext/yaml_nodes.rb +1 -1
- data/install.rb +30 -20
- data/lib/puppet/agent.rb +1 -1
- data/lib/puppet/application/agent.rb +4 -2
- data/lib/puppet/application/apply.rb +7 -4
- data/lib/puppet/application/cert.rb +1 -1
- data/lib/puppet/application/device.rb +1 -1
- data/lib/puppet/application/filebucket.rb +1 -1
- data/lib/puppet/application/inspect.rb +1 -1
- data/lib/puppet/application/lookup.rb +4 -4
- data/lib/puppet/application/master.rb +2 -2
- data/lib/puppet/application/resource.rb +1 -1
- data/lib/puppet/configurer.rb +100 -22
- data/lib/puppet/data_providers/hiera_config.rb +28 -3
- data/lib/puppet/data_providers/hiera_interpolate.rb +30 -15
- data/lib/puppet/data_providers/hiera_support.rb +1 -1
- data/lib/puppet/data_providers/json_data_provider_factory.rb +2 -2
- data/lib/puppet/data_providers/yaml_data_provider_factory.rb +2 -2
- data/lib/puppet/defaults.rb +65 -19
- data/lib/puppet/environments.rb +3 -1
- data/lib/puppet/face/config.rb +1 -1
- data/lib/puppet/face/epp.rb +1 -1
- data/lib/puppet/face/help/man.erb +1 -1
- data/lib/puppet/face/module/install.rb +6 -6
- data/lib/puppet/face/parser.rb +12 -9
- data/lib/puppet/face/status.rb +2 -1
- data/lib/puppet/feature/cfpropertylist.rb +3 -0
- data/lib/puppet/feature/telnet.rb +9 -0
- data/lib/puppet/file_serving/http_metadata.rb +46 -0
- data/lib/puppet/file_serving/metadata.rb +18 -2
- data/lib/puppet/file_serving/terminus_selector.rb +2 -0
- data/lib/puppet/file_system.rb +2 -2
- data/lib/puppet/file_system/file_impl.rb +2 -2
- data/lib/puppet/file_system/memory_impl.rb +1 -1
- data/lib/puppet/file_system/uniquefile.rb +1 -1
- data/lib/puppet/forge.rb +1 -1
- data/lib/puppet/forge/repository.rb +1 -31
- data/lib/puppet/functions.rb +45 -6
- data/lib/puppet/functions/assert_type.rb +9 -9
- data/lib/puppet/functions/each.rb +5 -13
- data/lib/puppet/functions/filter.rb +5 -14
- data/lib/puppet/functions/map.rb +6 -14
- data/lib/puppet/functions/reduce.rb +5 -13
- data/lib/puppet/functions/reverse_each.rb +82 -0
- data/lib/puppet/functions/scanf.rb +15 -18
- data/lib/puppet/functions/slice.rb +22 -36
- data/lib/puppet/functions/split.rb +2 -2
- data/lib/puppet/functions/step.rb +88 -0
- data/lib/puppet/functions/type.rb +70 -0
- data/lib/puppet/graph/rb_tree_map.rb +1 -1
- data/lib/puppet/indirector/catalog/compiler.rb +188 -5
- data/lib/puppet/indirector/file_content/http.rb +15 -0
- data/lib/puppet/indirector/file_metadata/http.rb +27 -0
- data/lib/puppet/indirector/generic_http.rb +16 -0
- data/lib/puppet/indirector/node/exec.rb +1 -1
- data/lib/puppet/indirector/node/ldap.rb +1 -1
- data/lib/puppet/indirector/rest.rb +2 -1
- data/lib/puppet/info_service/class_information_service.rb +13 -12
- data/lib/puppet/loaders.rb +1 -0
- data/lib/puppet/module.rb +3 -0
- data/lib/puppet/module_tool/skeleton/templates/generator/Gemfile +9 -2
- data/lib/puppet/module_tool/skeleton/templates/generator/spec/classes/init_spec.rb.erb +1 -1
- data/lib/puppet/module_tool/skeleton/templates/generator/tests/init.pp.erb +2 -2
- data/lib/puppet/module_tool/tar/mini.rb +3 -3
- data/lib/puppet/network/http/pool.rb +9 -0
- data/lib/puppet/node.rb +1 -1
- data/lib/puppet/node/environment.rb +11 -2
- data/lib/puppet/parser/ast/pops_bridge.rb +19 -22
- data/lib/puppet/parser/compiler.rb +3 -3
- data/lib/puppet/parser/environment_compiler.rb +0 -1
- data/lib/puppet/parser/functions.rb +28 -16
- data/lib/puppet/parser/functions/fqdn_rand.rb +1 -1
- data/lib/puppet/parser/functions/inline_template.rb +1 -1
- data/lib/puppet/parser/functions/map.rb +1 -1
- data/lib/puppet/parser/functions/scanf.rb +15 -26
- data/lib/puppet/parser/functions/slice.rb +17 -24
- data/lib/puppet/parser/functions/split.rb +1 -1
- data/lib/puppet/parser/resource.rb +19 -17
- data/lib/puppet/parser/scope.rb +176 -5
- data/lib/puppet/plugins/data_providers/data_provider.rb +54 -13
- data/lib/puppet/pops.rb +0 -8
- data/lib/puppet/pops/adaptable.rb +4 -1
- data/lib/puppet/pops/adapters.rb +38 -13
- data/lib/puppet/pops/binder/binder.rb +21 -17
- data/lib/puppet/pops/binder/binder_issues.rb +8 -6
- data/lib/puppet/pops/binder/bindings_checker.rb +12 -8
- data/lib/puppet/pops/binder/bindings_composer.rb +16 -12
- data/lib/puppet/pops/binder/bindings_factory.rb +108 -104
- data/lib/puppet/pops/binder/bindings_model.rb +49 -47
- data/lib/puppet/pops/binder/config/diagnostic_producer.rb +10 -6
- data/lib/puppet/pops/binder/injector.rb +53 -48
- data/lib/puppet/pops/binder/key_factory.rb +10 -6
- data/lib/puppet/pops/binder/producers.rb +67 -62
- data/lib/puppet/pops/evaluator/access_operator.rb +95 -93
- data/lib/puppet/pops/evaluator/closure.rb +84 -68
- data/lib/puppet/pops/evaluator/collector_transformer.rb +18 -14
- data/lib/puppet/pops/evaluator/collectors/exported_collector.rb +0 -1
- data/lib/puppet/pops/evaluator/compare_operator.rb +13 -9
- data/lib/puppet/pops/evaluator/epp_evaluator.rb +9 -8
- data/lib/puppet/pops/evaluator/evaluator_impl.rb +78 -76
- data/lib/puppet/pops/evaluator/json_strict_literal_evaluator.rb +85 -0
- data/lib/puppet/pops/evaluator/relationship_operator.rb +13 -11
- data/lib/puppet/pops/evaluator/runtime3_converter.rb +5 -0
- data/lib/puppet/pops/evaluator/runtime3_support.rb +41 -45
- data/lib/puppet/pops/issue_reporter.rb +6 -4
- data/lib/puppet/pops/issues.rb +34 -11
- data/lib/puppet/pops/loader/base_loader.rb +1 -1
- data/lib/puppet/pops/loader/loader.rb +1 -1
- data/lib/puppet/pops/loader/loader_paths.rb +15 -0
- data/lib/puppet/pops/loader/module_loaders.rb +17 -13
- data/lib/puppet/pops/loader/puppet_function_instantiator.rb +16 -12
- data/lib/puppet/pops/loader/ruby_function_instantiator.rb +16 -3
- data/lib/puppet/pops/loader/type_definition_instantiator.rb +55 -0
- data/lib/puppet/pops/loaders.rb +51 -9
- data/lib/puppet/pops/lookup.rb +14 -12
- data/lib/puppet/pops/merge_strategy.rb +16 -19
- data/lib/puppet/pops/model/factory.rb +26 -2
- data/lib/puppet/pops/model/model.rb +8 -8
- data/lib/puppet/pops/model/model_label_provider.rb +13 -7
- data/lib/puppet/pops/model/model_meta.rb +17 -0
- data/lib/puppet/pops/model/model_tree_dumper.rb +8 -0
- data/lib/puppet/pops/parser/egrammar.ra +38 -14
- data/lib/puppet/pops/parser/eparser.rb +1353 -1276
- data/lib/puppet/pops/parser/epp_support.rb +11 -7
- data/lib/puppet/pops/parser/evaluating_parser.rb +14 -10
- data/lib/puppet/pops/parser/heredoc_support.rb +15 -11
- data/lib/puppet/pops/parser/lexer2.rb +26 -19
- data/lib/puppet/pops/parser/lexer_support.rb +85 -7
- data/lib/puppet/pops/parser/locator.rb +21 -0
- data/lib/puppet/pops/parser/parser_support.rb +19 -16
- data/lib/puppet/pops/parser/slurp_support.rb +11 -7
- data/lib/puppet/pops/types/class_loader.rb +23 -19
- data/lib/puppet/pops/types/enumeration.rb +9 -26
- data/lib/puppet/pops/types/iterable.rb +308 -0
- data/lib/puppet/pops/types/recursion_guard.rb +82 -0
- data/lib/puppet/pops/types/type_acceptor.rb +25 -0
- data/lib/puppet/pops/types/type_asserter.rb +10 -9
- data/lib/puppet/pops/types/type_calculator.rb +138 -381
- data/lib/puppet/pops/types/type_factory.rb +91 -57
- data/lib/puppet/pops/types/type_formatter.rb +334 -0
- data/lib/puppet/pops/types/type_mismatch_describer.rb +226 -59
- data/lib/puppet/pops/types/type_parser.rb +159 -112
- data/lib/puppet/pops/types/types.rb +2057 -1247
- data/lib/puppet/pops/utils.rb +11 -10
- data/lib/puppet/pops/validation.rb +11 -9
- data/lib/puppet/pops/validation/checker4_0.rb +83 -55
- data/lib/puppet/pops/validation/validator_factory_4_0.rb +8 -4
- data/lib/puppet/provider/aixobject.rb +1 -1
- data/lib/puppet/provider/augeas/augeas.rb +1 -1
- data/lib/puppet/provider/cron/crontab.rb +1 -1
- data/lib/puppet/provider/exec/windows.rb +1 -1
- data/lib/puppet/provider/macauthorization/macauthorization.rb +10 -9
- data/lib/puppet/provider/nameservice/directoryservice.rb +35 -50
- data/lib/puppet/provider/package/appdmg.rb +3 -2
- data/lib/puppet/provider/package/dnf.rb +1 -1
- data/lib/puppet/provider/package/pip.rb +5 -8
- data/lib/puppet/provider/package/pip3.rb +1 -1
- data/lib/puppet/provider/package/pkg.rb +1 -1
- data/lib/puppet/provider/package/pkgdmg.rb +3 -2
- data/lib/puppet/provider/package/pkgng.rb +13 -4
- data/lib/puppet/provider/package/windows.rb +1 -1
- data/lib/puppet/provider/package/yum.rb +1 -1
- data/lib/puppet/provider/package/zypper.rb +19 -0
- data/lib/puppet/provider/service/debian.rb +2 -2
- data/lib/puppet/provider/service/launchd.rb +6 -18
- data/lib/puppet/provider/service/systemd.rb +9 -2
- data/lib/puppet/provider/sshkey/parsed.rb +1 -1
- data/lib/puppet/provider/user/aix.rb +1 -1
- data/lib/puppet/provider/user/directoryservice.rb +33 -58
- data/lib/puppet/provider/zfs/zfs.rb +1 -1
- data/lib/puppet/provider/zpool/zpool.rb +1 -1
- data/lib/puppet/reference/configuration.rb +1 -1
- data/lib/puppet/reference/providers.rb +1 -1
- data/lib/puppet/resource.rb +15 -12
- data/lib/puppet/resource/capability_finder.rb +20 -13
- data/lib/puppet/resource/catalog.rb +60 -3
- data/lib/puppet/resource/status.rb +11 -2
- data/lib/puppet/resource/type.rb +28 -38
- data/lib/puppet/settings.rb +1 -1
- data/lib/puppet/settings/config_file.rb +1 -1
- data/lib/puppet/settings/environment_conf.rb +13 -5
- data/lib/puppet/ssl/certificate_factory.rb +3 -3
- data/lib/puppet/ssl/certificate_request.rb +4 -4
- data/lib/puppet/ssl/certificate_signer.rb +1 -1
- data/lib/puppet/ssl/validator/default_validator.rb +1 -1
- data/lib/puppet/test/test_helper.rb +16 -4
- data/lib/puppet/transaction.rb +15 -2
- data/lib/puppet/transaction/additional_resource_generator.rb +6 -2
- data/lib/puppet/transaction/report.rb +31 -1
- data/lib/puppet/transaction/resource_harness.rb +0 -25
- data/lib/puppet/type.rb +11 -11
- data/lib/puppet/type/augeas.rb +1 -1
- data/lib/puppet/type/cron.rb +12 -12
- data/lib/puppet/type/file.rb +91 -39
- data/lib/puppet/type/file/checksum_value.rb +53 -0
- data/lib/puppet/type/file/content.rb +26 -111
- data/lib/puppet/type/file/data_sync.rb +84 -0
- data/lib/puppet/type/file/ensure.rb +17 -14
- data/lib/puppet/type/file/selcontext.rb +1 -1
- data/lib/puppet/type/file/source.rb +103 -18
- data/lib/puppet/type/filebucket.rb +1 -1
- data/lib/puppet/type/interface.rb +8 -3
- data/lib/puppet/type/macauthorization.rb +1 -1
- data/lib/puppet/type/package.rb +6 -0
- data/lib/puppet/type/schedule.rb +1 -1
- data/lib/puppet/type/stage.rb +1 -1
- data/lib/puppet/type/user.rb +19 -17
- data/lib/puppet/type/yumrepo.rb +20 -0
- data/lib/puppet/util.rb +109 -22
- data/lib/puppet/util/autoload.rb +16 -11
- data/lib/puppet/util/checksums.rb +74 -31
- data/lib/puppet/util/execution.rb +1 -1
- data/lib/puppet/util/http_proxy.rb +72 -0
- data/lib/puppet/util/log.rb +2 -0
- data/lib/puppet/util/logging.rb +43 -1
- data/lib/puppet/util/monkey_patches.rb +2 -2
- data/lib/puppet/util/multi_match.rb +51 -0
- data/lib/puppet/util/network_device/cisco/device.rb +10 -2
- data/lib/puppet/util/network_device/cisco/interface.rb +21 -8
- data/lib/puppet/util/network_device/transport/ssh.rb +7 -3
- data/lib/puppet/util/network_device/transport/telnet.rb +39 -36
- data/lib/puppet/util/plist.rb +130 -0
- data/lib/puppet/util/resource_template.rb +1 -1
- data/lib/puppet/util/run_mode.rb +2 -2
- data/lib/puppet/util/skip_tags.rb +9 -0
- data/lib/puppet/util/windows/access_control_entry.rb +1 -1
- data/lib/puppet/util/windows/access_control_list.rb +3 -3
- data/lib/puppet/util/windows/adsi.rb +4 -4
- data/lib/puppet/util/windows/api_types.rb +24 -18
- data/lib/puppet/util/windows/com.rb +3 -3
- data/lib/puppet/util/windows/error.rb +1 -1
- data/lib/puppet/util/windows/file.rb +8 -8
- data/lib/puppet/util/windows/principal.rb +23 -14
- data/lib/puppet/util/windows/process.rb +78 -11
- data/lib/puppet/util/windows/registry.rb +1 -1
- data/lib/puppet/util/windows/root_certs.rb +5 -5
- data/lib/puppet/util/windows/security.rb +33 -35
- data/lib/puppet/util/windows/security_descriptor.rb +1 -1
- data/lib/puppet/util/windows/sid.rb +42 -4
- data/lib/puppet/util/windows/taskscheduler.rb +15 -15
- data/lib/puppet/util/windows/user.rb +10 -10
- data/lib/puppet/vendor/deep_merge/deep_merge.gemspec +1 -1
- data/lib/puppet/vendor/pathspec/LICENSE +2 -2
- data/lib/puppet/vendor/pathspec/README.md +1 -1
- data/lib/puppet/vendor/rgen/README.rdoc +1 -1
- data/lib/puppet/vendor/semantic/lib/semantic/dependency/module_release.rb +14 -0
- data/lib/puppet/version.rb +1 -1
- data/lib/semver.rb +17 -1
- data/man/man5/puppet.conf.5 +12 -12
- data/man/man8/extlookup2hiera.8 +1 -1
- data/man/man8/puppet-agent.8 +2 -2
- data/man/man8/puppet-apply.8 +2 -2
- data/man/man8/puppet-ca.8 +2 -2
- data/man/man8/puppet-catalog.8 +2 -2
- data/man/man8/puppet-cert.8 +2 -2
- data/man/man8/puppet-certificate.8 +2 -2
- data/man/man8/puppet-certificate_request.8 +2 -2
- data/man/man8/puppet-certificate_revocation_list.8 +2 -2
- data/man/man8/puppet-config.8 +3 -3
- data/man/man8/puppet-describe.8 +1 -1
- data/man/man8/puppet-device.8 +1 -1
- data/man/man8/puppet-doc.8 +1 -1
- data/man/man8/puppet-epp.8 +2 -2
- data/man/man8/puppet-facts.8 +2 -2
- data/man/man8/puppet-file.8 +2 -2
- data/man/man8/puppet-filebucket.8 +2 -2
- data/man/man8/puppet-help.8 +2 -2
- data/man/man8/puppet-inspect.8 +2 -2
- data/man/man8/puppet-key.8 +2 -2
- data/man/man8/puppet-man.8 +2 -2
- data/man/man8/puppet-master.8 +2 -2
- data/man/man8/puppet-module.8 +9 -9
- data/man/man8/puppet-node.8 +2 -2
- data/man/man8/puppet-parser.8 +2 -2
- data/man/man8/puppet-plugin.8 +2 -2
- data/man/man8/puppet-report.8 +2 -2
- data/man/man8/puppet-resource.8 +2 -2
- data/man/man8/puppet-resource_type.8 +2 -2
- data/man/man8/puppet-status.8 +3 -3
- data/man/man8/puppet.8 +1 -1
- data/spec/fixtures/module.tar.gz +0 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/bad_data/lib/puppet/functions/bad_data/data.rb +1 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/bad_data/manifests/init.pp +0 -1
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/data/empty.json +0 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/hiera.yaml +5 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/manifests/init.pp +2 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/metadata.json +9 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/data/empty.yaml +1 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/hiera.yaml +5 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/manifests/init.pp +2 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/metadata.json +9 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/hieraprovider/data/first.json +2 -1
- data/spec/fixtures/unit/module/trailing-comma.json +1 -1
- data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/manifests/init.pp +3 -1
- data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/types/zero.pp +1 -0
- data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/types/withuseeone.pp +1 -0
- data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/types/withuseezero.pp +1 -0
- data/spec/fixtures/unit/provider/package/yum/yum-check-update-broken-notices.txt +187 -0
- data/spec/fixtures/unit/provider/sshkey/parsed/sample_with_blank_lines +8 -0
- data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_fetch_if_not_on_the_local_disk.yml +205 -0
- data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_not_update_if_content_on_disk_is_up-to-date.yml +213 -0
- data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_update_if_content_differs_on_disk.yml +213 -0
- data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_mtime_is_older_on_disk.yml +205 -0
- data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_no_header_specified.yml +197 -0
- data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_not_on_the_local_disk.yml +205 -0
- data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_not_update_if_mtime_is_newer_on_disk.yml +205 -0
- data/spec/integration/defaults_spec.rb +14 -2
- data/spec/integration/file_system/uniquefile_spec.rb +29 -0
- data/spec/integration/module_tool/tar/mini_spec.rb +28 -0
- data/spec/integration/node/environment_spec.rb +13 -0
- data/spec/integration/parser/dynamic_scoping_spec.rb +67 -0
- data/spec/integration/parser/parameter_defaults_spec.rb +336 -0
- data/spec/integration/parser/undef_param_spec.rb +8 -0
- data/spec/integration/provider/yumrepo_spec.rb +1 -1
- data/spec/integration/test/test_helper_spec.rb +28 -0
- data/spec/integration/transaction/report_spec.rb +16 -0
- data/spec/integration/transaction_spec.rb +11 -0
- data/spec/integration/type/file_spec.rb +194 -4
- data/spec/integration/type/package_spec.rb +5 -1
- data/spec/integration/type/tidy_spec.rb +21 -9
- data/spec/integration/util/execution_spec.rb +22 -0
- data/spec/integration/util/windows/principal_spec.rb +90 -4
- data/spec/integration/util/windows/process_spec.rb +31 -0
- data/spec/integration/util/windows/security_spec.rb +6 -6
- data/spec/integration/util/windows/user_spec.rb +1 -1
- data/spec/integration/util_spec.rb +49 -27
- data/spec/lib/puppet_spec/compiler.rb +17 -0
- data/spec/lib/puppet_spec/files.rb +2 -2
- data/spec/lib/puppet_spec/pops.rb +13 -0
- data/spec/shared_behaviours/iterative_functions.rb +1 -1
- data/spec/shared_contexts/types_setup.rb +96 -0
- data/spec/unit/agent_spec.rb +1 -0
- data/spec/unit/application/agent_spec.rb +10 -0
- data/spec/unit/application/apply_spec.rb +9 -0
- data/spec/unit/configurer/downloader_spec.rb +5 -5
- data/spec/unit/configurer_spec.rb +271 -39
- data/spec/unit/data_providers/hiera_interpolation_spec.rb +57 -0
- data/spec/unit/defaults_spec.rb +15 -0
- data/spec/unit/environments_spec.rb +24 -4
- data/spec/unit/face/parser_spec.rb +43 -2
- data/spec/unit/file_serving/http_metadata_spec.rb +85 -0
- data/spec/unit/file_serving/metadata_spec.rb +50 -0
- data/spec/unit/file_serving/terminus_selector_spec.rb +12 -2
- data/spec/unit/file_system_spec.rb +26 -0
- data/spec/unit/functions/assert_type_spec.rb +36 -2
- data/spec/unit/functions/defined_spec.rb +2 -2
- data/spec/unit/functions/epp_spec.rb +11 -3
- data/spec/unit/functions/lookup_spec.rb +58 -13
- data/spec/unit/functions/regsubst_spec.rb +1 -1
- data/spec/unit/functions/reverse_each_spec.rb +108 -0
- data/spec/unit/functions/step_spec.rb +113 -0
- data/spec/unit/functions/type_spec.rb +35 -0
- data/spec/unit/functions4_spec.rb +61 -5
- data/spec/unit/indirector/catalog/compiler_spec.rb +705 -4
- data/spec/unit/indirector/file_bucket_file/file_spec.rb +1 -1
- data/spec/unit/indirector/indirection_spec.rb +1 -1
- data/spec/unit/info_service_spec.rb +94 -32
- data/spec/unit/module_spec.rb +14 -0
- data/spec/unit/module_tool/applications/builder_spec.rb +4 -4
- data/spec/unit/network/authstore_spec.rb +1 -1
- data/spec/unit/network/http/connection_spec.rb +1 -0
- data/spec/unit/network/http/pool_spec.rb +30 -0
- data/spec/unit/node_spec.rb +1 -1
- data/spec/unit/parser/compiler_spec.rb +16 -0
- data/spec/unit/parser/scope_spec.rb +28 -11
- data/spec/unit/pops/evaluator/access_ops_spec.rb +3 -3
- data/spec/unit/pops/evaluator/comparison_ops_spec.rb +3 -0
- data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +7 -1
- data/spec/unit/pops/evaluator/evaluator_rspec_helper.rb +4 -4
- data/spec/unit/pops/evaluator/json_strict_literal_evaluator_spec.rb +63 -0
- data/spec/unit/pops/evaluator/runtime3_converter_spec.rb +6 -0
- data/spec/unit/pops/loaders/dependency_loader_spec.rb +53 -0
- data/spec/unit/pops/loaders/loaders_spec.rb +44 -1
- data/spec/unit/pops/parser/lexer2_spec.rb +112 -3
- data/spec/unit/pops/parser/parse_calls_spec.rb +8 -0
- data/spec/unit/pops/parser/parser_spec.rb +10 -0
- data/spec/unit/pops/parser/source_pos_adapter_spec.rb +26 -0
- data/spec/unit/pops/types/iterable_spec.rb +262 -0
- data/spec/unit/pops/types/recursion_guard_spec.rb +91 -0
- data/spec/unit/pops/types/type_acceptor_spec.rb +105 -0
- data/spec/unit/pops/types/type_asserter_spec.rb +43 -0
- data/spec/unit/pops/types/type_calculator_spec.rb +275 -373
- data/spec/unit/pops/types/type_formatter_spec.rb +280 -0
- data/spec/unit/pops/types/type_mismatch_describer_spec.rb +152 -0
- data/spec/unit/pops/types/type_parser_spec.rb +58 -13
- data/spec/unit/pops/types/types_spec.rb +241 -0
- data/spec/unit/pops/validator/validator_spec.rb +100 -43
- data/spec/unit/provider/cron/parsed_spec.rb +1 -0
- data/spec/unit/provider/macauthorization_spec.rb +5 -2
- data/spec/unit/provider/nameservice/directoryservice_spec.rb +14 -19
- data/spec/unit/provider/package/appdmg_spec.rb +3 -3
- data/spec/unit/provider/package/dnf_spec.rb +16 -0
- data/spec/unit/provider/package/pip3_spec.rb +60 -42
- data/spec/unit/provider/package/pip_spec.rb +47 -34
- data/spec/unit/provider/package/pkgdmg_spec.rb +18 -9
- data/spec/unit/provider/package/pkgng_spec.rb +4 -2
- data/spec/unit/provider/package/yum_spec.rb +11 -0
- data/spec/unit/provider/package/zypper_spec.rb +14 -0
- data/spec/unit/provider/service/launchd_spec.rb +17 -35
- data/spec/unit/provider/service/systemd_spec.rb +7 -0
- data/spec/unit/provider/sshkey/parsed_spec.rb +20 -19
- data/spec/unit/provider/user/directoryservice_spec.rb +40 -59
- data/spec/unit/resource/capability_finder_spec.rb +28 -15
- data/spec/unit/resource/catalog_spec.rb +33 -1
- data/spec/unit/resource/type_spec.rb +149 -7
- data/spec/unit/resource_spec.rb +96 -57
- data/spec/unit/settings/environment_conf_spec.rb +18 -1
- data/spec/unit/ssl/certificate_revocation_list_spec.rb +3 -3
- data/spec/unit/transaction/report_spec.rb +27 -0
- data/spec/unit/transaction/resource_harness_spec.rb +0 -47
- data/spec/unit/transaction_spec.rb +5 -0
- data/spec/unit/type/file/checksum_spec.rb +6 -0
- data/spec/unit/type/file/checksum_value_spec.rb +286 -0
- data/spec/unit/type/file/content_spec.rb +12 -193
- data/spec/unit/type/file/source_spec.rb +211 -119
- data/spec/unit/type/file_spec.rb +133 -34
- data/spec/unit/type/interface_spec.rb +32 -0
- data/spec/unit/type/macauthorization_spec.rb +4 -1
- data/spec/unit/type/yumrepo_spec.rb +2 -2
- data/spec/unit/util/filetype_spec.rb +1 -1
- data/spec/unit/util/http_proxy_spec.rb +2 -2
- data/spec/unit/util/log/destinations_spec.rb +0 -2
- data/spec/unit/util/logging_spec.rb +69 -0
- data/spec/unit/util/multi_match_spec.rb +39 -0
- data/spec/unit/util/network_device/cisco/device_spec.rb +253 -216
- data/spec/unit/util/network_device/transport/telnet_spec.rb +60 -58
- data/spec/unit/util/plist_spec.rb +110 -0
- data/spec/unit/util/resource_template_spec.rb +2 -2
- data/spec/unit/util/run_mode_spec.rb +27 -3
- data/spec/unit/util/windows/adsi_spec.rb +4 -4
- data/spec/unit/util/windows/api_types_spec.rb +42 -0
- data/spec/unit/util/windows/security_descriptor_spec.rb +3 -3
- data/spec/unit/util/windows/sid_spec.rb +1 -1
- data/spec/unit/util_spec.rb +123 -13
- data/tasks/cfpropertylist.rake +15 -0
- metadata +114 -26
- data/lib/puppet/vendor/load_plist.rb +0 -1
- data/lib/puppet/vendor/plist/CHANGELOG +0 -82
- data/lib/puppet/vendor/plist/MIT-LICENSE +0 -21
- data/lib/puppet/vendor/plist/PUPPET_README.md +0 -6
- data/lib/puppet/vendor/plist/README +0 -36
- data/lib/puppet/vendor/plist/Rakefile +0 -144
- data/lib/puppet/vendor/plist/docs/USAGE +0 -104
- data/lib/puppet/vendor/plist/docs/jamis-template.rb +0 -591
- data/lib/puppet/vendor/plist/lib/plist.rb +0 -22
- data/lib/puppet/vendor/plist/lib/plist/generator.rb +0 -224
- data/lib/puppet/vendor/plist/lib/plist/parser.rb +0 -225
- data/lib/puppet/vendor/plist/test/assets/AlbumData.xml +0 -203
- data/lib/puppet/vendor/plist/test/assets/Cookies.plist +0 -104
- data/lib/puppet/vendor/plist/test/assets/commented.plist +0 -9
- data/lib/puppet/vendor/plist/test/assets/example_data.bin +0 -0
- data/lib/puppet/vendor/plist/test/assets/example_data.jpg +0 -0
- data/lib/puppet/vendor/plist/test/assets/example_data.plist +0 -259
- data/lib/puppet/vendor/plist/test/assets/test_data_elements.plist +0 -24
- data/lib/puppet/vendor/plist/test/assets/test_empty_key.plist +0 -13
- data/lib/puppet/vendor/plist/test/test_data_elements.rb +0 -115
- data/lib/puppet/vendor/plist/test/test_generator.rb +0 -59
- data/lib/puppet/vendor/plist/test/test_generator_basic_types.rb +0 -58
- data/lib/puppet/vendor/plist/test/test_generator_collections.rb +0 -82
- data/lib/puppet/vendor/plist/test/test_parser.rb +0 -90
@@ -1,8 +1,5 @@
|
|
1
1
|
#! /usr/bin/env ruby
|
2
2
|
require 'spec_helper'
|
3
|
-
require 'puppet/network/http_pool'
|
4
|
-
|
5
|
-
require 'puppet/network/resolver'
|
6
3
|
|
7
4
|
describe Puppet::Type.type(:file).attrclass(:content), :uses_checksums => true do
|
8
5
|
include PuppetSpec::Files
|
@@ -183,6 +180,10 @@ describe Puppet::Type.type(:file).attrclass(:content), :uses_checksums => true d
|
|
183
180
|
expect(content).to be_safe_insync("{#{digest_algorithm}}" + digest("some content"))
|
184
181
|
end
|
185
182
|
|
183
|
+
it "should include the diff module" do
|
184
|
+
expect(content.respond_to?("diff")).to eq(false)
|
185
|
+
end
|
186
|
+
|
186
187
|
[true, false].product([true, false]).each do |cfg, param|
|
187
188
|
describe "and Puppet[:show_diff] is #{cfg} and show_diff => #{param}" do
|
188
189
|
before do
|
@@ -208,21 +209,21 @@ describe Puppet::Type.type(:file).attrclass(:content), :uses_checksums => true d
|
|
208
209
|
end
|
209
210
|
end
|
210
211
|
|
211
|
-
|
212
|
+
let(:saved_time) { Time.now }
|
212
213
|
[:ctime, :mtime].each do |time_stat|
|
213
|
-
[["older",
|
214
|
+
[["older", -1, false], ["same", 0, true], ["newer", 1, true]].each do
|
214
215
|
|compare, target_time, success|
|
215
216
|
describe "with #{compare} target #{time_stat} compared to source" do
|
216
217
|
before do
|
217
218
|
resource[:checksum] = time_stat
|
218
|
-
content.should = "{#{time_stat}}#{
|
219
|
+
content.should = "{#{time_stat}}#{saved_time}"
|
219
220
|
end
|
220
221
|
|
221
222
|
it "should return #{success}" do
|
222
223
|
if success
|
223
|
-
expect(content).to be_safe_insync("{#{time_stat}}#{target_time}")
|
224
|
+
expect(content).to be_safe_insync("{#{time_stat}}#{saved_time+target_time}")
|
224
225
|
else
|
225
|
-
expect(content).not_to be_safe_insync("{#{time_stat}}#{target_time}")
|
226
|
+
expect(content).not_to be_safe_insync("{#{time_stat}}#{saved_time+target_time}")
|
226
227
|
end
|
227
228
|
end
|
228
229
|
end
|
@@ -234,14 +235,14 @@ describe Puppet::Type.type(:file).attrclass(:content), :uses_checksums => true d
|
|
234
235
|
end
|
235
236
|
|
236
237
|
it "should not be insync if trying to create it" do
|
237
|
-
content.should = "{#{time_stat}}#{
|
238
|
+
content.should = "{#{time_stat}}#{saved_time}"
|
238
239
|
expect(content).not_to be_safe_insync(:absent)
|
239
240
|
end
|
240
241
|
|
241
242
|
it "should raise an error if content is not a checksum" do
|
242
243
|
content.should = "some content"
|
243
244
|
expect {
|
244
|
-
content.safe_insync?("{#{time_stat}}#{
|
245
|
+
content.safe_insync?("{#{time_stat}}#{saved_time}")
|
245
246
|
}.to raise_error(/Resource with checksum_type #{time_stat} didn't contain a date in/)
|
246
247
|
end
|
247
248
|
|
@@ -316,7 +317,7 @@ describe Puppet::Type.type(:file).attrclass(:content), :uses_checksums => true d
|
|
316
317
|
end
|
317
318
|
|
318
319
|
it "should use the file's :write method to write the content" do
|
319
|
-
resource.expects(:write).with(
|
320
|
+
resource.expects(:write).with(content)
|
320
321
|
|
321
322
|
content.sync
|
322
323
|
end
|
@@ -389,187 +390,5 @@ describe Puppet::Type.type(:file).attrclass(:content), :uses_checksums => true d
|
|
389
390
|
content.write(fh)
|
390
391
|
end
|
391
392
|
end
|
392
|
-
|
393
|
-
describe "from local source" do
|
394
|
-
let(:source_content) { "source file content\r\n"*10 }
|
395
|
-
before(:each) do
|
396
|
-
sourcename = tmpfile('source')
|
397
|
-
resource[:backup] = false
|
398
|
-
resource[:source] = sourcename
|
399
|
-
|
400
|
-
File.open(sourcename, 'wb') {|f| f.write source_content}
|
401
|
-
|
402
|
-
# This needs to be invoked to properly initialize the content property,
|
403
|
-
# or attempting to write a file will fail.
|
404
|
-
resource.newattr(:content)
|
405
|
-
end
|
406
|
-
|
407
|
-
it "should copy content from the source to the file" do
|
408
|
-
source = resource.parameter(:source)
|
409
|
-
resource.write(source)
|
410
|
-
|
411
|
-
expect(Puppet::FileSystem.binread(filename)).to eq(source_content)
|
412
|
-
end
|
413
|
-
|
414
|
-
with_digest_algorithms do
|
415
|
-
it "should return the checksum computed" do
|
416
|
-
File.open(filename, 'wb') do |file|
|
417
|
-
resource[:checksum] = digest_algorithm
|
418
|
-
expect(content.write(file)).to eq("{#{digest_algorithm}}#{digest(source_content)}")
|
419
|
-
end
|
420
|
-
end
|
421
|
-
end
|
422
|
-
end
|
423
|
-
|
424
|
-
describe 'from remote source' do
|
425
|
-
let(:source_content) { "source file content\n"*10 }
|
426
|
-
let(:source) { resource.newattr(:source) }
|
427
|
-
let(:response) { stub_everything('response') }
|
428
|
-
let(:conn) { mock('connection') }
|
429
|
-
|
430
|
-
before(:each) do
|
431
|
-
resource[:backup] = false
|
432
|
-
# This needs to be invoked to properly initialize the content property,
|
433
|
-
# or attempting to write a file will fail.
|
434
|
-
resource.newattr(:content)
|
435
|
-
|
436
|
-
response.stubs(:read_body).multiple_yields(*source_content.lines)
|
437
|
-
conn.stubs(:request_get).yields(response)
|
438
|
-
end
|
439
|
-
|
440
|
-
it 'should use an explicit fileserver if source starts with puppet://' do
|
441
|
-
response.stubs(:code).returns('200')
|
442
|
-
source.stubs(:metadata).returns stub_everything('metadata', :source => 'puppet://somehostname/test/foo', :ftype => 'file')
|
443
|
-
Puppet::Network::HttpPool.expects(:http_instance).with('somehostname', anything).returns(conn)
|
444
|
-
|
445
|
-
resource.write(source)
|
446
|
-
end
|
447
|
-
|
448
|
-
it 'should use the default fileserver if source starts with puppet:///' do
|
449
|
-
response.stubs(:code).returns('200')
|
450
|
-
source.stubs(:metadata).returns stub_everything('metadata', :source => 'puppet:///test/foo', :ftype => 'file')
|
451
|
-
Puppet::Network::HttpPool.expects(:http_instance).with(Puppet.settings[:server], anything).returns(conn)
|
452
|
-
|
453
|
-
resource.write(source)
|
454
|
-
end
|
455
|
-
|
456
|
-
it 'should percent encode reserved characters' do
|
457
|
-
response.stubs(:code).returns('200')
|
458
|
-
Puppet::Network::HttpPool.stubs(:http_instance).returns(conn)
|
459
|
-
source.stubs(:metadata).returns stub_everything('metadata', :source => 'puppet:///test/foo bar', :ftype => 'file')
|
460
|
-
|
461
|
-
conn.unstub(:request_get)
|
462
|
-
conn.expects(:request_get).with("#{Puppet::Network::HTTP::MASTER_URL_PREFIX}/v3/file_content/test/foo%20bar?environment=testing&", anything).yields(response)
|
463
|
-
|
464
|
-
resource.write(source)
|
465
|
-
end
|
466
|
-
|
467
|
-
describe 'when handling file_content responses' do
|
468
|
-
before(:each) do
|
469
|
-
Puppet::Network::HttpPool.stubs(:http_instance).returns(conn)
|
470
|
-
source.stubs(:metadata).returns stub_everything('metadata', :source => 'puppet:///test/foo', :ftype => 'file')
|
471
|
-
end
|
472
|
-
|
473
|
-
it 'should not write anything if source is not found' do
|
474
|
-
response.stubs(:code).returns('404')
|
475
|
-
|
476
|
-
expect { resource.write(source) }.to raise_error(Net::HTTPError, /404/)
|
477
|
-
expect(File.read(filename)).to eq('initial file content')
|
478
|
-
end
|
479
|
-
|
480
|
-
it 'should raise an HTTP error in case of server error' do
|
481
|
-
response.stubs(:code).returns('500')
|
482
|
-
|
483
|
-
expect { resource.write(source) }.to raise_error(Net::HTTPError, /500/)
|
484
|
-
end
|
485
|
-
|
486
|
-
context 'and the request was successful' do
|
487
|
-
before(:each) { response.stubs(:code).returns '200' }
|
488
|
-
|
489
|
-
it 'should write the contents to the file' do
|
490
|
-
resource.write(source)
|
491
|
-
expect(Puppet::FileSystem.binread(filename)).to eq(source_content)
|
492
|
-
end
|
493
|
-
|
494
|
-
with_digest_algorithms do
|
495
|
-
it 'should return the checksum computed' do
|
496
|
-
File.open(filename, 'w') do |file|
|
497
|
-
resource[:checksum] = digest_algorithm
|
498
|
-
expect(content.write(file)).to eq("{#{digest_algorithm}}#{digest(source_content)}")
|
499
|
-
end
|
500
|
-
end
|
501
|
-
end
|
502
|
-
|
503
|
-
end
|
504
|
-
|
505
|
-
end
|
506
|
-
end
|
507
|
-
|
508
|
-
# These are testing the implementation rather than the desired behaviour; while that bites, there are a whole
|
509
|
-
# pile of other methods in the File type that depend on intimate details of this implementation and vice-versa.
|
510
|
-
# If these blow up, you are gonna have to review the callers to make sure they don't explode! --daniel 2011-02-01
|
511
|
-
describe "each_chunk_from should work" do
|
512
|
-
|
513
|
-
it "when content is a string" do
|
514
|
-
content.each_chunk_from('i_am_a_string') { |chunk| expect(chunk).to eq('i_am_a_string') }
|
515
|
-
end
|
516
|
-
|
517
|
-
# The following manifest is a case where source and content.should are both set
|
518
|
-
# file { "/tmp/mydir" :
|
519
|
-
# source => '/tmp/sourcedir',
|
520
|
-
# recurse => true,
|
521
|
-
# }
|
522
|
-
it "when content checksum comes from source" do
|
523
|
-
source_param = Puppet::Type.type(:file).attrclass(:source)
|
524
|
-
source = source_param.new(:resource => resource)
|
525
|
-
content.should = "{md5}123abcd"
|
526
|
-
|
527
|
-
content.expects(:chunk_file_from_source).returns('from_source')
|
528
|
-
content.each_chunk_from(source) { |chunk| expect(chunk).to eq('from_source') }
|
529
|
-
end
|
530
|
-
|
531
|
-
it "when no content, source, but ensure present" do
|
532
|
-
resource[:ensure] = :present
|
533
|
-
content.each_chunk_from(nil) { |chunk| expect(chunk).to eq('') }
|
534
|
-
end
|
535
|
-
|
536
|
-
# you might do this if you were just auditing
|
537
|
-
it "when no content, source, but ensure file" do
|
538
|
-
resource[:ensure] = :file
|
539
|
-
content.each_chunk_from(nil) { |chunk| expect(chunk).to eq('') }
|
540
|
-
end
|
541
|
-
|
542
|
-
it "when source_or_content is nil and content not a checksum" do
|
543
|
-
content.each_chunk_from(nil) { |chunk| expect(chunk).to eq('') }
|
544
|
-
end
|
545
|
-
|
546
|
-
# the content is munged so that if it's a checksum nil gets passed in
|
547
|
-
it "when content is a checksum it should try to read from filebucket" do
|
548
|
-
content.should = "{md5}123abcd"
|
549
|
-
content.expects(:read_file_from_filebucket).once.returns('im_a_filebucket')
|
550
|
-
content.each_chunk_from(nil) { |chunk| expect(chunk).to eq('im_a_filebucket') }
|
551
|
-
end
|
552
|
-
|
553
|
-
it "when running as puppet apply" do
|
554
|
-
Puppet[:default_file_terminus] = "file_server"
|
555
|
-
source_or_content = stubs('source_or_content')
|
556
|
-
source_or_content.expects(:content).once.returns :whoo
|
557
|
-
content.each_chunk_from(source_or_content) { |chunk| expect(chunk).to eq(:whoo) }
|
558
|
-
end
|
559
|
-
|
560
|
-
it "when running from source with a local file" do
|
561
|
-
source_or_content = stubs('source_or_content')
|
562
|
-
source_or_content.expects(:local?).returns true
|
563
|
-
content.expects(:chunk_file_from_disk).with(source_or_content).once.yields 'woot'
|
564
|
-
content.each_chunk_from(source_or_content) { |chunk| expect(chunk).to eq('woot') }
|
565
|
-
end
|
566
|
-
|
567
|
-
it "when running from source with a remote file" do
|
568
|
-
source_or_content = stubs('source_or_content')
|
569
|
-
source_or_content.expects(:local?).returns false
|
570
|
-
content.expects(:chunk_file_from_source).with(source_or_content).once.yields 'woot'
|
571
|
-
content.each_chunk_from(source_or_content) { |chunk| expect(chunk).to eq('woot') }
|
572
|
-
end
|
573
|
-
end
|
574
393
|
end
|
575
394
|
end
|
@@ -1,10 +1,12 @@
|
|
1
1
|
#! /usr/bin/env ruby
|
2
2
|
require 'spec_helper'
|
3
3
|
require 'uri'
|
4
|
+
require 'puppet/network/http_pool'
|
5
|
+
#require 'puppet/network/resolver'
|
4
6
|
|
5
|
-
|
6
|
-
describe Puppet::Type.type(:file).attrclass(:source) do
|
7
|
+
describe Puppet::Type.type(:file).attrclass(:source), :uses_checksums => true do
|
7
8
|
include PuppetSpec::Files
|
9
|
+
include_context 'with supported checksum types'
|
8
10
|
|
9
11
|
around :each do |example|
|
10
12
|
Puppet.override(:environments => Puppet::Environments::Static.new) do
|
@@ -12,10 +14,12 @@ describe Puppet::Type.type(:file).attrclass(:source) do
|
|
12
14
|
end
|
13
15
|
end
|
14
16
|
|
17
|
+
let(:filename) { tmpfile('file_source_validate') }
|
18
|
+
let(:environment) { Puppet::Node::Environment.remote("myenv") }
|
19
|
+
let(:catalog) { Puppet::Resource::Catalog.new(:test, environment) }
|
20
|
+
let(:resource) { Puppet::Type.type(:file).new :path => filename, :catalog => catalog }
|
21
|
+
|
15
22
|
before do
|
16
|
-
# Wow that's a messy interface to the resource.
|
17
|
-
@environment = Puppet::Node::Environment.remote("myenv")
|
18
|
-
@resource = stub 'resource', :[]= => nil, :property => nil, :catalog => Puppet::Resource::Catalog.new(nil, @environment), :line => 0, :file => ''
|
19
23
|
@foobar = make_absolute("/foo/bar baz")
|
20
24
|
@feebooz = make_absolute("/fee/booz baz")
|
21
25
|
|
@@ -24,13 +28,10 @@ describe Puppet::Type.type(:file).attrclass(:source) do
|
|
24
28
|
end
|
25
29
|
|
26
30
|
it "should be a subclass of Parameter" do
|
27
|
-
expect(
|
31
|
+
expect(described_class.superclass).to eq(Puppet::Parameter)
|
28
32
|
end
|
29
33
|
|
30
34
|
describe "#validate" do
|
31
|
-
let(:path) { tmpfile('file_source_validate') }
|
32
|
-
let(:resource) { Puppet::Type.type(:file).new(:path => path) }
|
33
|
-
|
34
35
|
it "should fail if the set values are not URLs" do
|
35
36
|
URI.expects(:parse).with('foo').raises RuntimeError
|
36
37
|
|
@@ -38,7 +39,7 @@ describe Puppet::Type.type(:file).attrclass(:source) do
|
|
38
39
|
end
|
39
40
|
|
40
41
|
it "should fail if the URI is not a local file, file URI, or puppet URI" do
|
41
|
-
expect(lambda { resource[:source] = %w{
|
42
|
+
expect(lambda { resource[:source] = %w{ftp://foo/bar} }).to raise_error(Puppet::Error, /Cannot use URLs of type 'ftp' as source for fileserving/)
|
42
43
|
end
|
43
44
|
|
44
45
|
it "should strip trailing forward slashes", :unless => Puppet.features.microsoft_windows? do
|
@@ -80,12 +81,9 @@ describe Puppet::Type.type(:file).attrclass(:source) do
|
|
80
81
|
end
|
81
82
|
|
82
83
|
describe "#munge" do
|
83
|
-
let(:path) { tmpfile('file_source_munge') }
|
84
|
-
let(:resource) { Puppet::Type.type(:file).new(:path => path) }
|
85
|
-
|
86
84
|
it "should prefix file scheme to absolute paths" do
|
87
|
-
resource[:source] =
|
88
|
-
expect(resource[:source]).to eq([URI.unescape(Puppet::Util.path_to_uri(
|
85
|
+
resource[:source] = filename
|
86
|
+
expect(resource[:source]).to eq([URI.unescape(Puppet::Util.path_to_uri(filename).to_s)])
|
89
87
|
end
|
90
88
|
|
91
89
|
%w[file puppet].each do |scheme|
|
@@ -99,27 +97,27 @@ describe Puppet::Type.type(:file).attrclass(:source) do
|
|
99
97
|
describe "when returning the metadata" do
|
100
98
|
before do
|
101
99
|
@metadata = stub 'metadata', :source= => nil
|
102
|
-
|
103
|
-
|
104
|
-
|
100
|
+
resource.stubs(:[]).with(:links).returns :manage
|
101
|
+
resource.stubs(:[]).with(:source_permissions).returns :use
|
102
|
+
resource.stubs(:[]).with(:checksum).returns :checksum
|
105
103
|
end
|
106
104
|
|
107
105
|
it "should return already-available metadata" do
|
108
|
-
@source =
|
106
|
+
@source = described_class.new(:resource => resource)
|
109
107
|
@source.metadata = "foo"
|
110
108
|
expect(@source.metadata).to eq("foo")
|
111
109
|
end
|
112
110
|
|
113
111
|
it "should return nil if no @should value is set and no metadata is available" do
|
114
|
-
@source =
|
112
|
+
@source = described_class.new(:resource => resource)
|
115
113
|
expect(@source.metadata).to be_nil
|
116
114
|
end
|
117
115
|
|
118
116
|
it "should collect its metadata using the Metadata class if it is not already set" do
|
119
|
-
@source =
|
117
|
+
@source = described_class.new(:resource => resource, :value => @foobar)
|
120
118
|
Puppet::FileServing::Metadata.indirection.expects(:find).with do |uri, options|
|
121
119
|
expect(uri).to eq @foobar_uri
|
122
|
-
expect(options[:environment]).to eq
|
120
|
+
expect(options[:environment]).to eq environment
|
123
121
|
expect(options[:links]).to eq :manage
|
124
122
|
expect(options[:checksum_type]).to eq :checksum
|
125
123
|
end.returns @metadata
|
@@ -129,9 +127,9 @@ describe Puppet::Type.type(:file).attrclass(:source) do
|
|
129
127
|
|
130
128
|
it "should use the metadata from the first found source" do
|
131
129
|
metadata = stub 'metadata', :source= => nil
|
132
|
-
@source =
|
130
|
+
@source = described_class.new(:resource => resource, :value => [@foobar, @feebooz])
|
133
131
|
options = {
|
134
|
-
:environment =>
|
132
|
+
:environment => environment,
|
135
133
|
:links => :manage,
|
136
134
|
:source_permissions => :use,
|
137
135
|
:checksum_type => :checksum
|
@@ -143,10 +141,10 @@ describe Puppet::Type.type(:file).attrclass(:source) do
|
|
143
141
|
|
144
142
|
it "should store the found source as the metadata's source" do
|
145
143
|
metadata = mock 'metadata'
|
146
|
-
@source =
|
144
|
+
@source = described_class.new(:resource => resource, :value => @foobar)
|
147
145
|
Puppet::FileServing::Metadata.indirection.expects(:find).with do |uri, options|
|
148
146
|
expect(uri).to eq @foobar_uri
|
149
|
-
expect(options[:environment]).to eq
|
147
|
+
expect(options[:environment]).to eq environment
|
150
148
|
expect(options[:links]).to eq :manage
|
151
149
|
expect(options[:checksum_type]).to eq :checksum
|
152
150
|
end.returns metadata
|
@@ -156,10 +154,10 @@ describe Puppet::Type.type(:file).attrclass(:source) do
|
|
156
154
|
end
|
157
155
|
|
158
156
|
it "should fail intelligently if an exception is encountered while querying for metadata" do
|
159
|
-
@source =
|
157
|
+
@source = described_class.new(:resource => resource, :value => @foobar)
|
160
158
|
Puppet::FileServing::Metadata.indirection.expects(:find).with do |uri, options|
|
161
159
|
expect(uri).to eq @foobar_uri
|
162
|
-
expect(options[:environment]).to eq
|
160
|
+
expect(options[:environment]).to eq environment
|
163
161
|
expect(options[:links]).to eq :manage
|
164
162
|
expect(options[:checksum_type]).to eq :checksum
|
165
163
|
end.raises RuntimeError
|
@@ -169,10 +167,10 @@ describe Puppet::Type.type(:file).attrclass(:source) do
|
|
169
167
|
end
|
170
168
|
|
171
169
|
it "should fail if no specified sources can be found" do
|
172
|
-
@source =
|
170
|
+
@source = described_class.new(:resource => resource, :value => @foobar)
|
173
171
|
Puppet::FileServing::Metadata.indirection.expects(:find).with do |uri, options|
|
174
172
|
expect(uri).to eq @foobar_uri
|
175
|
-
expect(options[:environment]).to eq
|
173
|
+
expect(options[:environment]).to eq environment
|
176
174
|
expect(options[:links]).to eq :manage
|
177
175
|
expect(options[:checksum_type]).to eq :checksum
|
178
176
|
end.returns nil
|
@@ -184,15 +182,15 @@ describe Puppet::Type.type(:file).attrclass(:source) do
|
|
184
182
|
end
|
185
183
|
|
186
184
|
it "should have a method for setting the desired values on the resource" do
|
187
|
-
expect(
|
185
|
+
expect(described_class.new(:resource => resource)).to respond_to(:copy_source_values)
|
188
186
|
end
|
189
187
|
|
190
188
|
describe "when copying the source values" do
|
191
189
|
before :each do
|
192
190
|
@resource = Puppet::Type.type(:file).new :path => @foobar
|
193
191
|
|
194
|
-
@source =
|
195
|
-
@metadata = stub 'metadata', :owner => 100, :group => 200, :mode => "173", :checksum => "{md5}asdfasdf", :ftype => "file", :source => @foobar
|
192
|
+
@source = described_class.new(:resource => @resource)
|
193
|
+
@metadata = stub 'metadata', :owner => 100, :group => 200, :mode => "173", :checksum => "{md5}asdfasdf", :checksum_type => "md5", :ftype => "file", :source => @foobar
|
196
194
|
@source.stubs(:metadata).returns @metadata
|
197
195
|
|
198
196
|
Puppet.features.stubs(:root?).returns true
|
@@ -202,7 +200,7 @@ describe Puppet::Type.type(:file).attrclass(:source) do
|
|
202
200
|
@metadata.stubs(:mode).returns 0173
|
203
201
|
@resource[:source_permissions] = :use
|
204
202
|
if Puppet::Util::Platform.windows?
|
205
|
-
expect { @source.copy_source_values }.to raise_error("
|
203
|
+
expect { @source.copy_source_values }.to raise_error("Should not have tried to use source owner/mode/group on Windows")
|
206
204
|
else
|
207
205
|
expect { @source.copy_source_values }.not_to raise_error
|
208
206
|
end
|
@@ -212,7 +210,7 @@ describe Puppet::Type.type(:file).attrclass(:source) do
|
|
212
210
|
@metadata.stubs(:mode).returns "173"
|
213
211
|
@resource[:source_permissions] = :use
|
214
212
|
if Puppet::Util::Platform.windows?
|
215
|
-
expect { @source.copy_source_values }.to raise_error("
|
213
|
+
expect { @source.copy_source_values }.to raise_error("Should not have tried to use source owner/mode/group on Windows")
|
216
214
|
else
|
217
215
|
expect { @source.copy_source_values }.not_to raise_error
|
218
216
|
end
|
@@ -248,20 +246,22 @@ describe Puppet::Type.type(:file).attrclass(:source) do
|
|
248
246
|
context "when source_permissions is `use`" do
|
249
247
|
before :each do
|
250
248
|
@resource[:source_permissions] = "use"
|
249
|
+
@resource[:checksum] = :sha256
|
251
250
|
end
|
252
251
|
|
253
|
-
it "should copy the metadata's owner, group, checksum, and mode to the resource if they are not set on the resource" do
|
252
|
+
it "should copy the metadata's owner, group, checksum, checksum_type, and mode to the resource if they are not set on the resource" do
|
254
253
|
@source.copy_source_values
|
255
254
|
|
256
255
|
expect(@resource[:owner]).to eq(100)
|
257
256
|
expect(@resource[:group]).to eq(200)
|
258
257
|
expect(@resource[:mode]).to eq("173")
|
259
258
|
|
260
|
-
# Metadata calls it checksum, we call it content.
|
259
|
+
# Metadata calls it checksum and checksum_type, we call it content and checksum.
|
261
260
|
expect(@resource[:content]).to eq(@metadata.checksum)
|
261
|
+
expect(@resource[:checksum]).to eq(@metadata.checksum_type.to_sym)
|
262
262
|
end
|
263
263
|
|
264
|
-
it "should not copy the metadata's owner, group, checksum and mode to the resource if they are already set" do
|
264
|
+
it "should not copy the metadata's owner, group, checksum, checksum_type, and mode to the resource if they are already set" do
|
265
265
|
@resource[:owner] = 1
|
266
266
|
@resource[:group] = 2
|
267
267
|
@resource[:mode] = '173'
|
@@ -273,6 +273,7 @@ describe Puppet::Type.type(:file).attrclass(:source) do
|
|
273
273
|
expect(@resource[:group]).to eq(2)
|
274
274
|
expect(@resource[:mode]).to eq('173')
|
275
275
|
expect(@resource[:content]).not_to eq(@metadata.checksum)
|
276
|
+
expect(@resource[:checksum]).not_to eq(@metadata.checksum_type.to_sym)
|
276
277
|
end
|
277
278
|
|
278
279
|
describe "and puppet is not running as root" do
|
@@ -398,67 +399,17 @@ describe Puppet::Type.type(:file).attrclass(:source) do
|
|
398
399
|
expect(@resource[:mode]).to be_nil
|
399
400
|
end
|
400
401
|
end
|
401
|
-
|
402
|
-
describe "on Windows when source_permissions is `use`" do
|
403
|
-
before :each do
|
404
|
-
Puppet.features.stubs(:microsoft_windows?).returns true
|
405
|
-
@resource[:source_permissions] = "use"
|
406
|
-
end
|
407
|
-
let(:err_message) { "Copying owner/mode/group from the" <<
|
408
|
-
" source file on Windows is not supported;" <<
|
409
|
-
" use source_permissions => ignore." }
|
410
|
-
|
411
|
-
it "should issue error when copying from remote sources" do
|
412
|
-
@source.stubs(:local?).returns false
|
413
|
-
|
414
|
-
expect { @source.copy_source_values }.to raise_error(err_message)
|
415
|
-
end
|
416
|
-
|
417
|
-
it "should issue error when copying from local sources" do
|
418
|
-
@source.stubs(:local?).returns true
|
419
|
-
|
420
|
-
expect { @source.copy_source_values }.to raise_error(err_message)
|
421
|
-
end
|
422
|
-
|
423
|
-
it "should issue error when copying metadata from remote sources if only user is unspecified" do
|
424
|
-
@source.stubs(:local?).returns false
|
425
|
-
@resource[:group] = 2
|
426
|
-
@resource[:mode] = "0003"
|
427
|
-
|
428
|
-
expect { @source.copy_source_values }.to raise_error(err_message)
|
429
|
-
end
|
430
|
-
|
431
|
-
it "should issue error when copying metadata from remote sources if only group is unspecified" do
|
432
|
-
@source.stubs(:local?).returns false
|
433
|
-
@resource[:owner] = 1
|
434
|
-
@resource[:mode] = "0003"
|
435
|
-
|
436
|
-
expect { @source.copy_source_values }.to raise_error(err_message)
|
437
|
-
end
|
438
|
-
|
439
|
-
it "should issue error when copying metadata from remote sources if only mode is unspecified" do
|
440
|
-
@source.stubs(:local?).returns false
|
441
|
-
@resource[:owner] = 1
|
442
|
-
@resource[:group] = 2
|
443
|
-
|
444
|
-
expect { @source.copy_source_values }.to raise_error(err_message)
|
445
|
-
end
|
446
|
-
|
447
|
-
it "should not issue error when copying metadata from remote sources if group, owner, and mode are all specified" do
|
448
|
-
@source.stubs(:local?).returns false
|
449
|
-
@resource[:owner] = 1
|
450
|
-
@resource[:group] = 2
|
451
|
-
@resource[:mode] = "0003"
|
452
|
-
|
453
|
-
expect { @source.copy_source_values }.not_to raise_error
|
454
|
-
end
|
455
|
-
end
|
456
402
|
end
|
457
403
|
|
458
404
|
describe "and the source is a link" do
|
405
|
+
before do
|
406
|
+
Puppet.features.stubs(:microsoft_windows?).returns false
|
407
|
+
end
|
408
|
+
|
459
409
|
it "should set the target to the link destination" do
|
460
410
|
@metadata.stubs(:ftype).returns "link"
|
461
411
|
@metadata.stubs(:links).returns "manage"
|
412
|
+
@metadata.stubs(:checksum_type).returns nil
|
462
413
|
@resource.stubs(:[])
|
463
414
|
@resource.stubs(:[]=)
|
464
415
|
|
@@ -471,7 +422,7 @@ describe Puppet::Type.type(:file).attrclass(:source) do
|
|
471
422
|
end
|
472
423
|
|
473
424
|
it "should have a local? method" do
|
474
|
-
expect(
|
425
|
+
expect(described_class.new(:resource => resource)).to be_respond_to(:local?)
|
475
426
|
end
|
476
427
|
|
477
428
|
context "when accessing source properties" do
|
@@ -520,45 +471,186 @@ describe Puppet::Type.type(:file).attrclass(:source) do
|
|
520
471
|
end
|
521
472
|
end
|
522
473
|
|
523
|
-
|
524
|
-
|
525
|
-
|
474
|
+
%w{puppet http}.each do |scheme|
|
475
|
+
describe "for remote (#{scheme}) sources" do
|
476
|
+
let(:sourcepath) { "/path/to/source" }
|
477
|
+
let(:uri) { URI::Generic.build(:scheme => scheme, :host => 'server', :port => 8192, :path => sourcepath).to_s }
|
478
|
+
|
479
|
+
before(:each) do
|
480
|
+
metadata = Puppet::FileServing::Metadata.new(path, :source => uri, 'type' => 'file')
|
481
|
+
#metadata = stub('remote', :ftype => "file", :source => uri)
|
482
|
+
Puppet::FileServing::Metadata.indirection.stubs(:find).
|
483
|
+
with(uri,all_of(has_key(:environment), has_key(:links))).returns metadata
|
484
|
+
Puppet::FileServing::Metadata.indirection.stubs(:find).
|
485
|
+
with(uri,all_of(has_key(:environment), has_key(:links))).returns metadata
|
486
|
+
resource[:source] = uri
|
487
|
+
end
|
488
|
+
|
489
|
+
it "should not be local" do
|
490
|
+
expect(resource.parameter(:source)).not_to be_local
|
491
|
+
end
|
492
|
+
|
493
|
+
it "should be able to return the metadata source full path" do
|
494
|
+
expect(resource.parameter(:source).full_path).to eq("/path/to/source")
|
495
|
+
end
|
496
|
+
|
497
|
+
it "should be able to return the source server" do
|
498
|
+
expect(resource.parameter(:source).server).to eq("server")
|
499
|
+
end
|
500
|
+
|
501
|
+
it "should be able to return the source port" do
|
502
|
+
expect(resource.parameter(:source).port).to eq(8192)
|
503
|
+
end
|
504
|
+
|
505
|
+
if scheme == 'puppet'
|
506
|
+
describe "which don't specify server or port" do
|
507
|
+
let(:uri) { "puppet:///path/to/source" }
|
508
|
+
|
509
|
+
it "should return the default source server" do
|
510
|
+
Puppet[:server] = "myserver"
|
511
|
+
expect(resource.parameter(:source).server).to eq("myserver")
|
512
|
+
end
|
513
|
+
|
514
|
+
it "should return the default source port" do
|
515
|
+
Puppet[:masterport] = 1234
|
516
|
+
expect(resource.parameter(:source).port).to eq(1234)
|
517
|
+
end
|
518
|
+
end
|
519
|
+
end
|
520
|
+
end
|
521
|
+
end
|
522
|
+
end
|
523
|
+
|
524
|
+
describe "when writing" do
|
525
|
+
describe "as puppet apply" do
|
526
|
+
let(:source_content) { "source file content\r\n"*10 }
|
527
|
+
before do
|
528
|
+
Puppet[:default_file_terminus] = "file_server"
|
529
|
+
resource[:source] = file_containing('apply', source_content)
|
530
|
+
end
|
531
|
+
|
532
|
+
it "should copy content from the source to the file" do
|
533
|
+
source = resource.parameter(:source)
|
534
|
+
resource.write(source)
|
535
|
+
|
536
|
+
expect(Puppet::FileSystem.binread(filename)).to eq(source_content)
|
537
|
+
end
|
538
|
+
|
539
|
+
with_digest_algorithms do
|
540
|
+
it "should return the checksum computed" do
|
541
|
+
File.open(filename, 'wb') do |file|
|
542
|
+
source = resource.parameter(:source)
|
543
|
+
resource[:checksum] = digest_algorithm
|
544
|
+
expect(source.write(file)).to eq("{#{digest_algorithm}}#{digest(source_content)}")
|
545
|
+
end
|
546
|
+
end
|
547
|
+
end
|
548
|
+
end
|
549
|
+
|
550
|
+
describe "from local source" do
|
551
|
+
let(:source_content) { "source file content\r\n"*10 }
|
552
|
+
before do
|
553
|
+
resource[:backup] = false
|
554
|
+
resource[:source] = file_containing('source', source_content)
|
555
|
+
end
|
556
|
+
|
557
|
+
it "should copy content from the source to the file" do
|
558
|
+
source = resource.parameter(:source)
|
559
|
+
resource.write(source)
|
526
560
|
|
527
|
-
|
528
|
-
metadata = Puppet::FileServing::Metadata.new(path, :source => uri, 'type' => 'file')
|
529
|
-
#metadata = stub('remote', :ftype => "file", :source => uri)
|
530
|
-
Puppet::FileServing::Metadata.indirection.stubs(:find).
|
531
|
-
with(uri,all_of(has_key(:environment), has_key(:links))).returns metadata
|
532
|
-
resource[:source] = uri
|
561
|
+
expect(Puppet::FileSystem.binread(filename)).to eq(source_content)
|
533
562
|
end
|
534
563
|
|
535
|
-
|
536
|
-
|
564
|
+
with_digest_algorithms do
|
565
|
+
it "should return the checksum computed" do
|
566
|
+
File.open(filename, 'wb') do |file|
|
567
|
+
source = resource.parameter(:source)
|
568
|
+
resource[:checksum] = digest_algorithm
|
569
|
+
expect(source.write(file)).to eq("{#{digest_algorithm}}#{digest(source_content)}")
|
570
|
+
end
|
571
|
+
end
|
537
572
|
end
|
573
|
+
end
|
574
|
+
|
575
|
+
describe 'from remote source' do
|
576
|
+
let(:source_content) { "source file content\n"*10 }
|
577
|
+
let(:source) { resource.newattr(:source) }
|
578
|
+
let(:response) { stub_everything('response') }
|
579
|
+
let(:conn) { mock('connection') }
|
580
|
+
|
581
|
+
before do
|
582
|
+
resource[:backup] = false
|
538
583
|
|
539
|
-
|
540
|
-
|
584
|
+
response.stubs(:read_body).multiple_yields(*source_content.lines)
|
585
|
+
conn.stubs(:request_get).yields(response)
|
541
586
|
end
|
542
587
|
|
543
|
-
it
|
544
|
-
|
588
|
+
it 'should use an explicit fileserver if source starts with puppet://' do
|
589
|
+
response.stubs(:code).returns('200')
|
590
|
+
source.stubs(:metadata).returns stub_everything('metadata', :source => 'puppet://somehostname/test/foo', :ftype => 'file')
|
591
|
+
Puppet::Network::HttpPool.expects(:http_instance).with('somehostname', anything).returns(conn)
|
592
|
+
|
593
|
+
resource.write(source)
|
545
594
|
end
|
546
595
|
|
547
|
-
it
|
548
|
-
|
596
|
+
it 'should use the default fileserver if source starts with puppet:///' do
|
597
|
+
response.stubs(:code).returns('200')
|
598
|
+
source.stubs(:metadata).returns stub_everything('metadata', :source => 'puppet:///test/foo', :ftype => 'file')
|
599
|
+
Puppet::Network::HttpPool.expects(:http_instance).with(Puppet.settings[:server], anything).returns(conn)
|
600
|
+
|
601
|
+
resource.write(source)
|
549
602
|
end
|
550
603
|
|
551
|
-
|
552
|
-
|
604
|
+
it 'should percent encode reserved characters' do
|
605
|
+
response.stubs(:code).returns('200')
|
606
|
+
Puppet::Network::HttpPool.stubs(:http_instance).returns(conn)
|
607
|
+
source.stubs(:metadata).returns stub_everything('metadata', :source => 'puppet:///test/foo bar', :ftype => 'file')
|
608
|
+
|
609
|
+
conn.unstub(:request_get)
|
610
|
+
conn.expects(:request_get).with("#{Puppet::Network::HTTP::MASTER_URL_PREFIX}/v3/file_content/test/foo%20bar?environment=myenv&", anything).yields(response)
|
553
611
|
|
554
|
-
|
555
|
-
|
556
|
-
|
612
|
+
resource.write(source)
|
613
|
+
end
|
614
|
+
|
615
|
+
describe 'when handling file_content responses' do
|
616
|
+
before do
|
617
|
+
File.open(filename, 'w') {|f| f.write "initial file content"}
|
557
618
|
end
|
558
619
|
|
559
|
-
|
560
|
-
Puppet
|
561
|
-
|
620
|
+
before(:each) do
|
621
|
+
Puppet::Network::HttpPool.stubs(:http_instance).returns(conn)
|
622
|
+
source.stubs(:metadata).returns stub_everything('metadata', :source => 'puppet:///test/foo', :ftype => 'file')
|
623
|
+
end
|
624
|
+
|
625
|
+
it 'should not write anything if source is not found' do
|
626
|
+
response.stubs(:code).returns('404')
|
627
|
+
|
628
|
+
expect { resource.write(source) }.to raise_error(Net::HTTPError, /404/)
|
629
|
+
expect(File.read(filename)).to eq('initial file content')
|
630
|
+
end
|
631
|
+
|
632
|
+
it 'should raise an HTTP error in case of server error' do
|
633
|
+
response.stubs(:code).returns('500')
|
634
|
+
|
635
|
+
expect { resource.write(source) }.to raise_error(Net::HTTPError, /500/)
|
636
|
+
end
|
637
|
+
|
638
|
+
context 'and the request was successful' do
|
639
|
+
before(:each) { response.stubs(:code).returns '200' }
|
640
|
+
|
641
|
+
it 'should write the contents to the file' do
|
642
|
+
resource.write(source)
|
643
|
+
expect(Puppet::FileSystem.binread(filename)).to eq(source_content)
|
644
|
+
end
|
645
|
+
|
646
|
+
with_digest_algorithms do
|
647
|
+
it 'should return the checksum computed' do
|
648
|
+
File.open(filename, 'w') do |file|
|
649
|
+
resource[:checksum] = digest_algorithm
|
650
|
+
expect(source.write(file)).to eq("{#{digest_algorithm}}#{digest(source_content)}")
|
651
|
+
end
|
652
|
+
end
|
653
|
+
end
|
562
654
|
end
|
563
655
|
end
|
564
656
|
end
|