puppet 6.19.0-x64-mingw32 → 6.22.1-x64-mingw32
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.
Potentially problematic release.
This version of puppet might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/CODEOWNERS +2 -16
- data/Gemfile +3 -1
- data/Gemfile.lock +50 -39
- data/ext/project_data.yaml +2 -2
- data/lib/puppet/application.rb +10 -6
- data/lib/puppet/application/agent.rb +1 -0
- data/lib/puppet/application/apply.rb +3 -2
- data/lib/puppet/application/device.rb +1 -0
- data/lib/puppet/application/filebucket.rb +2 -2
- data/lib/puppet/application/script.rb +1 -0
- data/lib/puppet/application/ssl.rb +11 -0
- data/lib/puppet/application_support.rb +7 -0
- data/lib/puppet/configurer.rb +28 -18
- data/lib/puppet/defaults.rb +46 -20
- data/lib/puppet/environments.rb +54 -55
- data/lib/puppet/face/config.rb +10 -0
- data/lib/puppet/face/epp.rb +12 -2
- data/lib/puppet/face/facts.rb +158 -0
- data/lib/puppet/ffi/posix.rb +10 -0
- data/lib/puppet/ffi/posix/constants.rb +14 -0
- data/lib/puppet/ffi/posix/functions.rb +24 -0
- data/lib/puppet/file_system/memory_file.rb +8 -1
- data/lib/puppet/file_system/windows.rb +2 -0
- data/lib/puppet/functions/epp.rb +1 -0
- data/lib/puppet/functions/inline_epp.rb +1 -0
- data/lib/puppet/functions/partition.rb +8 -0
- data/lib/puppet/indirector/fact_search.rb +60 -0
- data/lib/puppet/indirector/facts/facter.rb +24 -3
- data/lib/puppet/indirector/facts/json.rb +27 -0
- data/lib/puppet/indirector/facts/yaml.rb +3 -58
- data/lib/puppet/indirector/json.rb +5 -1
- data/lib/puppet/indirector/node/json.rb +8 -0
- data/lib/puppet/indirector/report/json.rb +34 -0
- data/lib/puppet/module_tool/applications/installer.rb +48 -2
- data/lib/puppet/module_tool/errors/shared.rb +17 -2
- data/lib/puppet/network/formats.rb +69 -1
- data/lib/puppet/network/http/factory.rb +4 -0
- data/lib/puppet/pal/pal_impl.rb +70 -17
- data/lib/puppet/parser/ast/leaf.rb +3 -2
- data/lib/puppet/parser/templatewrapper.rb +1 -1
- data/lib/puppet/pops/evaluator/deferred_resolver.rb +5 -3
- data/lib/puppet/pops/evaluator/evaluator_impl.rb +22 -3
- data/lib/puppet/pops/model/ast_transformer.rb +1 -1
- data/lib/puppet/property/list.rb +1 -1
- data/lib/puppet/provider/group/groupadd.rb +13 -8
- data/lib/puppet/provider/package/apt.rb +34 -2
- data/lib/puppet/provider/package/aptitude.rb +6 -0
- data/lib/puppet/provider/package/dnfmodule.rb +1 -1
- data/lib/puppet/provider/service/debian.rb +2 -0
- data/lib/puppet/provider/service/systemd.rb +1 -1
- data/lib/puppet/provider/user/aix.rb +2 -2
- data/lib/puppet/provider/user/useradd.rb +62 -8
- data/lib/puppet/reference/configuration.rb +6 -5
- data/lib/puppet/settings.rb +43 -15
- data/lib/puppet/settings/alias_setting.rb +37 -0
- data/lib/puppet/settings/base_setting.rb +26 -2
- data/lib/puppet/settings/environment_conf.rb +1 -0
- data/lib/puppet/type/package.rb +3 -3
- data/lib/puppet/util/autoload.rb +1 -8
- data/lib/puppet/util/fact_dif.rb +81 -0
- data/lib/puppet/util/monkey_patches.rb +7 -0
- data/lib/puppet/util/posix.rb +54 -5
- data/lib/puppet/util/rubygems.rb +5 -1
- data/lib/puppet/util/windows/adsi.rb +46 -0
- data/lib/puppet/util/windows/api_types.rb +1 -1
- data/lib/puppet/util/windows/principal.rb +9 -2
- data/lib/puppet/util/windows/service.rb +1 -1
- data/lib/puppet/util/windows/sid.rb +4 -2
- data/lib/puppet/version.rb +1 -1
- data/locales/puppet.pot +295 -219
- data/man/man5/puppet.conf.5 +15 -7
- data/man/man8/puppet-agent.8 +2 -2
- data/man/man8/puppet-apply.8 +2 -2
- data/man/man8/puppet-catalog.8 +1 -1
- data/man/man8/puppet-config.8 +1 -1
- data/man/man8/puppet-describe.8 +1 -1
- data/man/man8/puppet-device.8 +2 -2
- data/man/man8/puppet-doc.8 +1 -1
- data/man/man8/puppet-epp.8 +1 -1
- data/man/man8/puppet-facts.8 +90 -1
- data/man/man8/puppet-filebucket.8 +3 -3
- data/man/man8/puppet-generate.8 +1 -1
- data/man/man8/puppet-help.8 +1 -1
- data/man/man8/puppet-key.8 +1 -1
- data/man/man8/puppet-lookup.8 +1 -1
- data/man/man8/puppet-man.8 +1 -1
- data/man/man8/puppet-module.8 +1 -1
- data/man/man8/puppet-node.8 +4 -1
- data/man/man8/puppet-parser.8 +1 -1
- data/man/man8/puppet-plugin.8 +1 -1
- data/man/man8/puppet-report.8 +4 -1
- data/man/man8/puppet-resource.8 +1 -1
- data/man/man8/puppet-script.8 +2 -2
- data/man/man8/puppet-ssl.8 +5 -1
- data/man/man8/puppet-status.8 +1 -1
- data/man/man8/puppet.8 +2 -2
- data/spec/fixtures/integration/application/agent/cached_deferred_catalog.json +91 -0
- data/spec/fixtures/unit/provider/service/systemd/list_unit_files_services_vendor_preset +9 -0
- data/spec/fixtures/unit/provider/user/aix/aix_passwd_file.out +4 -0
- data/spec/integration/application/agent_spec.rb +160 -3
- data/spec/integration/application/apply_spec.rb +19 -0
- data/spec/integration/application/plugin_spec.rb +1 -1
- data/spec/integration/defaults_spec.rb +0 -7
- data/spec/integration/environments/setting_hooks_spec.rb +1 -1
- data/spec/integration/http/client_spec.rb +12 -0
- data/spec/integration/indirector/direct_file_server_spec.rb +1 -3
- data/spec/integration/resource/type_collection_spec.rb +2 -6
- data/spec/integration/transaction_spec.rb +4 -9
- data/spec/integration/util/windows/adsi_spec.rb +21 -1
- data/spec/integration/util/windows/principal_spec.rb +21 -0
- data/spec/integration/util/windows/registry_spec.rb +6 -10
- data/spec/lib/puppet_spec/settings.rb +6 -1
- data/spec/spec_helper.rb +12 -5
- data/spec/unit/agent_spec.rb +8 -6
- data/spec/unit/application/agent_spec.rb +0 -1
- data/spec/unit/application/config_spec.rb +224 -4
- data/spec/unit/application/facts_spec.rb +482 -3
- data/spec/unit/application/filebucket_spec.rb +0 -2
- data/spec/unit/application/ssl_spec.rb +23 -0
- data/spec/unit/application_spec.rb +51 -9
- data/spec/unit/confine/feature_spec.rb +1 -1
- data/spec/unit/confine_spec.rb +8 -2
- data/spec/unit/defaults_spec.rb +36 -1
- data/spec/unit/environments_spec.rb +221 -68
- data/spec/unit/face/config_spec.rb +27 -32
- data/spec/unit/face/facts_spec.rb +4 -0
- data/spec/unit/face/node_spec.rb +0 -11
- data/spec/unit/file_serving/configuration/parser_spec.rb +0 -1
- data/spec/unit/file_serving/metadata_spec.rb +3 -3
- data/spec/unit/file_serving/terminus_helper_spec.rb +11 -4
- data/spec/unit/file_system_spec.rb +9 -0
- data/spec/unit/forge/module_release_spec.rb +2 -7
- data/spec/unit/functions/inline_epp_spec.rb +26 -1
- data/spec/unit/http/service/compiler_spec.rb +49 -0
- data/spec/unit/http/service_spec.rb +1 -1
- data/spec/unit/indirector/face_spec.rb +0 -1
- data/spec/unit/indirector/facts/facter_spec.rb +95 -1
- data/spec/unit/indirector/facts/json_spec.rb +255 -0
- data/spec/unit/indirector/file_bucket_file/selector_spec.rb +26 -8
- data/spec/unit/indirector/indirection_spec.rb +8 -12
- data/spec/unit/indirector/key/file_spec.rb +0 -1
- data/spec/unit/indirector/node/json_spec.rb +33 -0
- data/spec/{integration/indirector/report/yaml.rb → unit/indirector/report/json_spec.rb} +13 -24
- data/spec/unit/indirector/report/yaml_spec.rb +72 -8
- data/spec/unit/indirector_spec.rb +2 -2
- data/spec/unit/module_tool/applications/installer_spec.rb +66 -0
- data/spec/unit/network/authconfig_spec.rb +0 -3
- data/spec/unit/network/formats_spec.rb +41 -0
- data/spec/unit/network/http/api/indirected_routes_spec.rb +0 -9
- data/spec/unit/network/http/factory_spec.rb +19 -0
- data/spec/unit/network/http/handler_spec.rb +0 -5
- data/spec/unit/parser/compiler_spec.rb +3 -19
- data/spec/unit/parser/resource_spec.rb +14 -8
- data/spec/unit/parser/templatewrapper_spec.rb +4 -3
- data/spec/unit/pops/evaluator/deferred_resolver_spec.rb +20 -0
- data/spec/unit/property_spec.rb +1 -0
- data/spec/unit/provider/group/groupadd_spec.rb +5 -2
- data/spec/unit/provider/nameservice_spec.rb +66 -65
- data/spec/unit/provider/package/apt_spec.rb +28 -23
- data/spec/unit/provider/package/aptitude_spec.rb +1 -1
- data/spec/unit/provider/package/base_spec.rb +6 -5
- data/spec/unit/provider/package/dnfmodule_spec.rb +10 -1
- data/spec/unit/provider/package/pacman_spec.rb +18 -12
- data/spec/unit/provider/package/pip_spec.rb +6 -11
- data/spec/unit/provider/package/pkgdmg_spec.rb +0 -4
- data/spec/unit/provider/service/systemd_spec.rb +11 -0
- data/spec/unit/provider/user/aix_spec.rb +5 -0
- data/spec/unit/provider/user/hpux_spec.rb +1 -1
- data/spec/unit/provider/user/pw_spec.rb +2 -0
- data/spec/unit/provider/user/useradd_spec.rb +71 -3
- data/spec/unit/provider_spec.rb +8 -10
- data/spec/unit/puppet_pal_catalog_spec.rb +45 -0
- data/spec/unit/resource/capability_finder_spec.rb +6 -1
- data/spec/unit/resource/catalog_spec.rb +1 -1
- data/spec/unit/resource/type_spec.rb +1 -1
- data/spec/unit/resource_spec.rb +11 -10
- data/spec/unit/settings_spec.rb +543 -228
- data/spec/unit/ssl/base_spec.rb +0 -1
- data/spec/unit/ssl/host_spec.rb +0 -5
- data/spec/unit/ssl/ssl_provider_spec.rb +14 -8
- data/spec/unit/transaction/additional_resource_generator_spec.rb +3 -7
- data/spec/unit/transaction/event_manager_spec.rb +14 -11
- data/spec/unit/transaction_spec.rb +13 -4
- data/spec/unit/type/file/content_spec.rb +0 -1
- data/spec/unit/type/file/selinux_spec.rb +0 -2
- data/spec/unit/type/file_spec.rb +0 -6
- data/spec/unit/type/group_spec.rb +13 -6
- data/spec/unit/type/resources_spec.rb +7 -7
- data/spec/unit/type/service_spec.rb +1 -1
- data/spec/unit/type/tidy_spec.rb +0 -1
- data/spec/unit/type_spec.rb +2 -2
- data/spec/unit/util/at_fork_spec.rb +2 -2
- data/spec/unit/util/autoload_spec.rb +5 -1
- data/spec/unit/util/backups_spec.rb +1 -2
- data/spec/unit/util/execution_spec.rb +15 -11
- data/spec/unit/util/inifile_spec.rb +6 -14
- data/spec/unit/util/log_spec.rb +8 -7
- data/spec/unit/util/logging_spec.rb +3 -3
- data/spec/unit/util/posix_spec.rb +363 -15
- data/spec/unit/util/rubygems_spec.rb +2 -2
- data/spec/unit/util/selinux_spec.rb +76 -52
- data/spec/unit/util/storage_spec.rb +3 -1
- data/spec/unit/util/suidmanager_spec.rb +44 -41
- data/spec/unit/util/windows/sid_spec.rb +6 -0
- data/spec/unit/util_spec.rb +13 -6
- metadata +31 -16
- data/spec/integration/application/config_spec.rb +0 -74
- data/spec/lib/matchers/include.rb +0 -27
- data/spec/lib/matchers/include_spec.rb +0 -32
- data/spec/unit/face/catalog_spec.rb +0 -6
- data/spec/unit/face/module_spec.rb +0 -3
    
        data/spec/unit/ssl/base_spec.rb
    CHANGED
    
    | @@ -47,7 +47,6 @@ describe Puppet::SSL::Certificate do | |
| 47 47 | 
             
              describe "when initializing wrapped class from a file with #read" do
         | 
| 48 48 | 
             
                it "should open the file with ASCII encoding" do
         | 
| 49 49 | 
             
                  path = '/foo/bar/cert'
         | 
| 50 | 
            -
                  allow(Puppet::SSL::Base).to receive(:valid_certname).and_return(true)
         | 
| 51 50 | 
             
                  expect(Puppet::FileSystem).to receive(:read).with(path, :encoding => Encoding::ASCII).and_return("bar")
         | 
| 52 51 | 
             
                  @base.read(path)
         | 
| 53 52 | 
             
                end
         | 
    
        data/spec/unit/ssl/host_spec.rb
    CHANGED
    
    | @@ -263,8 +263,6 @@ describe Puppet::SSL::Host, if: !Puppet::Util::Platform.jruby? do | |
| 263 263 | 
             
                end
         | 
| 264 264 |  | 
| 265 265 | 
             
                it "should send a new request to the CA for signing" do
         | 
| 266 | 
            -
                  @http = double("http")
         | 
| 267 | 
            -
                  allow(@host).to receive(:http_client).and_return(@http)
         | 
| 268 266 | 
             
                  allow(@host).to receive(:ssl_store).and_return(double("ssl store"))
         | 
| 269 267 | 
             
                  allow(@host).to receive(:key).and_return(key)
         | 
| 270 268 | 
             
                  request = double("request")
         | 
| @@ -307,7 +305,6 @@ describe Puppet::SSL::Host, if: !Puppet::Util::Platform.jruby? do | |
| 307 305 | 
             
                  Puppet[:certdir] = tmpdir('certs')
         | 
| 308 306 | 
             
                  allow(@host).to receive(:key).and_return(double("key"))
         | 
| 309 307 | 
             
                  allow(@host).to receive(:validate_certificate_with_key)
         | 
| 310 | 
            -
                  allow(@host).to receive(:http_client).and_return(@http)
         | 
| 311 308 | 
             
                  allow(@host).to receive(:ssl_store).and_return(double("ssl store"))
         | 
| 312 309 | 
             
                end
         | 
| 313 310 |  | 
| @@ -464,8 +461,6 @@ describe Puppet::SSL::Host, if: !Puppet::Util::Platform.jruby? do | |
| 464 461 | 
             
                    @revoked_cert = @pki[:revoked_root_node_cert]
         | 
| 465 462 | 
             
                    localcacert = Puppet.settings[:localcacert]
         | 
| 466 463 | 
             
                    Puppet::Util.replace_file(localcacert, 0644) {|f| f.write @pki[:ca_bundle] }
         | 
| 467 | 
            -
                    @http = double('http')
         | 
| 468 | 
            -
                    allow(@host).to receive(:http_client).and_return(@http)
         | 
| 469 464 | 
             
                  end
         | 
| 470 465 |  | 
| 471 466 | 
             
                  after do
         | 
| @@ -271,14 +271,20 @@ describe Puppet::SSL::SSLProvider do | |
| 271 271 | 
             
                end
         | 
| 272 272 |  | 
| 273 273 | 
             
                # This option is only available in openssl 1.1
         | 
| 274 | 
            -
                 | 
| 275 | 
            -
             | 
| 276 | 
            -
             | 
| 277 | 
            -
             | 
| 278 | 
            -
             | 
| 279 | 
            -
             | 
| 280 | 
            -
             | 
| 281 | 
            -
             | 
| 274 | 
            +
                # OpenSSL 1.1.1h no longer reports expired root CAs when using "verify".
         | 
| 275 | 
            +
                # This regression was fixed in 1.1.1i, so only skip this test if we're on
         | 
| 276 | 
            +
                # the affected version.
         | 
| 277 | 
            +
                # See: https://github.com/openssl/openssl/pull/13585
         | 
| 278 | 
            +
                if Puppet::Util::Package.versioncmp(OpenSSL::OPENSSL_LIBRARY_VERSION.split[1], '1.1.1h') != 0
         | 
| 279 | 
            +
                  it 'raises if root cert signature is invalid', if: defined?(OpenSSL::X509::V_FLAG_CHECK_SS_SIGNATURE) do
         | 
| 280 | 
            +
                    ca = global_cacerts.first
         | 
| 281 | 
            +
                    ca.sign(wrong_key, OpenSSL::Digest::SHA256.new)
         | 
| 282 | 
            +
             | 
| 283 | 
            +
                    expect {
         | 
| 284 | 
            +
                      subject.create_context(**config.merge(cacerts: global_cacerts))
         | 
| 285 | 
            +
                    }.to raise_error(Puppet::SSL::CertVerifyError,
         | 
| 286 | 
            +
                                     "Invalid signature for certificate 'CN=Test CA'")
         | 
| 287 | 
            +
                  end
         | 
| 282 288 | 
             
                end
         | 
| 283 289 |  | 
| 284 290 | 
             
                it 'raises if intermediate CA signature is invalid' do
         | 
| @@ -33,10 +33,6 @@ describe Puppet::Transaction::AdditionalResourceGenerator do | |
| 33 33 |  | 
| 34 34 | 
             
                  newparam(:code)
         | 
| 35 35 |  | 
| 36 | 
            -
                  def respond_to?(method_name)
         | 
| 37 | 
            -
                    method_name == self[:kind] || super
         | 
| 38 | 
            -
                  end
         | 
| 39 | 
            -
             | 
| 40 36 | 
             
                  def eval_generate
         | 
| 41 37 | 
             
                    eval_code
         | 
| 42 38 | 
             
                  end
         | 
| @@ -314,13 +310,13 @@ describe Puppet::Transaction::AdditionalResourceGenerator do | |
| 314 310 |  | 
| 315 311 | 
             
                it "sets resources_failed_to_generate to true if resource#eval_generate raises an exception" do
         | 
| 316 312 | 
             
                  catalog = compile_to_ral(<<-MANIFEST)
         | 
| 317 | 
            -
                     | 
| 313 | 
            +
                    generator { thing: }
         | 
| 318 314 | 
             
                  MANIFEST
         | 
| 319 315 |  | 
| 320 | 
            -
                  allow(catalog.resource(" | 
| 316 | 
            +
                  allow(catalog.resource("Generator[thing]")).to receive(:eval_generate).and_raise(RuntimeError)
         | 
| 321 317 | 
             
                  relationship_graph = relationship_graph_for(catalog)
         | 
| 322 318 | 
             
                  generator = Puppet::Transaction::AdditionalResourceGenerator.new(catalog, relationship_graph, prioritizer)
         | 
| 323 | 
            -
                  generator.eval_generate(catalog.resource(" | 
| 319 | 
            +
                  generator.eval_generate(catalog.resource("Generator[thing]"))
         | 
| 324 320 |  | 
| 325 321 | 
             
                  expect(generator.resources_failed_to_generate).to be_truthy
         | 
| 326 322 | 
             
                end
         | 
| @@ -152,6 +152,9 @@ describe Puppet::Transaction::EventManager do | |
| 152 152 |  | 
| 153 153 | 
             
                  @resource = Puppet::Type.type(:file).new :path => make_absolute("/my/file")
         | 
| 154 154 | 
             
                  @event = Puppet::Transaction::Event.new(:name => :event, :resource => @resource)
         | 
| 155 | 
            +
             | 
| 156 | 
            +
                  @resource.class.send(:define_method, :callback1) {}
         | 
| 157 | 
            +
                  @resource.class.send(:define_method, :callback2) {}
         | 
| 155 158 | 
             
                end
         | 
| 156 159 |  | 
| 157 160 | 
             
                it "should call the required callback once for each set of associated events" do
         | 
| @@ -178,7 +181,7 @@ describe Puppet::Transaction::EventManager do | |
| 178 181 |  | 
| 179 182 | 
             
                  allow(@resource).to receive(:callback1)
         | 
| 180 183 |  | 
| 181 | 
            -
                  @manager.process_events(@resource) | 
| 184 | 
            +
                  @manager.process_events(@resource)
         | 
| 182 185 |  | 
| 183 186 | 
             
                  expect(@transaction.resource_status(@resource).events.length).to eq(1)
         | 
| 184 187 | 
             
                end
         | 
| @@ -211,9 +214,11 @@ describe Puppet::Transaction::EventManager do | |
| 211 214 | 
             
                    @event2 = Puppet::Transaction::Event.new(:name => :event, :resource => @resource)
         | 
| 212 215 | 
             
                    @event2.status = "success"
         | 
| 213 216 | 
             
                    expect(@manager).to receive(:queued_events).with(@resource).and_yield(:callback1, [@event, @event2])
         | 
| 217 | 
            +
                    @resource.class.send(:define_method, :callback1) {}
         | 
| 214 218 | 
             
                  end
         | 
| 215 219 |  | 
| 216 220 | 
             
                  it "should call the callback" do
         | 
| 221 | 
            +
             | 
| 217 222 | 
             
                    expect(@resource).to receive(:callback1)
         | 
| 218 223 |  | 
| 219 224 | 
             
                    @manager.process_events(@resource)
         | 
| @@ -225,6 +230,7 @@ describe Puppet::Transaction::EventManager do | |
| 225 230 | 
             
                    allow(@event).to receive(:status).and_return("noop")
         | 
| 226 231 | 
             
                    allow(@resource).to receive(:event).and_return(Puppet::Transaction::Event.new)
         | 
| 227 232 | 
             
                    expect(@manager).to receive(:queued_events).with(@resource).and_yield(:callback1, [@event])
         | 
| 233 | 
            +
                    @resource.class.send(:define_method, :callback1) {}
         | 
| 228 234 | 
             
                  end
         | 
| 229 235 |  | 
| 230 236 | 
             
                  it "should log" do
         | 
| @@ -254,6 +260,7 @@ describe Puppet::Transaction::EventManager do | |
| 254 260 | 
             
                    allow(@resource).to receive(:event).and_return(Puppet::Transaction::Event.new)
         | 
| 255 261 | 
             
                    allow(@resource).to receive(:noop?).and_return(true)
         | 
| 256 262 | 
             
                    expect(@manager).to receive(:queued_events).with(@resource).and_yield(:callback1, [@event])
         | 
| 263 | 
            +
                    @resource.class.send(:define_method, :callback1) {}
         | 
| 257 264 | 
             
                  end
         | 
| 258 265 |  | 
| 259 266 | 
             
                  it "should log" do
         | 
| @@ -279,7 +286,7 @@ describe Puppet::Transaction::EventManager do | |
| 279 286 |  | 
| 280 287 | 
             
                describe "and the callback fails" do
         | 
| 281 288 | 
             
                  before do
         | 
| 282 | 
            -
                     | 
| 289 | 
            +
                    @resource.class.send(:define_method, :callback1) { raise "a failure" }
         | 
| 283 290 |  | 
| 284 291 | 
             
                    expect(@manager).to receive(:queued_events).and_yield(:callback1, [@event])
         | 
| 285 292 | 
             
                  end
         | 
| @@ -323,16 +330,12 @@ describe Puppet::Transaction::EventManager do | |
| 323 330 |  | 
| 324 331 | 
             
              describe "when queueing then processing events for a given resource" do
         | 
| 325 332 | 
             
                before do
         | 
| 326 | 
            -
                  @ | 
| 327 | 
            -
                  @ | 
| 333 | 
            +
                  @catalog = Puppet::Resource::Catalog.new
         | 
| 334 | 
            +
                  @target = Puppet::Type.type(:exec).new(name: 'target', path: ENV['PATH'])
         | 
| 335 | 
            +
                  @resource = Puppet::Type.type(:exec).new(name: 'resource', path: ENV['PATH'], notify: @target)
         | 
| 336 | 
            +
                  @catalog.add_resource(@resource, @target)
         | 
| 328 337 |  | 
| 329 | 
            -
                  @ | 
| 330 | 
            -
                  @target = Puppet::Type.type(:file).new :path => make_absolute("/your/file")
         | 
| 331 | 
            -
             | 
| 332 | 
            -
                  @graph = allow('graph')
         | 
| 333 | 
            -
                  allow(@graph).to receive(:matching_edges).and_return([])
         | 
| 334 | 
            -
                  allow(@graph).to receive(:matching_edges).with(anything, @resource).and_return([double('edge', :target => @target, :callback => :refresh)])
         | 
| 335 | 
            -
                  allow(@manager).to receive(:relationship_graph).and_return(@graph)
         | 
| 338 | 
            +
                  @manager = Puppet::Transaction::EventManager.new(Puppet::Transaction.new(@catalog, nil, nil))
         | 
| 336 339 |  | 
| 337 340 | 
             
                  @event  = Puppet::Transaction::Event.new(:name => :notify, :resource => @target)
         | 
| 338 341 | 
             
                  @event2 = Puppet::Transaction::Event.new(:name => :service_start, :resource => @target, :invalidate_refreshes => true)
         | 
| @@ -5,6 +5,13 @@ require 'puppet_spec/compiler' | |
| 5 5 | 
             
            require 'puppet/transaction'
         | 
| 6 6 | 
             
            require 'fileutils'
         | 
| 7 7 |  | 
| 8 | 
            +
            Puppet::Type.newtype(:generator) do
         | 
| 9 | 
            +
              newparam(:name) { isnamevar }
         | 
| 10 | 
            +
             | 
| 11 | 
            +
              def generate
         | 
| 12 | 
            +
              end
         | 
| 13 | 
            +
            end
         | 
| 14 | 
            +
             | 
| 8 15 | 
             
            describe Puppet::Transaction do
         | 
| 9 16 | 
             
              include PuppetSpec::Files
         | 
| 10 17 | 
             
              include PuppetSpec::Compiler
         | 
| @@ -323,9 +330,9 @@ describe Puppet::Transaction do | |
| 323 330 | 
             
              describe "when generating resources before traversal" do
         | 
| 324 331 | 
             
                let(:catalog) { Puppet::Resource::Catalog.new }
         | 
| 325 332 | 
             
                let(:transaction) { Puppet::Transaction.new(catalog, nil, Puppet::Graph::SequentialPrioritizer.new) }
         | 
| 326 | 
            -
                let(:generator) { Puppet::Type.type(: | 
| 333 | 
            +
                let(:generator) { Puppet::Type.type(:generator).new :title => "generator" }
         | 
| 327 334 | 
             
                let(:generated) do
         | 
| 328 | 
            -
                  %w[a b c].map { |name| Puppet::Type.type(: | 
| 335 | 
            +
                  %w[a b c].map { |name| Puppet::Type.type(:generator).new(:name => name) }
         | 
| 329 336 | 
             
                end
         | 
| 330 337 |  | 
| 331 338 | 
             
                before :each do
         | 
| @@ -666,7 +673,7 @@ describe Puppet::Transaction do | |
| 666 673 | 
             
                    end
         | 
| 667 674 |  | 
| 668 675 | 
             
                    describe "and new resources are generated" do
         | 
| 669 | 
            -
                      let(:generator) { Puppet::Type.type(: | 
| 676 | 
            +
                      let(:generator) { Puppet::Type.type(:generator).new :title => "generator" }
         | 
| 670 677 | 
             
                      let(:generated) do
         | 
| 671 678 | 
             
                        %w[a b c].map { |name| Puppet::Type.type(:package).new :title => "foo", :name => name, :provider => :apt }
         | 
| 672 679 | 
             
                      end
         | 
| @@ -785,6 +792,9 @@ describe Puppet::Transaction do | |
| 785 792 | 
             
                      def self.is_selinux_enabled
         | 
| 786 793 | 
             
                        true
         | 
| 787 794 | 
             
                      end
         | 
| 795 | 
            +
             | 
| 796 | 
            +
                      def self.matchpathcon_fini
         | 
| 797 | 
            +
                      end
         | 
| 788 798 | 
             
                    end
         | 
| 789 799 | 
             
                  end
         | 
| 790 800 |  | 
| @@ -828,7 +838,6 @@ describe Puppet::Transaction do | |
| 828 838 | 
             
                  before do
         | 
| 829 839 | 
             
                    @resource = Puppet::Type.type(:notify).new :title => "foobar"
         | 
| 830 840 | 
             
                    @catalog.add_resource @resource
         | 
| 831 | 
            -
                    allow(@transaction).to receive(:add_dynamically_generated_resources)
         | 
| 832 841 | 
             
                  end
         | 
| 833 842 |  | 
| 834 843 | 
             
                  it 'should stop processing if :stop_processing? is true' do
         | 
| @@ -11,7 +11,6 @@ describe Puppet::Type.type(:file).attrclass(:content), :uses_checksums => true d | |
| 11 11 |  | 
| 12 12 | 
             
              before do
         | 
| 13 13 | 
             
                File.open(filename, 'w') {|f| f.write "initial file content"}
         | 
| 14 | 
            -
                allow(described_class).to receive(:standalone?).and_return(false)
         | 
| 15 14 | 
             
              end
         | 
| 16 15 |  | 
| 17 16 | 
             
              around do |example|
         | 
| @@ -9,8 +9,6 @@ require 'spec_helper' | |
| 9 9 | 
             
                  @path = make_absolute("/my/file")
         | 
| 10 10 | 
             
                  @resource = Puppet::Type.type(:file).new :path => @path
         | 
| 11 11 | 
             
                  @sel = property.new :resource => @resource
         | 
| 12 | 
            -
                  allow(@sel).to receive(:normalize_selinux_category).with("s0").and_return("s0")
         | 
| 13 | 
            -
                  allow(@sel).to receive(:normalize_selinux_category).with(nil).and_return(nil)
         | 
| 14 12 | 
             
                end
         | 
| 15 13 |  | 
| 16 14 | 
             
                it "retrieve on #{param} should return :absent if the file isn't statable" do
         | 
    
        data/spec/unit/type/file_spec.rb
    CHANGED
    
    | @@ -344,12 +344,6 @@ describe Puppet::Type.type(:file) do | |
| 344 344 | 
             
              end
         | 
| 345 345 |  | 
| 346 346 | 
             
              describe "#flush" do
         | 
| 347 | 
            -
                it "should flush all properties that respond to :flush" do
         | 
| 348 | 
            -
                  file[:source] = File.expand_path(__FILE__)
         | 
| 349 | 
            -
                  expect(file.parameter(:source)).to receive(:flush)
         | 
| 350 | 
            -
                  file.flush
         | 
| 351 | 
            -
                end
         | 
| 352 | 
            -
             | 
| 353 347 | 
             
                it "should reset its stat reference" do
         | 
| 354 348 | 
             
                  FileUtils.touch(path)
         | 
| 355 349 | 
             
                  stat1 = file.stat
         | 
| @@ -60,9 +60,12 @@ describe Puppet::Type.type(:group) do | |
| 60 60 | 
             
              end
         | 
| 61 61 |  | 
| 62 62 | 
             
              it "delegates the existence check to its provider" do
         | 
| 63 | 
            -
                provider = @class.provide(:testing)  | 
| 63 | 
            +
                provider = @class.provide(:testing) do
         | 
| 64 | 
            +
                  def exists?
         | 
| 65 | 
            +
                    true
         | 
| 66 | 
            +
                  end
         | 
| 67 | 
            +
                end
         | 
| 64 68 | 
             
                provider_instance = provider.new
         | 
| 65 | 
            -
                expect(provider_instance).to receive(:exists?).and_return(true)
         | 
| 66 69 |  | 
| 67 70 | 
             
                type = @class.new(:name => "group", :provider => provider_instance)
         | 
| 68 71 |  | 
| @@ -77,20 +80,24 @@ describe Puppet::Type.type(:group) do | |
| 77 80 | 
             
                    def members
         | 
| 78 81 | 
             
                      []
         | 
| 79 82 | 
             
                    end
         | 
| 83 | 
            +
             | 
| 84 | 
            +
                    def members_insync?(current, should)
         | 
| 85 | 
            +
                      current == should
         | 
| 86 | 
            +
                    end
         | 
| 87 | 
            +
             | 
| 88 | 
            +
                    def members_to_s(values)
         | 
| 89 | 
            +
                      values.map { |v| "#{v} ()" }.join(', ')
         | 
| 90 | 
            +
                    end
         | 
| 80 91 | 
             
                  end
         | 
| 81 92 | 
             
                end
         | 
| 82 93 | 
             
                let (:provider_instance) { provider.new }
         | 
| 83 94 | 
             
                let (:type) { @class.new(:name => "group", :provider => provider_instance, :members => ['user1']) }
         | 
| 84 95 |  | 
| 85 96 | 
             
                it "insync? calls members_insync?" do
         | 
| 86 | 
            -
                  expect(provider_instance).to receive(:members_insync?).with(['user1'], ['user1']).and_return(true)
         | 
| 87 97 | 
             
                  expect(type.property(:members).insync?(['user1'])).to be_truthy
         | 
| 88 98 | 
             
                end
         | 
| 89 99 |  | 
| 90 100 | 
             
                it "is_to_s and should_to_s call members_to_s" do
         | 
| 91 | 
            -
                  expect(provider_instance).to receive(:members_to_s).with(['user1', 'user2']).and_return("user1 (), user2 ()")
         | 
| 92 | 
            -
                  expect(provider_instance).to receive(:members_to_s).with(['user1']).and_return("user1 ()")
         | 
| 93 | 
            -
             | 
| 94 101 | 
             
                  expect(type.property(:members).is_to_s('user1')).to eq('user1 ()')
         | 
| 95 102 | 
             
                  expect(type.property(:members).should_to_s('user1,user2')).to eq('user1 (), user2 ()')
         | 
| 96 103 | 
             
                end
         | 
| @@ -6,6 +6,9 @@ Puppet::Type.newtype(:purgeable_test) do | |
| 6 6 | 
             
              newparam(:name) {}
         | 
| 7 7 | 
             
            end
         | 
| 8 8 | 
             
            Puppet::Type.type(:purgeable_test).provide(:purgeable_test) do
         | 
| 9 | 
            +
              def self.instances
         | 
| 10 | 
            +
                []
         | 
| 11 | 
            +
              end
         | 
| 9 12 | 
             
            end
         | 
| 10 13 |  | 
| 11 14 | 
             
            resources = Puppet::Type.type(:resources)
         | 
| @@ -46,19 +49,16 @@ describe resources do | |
| 46 49 | 
             
                end
         | 
| 47 50 |  | 
| 48 51 | 
             
                it "cannot be set to true for a resource type that does not accept ensure" do
         | 
| 49 | 
            -
                  allow(instance.resource_type).to receive(: | 
| 50 | 
            -
                   | 
| 51 | 
            -
                  expect { instance[:purge] = 'yes' }.to raise_error Puppet::Error
         | 
| 52 | 
            +
                  allow(instance.resource_type).to receive(:validproperty?).with(:ensure).and_return(false)
         | 
| 53 | 
            +
                  expect { instance[:purge] = 'yes' }.to raise_error Puppet::Error, /Purging is only supported on types that accept 'ensure'/
         | 
| 52 54 | 
             
                end
         | 
| 53 55 |  | 
| 54 56 | 
             
                it "cannot be set to true for a resource type that does not have instances" do
         | 
| 55 | 
            -
                  allow(instance.resource_type).to receive(:respond_to?).and_return(false)
         | 
| 56 | 
            -
                   | 
| 57 | 
            -
                  expect { instance[:purge] = 'yes' }.to raise_error Puppet::Error
         | 
| 57 | 
            +
                  allow(instance.resource_type).to receive(:respond_to?).with(:instances).and_return(false)
         | 
| 58 | 
            +
                  expect { instance[:purge] = 'yes' }.to raise_error Puppet::Error, /Purging resources of type file is not supported/
         | 
| 58 59 | 
             
                end
         | 
| 59 60 |  | 
| 60 61 | 
             
                it "can be set to true for a resource type that has instances and can accept ensure" do
         | 
| 61 | 
            -
                  allow(instance.resource_type).to receive(:respond_to?).and_return(true)
         | 
| 62 62 | 
             
                  allow(instance.resource_type).to receive(:validproperty?).and_return(true)
         | 
| 63 63 | 
             
                  expect { instance[:purge] = 'yes' }.to_not raise_error
         | 
| 64 64 | 
             
                end
         | 
| @@ -488,7 +488,7 @@ describe test_title, "when changing the host" do | |
| 488 488 | 
             
              it "insyncness should be resolved by provider instead of superclass implementation when provider responds to the 'enabled_insync?' method" do
         | 
| 489 489 | 
             
                allow(@service.provider.class).to receive(:supports_parameter?).and_return(true)
         | 
| 490 490 | 
             
                @service[:enable] = true
         | 
| 491 | 
            -
                allow(@service.provider).to receive(:respond_to?).with(:enabled_insync | 
| 491 | 
            +
                allow(@service.provider).to receive(:respond_to?).with(:enabled_insync?, any_args).and_return(true)
         | 
| 492 492 | 
             
                allow(@service.provider).to receive(:enabled_insync?).and_return(false)
         | 
| 493 493 |  | 
| 494 494 | 
             
                expect(@service.property(:enable).insync?(:true)).to eq(false)
         | 
    
        data/spec/unit/type/tidy_spec.rb
    CHANGED
    
    | @@ -191,7 +191,6 @@ describe tidy do | |
| 191 191 | 
             
                describe "and recursion is used" do
         | 
| 192 192 | 
             
                  before do
         | 
| 193 193 | 
             
                    @tidy[:recurse] = true
         | 
| 194 | 
            -
                    allow_any_instance_of(Puppet::FileServing::Fileset).to receive(:stat).and_return(double("stat"))
         | 
| 195 194 | 
             
                    @fileset = Puppet::FileServing::Fileset.new(@basepath)
         | 
| 196 195 | 
             
                    allow(Puppet::FileServing::Fileset).to receive(:new).and_return(@fileset)
         | 
| 197 196 | 
             
                  end
         | 
    
        data/spec/unit/type_spec.rb
    CHANGED
    
    | @@ -912,8 +912,8 @@ describe Puppet::Type, :unless => Puppet::Util::Platform.windows? do | |
| 912 912 |  | 
| 913 913 | 
             
                it "should always retrieve the ensure value by default" do
         | 
| 914 914 | 
             
                  @ensurable_resource = Puppet::Type.type(:file).new(:name => "/not/existent", :mode => "0644")
         | 
| 915 | 
            -
                   | 
| 916 | 
            -
                   | 
| 915 | 
            +
                  # the ensure property is lazily metaprogrammed...
         | 
| 916 | 
            +
                  allow_any_instance_of(Puppet::Type::File::Ensure).to receive(:retrieve).and_return(:absent)
         | 
| 917 917 | 
             
                  @ensurable_resource.retrieve_resource
         | 
| 918 918 | 
             
                end
         | 
| 919 919 |  | 
| @@ -50,8 +50,8 @@ describe 'Puppet::Util::AtFork' do | |
| 50 50 | 
             
                          const_set(:TYPE_VOID,  nil)
         | 
| 51 51 | 
             
                          const_set(:TYPE_INT,   nil)
         | 
| 52 52 | 
             
                          const_set(:DLError,    Class.new(StandardError))
         | 
| 53 | 
            -
                          const_set(:Handle,     Class.new)
         | 
| 54 | 
            -
                          const_set(:Function,   Class.new)
         | 
| 53 | 
            +
                          const_set(:Handle,     Class.new { def initialize(library = nil, flags = 0); end })
         | 
| 54 | 
            +
                          const_set(:Function,   Class.new { def initialize(ptr, args, ret_type, abi = 0); end })
         | 
| 55 55 | 
             
                        end)
         | 
| 56 56 | 
             
                      end
         | 
| 57 57 | 
             
                    end
         | 
| @@ -157,7 +157,7 @@ describe Puppet::Util::Autoload do | |
| 157 157 | 
             
                end
         | 
| 158 158 |  | 
| 159 159 | 
             
                it "should load the first file in the searchpath" do
         | 
| 160 | 
            -
                  allow(@autoload).to receive(:search_directories).and_return([make_absolute("/a"), make_absolute("/b")])
         | 
| 160 | 
            +
                  allow(@autoload.class).to receive(:search_directories).and_return([make_absolute("/a"), make_absolute("/b")])
         | 
| 161 161 | 
             
                  allow(FileTest).to receive(:directory?).and_return(true)
         | 
| 162 162 | 
             
                  allow(Puppet::FileSystem).to receive(:exist?).and_return(true)
         | 
| 163 163 | 
             
                  expect(Kernel).to receive(:load).with(make_absolute("/a/tmp/myfile.rb"), any_args)
         | 
| @@ -298,6 +298,10 @@ describe Puppet::Util::Autoload do | |
| 298 298 | 
             
                  it "should convert c:\ to c:/" do
         | 
| 299 299 | 
             
                    expect(Puppet::Util::Autoload.cleanpath('c:\\')).to eq('c:/')
         | 
| 300 300 | 
             
                  end
         | 
| 301 | 
            +
             | 
| 302 | 
            +
                  it "should convert all backslashes to forward slashes" do
         | 
| 303 | 
            +
                    expect(Puppet::Util::Autoload.cleanpath('c:\projects\ruby\bug\test.rb')).to eq('c:/projects/ruby/bug/test.rb')
         | 
| 304 | 
            +
                  end
         | 
| 301 305 | 
             
                end
         | 
| 302 306 | 
             
              end
         | 
| 303 307 |  | 
| @@ -119,8 +119,7 @@ describe Puppet::Util::Backups do | |
| 119 119 | 
             
                  file = Puppet::Type.type(:file).new(:name => path, :backup => 'foo', :recurse => true)
         | 
| 120 120 |  | 
| 121 121 | 
             
                  expect(bucket).not_to receive(:backup)
         | 
| 122 | 
            -
                   | 
| 123 | 
            -
                  allow(Puppet::FileSystem).to receive(:new).with(path).and_return(stub_file)
         | 
| 122 | 
            +
                  allow(Puppet::FileSystem).to receive(:stat).with(path).and_return(double('stat', :ftype => 'directory'))
         | 
| 124 123 | 
             
                  expect(Find).not_to receive(:find)
         | 
| 125 124 |  | 
| 126 125 | 
             
                  file.perform_backup
         | 
| @@ -639,6 +639,8 @@ describe Puppet::Util::Execution, if: !Puppet::Util::Platform.jruby? do | |
| 639 639 |  | 
| 640 640 | 
             
                describe "#execute (debug logging)" do
         | 
| 641 641 | 
             
                  before :each do
         | 
| 642 | 
            +
                    Puppet[:log_level] = 'debug'
         | 
| 643 | 
            +
             | 
| 642 644 | 
             
                    stub_process_wait(0)
         | 
| 643 645 |  | 
| 644 646 | 
             
                    if Puppet::Util::Platform.windows?
         | 
| @@ -649,47 +651,47 @@ describe Puppet::Util::Execution, if: !Puppet::Util::Platform.jruby? do | |
| 649 651 | 
             
                  end
         | 
| 650 652 |  | 
| 651 653 | 
             
                  it "should log if no uid or gid specified" do
         | 
| 652 | 
            -
                    expect(Puppet | 
| 654 | 
            +
                    expect(Puppet).to receive(:send_log).with(:debug, "Executing: 'echo hello'")
         | 
| 653 655 | 
             
                    Puppet::Util::Execution.execute('echo hello')
         | 
| 654 656 | 
             
                  end
         | 
| 655 657 |  | 
| 656 658 | 
             
                  it "should log numeric uid if specified" do
         | 
| 657 | 
            -
                    expect(Puppet | 
| 659 | 
            +
                    expect(Puppet).to receive(:send_log).with(:debug, "Executing with uid=100: 'echo hello'")
         | 
| 658 660 | 
             
                    Puppet::Util::Execution.execute('echo hello', {:uid => 100})
         | 
| 659 661 | 
             
                  end
         | 
| 660 662 |  | 
| 661 663 | 
             
                  it "should log numeric gid if specified" do
         | 
| 662 | 
            -
                    expect(Puppet | 
| 664 | 
            +
                    expect(Puppet).to receive(:send_log).with(:debug, "Executing with gid=500: 'echo hello'")
         | 
| 663 665 | 
             
                    Puppet::Util::Execution.execute('echo hello', {:gid => 500})
         | 
| 664 666 | 
             
                  end
         | 
| 665 667 |  | 
| 666 668 | 
             
                  it "should log numeric uid and gid if specified" do
         | 
| 667 | 
            -
                    expect(Puppet | 
| 669 | 
            +
                    expect(Puppet).to receive(:send_log).with(:debug, "Executing with uid=100 gid=500: 'echo hello'")
         | 
| 668 670 | 
             
                    Puppet::Util::Execution.execute('echo hello', {:uid => 100, :gid => 500})
         | 
| 669 671 | 
             
                  end
         | 
| 670 672 |  | 
| 671 673 | 
             
                  it "should log string uid if specified" do
         | 
| 672 | 
            -
                    expect(Puppet | 
| 674 | 
            +
                    expect(Puppet).to receive(:send_log).with(:debug, "Executing with uid=myuser: 'echo hello'")
         | 
| 673 675 | 
             
                    Puppet::Util::Execution.execute('echo hello', {:uid => 'myuser'})
         | 
| 674 676 | 
             
                  end
         | 
| 675 677 |  | 
| 676 678 | 
             
                  it "should log string gid if specified" do
         | 
| 677 | 
            -
                    expect(Puppet | 
| 679 | 
            +
                    expect(Puppet).to receive(:send_log).with(:debug, "Executing with gid=mygroup: 'echo hello'")
         | 
| 678 680 | 
             
                    Puppet::Util::Execution.execute('echo hello', {:gid => 'mygroup'})
         | 
| 679 681 | 
             
                  end
         | 
| 680 682 |  | 
| 681 683 | 
             
                  it "should log string uid and gid if specified" do
         | 
| 682 | 
            -
                    expect(Puppet | 
| 684 | 
            +
                    expect(Puppet).to receive(:send_log).with(:debug, "Executing with uid=myuser gid=mygroup: 'echo hello'")
         | 
| 683 685 | 
             
                    Puppet::Util::Execution.execute('echo hello', {:uid => 'myuser', :gid => 'mygroup'})
         | 
| 684 686 | 
             
                  end
         | 
| 685 687 |  | 
| 686 688 | 
             
                  it "should log numeric uid and string gid if specified" do
         | 
| 687 | 
            -
                    expect(Puppet | 
| 689 | 
            +
                    expect(Puppet).to receive(:send_log).with(:debug, "Executing with uid=100 gid=mygroup: 'echo hello'")
         | 
| 688 690 | 
             
                    Puppet::Util::Execution.execute('echo hello', {:uid => 100, :gid => 'mygroup'})
         | 
| 689 691 | 
             
                  end
         | 
| 690 692 |  | 
| 691 693 | 
             
                  it 'should redact commands in debug output when passed sensitive option' do
         | 
| 692 | 
            -
                    expect(Puppet | 
| 694 | 
            +
                    expect(Puppet).to receive(:send_log).with(:debug, "Executing: '[redacted]'")
         | 
| 693 695 | 
             
                    Puppet::Util::Execution.execute('echo hello', {:sensitive => true})
         | 
| 694 696 | 
             
                  end
         | 
| 695 697 | 
             
                end
         | 
| @@ -903,14 +905,16 @@ describe Puppet::Util::Execution, if: !Puppet::Util::Platform.jruby? do | |
| 903 905 | 
             
                end
         | 
| 904 906 |  | 
| 905 907 | 
             
                it "should print meaningful debug message for string argument" do
         | 
| 906 | 
            -
                   | 
| 908 | 
            +
                  Puppet[:log_level] = 'debug'
         | 
| 909 | 
            +
                  expect(Puppet).to receive(:send_log).with(:debug, "Executing 'echo hello'")
         | 
| 907 910 | 
             
                  expect(Puppet::Util::Execution).to receive(:open).with('| echo hello 2>&1').and_return('hello')
         | 
| 908 911 | 
             
                  expect(Puppet::Util::Execution).to receive(:exitstatus).and_return(0)
         | 
| 909 912 | 
             
                  Puppet::Util::Execution.execpipe('echo hello')
         | 
| 910 913 | 
             
                end
         | 
| 911 914 |  | 
| 912 915 | 
             
                it "should print meaningful debug message for array argument" do
         | 
| 913 | 
            -
                   | 
| 916 | 
            +
                  Puppet[:log_level] = 'debug'
         | 
| 917 | 
            +
                  expect(Puppet).to receive(:send_log).with(:debug, "Executing 'echo hello'")
         | 
| 914 918 | 
             
                  expect(Puppet::Util::Execution).to receive(:open).with('| echo hello 2>&1').and_return('hello')
         | 
| 915 919 | 
             
                  expect(Puppet::Util::Execution).to receive(:exitstatus).and_return(0)
         | 
| 916 920 | 
             
                  Puppet::Util::Execution.execpipe(['echo','hello'])
         |