puppet 7.11.0-universal-darwin → 7.14.0-universal-darwin

Sign up to get free protection for your applications and to get access to all the features.
Files changed (115) hide show
  1. checksums.yaml +4 -4
  2. data/CODEOWNERS +1 -1
  3. data/Gemfile +2 -2
  4. data/Gemfile.lock +24 -19
  5. data/ext/project_data.yaml +1 -1
  6. data/lib/puppet/application/lookup.rb +78 -24
  7. data/lib/puppet/concurrent/thread_local_singleton.rb +5 -3
  8. data/lib/puppet/configurer.rb +74 -25
  9. data/lib/puppet/defaults.rb +20 -1
  10. data/lib/puppet/face/generate.rb +2 -0
  11. data/lib/puppet/file_serving/metadata.rb +3 -0
  12. data/lib/puppet/file_system/file_impl.rb +7 -7
  13. data/lib/puppet/file_system/jruby.rb +1 -1
  14. data/lib/puppet/file_system/path_pattern.rb +10 -15
  15. data/lib/puppet/file_system/uniquefile.rb +1 -1
  16. data/lib/puppet/file_system/windows.rb +4 -4
  17. data/lib/puppet/file_system.rb +3 -2
  18. data/lib/puppet/functions/versioncmp.rb +6 -2
  19. data/lib/puppet/generate/type.rb +9 -0
  20. data/lib/puppet/graph/simple_graph.rb +2 -1
  21. data/lib/puppet/http/client.rb +1 -1
  22. data/lib/puppet/http/redirector.rb +5 -0
  23. data/lib/puppet/node.rb +1 -1
  24. data/lib/puppet/parser/resource.rb +1 -1
  25. data/lib/puppet/pops/evaluator/closure.rb +7 -5
  26. data/lib/puppet/pops/evaluator/runtime3_resource_support.rb +1 -0
  27. data/lib/puppet/pops/parser/code_merger.rb +4 -4
  28. data/lib/puppet/pops/parser/egrammar.ra +2 -0
  29. data/lib/puppet/pops/parser/eparser.rb +574 -558
  30. data/lib/puppet/pops/serialization/to_data_converter.rb +6 -18
  31. data/lib/puppet/pops/validation/checker4_0.rb +7 -2
  32. data/lib/puppet/provider/package/pkg.rb +10 -0
  33. data/lib/puppet/provider/service/init.rb +5 -4
  34. data/lib/puppet/provider/user/useradd.rb +20 -0
  35. data/lib/puppet/resource/catalog.rb +1 -1
  36. data/lib/puppet/resource/type_collection.rb +21 -17
  37. data/lib/puppet/resource.rb +38 -5
  38. data/lib/puppet/ssl/verifier.rb +3 -1
  39. data/lib/puppet/transaction/persistence.rb +22 -12
  40. data/lib/puppet/type/file/data_sync.rb +1 -1
  41. data/lib/puppet/type/file/group.rb +8 -1
  42. data/lib/puppet/type/file/owner.rb +8 -1
  43. data/lib/puppet/type/service.rb +8 -3
  44. data/lib/puppet/type/user.rb +41 -39
  45. data/lib/puppet/util/autoload.rb +1 -1
  46. data/lib/puppet/util/json.rb +20 -0
  47. data/lib/puppet/util/log.rb +7 -2
  48. data/lib/puppet/util/monkey_patches.rb +26 -2
  49. data/lib/puppet/util/package.rb +25 -16
  50. data/lib/puppet/util/windows/service.rb +0 -5
  51. data/lib/puppet/util/windows.rb +3 -0
  52. data/lib/puppet/util/yaml.rb +16 -1
  53. data/lib/puppet/version.rb +1 -1
  54. data/lib/puppet.rb +1 -0
  55. data/locales/puppet.pot +5 -9737
  56. data/man/man5/puppet.conf.5 +21 -2
  57. data/man/man8/puppet-agent.8 +1 -1
  58. data/man/man8/puppet-apply.8 +1 -1
  59. data/man/man8/puppet-catalog.8 +1 -1
  60. data/man/man8/puppet-config.8 +1 -1
  61. data/man/man8/puppet-describe.8 +1 -1
  62. data/man/man8/puppet-device.8 +1 -1
  63. data/man/man8/puppet-doc.8 +1 -1
  64. data/man/man8/puppet-epp.8 +1 -1
  65. data/man/man8/puppet-facts.8 +1 -1
  66. data/man/man8/puppet-filebucket.8 +1 -1
  67. data/man/man8/puppet-generate.8 +1 -1
  68. data/man/man8/puppet-help.8 +1 -1
  69. data/man/man8/puppet-lookup.8 +9 -6
  70. data/man/man8/puppet-module.8 +1 -1
  71. data/man/man8/puppet-node.8 +1 -1
  72. data/man/man8/puppet-parser.8 +1 -1
  73. data/man/man8/puppet-plugin.8 +1 -1
  74. data/man/man8/puppet-report.8 +1 -1
  75. data/man/man8/puppet-resource.8 +1 -1
  76. data/man/man8/puppet-script.8 +1 -1
  77. data/man/man8/puppet-ssl.8 +1 -1
  78. data/man/man8/puppet.8 +2 -2
  79. data/spec/fixtures/integration/application/agent/cached_deferred_catalog.json +2 -1
  80. data/spec/fixtures/unit/forge/bacula.json +1 -1
  81. data/spec/integration/application/agent_spec.rb +28 -0
  82. data/spec/integration/application/lookup_spec.rb +32 -6
  83. data/spec/integration/parser/pcore_resource_spec.rb +20 -0
  84. data/spec/shared_contexts/l10n.rb +5 -0
  85. data/spec/unit/application/lookup_spec.rb +131 -10
  86. data/spec/unit/concurrent/thread_local_singleton_spec.rb +39 -0
  87. data/spec/unit/configurer_spec.rb +167 -60
  88. data/spec/unit/face/generate_spec.rb +64 -0
  89. data/spec/unit/file_system/uniquefile_spec.rb +7 -1
  90. data/spec/unit/file_system_spec.rb +34 -4
  91. data/spec/unit/forge/module_release_spec.rb +3 -3
  92. data/spec/unit/functions/versioncmp_spec.rb +40 -4
  93. data/spec/unit/http/client_spec.rb +58 -1
  94. data/spec/unit/network/formats_spec.rb +6 -0
  95. data/spec/unit/node_spec.rb +6 -0
  96. data/spec/unit/pops/parser/parse_containers_spec.rb +2 -2
  97. data/spec/unit/pops/serialization/to_from_hr_spec.rb +0 -58
  98. data/spec/unit/pops/validator/validator_spec.rb +5 -0
  99. data/spec/unit/provider/package/pkg_spec.rb +15 -0
  100. data/spec/unit/provider/service/gentoo_spec.rb +6 -5
  101. data/spec/unit/provider/service/init_spec.rb +15 -9
  102. data/spec/unit/provider/service/openwrt_spec.rb +21 -29
  103. data/spec/unit/provider/service/redhat_spec.rb +3 -2
  104. data/spec/unit/provider/user/useradd_spec.rb +40 -0
  105. data/spec/unit/resource/catalog_spec.rb +14 -1
  106. data/spec/unit/resource_spec.rb +58 -2
  107. data/spec/unit/transaction/persistence_spec.rb +51 -0
  108. data/spec/unit/type/file/group_spec.rb +7 -0
  109. data/spec/unit/type/file/owner_spec.rb +7 -0
  110. data/spec/unit/type/service_spec.rb +27 -0
  111. data/spec/unit/type/user_spec.rb +67 -45
  112. data/spec/unit/util/autoload_spec.rb +25 -8
  113. data/spec/unit/util/json_spec.rb +126 -0
  114. data/spec/unit/util/yaml_spec.rb +37 -13
  115. metadata +15 -5
@@ -638,19 +638,68 @@ describe Puppet::Resource do
638
638
  it "should use the resource type's :new method to create the resource if the resource is of a builtin type" do
639
639
  resource = Puppet::Resource.new("file", basepath+"/my/file")
640
640
  result = resource.to_ral
641
+
641
642
  expect(result).to be_instance_of(Puppet::Type.type(:file))
642
643
  expect(result[:path]).to eq(basepath+"/my/file")
643
644
  end
644
645
 
645
- it "should convert to a component instance if the resource type is not of a builtin type" do
646
+ it "should convert to a component instance if the resource is not a compilable_type" do
646
647
  resource = Puppet::Resource.new("foobar", "somename")
647
648
  result = resource.to_ral
648
649
 
649
650
  expect(result).to be_instance_of(Puppet::Type.type(:component))
650
651
  expect(result.title).to eq("Foobar[somename]")
651
652
  end
652
- end
653
653
 
654
+ it "should convert to a component instance if the resource is a class" do
655
+ resource = Puppet::Resource.new("Class", "somename")
656
+ result = resource.to_ral
657
+
658
+ expect(result).to be_instance_of(Puppet::Type.type(:component))
659
+ expect(result.title).to eq("Class[Somename]")
660
+ end
661
+
662
+ it "should convert to component when the resource is a defined_type" do
663
+ resource = Puppet::Resource.new("Unknown", "type", :kind => 'defined_type')
664
+
665
+ result = resource.to_ral
666
+ expect(result).to be_instance_of(Puppet::Type.type(:component))
667
+ end
668
+
669
+ it "should raise if a resource type is a compilable_type and it wasn't found" do
670
+ resource = Puppet::Resource.new("Unknown", "type", :kind => 'compilable_type')
671
+
672
+ expect { resource.to_ral }.to raise_error(Puppet::Error, "Resource type 'Unknown' was not found")
673
+ end
674
+
675
+ it "should use the old behaviour when the catalog_format is equal to 1" do
676
+ resource = Puppet::Resource.new("Unknown", "type")
677
+ catalog = Puppet::Resource::Catalog.new("mynode")
678
+
679
+ resource.catalog = catalog
680
+ resource.catalog.catalog_format = 1
681
+
682
+ result = resource.to_ral
683
+ expect(result).to be_instance_of(Puppet::Type.type(:component))
684
+ end
685
+
686
+ it "should use the new behaviour and fail when the catalog_format is greater than 1" do
687
+ resource = Puppet::Resource.new("Unknown", "type", :kind => 'compilable_type')
688
+ catalog = Puppet::Resource::Catalog.new("mynode")
689
+
690
+ resource.catalog = catalog
691
+ resource.catalog.catalog_format = 2
692
+
693
+ expect { resource.to_ral }.to raise_error(Puppet::Error, "Resource type 'Unknown' was not found")
694
+ end
695
+
696
+ it "should use the resource type when the resource doesn't respond to kind and the resource type can be found" do
697
+ resource = Puppet::Resource.new("file", basepath+"/my/file")
698
+
699
+ result = resource.to_ral
700
+ expect(result).to be_instance_of(Puppet::Type.type(:file))
701
+ end
702
+ end
654
703
  describe "when converting to puppet code" do
655
704
  before do
656
705
  @resource = Puppet::Resource.new("one::two", "/my/file",
@@ -766,6 +815,13 @@ describe Puppet::Resource do
766
815
  expect(Puppet::Resource.from_data_hash(JSON.parse(resource.to_json)).line).to eq(50)
767
816
  end
768
817
 
818
+ it "should include the kind if one is set" do
819
+ resource = Puppet::Resource.new("File", "/foo")
820
+ resource.kind = 'im_a_file'
821
+
822
+ expect(Puppet::Resource.from_data_hash(JSON.parse(resource.to_json)).kind).to eq('im_a_file')
823
+ end
824
+
769
825
  it "should include the 'exported' value if one is set" do
770
826
  resource = Puppet::Resource.new("File", "/foo")
771
827
  resource.exported = true
@@ -138,6 +138,57 @@ describe Puppet::Transaction::Persistence do
138
138
  persistence = Puppet::Transaction::Persistence.new
139
139
  expect(persistence.load.dig("File[/tmp/audit]", "parameters", "mtime", "system_value")).to contain_exactly(be_a(Time))
140
140
  end
141
+
142
+ it 'should load Regexp' do
143
+ write_state_file(<<~END)
144
+ system_value:
145
+ - !ruby/regexp /regexp/
146
+ END
147
+
148
+ persistence = Puppet::Transaction::Persistence.new
149
+ expect(persistence.load.dig("system_value")).to contain_exactly(be_a(Regexp))
150
+ end
151
+
152
+ it 'should load semantic puppet version' do
153
+ write_state_file(<<~END)
154
+ system_value:
155
+ - !ruby/object:SemanticPuppet::Version
156
+ major: 1
157
+ minor: 0
158
+ patch: 0
159
+ prerelease:
160
+ build:
161
+ END
162
+
163
+ persistence = Puppet::Transaction::Persistence.new
164
+ expect(persistence.load.dig("system_value")).to contain_exactly(be_a(SemanticPuppet::Version))
165
+ end
166
+
167
+ it 'should load puppet time related objects' do
168
+ write_state_file(<<~END)
169
+ system_value:
170
+ - !ruby/object:Puppet::Pops::Time::Timestamp
171
+ nsecs: 1638316135955087259
172
+ - !ruby/object:Puppet::Pops::Time::TimeData
173
+ nsecs: 1495789430910161286
174
+ - !ruby/object:Puppet::Pops::Time::Timespan
175
+ nsecs: 1495789430910161286
176
+ END
177
+
178
+ persistence = Puppet::Transaction::Persistence.new
179
+ expect(persistence.load.dig("system_value")).to contain_exactly(be_a(Puppet::Pops::Time::Timestamp), be_a(Puppet::Pops::Time::TimeData), be_a(Puppet::Pops::Time::Timespan))
180
+ end
181
+
182
+ it 'should load binary objects' do
183
+ write_state_file(<<~END)
184
+ system_value:
185
+ - !ruby/object:Puppet::Pops::Types::PBinaryType::Binary
186
+ binary_buffer: ''
187
+ END
188
+
189
+ persistence = Puppet::Transaction::Persistence.new
190
+ expect(persistence.load.dig("system_value")).to contain_exactly(be_a(Puppet::Pops::Types::PBinaryType::Binary))
191
+ end
141
192
  end
142
193
  end
143
194
 
@@ -27,6 +27,13 @@ describe Puppet::Type.type(:file).attrclass(:group) do
27
27
  expect { group.insync?(5) }.to raise_error(/Could not find group foos/)
28
28
  end
29
29
 
30
+ it "should return false if a group's id can't be found by name in noop" do
31
+ Puppet[:noop] = true
32
+ allow(resource.provider).to receive(:name2gid).and_return(nil)
33
+
34
+ expect(group.insync?('notcreatedyet')).to eq(false)
35
+ end
36
+
30
37
  it "should use the id for comparisons, not the name" do
31
38
  expect(group.insync?('foos')).to be_falsey
32
39
  end
@@ -25,6 +25,13 @@ describe Puppet::Type.type(:file).attrclass(:owner) do
25
25
  expect { owner.insync?(5) }.to raise_error(/Could not find user foo/)
26
26
  end
27
27
 
28
+ it "should return false if an owner's id can't be found by name in noop" do
29
+ Puppet[:noop] = true
30
+ allow(resource.provider).to receive(:name2uid).and_return(nil)
31
+
32
+ expect(owner.insync?('notcreatedyet')).to eq(false)
33
+ end
34
+
28
35
  it "should use the id for comparisons, not the name" do
29
36
  expect(owner.insync?('foo')).to be_falsey
30
37
  end
@@ -158,6 +158,33 @@ describe test_title, "when validating attribute values" do
158
158
  expect(srv[:timeout]).to eq(int)
159
159
  end
160
160
  end
161
+
162
+ it "should default :timeout to 10 when provider has no default value" do
163
+ srv = Puppet::Type.type(:service).new(:name => "yay")
164
+ expect(srv[:timeout]).to eq(10)
165
+ end
166
+
167
+ it "should default :timeout to provider given default time when it has one" do
168
+ provider_class_with_timeout = Puppet::Type.type(:service).provide(:simple) do
169
+ has_features :configurable_timeout
170
+ def default_timeout
171
+ 30
172
+ end
173
+ end
174
+ allow(Puppet::Type.type(:service)).to receive(:defaultprovider).and_return(provider_class_with_timeout)
175
+
176
+ srv = Puppet::Type.type(:service).new(:name => "yay")
177
+ expect(srv[:timeout]).to eq(30)
178
+ end
179
+
180
+ it "should accept string as value" do
181
+ srv = Puppet::Type.type(:service).new(:name => "yay", :timeout => "25")
182
+ expect(srv[:timeout]).to eq(25)
183
+ end
184
+
185
+ it "should not support values that cannot be converted to Integer such as Array" do
186
+ expect { Puppet::Type.type(:service).new(:name => "yay", :timeout => [25]) }.to raise_error(Puppet::Error)
187
+ end
161
188
  end
162
189
 
163
190
  describe "the service logon credentials" do
@@ -174,51 +174,6 @@ describe Puppet::Type.type(:user) do
174
174
  end
175
175
  end
176
176
 
177
- describe "when managing the purge_ssh_keys property" do
178
- context "with valid input" do
179
- it "should support a :true value" do
180
- expect { described_class.new(:name => 'foo', :purge_ssh_keys => :true) }.to_not raise_error
181
- end
182
-
183
- it "should support a :false value" do
184
- expect { described_class.new(:name => 'foo', :purge_ssh_keys => :false) }.to_not raise_error
185
- end
186
-
187
- it "should support a String value" do
188
- expect { described_class.new(:name => 'foo', :purge_ssh_keys => File.expand_path('home/foo/.ssh/authorized_keys')) }.to_not raise_error
189
- end
190
-
191
- it "should support an Array value" do
192
- expect { described_class.new(:name => 'foo', :purge_ssh_keys => [File.expand_path('home/foo/.ssh/authorized_keys'),
193
- File.expand_path('custom/authorized_keys')]) }.to_not raise_error
194
- end
195
- end
196
-
197
- context "with faulty input" do
198
- it "should raise error for relative path" do
199
- expect { described_class.new(:name => 'foo', :purge_ssh_keys => 'home/foo/.ssh/authorized_keys') }.to raise_error(Puppet::ResourceError,
200
- /Paths to keyfiles must be absolute/ )
201
- end
202
-
203
- it "should raise error for invalid type" do
204
- expect { described_class.new(:name => 'foo', :purge_ssh_keys => :invalid) }.to raise_error(Puppet::ResourceError,
205
- /purge_ssh_keys must be true, false, or an array of file names/ )
206
- end
207
-
208
- it "should raise error for array with relative path" do
209
- expect { described_class.new(:name => 'foo', :purge_ssh_keys => ['home/foo/.ssh/authorized_keys',
210
- File.expand_path('custom/authorized_keys')]) }.to raise_error(Puppet::ResourceError,
211
- /Paths to keyfiles must be absolute/ )
212
- end
213
-
214
- it "should raise error for array with invalid type" do
215
- expect { described_class.new(:name => 'foo', :purge_ssh_keys => [:invalid,
216
- File.expand_path('custom/authorized_keys')]) }.to raise_error(Puppet::ResourceError,
217
- /Each entry for purge_ssh_keys must be a string/ )
218
- end
219
- end
220
- end
221
-
222
177
  describe "when managing the uid property" do
223
178
  it "should convert number-looking strings into actual numbers" do
224
179
  expect(described_class.new(:name => 'foo', :uid => '50')[:uid]).to eq(50)
@@ -334,6 +289,73 @@ describe Puppet::Type.type(:user) do
334
289
  end
335
290
  end
336
291
 
292
+ describe "when managing the purge_ssh_keys property" do
293
+ context "with valid input" do
294
+ ['true', :true, true].each do |input|
295
+ it "should support #{input} as value" do
296
+ expect { described_class.new(:name => 'foo', :purge_ssh_keys => input) }.to_not raise_error
297
+ end
298
+ end
299
+
300
+ ['false', :false, false].each do |input|
301
+ it "should support #{input} as value" do
302
+ expect { described_class.new(:name => 'foo', :purge_ssh_keys => input) }.to_not raise_error
303
+ end
304
+ end
305
+
306
+ it "should support a String value" do
307
+ expect { described_class.new(:name => 'foo', :purge_ssh_keys => File.expand_path('home/foo/.ssh/authorized_keys')) }.to_not raise_error
308
+ end
309
+
310
+ it "should support an Array value" do
311
+ expect { described_class.new(:name => 'foo', :purge_ssh_keys => [File.expand_path('home/foo/.ssh/authorized_keys'),
312
+ File.expand_path('custom/authorized_keys')]) }.to_not raise_error
313
+ end
314
+ end
315
+
316
+ context "with faulty input" do
317
+ it "should raise error for relative path" do
318
+ expect { described_class.new(:name => 'foo', :purge_ssh_keys => 'home/foo/.ssh/authorized_keys') }.to raise_error(Puppet::ResourceError,
319
+ /Paths to keyfiles must be absolute/ )
320
+ end
321
+
322
+ it "should raise error for invalid type" do
323
+ expect { described_class.new(:name => 'foo', :purge_ssh_keys => :invalid) }.to raise_error(Puppet::ResourceError,
324
+ /purge_ssh_keys must be true, false, or an array of file names/ )
325
+ end
326
+
327
+ it "should raise error for array with relative path" do
328
+ expect { described_class.new(:name => 'foo', :purge_ssh_keys => ['home/foo/.ssh/authorized_keys',
329
+ File.expand_path('custom/authorized_keys')]) }.to raise_error(Puppet::ResourceError,
330
+ /Paths to keyfiles must be absolute/ )
331
+ end
332
+
333
+ it "should raise error for array with invalid type" do
334
+ expect { described_class.new(:name => 'foo', :purge_ssh_keys => [:invalid,
335
+ File.expand_path('custom/authorized_keys')]) }.to raise_error(Puppet::ResourceError,
336
+ /Each entry for purge_ssh_keys must be a string/ )
337
+ end
338
+ end
339
+
340
+ context "homedir retrieval" do
341
+ it "should accept the home provided" do
342
+ expect(Puppet).not_to receive(:debug).with("User 'foo' does not exist")
343
+ described_class.new(:name => 'foo', :purge_ssh_keys => true, :home => '/my_home')
344
+ end
345
+
346
+ it "should accept the home provided" do
347
+ expect(Dir).to receive(:home).with('foo').and_return('/my_home')
348
+ expect(Puppet).not_to receive(:debug).with("User 'foo' does not exist")
349
+ described_class.new(:name => 'foo', :purge_ssh_keys => true)
350
+ end
351
+
352
+ it "should output debug message when home directory cannot be retrieved" do
353
+ allow(Dir).to receive(:home).with('foo').and_raise(ArgumentError)
354
+ expect(Puppet).to receive(:debug).with("User 'foo' does not exist")
355
+ described_class.new(:name => 'foo', :purge_ssh_keys => true)
356
+ end
357
+ end
358
+ end
337
359
 
338
360
  describe "when managing expiry" do
339
361
  it "should fail if given an invalid date" do
@@ -178,15 +178,14 @@ describe Puppet::Util::Autoload do
178
178
  end
179
179
 
180
180
  describe "when loading all files" do
181
+ let(:basedir) { tmpdir('autoloader') }
182
+ let(:path) { File.join(basedir, @autoload.path, 'file.rb') }
183
+
181
184
  before do
182
- allow(@autoload.class).to receive(:search_directories).and_return([make_absolute("/a")])
183
- allow(FileTest).to receive(:directory?).and_return(true)
184
- allow(Dir).to receive(:glob).and_return([make_absolute("/a/foo/file.rb")])
185
- allow(Puppet::FileSystem).to receive(:exist?).and_return(true)
186
- @time_a = Time.utc(2010, 'jan', 1, 6, 30)
187
- allow(File).to receive(:mtime).and_return(@time_a)
185
+ FileUtils.mkdir_p(File.dirname(path))
186
+ FileUtils.touch(path)
188
187
 
189
- allow(@autoload.class).to receive(:loaded?).and_return(false)
188
+ allow(@autoload.class).to receive(:search_directories).and_return([basedir])
190
189
  end
191
190
 
192
191
  [RuntimeError, LoadError, SyntaxError].each do |error|
@@ -198,7 +197,25 @@ describe Puppet::Util::Autoload do
198
197
  end
199
198
 
200
199
  it "should require the full path to the file" do
201
- expect(Kernel).to receive(:load).with(make_absolute("/a/foo/file.rb"), any_args)
200
+ expect(Kernel).to receive(:load).with(path, any_args)
201
+
202
+ @autoload.loadall(env)
203
+ end
204
+
205
+ it "autoloads from a directory whose ancestor is Windows 8.3", if: Puppet::Util::Platform.windows? do
206
+ # File.expand_path will expand ~ in the last directory component only(!)
207
+ # so create an ancestor directory with a long path
208
+ dir = File.join(tmpdir('longpath'), 'short')
209
+ path = File.join(dir, @autoload.path, 'file.rb')
210
+
211
+ FileUtils.mkdir_p(File.dirname(path))
212
+ FileUtils.touch(path)
213
+
214
+ dir83 = File.join(File.dirname(basedir), 'longpa~1', 'short')
215
+ path83 = File.join(dir83, @autoload.path, 'file.rb')
216
+
217
+ allow(@autoload.class).to receive(:search_directories).and_return([dir83])
218
+ expect(Kernel).to receive(:load).with(path83, any_args)
202
219
 
203
220
  @autoload.loadall(env)
204
221
  end
@@ -0,0 +1,126 @@
1
+ # coding: utf-8
2
+ require 'spec_helper'
3
+ require 'puppet/util/json'
4
+
5
+ describe Puppet::Util::Json do
6
+ include PuppetSpec::Files
7
+
8
+ shared_examples_for 'json file loader' do |load_method|
9
+ it 'reads a JSON file from disk' do
10
+ file_path = file_containing('input', JSON.dump({ "my" => "data" }))
11
+
12
+ expect(load_method.call(file_path)).to eq({ "my" => "data" })
13
+ end
14
+
15
+ it 'reads JSON as UTF-8' do
16
+ file_path = file_containing('input', JSON.dump({ "my" => "𠜎" }))
17
+
18
+ expect(load_method.call(file_path)).to eq({ "my" => "𠜎" })
19
+ end
20
+ end
21
+
22
+ context "#load" do
23
+ it 'raises an error if JSON is invalid' do
24
+ expect {
25
+ Puppet::Util::Json.load('{ invalid')
26
+ }.to raise_error(Puppet::Util::Json::ParseError, /unexpected token at '{ invalid'/)
27
+ end
28
+
29
+ it 'raises an error if the content is empty' do
30
+ expect {
31
+ Puppet::Util::Json.load('')
32
+ }.to raise_error(Puppet::Util::Json::ParseError)
33
+ end
34
+
35
+ it 'loads true' do
36
+ expect(Puppet::Util::Json.load('true')).to eq(true)
37
+ end
38
+
39
+ it 'loads false' do
40
+ expect(Puppet::Util::Json.load('false')).to eq(false)
41
+ end
42
+
43
+ it 'loads a numeric' do
44
+ expect(Puppet::Util::Json.load('42')).to eq(42)
45
+ end
46
+
47
+ it 'loads a string' do
48
+ expect(Puppet::Util::Json.load('"puppet"')).to eq('puppet')
49
+ end
50
+
51
+ it 'loads an array' do
52
+ expect(Puppet::Util::Json.load(<<~JSON)).to eq([1, 2])
53
+ [1, 2]
54
+ JSON
55
+ end
56
+
57
+ it 'loads a hash' do
58
+ expect(Puppet::Util::Json.load(<<~JSON)).to eq('a' => 1, 'b' => 2)
59
+ {
60
+ "a": 1,
61
+ "b": 2
62
+ }
63
+ JSON
64
+ end
65
+ end
66
+
67
+ context "load_file_if_valid" do
68
+ before do
69
+ Puppet[:log_level] = 'debug'
70
+ end
71
+
72
+ it_should_behave_like 'json file loader', Puppet::Util::Json.method(:load_file_if_valid)
73
+
74
+ it 'returns nil when the file is invalid JSON and debug logs about it' do
75
+ file_path = file_containing('input', '{ invalid')
76
+ expect(Puppet).to receive(:debug)
77
+ .with(/Could not retrieve JSON content .+: unexpected token at '{ invalid'/).and_call_original
78
+
79
+ expect(Puppet::Util::Json.load_file_if_valid(file_path)).to eql(nil)
80
+ end
81
+
82
+ it 'returns nil when the filename is illegal and debug logs about it' do
83
+ expect(Puppet).to receive(:debug)
84
+ .with(/Could not retrieve JSON content .+: pathname contains null byte/).and_call_original
85
+
86
+ expect(Puppet::Util::Json.load_file_if_valid("not\0allowed")).to eql(nil)
87
+ end
88
+
89
+ it 'returns nil when the file does not exist and debug logs about it' do
90
+ expect(Puppet).to receive(:debug)
91
+ .with(/Could not retrieve JSON content .+: No such file or directory/).and_call_original
92
+
93
+ expect(Puppet::Util::Json.load_file_if_valid('does/not/exist.json')).to eql(nil)
94
+ end
95
+ end
96
+
97
+ context '#load_file' do
98
+ it_should_behave_like 'json file loader', Puppet::Util::Json.method(:load_file)
99
+
100
+ it 'raises an error when the file is invalid JSON' do
101
+ file_path = file_containing('input', '{ invalid')
102
+
103
+ expect {
104
+ Puppet::Util::Json.load_file(file_path)
105
+ }.to raise_error(Puppet::Util::Json::ParseError, /unexpected token at '{ invalid'/)
106
+ end
107
+
108
+ it 'raises an error when the filename is illegal' do
109
+ expect {
110
+ Puppet::Util::Json.load_file("not\0allowed")
111
+ }.to raise_error(ArgumentError, /null byte/)
112
+ end
113
+
114
+ it 'raises an error when the file does not exist' do
115
+ expect {
116
+ Puppet::Util::Json.load_file('does/not/exist.json')
117
+ }.to raise_error(Errno::ENOENT, /No such file or directory/)
118
+ end
119
+
120
+ it 'writes data formatted as JSON to disk' do
121
+ file_path = file_containing('input', Puppet::Util::Json.dump({ "my" => "data" }))
122
+
123
+ expect(Puppet::Util::Json.load_file(file_path)).to eq({ "my" => "data" })
124
+ end
125
+ end
126
+ end
@@ -1,6 +1,5 @@
1
1
  # coding: utf-8
2
2
  require 'spec_helper'
3
-
4
3
  require 'puppet/util/yaml'
5
4
 
6
5
  describe Puppet::Util::Yaml do
@@ -10,21 +9,21 @@ describe Puppet::Util::Yaml do
10
9
 
11
10
  shared_examples_for 'yaml file loader' do |load_method|
12
11
  it 'returns false when the file is empty' do
13
- Puppet::FileSystem.touch(filename)
12
+ file_path = file_containing('input', '')
14
13
 
15
- expect(load_method.call(filename)).to eq(false)
14
+ expect(load_method.call(file_path)).to eq(false)
16
15
  end
17
16
 
18
17
  it 'reads a YAML file from disk' do
19
- write_file(filename, YAML.dump({ "my" => "data" }))
18
+ file_path = file_containing('input', YAML.dump({ "my" => "data" }))
20
19
 
21
- expect(load_method.call(filename)).to eq({ "my" => "data" })
20
+ expect(load_method.call(file_path)).to eq({ "my" => "data" })
22
21
  end
23
22
 
24
23
  it 'reads YAML as UTF-8' do
25
- write_file(filename, YAML.dump({ "my" => "𠜎" }))
24
+ file_path = file_containing('input', YAML.dump({ "my" => "𠜎" }))
26
25
 
27
- expect(load_method.call(filename)).to eq({ "my" => "𠜎" })
26
+ expect(load_method.call(file_path)).to eq({ "my" => "𠜎" })
28
27
  end
29
28
  end
30
29
 
@@ -119,11 +118,11 @@ FACTS
119
118
  it_should_behave_like 'yaml file loader', Puppet::Util::Yaml.method(:safe_load_file)
120
119
 
121
120
  it 'raises an error when the file is invalid YAML' do
122
- write_file(filename, '{ invalid')
121
+ file_path = file_containing('input', '{ invalid')
123
122
 
124
123
  expect {
125
- Puppet::Util::Yaml.safe_load_file(filename)
126
- }.to raise_error(Puppet::Util::Yaml::YamlLoadError, %r[\(#{filename}\): .* at line \d+ column \d+])
124
+ Puppet::Util::Yaml.safe_load_file(file_path)
125
+ }.to raise_error(Puppet::Util::Yaml::YamlLoadError, %r[\(#{file_path}\): .* at line \d+ column \d+])
127
126
  end
128
127
 
129
128
  it 'raises an error when the filename is illegal' do
@@ -139,9 +138,34 @@ FACTS
139
138
  end
140
139
  end
141
140
 
142
- def write_file(name, contents)
143
- File.open(name, "w:UTF-8") do |fh|
144
- fh.write(contents)
141
+ context "#safe_load_file_if_valid" do
142
+ before do
143
+ Puppet[:log_level] = 'debug'
144
+ end
145
+
146
+ it_should_behave_like 'yaml file loader', Puppet::Util::Yaml.method(:safe_load_file_if_valid)
147
+
148
+ it 'returns nil when the file is invalid YAML and debug logs about it' do
149
+ file_path = file_containing('input', '{ invalid')
150
+
151
+ expect(Puppet).to receive(:debug)
152
+ .with(/Could not retrieve YAML content .+ expected ',' or '}'/).and_call_original
153
+
154
+ expect(Puppet::Util::Yaml.safe_load_file_if_valid(file_path)).to eql(nil)
155
+ end
156
+
157
+ it 'returns nil when the filename is illegal and debug logs about it' do
158
+ expect(Puppet).to receive(:debug)
159
+ .with(/Could not retrieve YAML content .+: pathname contains null byte/).and_call_original
160
+
161
+ expect(Puppet::Util::Yaml.safe_load_file_if_valid("not\0allowed")).to eql(nil)
162
+ end
163
+
164
+ it 'returns nil when the file does not exist and debug logs about it' do
165
+ expect(Puppet).to receive(:debug)
166
+ .with(/Could not retrieve YAML content .+: No such file or directory/).and_call_original
167
+
168
+ expect(Puppet::Util::Yaml.safe_load_file_if_valid('does/not/exist.yaml')).to eql(nil)
145
169
  end
146
170
  end
147
171
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: puppet
3
3
  version: !ruby/object:Gem::Version
4
- version: 7.11.0
4
+ version: 7.14.0
5
5
  platform: universal-darwin
6
6
  authors:
7
7
  - Puppet Labs
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-09-13 00:00:00.000000000 Z
11
+ date: 2022-01-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: facter
@@ -68,16 +68,22 @@ dependencies:
68
68
  name: fast_gettext
69
69
  requirement: !ruby/object:Gem::Requirement
70
70
  requirements:
71
- - - "~>"
71
+ - - ">="
72
72
  - !ruby/object:Gem::Version
73
73
  version: '1.1'
74
+ - - "<"
75
+ - !ruby/object:Gem::Version
76
+ version: '3'
74
77
  type: :runtime
75
78
  prerelease: false
76
79
  version_requirements: !ruby/object:Gem::Requirement
77
80
  requirements:
78
- - - "~>"
81
+ - - ">="
79
82
  - !ruby/object:Gem::Version
80
83
  version: '1.1'
84
+ - - "<"
85
+ - !ruby/object:Gem::Version
86
+ version: '3'
81
87
  - !ruby/object:Gem::Dependency
82
88
  name: locale
83
89
  requirement: !ruby/object:Gem::Requirement
@@ -1849,6 +1855,7 @@ files:
1849
1855
  - spec/unit/application_spec.rb
1850
1856
  - spec/unit/certificate_factory_spec.rb
1851
1857
  - spec/unit/concurrent/lock_spec.rb
1858
+ - spec/unit/concurrent/thread_local_singleton_spec.rb
1852
1859
  - spec/unit/configurer/downloader_spec.rb
1853
1860
  - spec/unit/configurer/fact_handler_spec.rb
1854
1861
  - spec/unit/configurer/plugin_handler_spec.rb
@@ -2445,6 +2452,7 @@ files:
2445
2452
  - spec/unit/util/filetype_spec.rb
2446
2453
  - spec/unit/util/inifile_spec.rb
2447
2454
  - spec/unit/util/json_lockfile_spec.rb
2455
+ - spec/unit/util/json_spec.rb
2448
2456
  - spec/unit/util/ldap/connection_spec.rb
2449
2457
  - spec/unit/util/ldap/generator_spec.rb
2450
2458
  - spec/unit/util/ldap/manager_spec.rb
@@ -2543,7 +2551,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
2543
2551
  - !ruby/object:Gem::Version
2544
2552
  version: 1.3.1
2545
2553
  requirements: []
2546
- rubygems_version: 3.0.8
2554
+ rubygems_version: 3.1.2
2547
2555
  signing_key:
2548
2556
  specification_version: 4
2549
2557
  summary: Puppet, an automated configuration management tool
@@ -3106,6 +3114,7 @@ test_files:
3106
3114
  - spec/unit/application_spec.rb
3107
3115
  - spec/unit/certificate_factory_spec.rb
3108
3116
  - spec/unit/concurrent/lock_spec.rb
3117
+ - spec/unit/concurrent/thread_local_singleton_spec.rb
3109
3118
  - spec/unit/configurer/downloader_spec.rb
3110
3119
  - spec/unit/configurer/fact_handler_spec.rb
3111
3120
  - spec/unit/configurer/plugin_handler_spec.rb
@@ -3702,6 +3711,7 @@ test_files:
3702
3711
  - spec/unit/util/filetype_spec.rb
3703
3712
  - spec/unit/util/inifile_spec.rb
3704
3713
  - spec/unit/util/json_lockfile_spec.rb
3714
+ - spec/unit/util/json_spec.rb
3705
3715
  - spec/unit/util/ldap/connection_spec.rb
3706
3716
  - spec/unit/util/ldap/generator_spec.rb
3707
3717
  - spec/unit/util/ldap/manager_spec.rb