puppet 6.19.1 → 6.20.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.

Files changed (171) hide show
  1. checksums.yaml +4 -4
  2. data/CODEOWNERS +2 -16
  3. data/Gemfile +2 -0
  4. data/Gemfile.lock +30 -25
  5. data/lib/puppet/application.rb +10 -6
  6. data/lib/puppet/application/agent.rb +1 -0
  7. data/lib/puppet/application/apply.rb +3 -2
  8. data/lib/puppet/application/device.rb +1 -0
  9. data/lib/puppet/application/filebucket.rb +2 -2
  10. data/lib/puppet/application/script.rb +1 -0
  11. data/lib/puppet/application_support.rb +7 -0
  12. data/lib/puppet/configurer.rb +28 -18
  13. data/lib/puppet/defaults.rb +24 -18
  14. data/lib/puppet/environments.rb +38 -54
  15. data/lib/puppet/face/config.rb +10 -0
  16. data/lib/puppet/face/epp.rb +12 -2
  17. data/lib/puppet/face/facts.rb +60 -0
  18. data/lib/puppet/ffi/posix.rb +10 -0
  19. data/lib/puppet/ffi/posix/constants.rb +14 -0
  20. data/lib/puppet/ffi/posix/functions.rb +24 -0
  21. data/lib/puppet/functions/epp.rb +1 -0
  22. data/lib/puppet/functions/inline_epp.rb +1 -0
  23. data/lib/puppet/indirector/fact_search.rb +60 -0
  24. data/lib/puppet/indirector/facts/json.rb +27 -0
  25. data/lib/puppet/indirector/facts/yaml.rb +3 -58
  26. data/lib/puppet/indirector/json.rb +5 -1
  27. data/lib/puppet/indirector/node/json.rb +8 -0
  28. data/lib/puppet/indirector/report/json.rb +34 -0
  29. data/lib/puppet/module_tool/applications/installer.rb +48 -2
  30. data/lib/puppet/module_tool/errors/shared.rb +17 -2
  31. data/lib/puppet/network/formats.rb +2 -1
  32. data/lib/puppet/pal/pal_impl.rb +70 -17
  33. data/lib/puppet/parser/ast/leaf.rb +3 -2
  34. data/lib/puppet/parser/templatewrapper.rb +1 -1
  35. data/lib/puppet/pops/evaluator/deferred_resolver.rb +5 -3
  36. data/lib/puppet/pops/evaluator/evaluator_impl.rb +22 -3
  37. data/lib/puppet/pops/model/ast_transformer.rb +1 -1
  38. data/lib/puppet/provider/package/apt.rb +4 -0
  39. data/lib/puppet/provider/user/aix.rb +2 -2
  40. data/lib/puppet/reference/configuration.rb +6 -5
  41. data/lib/puppet/settings.rb +33 -28
  42. data/lib/puppet/settings/alias_setting.rb +37 -0
  43. data/lib/puppet/settings/base_setting.rb +26 -2
  44. data/lib/puppet/util/autoload.rb +1 -8
  45. data/lib/puppet/util/fact_dif.rb +62 -0
  46. data/lib/puppet/util/posix.rb +54 -5
  47. data/lib/puppet/util/rubygems.rb +5 -1
  48. data/lib/puppet/version.rb +1 -1
  49. data/locales/puppet.pot +188 -164
  50. data/man/man5/puppet.conf.5 +6 -6
  51. data/man/man8/puppet-agent.8 +2 -2
  52. data/man/man8/puppet-apply.8 +2 -2
  53. data/man/man8/puppet-catalog.8 +1 -1
  54. data/man/man8/puppet-config.8 +1 -1
  55. data/man/man8/puppet-describe.8 +1 -1
  56. data/man/man8/puppet-device.8 +2 -2
  57. data/man/man8/puppet-doc.8 +1 -1
  58. data/man/man8/puppet-epp.8 +1 -1
  59. data/man/man8/puppet-facts.8 +32 -1
  60. data/man/man8/puppet-filebucket.8 +3 -3
  61. data/man/man8/puppet-generate.8 +1 -1
  62. data/man/man8/puppet-help.8 +1 -1
  63. data/man/man8/puppet-key.8 +1 -1
  64. data/man/man8/puppet-lookup.8 +1 -1
  65. data/man/man8/puppet-man.8 +1 -1
  66. data/man/man8/puppet-module.8 +1 -1
  67. data/man/man8/puppet-node.8 +4 -1
  68. data/man/man8/puppet-parser.8 +1 -1
  69. data/man/man8/puppet-plugin.8 +1 -1
  70. data/man/man8/puppet-report.8 +4 -1
  71. data/man/man8/puppet-resource.8 +1 -1
  72. data/man/man8/puppet-script.8 +2 -2
  73. data/man/man8/puppet-ssl.8 +1 -1
  74. data/man/man8/puppet-status.8 +1 -1
  75. data/man/man8/puppet.8 +2 -2
  76. data/spec/fixtures/integration/application/agent/cached_deferred_catalog.json +91 -0
  77. data/spec/fixtures/unit/provider/user/aix/aix_passwd_file.out +4 -0
  78. data/spec/integration/application/agent_spec.rb +127 -3
  79. data/spec/integration/application/apply_spec.rb +19 -0
  80. data/spec/integration/defaults_spec.rb +0 -7
  81. data/spec/integration/environments/setting_hooks_spec.rb +1 -1
  82. data/spec/integration/resource/type_collection_spec.rb +2 -6
  83. data/spec/integration/transaction_spec.rb +4 -9
  84. data/spec/integration/util/windows/adsi_spec.rb +3 -1
  85. data/spec/integration/util/windows/registry_spec.rb +0 -10
  86. data/spec/lib/puppet_spec/settings.rb +6 -1
  87. data/spec/spec_helper.rb +1 -4
  88. data/spec/unit/agent_spec.rb +8 -6
  89. data/spec/unit/application/agent_spec.rb +0 -1
  90. data/spec/unit/application/config_spec.rb +224 -4
  91. data/spec/unit/application/filebucket_spec.rb +0 -2
  92. data/spec/unit/application_spec.rb +51 -9
  93. data/spec/unit/confine/feature_spec.rb +1 -1
  94. data/spec/unit/confine_spec.rb +8 -2
  95. data/spec/unit/defaults_spec.rb +20 -1
  96. data/spec/unit/environments_spec.rb +96 -19
  97. data/spec/unit/face/config_spec.rb +27 -32
  98. data/spec/unit/face/node_spec.rb +0 -11
  99. data/spec/unit/file_serving/configuration/parser_spec.rb +0 -1
  100. data/spec/unit/file_serving/metadata_spec.rb +3 -3
  101. data/spec/unit/file_serving/terminus_helper_spec.rb +11 -4
  102. data/spec/unit/forge/module_release_spec.rb +2 -7
  103. data/spec/unit/functions/inline_epp_spec.rb +26 -1
  104. data/spec/unit/http/service/compiler_spec.rb +49 -0
  105. data/spec/unit/http/service_spec.rb +1 -1
  106. data/spec/unit/indirector/face_spec.rb +0 -1
  107. data/spec/unit/indirector/facts/facter_spec.rb +0 -1
  108. data/spec/unit/indirector/facts/json_spec.rb +255 -0
  109. data/spec/unit/indirector/file_bucket_file/selector_spec.rb +26 -8
  110. data/spec/unit/indirector/indirection_spec.rb +8 -12
  111. data/spec/unit/indirector/key/file_spec.rb +0 -1
  112. data/spec/unit/indirector/node/json_spec.rb +33 -0
  113. data/spec/{integration/indirector/report/yaml.rb → unit/indirector/report/json_spec.rb} +13 -24
  114. data/spec/unit/indirector/report/yaml_spec.rb +72 -8
  115. data/spec/unit/indirector_spec.rb +2 -2
  116. data/spec/unit/module_tool/applications/installer_spec.rb +66 -0
  117. data/spec/unit/network/authconfig_spec.rb +0 -3
  118. data/spec/unit/network/http/api/indirected_routes_spec.rb +0 -9
  119. data/spec/unit/network/http/handler_spec.rb +0 -5
  120. data/spec/unit/parser/compiler_spec.rb +3 -19
  121. data/spec/unit/parser/resource_spec.rb +14 -8
  122. data/spec/unit/parser/templatewrapper_spec.rb +4 -3
  123. data/spec/unit/pops/evaluator/deferred_resolver_spec.rb +20 -0
  124. data/spec/unit/property_spec.rb +1 -0
  125. data/spec/unit/provider/nameservice_spec.rb +66 -65
  126. data/spec/unit/provider/package/apt_spec.rb +4 -8
  127. data/spec/unit/provider/package/base_spec.rb +6 -5
  128. data/spec/unit/provider/package/pacman_spec.rb +18 -12
  129. data/spec/unit/provider/package/pip_spec.rb +6 -11
  130. data/spec/unit/provider/package/pkgdmg_spec.rb +0 -4
  131. data/spec/unit/provider/user/aix_spec.rb +5 -0
  132. data/spec/unit/provider/user/hpux_spec.rb +1 -1
  133. data/spec/unit/provider/user/pw_spec.rb +2 -0
  134. data/spec/unit/provider/user/useradd_spec.rb +1 -0
  135. data/spec/unit/provider_spec.rb +8 -10
  136. data/spec/unit/puppet_pal_catalog_spec.rb +45 -0
  137. data/spec/unit/resource/capability_finder_spec.rb +6 -1
  138. data/spec/unit/resource/type_spec.rb +1 -1
  139. data/spec/unit/resource_spec.rb +11 -10
  140. data/spec/unit/settings_spec.rb +419 -242
  141. data/spec/unit/ssl/base_spec.rb +0 -1
  142. data/spec/unit/ssl/host_spec.rb +0 -5
  143. data/spec/unit/ssl/ssl_provider_spec.rb +14 -8
  144. data/spec/unit/transaction/additional_resource_generator_spec.rb +3 -7
  145. data/spec/unit/transaction/event_manager_spec.rb +14 -11
  146. data/spec/unit/transaction_spec.rb +13 -4
  147. data/spec/unit/type/file/content_spec.rb +0 -1
  148. data/spec/unit/type/file/selinux_spec.rb +0 -2
  149. data/spec/unit/type/file_spec.rb +0 -6
  150. data/spec/unit/type/group_spec.rb +13 -6
  151. data/spec/unit/type/resources_spec.rb +7 -7
  152. data/spec/unit/type/service_spec.rb +1 -1
  153. data/spec/unit/type/tidy_spec.rb +0 -1
  154. data/spec/unit/type_spec.rb +2 -2
  155. data/spec/unit/util/at_fork_spec.rb +2 -2
  156. data/spec/unit/util/autoload_spec.rb +5 -1
  157. data/spec/unit/util/backups_spec.rb +1 -2
  158. data/spec/unit/util/execution_spec.rb +15 -11
  159. data/spec/unit/util/inifile_spec.rb +6 -14
  160. data/spec/unit/util/log_spec.rb +8 -7
  161. data/spec/unit/util/logging_spec.rb +3 -3
  162. data/spec/unit/util/posix_spec.rb +363 -15
  163. data/spec/unit/util/rubygems_spec.rb +2 -2
  164. data/spec/unit/util/selinux_spec.rb +76 -52
  165. data/spec/unit/util/storage_spec.rb +3 -1
  166. data/spec/unit/util/suidmanager_spec.rb +44 -41
  167. data/spec/unit/util_spec.rb +13 -6
  168. metadata +21 -10
  169. data/spec/integration/application/config_spec.rb +0 -74
  170. data/spec/unit/face/catalog_spec.rb +0 -6
  171. data/spec/unit/face/module_spec.rb +0 -3
@@ -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
@@ -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
- it 'raises if root cert signature is invalid', if: defined?(OpenSSL::X509::V_FLAG_CHECK_SS_SIGNATURE) do
275
- ca = global_cacerts.first
276
- ca.sign(wrong_key, OpenSSL::Digest::SHA256.new)
277
-
278
- expect {
279
- subject.create_context(**config.merge(cacerts: global_cacerts))
280
- }.to raise_error(Puppet::SSL::CertVerifyError,
281
- "Invalid signature for certificate 'CN=Test CA'")
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
- notify { 'hello': }
313
+ generator { thing: }
318
314
  MANIFEST
319
315
 
320
- allow(catalog.resource("Notify[hello]")).to receive(:eval_generate).and_raise(RuntimeError)
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("Notify[hello]"))
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) #x
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
- expect(@resource).to receive(:callback1).and_raise("a failure")
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
- @transaction = Puppet::Transaction.new(Puppet::Resource::Catalog.new, nil, nil)
327
- @manager = Puppet::Transaction::EventManager.new(@transaction)
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
- @resource = Puppet::Type.type(:file).new :path => make_absolute("/my/file")
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(:notify).new :title => "generator" }
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(:notify).new(:name => name) }
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(:notify).new :title => "generator" }
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
@@ -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(:respond_to?).and_return(true)
50
- allow(instance.resource_type).to receive(:validproperty?).and_return(false)
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
- allow(instance.resource_type).to receive(:validproperty?).and_return(true)
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?).and_return(true)
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)
@@ -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
@@ -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
- allow(Puppet::Type::File::Ensure).to receive(:ensure).and_return(:absent)
916
- expect_any_instance_of(Puppet::Type::File::Ensure).to receive(:retrieve).once
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
- stub_file = double('file', :stat => double('stat', :ftype => 'directory'))
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::Util::Execution).to receive(:debug).with("Executing: 'echo hello'")
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::Util::Execution).to receive(:debug).with("Executing with uid=100: 'echo hello'")
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::Util::Execution).to receive(:debug).with("Executing with gid=500: 'echo hello'")
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::Util::Execution).to receive(:debug).with("Executing with uid=100 gid=500: 'echo hello'")
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::Util::Execution).to receive(:debug).with("Executing with uid=myuser: 'echo hello'")
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::Util::Execution).to receive(:debug).with("Executing with gid=mygroup: 'echo hello'")
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::Util::Execution).to receive(:debug).with("Executing with uid=myuser gid=mygroup: 'echo hello'")
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::Util::Execution).to receive(:debug).with("Executing with uid=100 gid=mygroup: 'echo hello'")
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::Util::Execution).to receive(:debug).with("Executing: '[redacted]'")
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
- expect(Puppet::Util::Execution).to receive(:debug).with("Executing 'echo hello'")
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
- expect(Puppet::Util::Execution).to receive(:debug).with("Executing 'echo hello'")
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'])