puppet 6.19.1-x64-mingw32 → 6.20.0-x64-mingw32

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
@@ -11,9 +11,7 @@ describe Puppet::Type.type(:package).provider(:apt) do
11
11
  end
12
12
 
13
13
  let(:provider) do
14
- provider = subject()
15
- provider.resource = resource
16
- provider
14
+ resource.provider
17
15
  end
18
16
 
19
17
  it "should be the default provider on :osfamily => Debian" do
@@ -88,7 +86,7 @@ Version table:
88
86
 
89
87
  describe ".instances" do
90
88
  before do
91
- allow(Puppet::Type::Package::ProviderDpkg).to receive(:instances).and_return([resource])
89
+ allow(Puppet::Type::Package::ProviderDpkg).to receive(:instances).and_return([provider])
92
90
  end
93
91
 
94
92
  context "when package is manual marked" do
@@ -97,8 +95,7 @@ Version table:
97
95
  end
98
96
 
99
97
  it 'sets mark to manual' do
100
- expect(resource).to receive(:mark=).with(:manual)
101
- described_class.instances
98
+ expect(described_class.instances.map(&:mark)).to eq([:manual])
102
99
  end
103
100
  end
104
101
 
@@ -108,8 +105,7 @@ Version table:
108
105
  end
109
106
 
110
107
  it 'does not set mark to manual' do
111
- expect(resource).not_to receive(:mark=).with(:manual)
112
- described_class.instances
108
+ expect(described_class.instances.map(&:mark)).to eq([nil])
113
109
  end
114
110
  end
115
111
  end
@@ -1,17 +1,18 @@
1
1
  require 'spec_helper'
2
2
  require 'puppet/provider/package'
3
3
 
4
+ Puppet::Type.type(:package).provide(:test_base_provider, parent: Puppet::Provider::Package) do
5
+ def query; end
6
+ end
7
+
4
8
  describe Puppet::Provider::Package do
9
+ let(:provider) { Puppet::Type.type(:package).provider(:test_base_provider).new }
10
+
5
11
  it 'returns absent for uninstalled packages when not purgeable' do
6
- provider = Puppet::Provider::Package.new
7
- expect(provider).to receive(:query).and_return(nil)
8
- expect(provider.class).to receive(:feature?).with(:purgeable).and_return(false)
9
12
  expect(provider.properties[:ensure]).to eq(:absent)
10
13
  end
11
14
 
12
15
  it 'returns purged for uninstalled packages when purgeable' do
13
- provider = Puppet::Provider::Package.new
14
- expect(provider).to receive(:query).and_return(nil)
15
16
  expect(provider.class).to receive(:feature?).with(:purgeable).and_return(true)
16
17
  expect(provider.properties[:ensure]).to eq(:purged)
17
18
  end
@@ -32,10 +32,12 @@ describe Puppet::Type.type(:package).provider(:pacman) do
32
32
  end
33
33
 
34
34
  it "should call yaourt to install the right package quietly when yaourt is installed" do
35
- allow(described_class).to receive(:yaourt?).and_return(true)
36
- args = ['--noconfirm', '--needed', '--noprogressbar', '-S', resource[:name]]
37
- expect(provider).to receive(:yaourt).at_least(:once).with(*args).and_return('')
38
- provider.install
35
+ without_partial_double_verification do
36
+ allow(described_class).to receive(:yaourt?).and_return(true)
37
+ args = ['--noconfirm', '--needed', '--noprogressbar', '-S', resource[:name]]
38
+ expect(provider).to receive(:yaourt).at_least(:once).with(*args).and_return('')
39
+ provider.install
40
+ end
39
41
  end
40
42
 
41
43
  it "should raise an Puppet::Error if the installation failed" do
@@ -74,10 +76,12 @@ describe Puppet::Type.type(:package).provider(:pacman) do
74
76
  end
75
77
 
76
78
  it "should call yaourt to install the right package quietly when yaourt is installed" do
77
- expect(described_class).to receive(:yaourt?).and_return(true)
78
- args = ['--noconfirm', '--needed', '--noprogressbar', '-x', '--arg=value', '-S', resource[:name]]
79
- expect(provider).to receive(:yaourt).at_least(:once).with(*args).and_return('')
80
- provider.install
79
+ without_partial_double_verification do
80
+ expect(described_class).to receive(:yaourt?).and_return(true)
81
+ args = ['--noconfirm', '--needed', '--noprogressbar', '-x', '--arg=value', '-S', resource[:name]]
82
+ expect(provider).to receive(:yaourt).at_least(:once).with(*args).and_return('')
83
+ provider.install
84
+ end
81
85
  end
82
86
  end
83
87
 
@@ -172,10 +176,12 @@ describe Puppet::Type.type(:package).provider(:pacman) do
172
176
  end
173
177
 
174
178
  it "should call yaourt to remove the right package quietly" do
175
- allow(described_class).to receive(:yaourt?).and_return(true)
176
- args = ["--noconfirm", "--noprogressbar", "-R", resource[:name]]
177
- expect(provider).to receive(:yaourt).with(*args)
178
- provider.uninstall
179
+ without_partial_double_verification do
180
+ allow(described_class).to receive(:yaourt?).and_return(true)
181
+ args = ["--noconfirm", "--noprogressbar", "-R", resource[:name]]
182
+ expect(provider).to receive(:yaourt).with(*args)
183
+ provider.uninstall
184
+ end
179
185
  end
180
186
 
181
187
  it "adds any uninstall_options" do
@@ -14,9 +14,8 @@ describe Puppet::Type.type(:package).provider(:pip) do
14
14
  it { is_expected.to be_version_ranges }
15
15
 
16
16
  before do
17
- @resource = Puppet::Resource.new(:package, "fake_package")
18
- allow(@resource).to receive(:original_parameters).and_return({})
19
- @provider = described_class.new(@resource)
17
+ @resource = Puppet::Type.type(:package).new(name: "fake_package", provider: :pip)
18
+ @provider = @resource.provider
20
19
  @client = double('client')
21
20
  allow(@client).to receive(:call).with('package_releases', 'real_package').and_return(["1.3", "1.2.5", "1.2.4"])
22
21
  allow(@client).to receive(:call).with('package_releases', 'fake_package').and_return([])
@@ -335,7 +334,6 @@ describe Puppet::Type.type(:package).provider(:pip) do
335
334
 
336
335
  it "should install" do
337
336
  @resource[:ensure] = :installed
338
- @resource[:source] = nil
339
337
  expect(@provider).to receive(:execute).with(["/fake/bin/pip", ["install", "-q", "fake_package"]])
340
338
  @provider.install
341
339
  end
@@ -368,7 +366,6 @@ describe Puppet::Type.type(:package).provider(:pip) do
368
366
 
369
367
  it "should install a particular version" do
370
368
  @resource[:ensure] = "0.0.0"
371
- @resource[:source] = nil
372
369
  # TJK
373
370
  expect(@provider).to receive(:execute).with(["/fake/bin/pip", ["install", "-q", "fake_package==0.0.0"]])
374
371
  @provider.install
@@ -376,7 +373,6 @@ describe Puppet::Type.type(:package).provider(:pip) do
376
373
 
377
374
  it "should upgrade" do
378
375
  @resource[:ensure] = :latest
379
- @resource[:source] = nil
380
376
  # TJK
381
377
  expect(@provider).to receive(:execute).with(["/fake/bin/pip", ["install", "-q", "--upgrade", "fake_package"]])
382
378
  @provider.install
@@ -384,7 +380,6 @@ describe Puppet::Type.type(:package).provider(:pip) do
384
380
 
385
381
  it "should handle install options" do
386
382
  @resource[:ensure] = :installed
387
- @resource[:source] = nil
388
383
  @resource[:install_options] = [{"--timeout" => "10"}, "--no-index"]
389
384
  expect(@provider).to receive(:execute).with(["/fake/bin/pip", ["install", "-q", "--timeout=10", "--no-index", "fake_package"]])
390
385
  @provider.install
@@ -415,7 +410,7 @@ describe Puppet::Type.type(:package).provider(:pip) do
415
410
  let(:pip) { '/fake/bin/pip' }
416
411
 
417
412
  it "should look up version if pip is present" do
418
- allow(described_class).to receive(:pip_cmd).and_return(pip)
413
+ allow(described_class).to receive(:cmd).and_return(pip)
419
414
  process = ['pip 8.0.2 from /usr/local/lib/python2.7/dist-packages (python 2.7)']
420
415
  allow(described_class).to receive(:execpipe).with([pip, '--version']).and_yield(process)
421
416
 
@@ -423,7 +418,7 @@ describe Puppet::Type.type(:package).provider(:pip) do
423
418
  end
424
419
 
425
420
  it "parses multiple lines of output" do
426
- allow(described_class).to receive(:pip_cmd).and_return(pip)
421
+ allow(described_class).to receive(:cmd).and_return(pip)
427
422
  process = [
428
423
  "/usr/local/lib/python2.7/dist-packages/urllib3/contrib/socks.py:37: DependencyWarning: SOCKS support in urllib3 requires the installation of optional dependencies: specifically, PySocks. For more information, see https://urllib3.readthedocs.io/en/latest/contrib.html#socks-proxies",
429
424
  " DependencyWarning",
@@ -435,7 +430,7 @@ describe Puppet::Type.type(:package).provider(:pip) do
435
430
  end
436
431
 
437
432
  it "raises if there isn't a version string" do
438
- allow(described_class).to receive(:pip_cmd).and_return(pip)
433
+ allow(described_class).to receive(:cmd).and_return(pip)
439
434
  allow(described_class).to receive(:execpipe).with([pip, '--version']).and_yield([""])
440
435
  expect {
441
436
  described_class.pip_version(pip)
@@ -444,7 +439,7 @@ describe Puppet::Type.type(:package).provider(:pip) do
444
439
 
445
440
  it "quotes commands with spaces" do
446
441
  pip = 'C:\Program Files\Python27\Scripts\pip.exe'
447
- allow(described_class).to receive(:pip_cmd).and_return(pip)
442
+ allow(described_class).to receive(:cmd).and_return(pip)
448
443
  process = ["pip 18.1 from c:\program files\python27\lib\site-packages\pip (python 2.7)\r\n"]
449
444
  allow(described_class).to receive(:execpipe).with(["\"#{pip}\"", '--version']).and_yield(process)
450
445
 
@@ -8,10 +8,6 @@ describe Puppet::Type.type(:package).provider(:pkgdmg) do
8
8
  it { is_expected.not_to be_uninstallable }
9
9
 
10
10
  describe "when installing it should fail when" do
11
- before :each do
12
- expect(Puppet::Util).not_to receive(:execute)
13
- end
14
-
15
11
  it "no source is specified" do
16
12
  expect { provider.install }.to raise_error(Puppet::Error, /must specify a package source/)
17
13
  end
@@ -143,6 +143,11 @@ describe 'Puppet::Type::User::Provider::Aix' do
143
143
  it "returns the user's password" do
144
144
  expect(call_parse_password).to eql('some_password')
145
145
  end
146
+
147
+ it "returns the user's password with tabs" do
148
+ resource[:name] = 'tab_password_user'
149
+ expect(call_parse_password).to eql('some_password')
150
+ end
146
151
  end
147
152
 
148
153
  # TODO: If we move from using Mocha to rspec's mocks,
@@ -33,7 +33,7 @@ describe Puppet::Type.type(:user).provider(:hpuxuseradd),
33
33
  before :each do
34
34
  allow(Etc).to receive(:getpwent).and_return(pwent)
35
35
  allow(Etc).to receive(:getpwnam).and_return(pwent)
36
- allow(resource).to receive(:command).with(:modify).and_return('/usr/sam/lbin/usermod.sam')
36
+ allow(provider).to receive(:command).with(:modify).and_return('/usr/sam/lbin/usermod.sam')
37
37
  end
38
38
 
39
39
  it "should have feature manages_passwords" do
@@ -53,12 +53,14 @@ describe Puppet::Type.type(:user).provider(:pw) do
53
53
 
54
54
  it "should use -G with the correct argument when the groups property is set" do
55
55
  resource[:groups] = "group1"
56
+ allow(Puppet::Util::POSIX).to receive(:groups_of).with('testuser').and_return([])
56
57
  expect(provider).to receive(:execute).with(include("-G").and(include("group1")), kind_of(Hash))
57
58
  provider.create
58
59
  end
59
60
 
60
61
  it "should use -G with all the given groups when the groups property is set to an array" do
61
62
  resource[:groups] = ["group1", "group2"]
63
+ allow(Puppet::Util::POSIX).to receive(:groups_of).with('testuser').and_return([])
62
64
  expect(provider).to receive(:execute).with(include("-G").and(include("group1,group2")), kind_of(Hash))
63
65
  provider.create
64
66
  end
@@ -4,6 +4,7 @@ RSpec::Matchers.define_negated_matcher :excluding, :include
4
4
 
5
5
  describe Puppet::Type.type(:user).provider(:useradd) do
6
6
  before :each do
7
+ allow(Puppet::Util::POSIX).to receive(:groups_of).and_return([])
7
8
  allow(described_class).to receive(:command).with(:password).and_return('/usr/bin/chage')
8
9
  allow(described_class).to receive(:command).with(:localpassword).and_return('/usr/sbin/lchage')
9
10
  allow(described_class).to receive(:command).with(:add).and_return('/usr/sbin/useradd')
@@ -648,39 +648,37 @@ describe Puppet::Provider do
648
648
  it "delegates instance execute to Puppet::Util::Execution" do
649
649
  expect(Puppet::Util::Execution).to receive(:execute).with("a_command", { :option => "value" })
650
650
 
651
- provider.new.send(:execute, "a_command", { :option => "value" })
651
+ provider.new.execute("a_command", { :option => "value" })
652
652
  end
653
653
 
654
654
  it "delegates class execute to Puppet::Util::Execution" do
655
655
  expect(Puppet::Util::Execution).to receive(:execute).with("a_command", { :option => "value" })
656
656
 
657
- provider.send(:execute, "a_command", { :option => "value" })
657
+ provider.execute("a_command", { :option => "value" })
658
658
  end
659
659
 
660
660
  it "delegates instance execpipe to Puppet::Util::Execution" do
661
- block = Proc.new { }
662
- expect(Puppet::Util::Execution).to receive(:execpipe).with("a_command", true, block)
661
+ allow(Puppet::Util::Execution).to receive(:execpipe).with("a_command", true).and_yield('some output')
663
662
 
664
- provider.new.send(:execpipe, "a_command", true, block)
663
+ expect { |b| provider.new.execpipe("a_command", true, &b) }.to yield_with_args('some output')
665
664
  end
666
665
 
667
666
  it "delegates class execpipe to Puppet::Util::Execution" do
668
- block = Proc.new { }
669
- expect(Puppet::Util::Execution).to receive(:execpipe).with("a_command", true, block)
667
+ allow(Puppet::Util::Execution).to receive(:execpipe).with("a_command", true).and_yield('some output')
670
668
 
671
- provider.send(:execpipe, "a_command", true, block)
669
+ expect { |b| provider.execpipe("a_command", true, &b) }.to yield_with_args('some output')
672
670
  end
673
671
 
674
672
  it "delegates instance execfail to Puppet::Util::Execution" do
675
673
  expect(Puppet::Util::Execution).to receive(:execfail).with("a_command", "an exception to raise")
676
674
 
677
- provider.new.send(:execfail, "a_command", "an exception to raise")
675
+ provider.new.execfail("a_command", "an exception to raise")
678
676
  end
679
677
 
680
678
  it "delegates class execfail to Puppet::Util::Execution" do
681
679
  expect(Puppet::Util::Execution).to receive(:execfail).with("a_command", "an exception to raise")
682
680
 
683
- provider.send(:execfail, "a_command", "an exception to raise")
681
+ provider.execfail("a_command", "an exception to raise")
684
682
  end
685
683
  end
686
684
 
@@ -69,6 +69,51 @@ describe 'Puppet Pal' do
69
69
  }.to raise_error(/manifest_file or code_string cannot be given when configured_by_env is true/)
70
70
  end
71
71
 
72
+ it 'shadows target variables that collide with plan variables' do
73
+ facts = { 'var' => 'fact' }
74
+ target_vars = { 'var' => 'target' }
75
+
76
+ expect(Puppet).to receive(:warning).with(/Target variable \$var will be overridden by fact of the same name/)
77
+
78
+ result = Puppet::Pal.in_tmp_environment('pal_env', facts: {}) do |ctx|
79
+ ctx.with_catalog_compiler(facts: facts, target_variables: target_vars ) do |c|
80
+ c.evaluate_string('$var')
81
+ end
82
+ end
83
+
84
+ expect(result).to eq('fact')
85
+ end
86
+
87
+ it 'shadows target variables that collide with facts' do
88
+ plan_vars = { 'var' => 'plan' }
89
+ target_vars = { 'var' => 'target' }
90
+
91
+ expect(Puppet).to receive(:warning).with(/Target variable \$var will be overridden by plan variable of the same name/)
92
+
93
+ result = Puppet::Pal.in_tmp_environment('pal_env', facts: {}) do |ctx|
94
+ ctx.with_catalog_compiler(variables: plan_vars, target_variables: target_vars ) do |c|
95
+ c.evaluate_string('$var')
96
+ end
97
+ end
98
+
99
+ expect(result).to eq('plan')
100
+ end
101
+
102
+ it 'shadows plan variables that collide with facts' do
103
+ facts = { 'var' => 'fact' }
104
+ plan_vars = { 'var' => 'plan' }
105
+
106
+ expect(Puppet).to receive(:warning).with(/Plan variable \$var will be overridden by fact of the same name/)
107
+
108
+ result = Puppet::Pal.in_tmp_environment('pal_env', facts: {}) do |ctx|
109
+ ctx.with_catalog_compiler(facts: facts, variables: plan_vars ) do |c|
110
+ c.evaluate_string('$var')
111
+ end
112
+ end
113
+
114
+ expect(result).to eq('fact')
115
+ end
116
+
72
117
  context "evaluate_string method" do
73
118
  it 'evaluates code string in a given tmp environment' do
74
119
  result = Puppet::Pal.in_tmp_environment('pal_env', modulepath: modulepath, facts: node_facts) do |ctx|
@@ -16,7 +16,12 @@ describe Puppet::Resource::CapabilityFinder do
16
16
  Puppet.push_context({:loaders => loaders, :current_environment => env})
17
17
  if mock_pdb
18
18
  module Puppet::Util::Puppetdb
19
- class Http; end
19
+ def query_puppetdb(query); end
20
+ module_function :query_puppetdb
21
+
22
+ class Http
23
+ def self.action(url); end
24
+ end
20
25
  end
21
26
  end
22
27
  make_cap_type
@@ -554,7 +554,7 @@ describe Puppet::Resource::Type do
554
554
 
555
555
  it "should not create a subscope for the :main class" do
556
556
  allow(@resource).to receive(:title).and_return(:main)
557
- expect(@type).not_to receive(:subscope)
557
+ expect(@scope).not_to receive(:newscope)
558
558
  expect(@type).to receive(:set_resource_parameters).with(@resource, @scope)
559
559
 
560
560
  @type.evaluate_code(@resource)
@@ -321,7 +321,7 @@ describe Puppet::Resource do
321
321
 
322
322
  describe "when the resource type is :hostclass" do
323
323
  let(:environment_name) { "testing env" }
324
- let(:fact_values) { { :a => 1 } }
324
+ let(:fact_values) { { 'a' => 1 } }
325
325
  let(:port) { Puppet::Parser::AST::Leaf.new(:value => '80') }
326
326
 
327
327
  def inject_and_set_defaults(resource, scope)
@@ -330,10 +330,7 @@ describe Puppet::Resource do
330
330
 
331
331
  before do
332
332
  environment.known_resource_types.add(apache)
333
-
334
- allow(scope).to receive(:host).and_return('host')
335
- allow(scope).to receive(:environment).and_return(environment)
336
- allow(scope).to receive(:facts).and_return(Puppet::Node::Facts.new("facts", fact_values))
333
+ scope.set_facts(fact_values)
337
334
  end
338
335
 
339
336
  context 'with a default value expression' do
@@ -627,11 +624,15 @@ describe Puppet::Resource do
627
624
  expect(resource.to_hash[:myvar]).to eq("bob")
628
625
  end
629
626
 
630
- it "should set :name to the title if :name is not present for non-builtin types" do
631
- krt = Puppet::Resource::TypeCollection.new("myenv")
632
- krt.add Puppet::Resource::Type.new(:definition, :foo)
633
- resource = Puppet::Resource.new :foo, "bar"
634
- allow(resource).to receive(:known_resource_types).and_return(krt)
627
+ it "should set :name to the title if :name is not present for non-existent types" do
628
+ resource = Puppet::Resource.new :doesnotexist, "bar"
629
+ expect(resource.to_hash[:name]).to eq("bar")
630
+ end
631
+
632
+ it "should set :name to the title if :name is not present for a definition" do
633
+ type = Puppet::Resource::Type.new(:definition, :foo)
634
+ environment.known_resource_types.add(type)
635
+ resource = Puppet::Resource.new :foo, "bar", :environment => environment
635
636
  expect(resource.to_hash[:name]).to eq("bar")
636
637
  end
637
638
  end
@@ -87,16 +87,7 @@ describe Puppet::Settings do
87
87
  end
88
88
  end
89
89
 
90
-
91
90
  describe "when initializing application defaults do" do
92
- let(:default_values) do
93
- values = {}
94
- PuppetSpec::Settings::TEST_APP_DEFAULT_DEFINITIONS.keys.each do |key|
95
- values[key] = 'default value'
96
- end
97
- values
98
- end
99
-
100
91
  before do
101
92
  @settings = Puppet::Settings.new
102
93
  @settings.define_settings(:main, PuppetSpec::Settings::TEST_APP_DEFAULT_DEFINITIONS)
@@ -104,7 +95,7 @@ describe Puppet::Settings do
104
95
 
105
96
  it "should fail if the app defaults hash is missing any required values" do
106
97
  expect {
107
- @settings.initialize_app_defaults(default_values.reject { |key, _| key == :confdir })
98
+ @settings.initialize_app_defaults(PuppetSpec::Settings::TEST_APP_DEFAULT_VALUES.reject { |key, _| key == :confdir })
108
99
  }.to raise_error(Puppet::Settings::SettingsError)
109
100
  end
110
101
 
@@ -112,7 +103,7 @@ describe Puppet::Settings do
112
103
  # case behaviors / uses. However, until that time... we need to make sure that our private run_mode=
113
104
  # setter method gets properly called during app initialization.
114
105
  it "sets the preferred run mode when initializing the app defaults" do
115
- @settings.initialize_app_defaults(default_values.merge(:run_mode => :server))
106
+ @settings.initialize_app_defaults(PuppetSpec::Settings::TEST_APP_DEFAULT_VALUES.merge(:run_mode => :server))
116
107
 
117
108
  expect(@settings.preferred_run_mode).to eq(:server)
118
109
  end
@@ -121,7 +112,7 @@ describe Puppet::Settings do
121
112
  # initialize_app_defaults is called in spec_helper, before we even
122
113
  # get here, but call it here to make it explicit what we're trying
123
114
  # to do.
124
- @settings.initialize_app_defaults(default_values)
115
+ @settings.initialize_app_defaults(PuppetSpec::Settings::TEST_APP_DEFAULT_VALUES)
125
116
 
126
117
  Puppet::Settings::REQUIRED_APP_SETTINGS.each do |key|
127
118
  expect(File).to exist(File.dirname(Puppet[key]))
@@ -148,6 +139,7 @@ describe Puppet::Settings do
148
139
  end.to_not raise_error
149
140
  end
150
141
  end
142
+
151
143
  describe "if no interpolation error" do
152
144
  it "should not raise an error" do
153
145
  hook_values = []
@@ -177,6 +169,7 @@ describe Puppet::Settings do
177
169
  @settings.send(:call_hooks_deferred_to_application_initialization, options)
178
170
  end.to raise_error(Puppet::Settings::InterpolationError)
179
171
  end
172
+
180
173
  it "should contain the setting name in error message" do
181
174
  hook_values = []
182
175
  @settings.define_settings(
@@ -193,6 +186,7 @@ describe Puppet::Settings do
193
186
  end.to raise_error(Puppet::Settings::InterpolationError, /badhook/)
194
187
  end
195
188
  end
189
+
196
190
  describe "if no interpolation error" do
197
191
  it "should not raise an error" do
198
192
  hook_values = []
@@ -397,122 +391,320 @@ describe Puppet::Settings do
397
391
  end
398
392
 
399
393
  describe "call_hook" do
394
+ let(:config_file) { tmpfile('config') }
395
+
396
+ before :each do
397
+ # We can't specify the config file to read from using `Puppet[:config] =`
398
+ # or pass it as an arg to Puppet.initialize_global_settings, because
399
+ # both of those will set the value on the `Puppet.settings` instance
400
+ # which is different from the `@settings` instance created in the test.
401
+ # Instead, we define a `:config` setting and set its default value to
402
+ # the `config_file` temp file, and then access the `config_file` within
403
+ # each test.
404
+ @settings.define_settings(:main, :config => { :type => :file, :desc => "config file", :default => config_file })
405
+ end
406
+
400
407
  Puppet::Settings::StringSetting.available_call_hook_values.each do |val|
401
408
  describe "when :#{val}" do
402
409
  describe "and definition invalid" do
403
410
  it "should raise error if no hook defined" do
404
411
  expect do
405
- @settings.define_settings(:section, :hooker => {:default => "yay", :desc => "boo", :call_hook => val})
412
+ @settings.define_settings(:section, :setting => {:default => "yay", :desc => "boo", :call_hook => val})
406
413
  end.to raise_error(ArgumentError, /no :hook/)
407
414
  end
415
+
408
416
  it "should include the setting name in the error message" do
409
417
  expect do
410
- @settings.define_settings(:section, :hooker => {:default => "yay", :desc => "boo", :call_hook => val})
411
- end.to raise_error(ArgumentError, /for :hooker/)
418
+ @settings.define_settings(:section, :setting => {:default => "yay", :desc => "boo", :call_hook => val})
419
+ end.to raise_error(ArgumentError, /for :setting/)
412
420
  end
413
421
  end
422
+
414
423
  describe "and definition valid" do
415
424
  before(:each) do
416
425
  hook_values = []
417
- @settings.define_settings(:section, :hooker => {:default => "yay", :desc => "boo", :call_hook => val, :hook => lambda { |v| hook_values << v }})
426
+ @settings.define_settings(:section, :setting => {:default => "yay", :desc => "boo", :call_hook => val, :hook => lambda { |v| hook_values << v }})
418
427
  end
419
428
 
420
429
  it "should call the hook when value written" do
421
- expect(@settings.setting(:hooker)).to receive(:handle).with("something").once
422
- @settings[:hooker] = "something"
430
+ expect(@settings.setting(:setting)).to receive(:handle).with("something").once
431
+ @settings[:setting] = "something"
423
432
  end
424
433
  end
425
434
  end
426
435
  end
427
436
 
428
437
  it "should have a default value of :on_write_only" do
429
- @settings.define_settings(:section, :hooker => {:default => "yay", :desc => "boo", :hook => lambda { |v| hook_values << v }})
430
- expect(@settings.setting(:hooker).call_hook).to eq(:on_write_only)
438
+ @settings.define_settings(:section, :setting => {:default => "yay", :desc => "boo", :hook => lambda { |v| hook_values << v }})
439
+ expect(@settings.setting(:setting).call_hook).to eq(:on_write_only)
431
440
  end
432
441
 
433
442
  describe "when nil" do
434
443
  it "should generate a warning" do
435
444
  expect(Puppet).to receive(:warning)
436
- @settings.define_settings(:section, :hooker => {:default => "yay", :desc => "boo", :call_hook => nil, :hook => lambda { |v| hook_values << v }})
445
+ @settings.define_settings(:section, :setting => {:default => "yay", :desc => "boo", :call_hook => nil, :hook => lambda { |v| hook_values << v }})
437
446
  end
447
+
438
448
  it "should use default" do
439
- @settings.define_settings(:section, :hooker => {:default => "yay", :desc => "boo", :call_hook => nil, :hook => lambda { |v| hook_values << v }})
440
- expect(@settings.setting(:hooker).call_hook).to eq(:on_write_only)
449
+ @settings.define_settings(:section, :setting => {:default => "yay", :desc => "boo", :call_hook => nil, :hook => lambda { |v| hook_values << v }})
450
+ expect(@settings.setting(:setting).call_hook).to eq(:on_write_only)
441
451
  end
442
452
  end
443
453
 
444
454
  describe "when invalid" do
445
455
  it "should raise an error" do
446
456
  expect do
447
- @settings.define_settings(:section, :hooker => {:default => "yay", :desc => "boo", :call_hook => :foo, :hook => lambda { |v| hook_values << v }})
457
+ @settings.define_settings(:section, :setting => {:default => "yay", :desc => "boo", :call_hook => :foo, :hook => lambda { |v| hook_values << v }})
448
458
  end.to raise_error(ArgumentError, /invalid.*call_hook/i)
449
459
  end
450
460
  end
451
461
 
462
+ describe "when :on_write_only" do
463
+ it "returns its hook type" do
464
+ @settings.define_settings(:main, :setting => {:default => "yay", :desc => "boo", :hook => lambda { |_| }})
465
+
466
+ expect(@settings.setting(:setting).call_hook).to eq(:on_write_only)
467
+ end
468
+
469
+ it "should not call the hook at definition" do
470
+ hook_values = []
471
+ @settings.define_settings(:main, :setting => {:default => "yay", :desc => "boo", :hook => lambda { |v| hook_values << v }})
472
+
473
+ expect(hook_values).to eq(%w[])
474
+ end
475
+
476
+ it "calls the hook when initializing global defaults with the value from the `main` section" do
477
+ hook_values = []
478
+ @settings.define_settings(:main, :setting => {:default => "yay", :desc => "boo", :hook => lambda { |v| hook_values << v }})
479
+
480
+ File.write(config_file, <<~END)
481
+ [main]
482
+ setting=in_main
483
+ END
484
+ @settings.initialize_global_settings
485
+
486
+ expect(@settings[:setting]).to eq('in_main')
487
+ expect(hook_values).to eq(%w[in_main])
488
+ end
489
+
490
+ it "doesn't call the hook when initializing app defaults" do
491
+ hook_values = []
492
+ @settings.define_settings(:main, PuppetSpec::Settings::TEST_APP_DEFAULT_DEFINITIONS)
493
+ @settings.define_settings(:main, :setting => {:default => "yay", :desc => "boo", :hook => lambda { |v| hook_values << v }})
494
+
495
+ File.write(config_file, <<~END)
496
+ [main]
497
+ setting=in_main
498
+ [agent]
499
+ setting=in_agent
500
+ END
501
+ @settings.initialize_global_settings
502
+
503
+ hook_values.clear
504
+
505
+ @settings.initialize_app_defaults(PuppetSpec::Settings::TEST_APP_DEFAULT_VALUES)
506
+
507
+ expect(@settings[:setting]).to eq('in_main')
508
+ expect(hook_values).to eq(%w[])
509
+ end
510
+
511
+ it "doesn't call the hook with value from a section that matches the run_mode" do
512
+ hook_values = []
513
+ @settings.define_settings(:main, PuppetSpec::Settings::TEST_APP_DEFAULT_DEFINITIONS)
514
+ @settings.define_settings(:main, :setting => {:default => "yay", :desc => "boo", :hook => lambda { |v| hook_values << v }})
515
+
516
+ File.write(config_file, <<~END)
517
+ [main]
518
+ setting=in_main
519
+ [agent]
520
+ setting=in_agent
521
+ END
522
+ @settings.initialize_global_settings
523
+
524
+ hook_values.clear
525
+
526
+ @settings.initialize_app_defaults(PuppetSpec::Settings::TEST_APP_DEFAULT_VALUES.merge(:run_mode => :agent))
527
+
528
+ expect(@settings[:setting]).to eq('in_agent')
529
+ expect(hook_values).to eq(%w[])
530
+ end
531
+ end
532
+
452
533
  describe "when :on_define_and_write" do
453
- it "should call the hook at definition" do
534
+ it "returns its hook type" do
535
+ @settings.define_settings(:main, :setting => {:default => "yay", :desc => "boo", :call_hook => :on_define_and_write, :hook => lambda { |_| }})
536
+
537
+ expect(@settings.setting(:setting).call_hook).to eq(:on_define_and_write)
538
+ end
539
+
540
+ it "should call the hook at definition with the default value" do
454
541
  hook_values = []
455
- @settings.define_settings(:section, :hooker => {:default => "yay", :desc => "boo", :call_hook => :on_define_and_write, :hook => lambda { |v| hook_values << v }})
456
- expect(@settings.setting(:hooker).call_hook).to eq(:on_define_and_write)
457
- expect(hook_values).to eq(%w{yay})
542
+ @settings.define_settings(:main, :setting => {:default => "yay", :desc => "boo", :call_hook => :on_define_and_write, :hook => lambda { |v| hook_values << v }})
543
+
544
+ expect(hook_values).to eq(%w[yay])
545
+ end
546
+
547
+ it "calls the hook when initializing global defaults with the value from the `main` section" do
548
+ hook_values = []
549
+ @settings.define_settings(:main, :setting => {:default => "yay", :desc => "boo", :call_hook => :on_define_and_write, :hook => lambda { |v| hook_values << v }})
550
+
551
+ File.write(config_file, <<~END)
552
+ [main]
553
+ setting=in_main
554
+ END
555
+ @settings.initialize_global_settings
556
+
557
+ expect(@settings[:setting]).to eq('in_main')
558
+ expect(hook_values).to eq(%w[yay in_main])
559
+ end
560
+
561
+ it "doesn't call the hook when initializing app defaults" do
562
+ hook_values = []
563
+ @settings.define_settings(:main, PuppetSpec::Settings::TEST_APP_DEFAULT_DEFINITIONS)
564
+ @settings.define_settings(:main, :setting => {:default => "yay", :desc => "boo", :call_hook => :on_define_and_write, :hook => lambda { |v| hook_values << v }})
565
+
566
+ File.write(config_file, <<~END)
567
+ [main]
568
+ setting=in_main
569
+ [agent]
570
+ setting=in_agent
571
+ END
572
+ @settings.initialize_global_settings
573
+
574
+ hook_values.clear
575
+
576
+ @settings.initialize_app_defaults(PuppetSpec::Settings::TEST_APP_DEFAULT_VALUES)
577
+
578
+ expect(@settings[:setting]).to eq('in_main')
579
+ expect(hook_values).to eq([])
580
+ end
581
+
582
+ it "doesn't call the hook with value from a section that matches the run_mode" do
583
+ hook_values = []
584
+ @settings.define_settings(:main, PuppetSpec::Settings::TEST_APP_DEFAULT_DEFINITIONS)
585
+ @settings.define_settings(:main, :setting => {:default => "yay", :desc => "boo", :call_hook => :on_define_and_write, :hook => lambda { |v| hook_values << v }})
586
+
587
+ File.write(config_file, <<~END)
588
+ [main]
589
+ setting=in_main
590
+ [agent]
591
+ setting=in_agent
592
+ END
593
+
594
+ @settings.initialize_global_settings
595
+
596
+ hook_values.clear
597
+
598
+ @settings.initialize_app_defaults(PuppetSpec::Settings::TEST_APP_DEFAULT_VALUES.merge(:run_mode => :agent))
599
+
600
+ # The correct value is returned
601
+ expect(@settings[:setting]).to eq('in_agent')
602
+
603
+ # but the hook is never called, seems like a bug!
604
+ expect(hook_values).to eq([])
458
605
  end
459
606
  end
460
607
 
461
608
  describe "when :on_initialize_and_write" do
462
- before(:each) do
463
- @hook_values = []
464
- @settings.define_settings(:section, :hooker => {:default => "yay", :desc => "boo", :call_hook => :on_initialize_and_write, :hook => lambda { |v| @hook_values << v }})
609
+ it "returns its hook type" do
610
+ @settings.define_settings(:main, :setting => {:default => "yay", :desc => "boo", :call_hook => :on_initialize_and_write, :hook => lambda { |_| }})
611
+
612
+ expect(@settings.setting(:setting).call_hook).to eq(:on_initialize_and_write)
465
613
  end
466
614
 
467
615
  it "should not call the hook at definition" do
468
- expect(@hook_values).to eq([])
469
- expect(@hook_values).not_to eq(%w{yay})
616
+ hook_values = []
617
+ @settings.define_settings(:main, :setting => {:default => "yay", :desc => "boo", :call_hook => :on_initialize_and_write, :hook => lambda { |v| hook_values << v }})
618
+ expect(hook_values).to eq([])
470
619
  end
471
620
 
472
- it "should call the hook at initialization" do
473
- app_defaults = {}
474
- Puppet::Settings::REQUIRED_APP_SETTINGS.each do |key|
475
- app_defaults[key] = "foo"
476
- end
477
- app_defaults[:run_mode] = :user
621
+ it "calls the hook when initializing global defaults with the value from the `main` section" do
622
+ hook_values = []
623
+ @settings.define_settings(:main, :setting => {:default => "yay", :desc => "boo", :call_hook => :on_initialize_and_write, :hook => lambda { |v| hook_values << v }})
624
+
625
+ File.write(config_file, <<~END)
626
+ [main]
627
+ setting=in_main
628
+ END
629
+ @settings.initialize_global_settings
630
+
631
+ expect(@settings[:setting]).to eq('in_main')
632
+ expect(hook_values).to eq(%w[in_main])
633
+ end
634
+
635
+ it "calls the hook when initializing app defaults" do
636
+ hook_values = []
478
637
  @settings.define_settings(:main, PuppetSpec::Settings::TEST_APP_DEFAULT_DEFINITIONS)
638
+ @settings.define_settings(:main, :setting => {:default => "yay", :desc => "boo", :call_hook => :on_initialize_and_write, :hook => lambda { |v| hook_values << v }})
479
639
 
480
- expect(@settings.setting(:hooker)).to receive(:handle).with("yay").once
640
+ File.write(config_file, <<~END)
641
+ [main]
642
+ setting=in_main
643
+ [agent]
644
+ setting=in_agent
645
+ END
646
+ @settings.initialize_global_settings
481
647
 
482
- @settings.initialize_app_defaults app_defaults
648
+ hook_values.clear
649
+
650
+ @settings.initialize_app_defaults(PuppetSpec::Settings::TEST_APP_DEFAULT_VALUES)
651
+
652
+ expect(@settings[:setting]).to eq('in_main')
653
+ expect(hook_values).to eq(%w[in_main])
654
+ end
655
+
656
+ it "calls the hook with the overridden value from a section that matches the run_mode" do
657
+ hook_values = []
658
+ @settings.define_settings(:main, PuppetSpec::Settings::TEST_APP_DEFAULT_DEFINITIONS)
659
+ @settings.define_settings(:main, :setting => {:default => "yay", :desc => "boo", :call_hook => :on_initialize_and_write, :hook => lambda { |v| hook_values << v }})
660
+
661
+ File.write(config_file, <<~END)
662
+ [main]
663
+ setting=in_main
664
+ [agent]
665
+ setting=in_agent
666
+ END
667
+ @settings.initialize_global_settings
668
+
669
+ hook_values.clear
670
+
671
+ @settings.initialize_app_defaults(PuppetSpec::Settings::TEST_APP_DEFAULT_VALUES.merge(:run_mode => :agent))
672
+
673
+ expect(@settings[:setting]).to eq('in_agent')
674
+ expect(hook_values).to eq(%w[in_agent])
483
675
  end
484
676
  end
485
677
  end
486
678
 
487
679
  it "should call passed blocks when values are set" do
488
680
  values = []
489
- @settings.define_settings(:section, :hooker => {:default => "yay", :desc => "boo", :hook => lambda { |v| values << v }})
681
+ @settings.define_settings(:section, :setting => {:default => "yay", :desc => "boo", :hook => lambda { |v| values << v }})
490
682
  expect(values).to eq([])
491
683
 
492
- @settings[:hooker] = "something"
684
+ @settings[:setting] = "something"
493
685
  expect(values).to eq(%w{something})
494
686
  end
495
687
 
496
688
  it "should call passed blocks when values are set via the command line" do
497
689
  values = []
498
- @settings.define_settings(:section, :hooker => {:default => "yay", :desc => "boo", :hook => lambda { |v| values << v }})
690
+ @settings.define_settings(:section, :setting => {:default => "yay", :desc => "boo", :hook => lambda { |v| values << v }})
499
691
  expect(values).to eq([])
500
692
 
501
- @settings.handlearg("--hooker", "yay")
693
+ @settings.handlearg("--setting", "yay")
502
694
 
503
695
  expect(values).to eq(%w{yay})
504
696
  end
505
697
 
506
698
  it "should provide an option to call passed blocks during definition" do
507
699
  values = []
508
- @settings.define_settings(:section, :hooker => {:default => "yay", :desc => "boo", :call_hook => :on_define_and_write, :hook => lambda { |v| values << v }})
700
+ @settings.define_settings(:section, :setting => {:default => "yay", :desc => "boo", :call_hook => :on_define_and_write, :hook => lambda { |v| values << v }})
509
701
  expect(values).to eq(%w{yay})
510
702
  end
511
703
 
512
704
  it "should pass the fully interpolated value to the hook when called on definition" do
513
705
  values = []
514
706
  @settings.define_settings(:section, :one => { :default => "test", :desc => "a" })
515
- @settings.define_settings(:section, :hooker => {:default => "$one/yay", :desc => "boo", :call_hook => :on_define_and_write, :hook => lambda { |v| values << v }})
707
+ @settings.define_settings(:section, :setting => {:default => "$one/yay", :desc => "boo", :call_hook => :on_define_and_write, :hook => lambda { |v| values << v }})
516
708
  expect(values).to eq(%w{test/yay})
517
709
  end
518
710
 
@@ -561,12 +753,8 @@ describe Puppet::Settings do
561
753
  end
562
754
 
563
755
  it "setting a value to nil causes it to return to its default" do
564
- default_values = { :one => "skipped value" }
565
- [:logdir, :confdir, :codedir, :vardir].each do |key|
566
- default_values[key] = 'default value'
567
- end
568
756
  @settings.define_settings :main, PuppetSpec::Settings::TEST_APP_DEFAULT_DEFINITIONS
569
- @settings.initialize_app_defaults(default_values)
757
+ @settings.initialize_app_defaults(PuppetSpec::Settings::TEST_APP_DEFAULT_VALUES.merge(:one => "skipped value"))
570
758
  @settings[:one] = "value will disappear"
571
759
 
572
760
  @settings[:one] = nil
@@ -627,13 +815,14 @@ describe Puppet::Settings do
627
815
  end
628
816
 
629
817
  describe "when choosing which value to return" do
818
+ let(:config_file) { tmpfile('settings') }
819
+
630
820
  before do
631
821
  @settings = Puppet::Settings.new
632
822
  @settings.define_settings :section,
633
- :config => { :type => :file, :default => "/my/file", :desc => "a" },
823
+ :config => { :type => :file, :default => config_file, :desc => "a" },
634
824
  :one => { :default => "ONE", :desc => "a" },
635
825
  :two => { :default => "TWO", :desc => "b" }
636
- allow(Puppet::FileSystem).to receive(:exist?).and_return(true)
637
826
  @settings.preferred_run_mode = :agent
638
827
  end
639
828
 
@@ -642,18 +831,16 @@ describe Puppet::Settings do
642
831
  end
643
832
 
644
833
  it "should return values set on the cli before values set in the configuration file" do
645
- text = "[main]\none = fileval\n"
646
- allow(@settings).to receive(:read_file).and_return(text)
834
+ File.write(config_file, "[main]\none = fileval\n")
647
835
  @settings.handlearg("--one", "clival")
648
- @settings.send(:parse_config_files)
836
+ @settings.initialize_global_settings
649
837
 
650
838
  expect(@settings[:one]).to eq("clival")
651
839
  end
652
840
 
653
841
  it "should return values set in the mode-specific section before values set in the main section" do
654
- text = "[main]\none = mainval\n[agent]\none = modeval\n"
655
- allow(@settings).to receive(:read_file).and_return(text)
656
- @settings.send(:parse_config_files)
842
+ File.write(config_file, "[main]\none = mainval\n[agent]\none = modeval\n")
843
+ @settings.initialize_global_settings
657
844
 
658
845
  expect(@settings[:one]).to eq("modeval")
659
846
  end
@@ -663,17 +850,15 @@ describe Puppet::Settings do
663
850
  before(:each) { @settings.preferred_run_mode = run_mode }
664
851
 
665
852
  it "returns values set in the 'master' section if the 'server' section does not exist" do
666
- text = "[main]\none = mainval\n[master]\none = modeval\n"
667
- allow(@settings).to receive(:read_file).and_return(text)
668
- @settings.send(:parse_config_files)
853
+ File.write(config_file, "[main]\none = mainval\n[master]\none = modeval\n")
854
+ @settings.initialize_global_settings
669
855
 
670
856
  expect(@settings[:one]).to eq("modeval")
671
857
  end
672
858
 
673
859
  it "prioritizes values set in the 'server' section if set" do
674
- text = "[main]\none = mainval\n[server]\none = serverval\n[master]\none = masterval\n"
675
- allow(@settings).to receive(:read_file).and_return(text)
676
- @settings.send(:parse_config_files)
860
+ File.write(config_file, "[main]\none = mainval\n[server]\none = serverval\n[master]\none = masterval\n")
861
+ @settings.initialize_global_settings
677
862
 
678
863
  expect(@settings[:one]).to eq("serverval")
679
864
  end
@@ -681,9 +866,9 @@ describe Puppet::Settings do
681
866
  end
682
867
 
683
868
  it "should not return values outside of its search path" do
684
- text = "[other]\none = oval\n"
685
- allow(@settings).to receive(:read_file).and_return(text)
686
- @settings.send(:parse_config_files)
869
+ File.write(config_file, "[other]\none = oval\n")
870
+ @settings.initialize_global_settings
871
+
687
872
  expect(@settings[:one]).to eq("ONE")
688
873
  end
689
874
 
@@ -705,7 +890,7 @@ describe Puppet::Settings do
705
890
  expect(Puppet::FileSystem).to receive(:exist?).with(main_config_file_default_location).and_return(false)
706
891
  expect(Puppet::FileSystem).not_to receive(:exist?).with(user_config_file_default_location)
707
892
 
708
- @settings.send(:parse_config_files)
893
+ @settings.initialize_global_settings
709
894
  end
710
895
  end
711
896
 
@@ -715,7 +900,7 @@ describe Puppet::Settings do
715
900
 
716
901
  expect(Puppet::FileSystem).to receive(:exist?).with(user_config_file_default_location).and_return(false)
717
902
 
718
- @settings.send(:parse_config_files)
903
+ @settings.initialize_global_settings
719
904
  end
720
905
  end
721
906
 
@@ -724,7 +909,7 @@ describe Puppet::Settings do
724
909
  expect(Puppet::FileSystem).to receive(:exist?).with(user_config_file_default_location).and_return(true)
725
910
  expect(@settings).to receive(:read_file).and_raise('Permission denied')
726
911
 
727
- expect{ @settings.send(:parse_config_files) }.to raise_error(RuntimeError, /Could not load #{user_config_file_default_location}: Permission denied/)
912
+ expect{ @settings.initialize_global_settings }.to raise_error(RuntimeError, /Could not load #{user_config_file_default_location}: Permission denied/)
728
913
  end
729
914
 
730
915
  it "does not fail if the file is not readable and when `require_config` is false" do
@@ -734,7 +919,7 @@ describe Puppet::Settings do
734
919
  expect(@settings).not_to receive(:parse_config)
735
920
  expect(Puppet).to receive(:log_exception)
736
921
 
737
- expect{ @settings.send(:parse_config_files, false) }.not_to raise_error
922
+ expect{ @settings.initialize_global_settings([], false) }.not_to raise_error
738
923
  end
739
924
 
740
925
  it "reads the file if it is readable" do
@@ -742,7 +927,7 @@ describe Puppet::Settings do
742
927
  expect(@settings).to receive(:read_file).and_return('server = host.string')
743
928
  expect(@settings).to receive(:parse_config)
744
929
 
745
- @settings.send(:parse_config_files)
930
+ @settings.initialize_global_settings
746
931
  end
747
932
  end
748
933
 
@@ -751,7 +936,7 @@ describe Puppet::Settings do
751
936
  expect(Puppet::FileSystem).to receive(:exist?).with(user_config_file_default_location).and_return(false)
752
937
  expect(@settings).not_to receive(:parse_config)
753
938
 
754
- @settings.send(:parse_config_files)
939
+ @settings.initialize_global_settings
755
940
  end
756
941
  end
757
942
  end
@@ -761,43 +946,41 @@ describe Puppet::Settings do
761
946
  @settings = Puppet::Settings.new
762
947
  allow(@settings).to receive(:service_user_available?).and_return(true)
763
948
  allow(@settings).to receive(:service_group_available?).and_return(true)
764
- @file = make_absolute("/some/file")
765
- @userconfig = make_absolute("/test/userconfigfile")
949
+ @file = tmpfile("somefile")
766
950
  @settings.define_settings :section, :user => { :default => "suser", :desc => "doc" }, :group => { :default => "sgroup", :desc => "doc" }
767
951
  @settings.define_settings :section,
768
952
  :config => { :type => :file, :default => @file, :desc => "eh" },
769
953
  :one => { :default => "ONE", :desc => "a" },
770
954
  :two => { :default => "$one TWO", :desc => "b" },
771
955
  :three => { :default => "$one $two THREE", :desc => "c" }
772
- allow(@settings).to receive(:user_config_file).and_return(@userconfig)
773
- allow(Puppet::FileSystem).to receive(:exist?).with(@file).and_return(true)
774
- allow(Puppet::FileSystem).to receive(:exist?).with(@userconfig).and_return(false)
956
+
957
+ userconfig = tmpfile("userconfig")
958
+ allow(@settings).to receive(:user_config_file).and_return(userconfig)
775
959
  end
776
960
 
777
961
  it "should not ignore the report setting" do
778
962
  @settings.define_settings :section, :report => { :default => "false", :desc => "a" }
779
- # This is needed in order to make sure we pass on windows
780
- myfile = File.expand_path(@file)
781
- @settings[:config] = myfile
782
- text = <<-CONF
963
+ File.write(@file, <<~CONF)
783
964
  [puppetd]
784
- report=true
965
+ report=true
785
966
  CONF
786
- expect(Puppet::FileSystem).to receive(:exist?).with(myfile).and_return(true)
787
- expect(@settings).to receive(:read_file).and_return(text)
788
- @settings.send(:parse_config_files)
967
+
968
+ @settings.initialize_global_settings
969
+
789
970
  expect(@settings[:report]).to be_truthy
790
971
  end
791
972
 
792
973
  it "should use its current ':config' value for the file to parse" do
793
- myfile = make_absolute("/my/file")
794
- @settings[:config] = myfile
795
-
796
- expect(Puppet::FileSystem).to receive(:exist?).with(myfile).and_return(true)
974
+ myfile = tmpfile('myfile')
975
+ File.write(myfile, <<~CONF)
976
+ [main]
977
+ one=myfile
978
+ CONF
797
979
 
798
- expect(Puppet::FileSystem).to receive(:read).with(myfile, :encoding => 'utf-8').and_return("[main]")
980
+ @settings[:config] = myfile
981
+ @settings.initialize_global_settings
799
982
 
800
- @settings.send(:parse_config_files)
983
+ expect(@settings[:one]).to eq('myfile')
801
984
  end
802
985
 
803
986
  it "should not try to parse non-existent files" do
@@ -805,42 +988,50 @@ describe Puppet::Settings do
805
988
 
806
989
  expect(File).not_to receive(:read).with(@file)
807
990
 
808
- @settings.send(:parse_config_files)
991
+ @settings.initialize_global_settings
809
992
  end
810
993
 
811
994
  it "should return values set in the configuration file" do
812
- text = "[main]
813
- one = fileval
814
- "
815
- expect(@settings).to receive(:read_file).and_return(text)
816
- @settings.send(:parse_config_files)
995
+ File.write(@file, <<~CONF)
996
+ [main]
997
+ one = fileval
998
+ CONF
999
+
1000
+ @settings.initialize_global_settings
817
1001
  expect(@settings[:one]).to eq("fileval")
818
1002
  end
819
1003
 
820
1004
  #484 - this should probably be in the regression area
821
1005
  it "should not throw an exception on unknown parameters" do
822
- text = "[main]\nnosuchparam = mval\n"
823
- expect(@settings).to receive(:read_file).and_return(text)
824
- expect { @settings.send(:parse_config_files) }.not_to raise_error
1006
+ File.write(@file, <<~CONF)
1007
+ [main]
1008
+ nosuchparam = mval
1009
+ CONF
1010
+
1011
+ expect { @settings.initialize_global_settings }.not_to raise_error
825
1012
  end
826
1013
 
827
1014
  it "should convert booleans in the configuration file into Ruby booleans" do
828
- text = "[main]
829
- one = true
830
- two = false
831
- "
832
- expect(@settings).to receive(:read_file).and_return(text)
833
- @settings.send(:parse_config_files)
1015
+ File.write(@file, <<~CONF)
1016
+ [main]
1017
+ one = true
1018
+ two = false
1019
+ CONF
1020
+
1021
+ @settings.initialize_global_settings
1022
+
834
1023
  expect(@settings[:one]).to eq(true)
835
1024
  expect(@settings[:two]).to eq(false)
836
1025
  end
837
1026
 
838
1027
  it "should convert integers in the configuration file into Ruby Integers" do
839
- text = "[main]
840
- one = 65
841
- "
842
- expect(@settings).to receive(:read_file).and_return(text)
843
- @settings.send(:parse_config_files)
1028
+ File.write(@file, <<~CONF)
1029
+ [main]
1030
+ one = 65
1031
+ CONF
1032
+
1033
+ @settings.initialize_global_settings
1034
+
844
1035
  expect(@settings[:one]).to eq(65)
845
1036
  end
846
1037
 
@@ -871,25 +1062,21 @@ describe Puppet::Settings do
871
1062
  end
872
1063
 
873
1064
  it "should support loading metadata (owner, group, or mode) from a run_mode section in the configuration file" do
874
- default_values = {}
875
- PuppetSpec::Settings::TEST_APP_DEFAULT_DEFINITIONS.keys.each do |key|
876
- default_values[key] = 'default value'
877
- end
878
1065
  @settings.define_settings :main, PuppetSpec::Settings::TEST_APP_DEFAULT_DEFINITIONS
879
1066
  @settings.define_settings :server, :myfile => { :type => :file, :default => make_absolute("/myfile"), :desc => "a" }
880
1067
 
881
1068
  otherfile = make_absolute("/other/file")
882
- text = "[server]
883
- myfile = #{otherfile} {mode = 664}
884
- "
885
- expect(@settings).to receive(:read_file).and_return(text)
1069
+ File.write(@file, <<~CONF)
1070
+ [server]
1071
+ myfile = #{otherfile} {mode = 664}
1072
+ CONF
886
1073
 
887
1074
  # will start initialization as user
888
1075
  expect(@settings.preferred_run_mode).to eq(:user)
889
- @settings.send(:parse_config_files)
1076
+ @settings.initialize_global_settings
890
1077
 
891
1078
  # change app run_mode to server
892
- @settings.initialize_app_defaults(default_values.merge(:run_mode => :server))
1079
+ @settings.initialize_app_defaults(PuppetSpec::Settings::TEST_APP_DEFAULT_VALUES.merge(:run_mode => :server))
893
1080
  expect(@settings.preferred_run_mode).to eq(:server)
894
1081
 
895
1082
  # initializing the app should have reloaded the metadata based on run_mode
@@ -899,18 +1086,18 @@ describe Puppet::Settings do
899
1086
 
900
1087
  context "when setting serverport and masterport" do
901
1088
  before(:each) do
902
- default_values = {}
903
- PuppetSpec::Settings::TEST_APP_DEFAULT_DEFINITIONS.keys.each do |key|
904
- default_values[key] = 'default value'
905
- end
906
1089
  @settings.define_settings :main, PuppetSpec::Settings::TEST_APP_DEFAULT_DEFINITIONS
907
1090
  @settings.define_settings :server, :masterport => { :desc => "a", :default => 1000 }
908
- @settings.define_settings :server, :serverport => { :desc => "a", :default => 1000 }
1091
+ @settings.define_settings :server, :serverport => { :type => :alias, :alias_for => :masterport }
909
1092
  @settings.define_settings :server, :ca_port => { :desc => "a", :default => "$serverport" }
910
1093
  @settings.define_settings :server, :report_port => { :desc => "a", :default => "$serverport" }
911
- expect(@settings).to receive(:read_file).and_return(text)
912
- @settings.send(:parse_config_files)
913
- @settings.initialize_app_defaults(default_values.merge(:run_mode => :agent))
1094
+
1095
+ config_file = tmpfile('config')
1096
+ @settings[:config] = config_file
1097
+ File.write(config_file, text)
1098
+
1099
+ @settings.initialize_global_settings
1100
+ @settings.initialize_app_defaults(PuppetSpec::Settings::TEST_APP_DEFAULT_VALUES.merge(:run_mode => :agent))
914
1101
  expect(@settings.preferred_run_mode).to eq(:agent)
915
1102
  end
916
1103
 
@@ -923,9 +1110,10 @@ describe Puppet::Settings do
923
1110
  "
924
1111
  end
925
1112
 
926
- it { expect(@settings[:serverport]).to eq(445) }
927
- it { expect(@settings[:ca_port]).to eq("445") }
928
- it { expect(@settings[:report_port]).to eq("445") }
1113
+ it { expect(@settings[:serverport]).to eq(444) }
1114
+ it { expect(@settings[:ca_port]).to eq("444") }
1115
+ it { expect(@settings[:report_port]).to eq("444") }
1116
+ it { expect(@settings[:masterport]).to eq(445) }
929
1117
  end
930
1118
 
931
1119
  context 'with serverport and masterport in main' do
@@ -939,6 +1127,7 @@ describe Puppet::Settings do
939
1127
  it { expect(@settings[:serverport]).to eq(445) }
940
1128
  it { expect(@settings[:ca_port]).to eq("445") }
941
1129
  it { expect(@settings[:report_port]).to eq("445") }
1130
+ it { expect(@settings[:masterport]).to eq(444) }
942
1131
  end
943
1132
 
944
1133
  context 'with serverport and masterport in agent' do
@@ -952,6 +1141,7 @@ describe Puppet::Settings do
952
1141
  it { expect(@settings[:serverport]).to eq(445) }
953
1142
  it { expect(@settings[:ca_port]).to eq("445") }
954
1143
  it { expect(@settings[:report_port]).to eq("445") }
1144
+ it { expect(@settings[:masterport]).to eq(444) }
955
1145
  end
956
1146
 
957
1147
  context 'with both serverport and masterport in main and agent' do
@@ -968,6 +1158,7 @@ describe Puppet::Settings do
968
1158
  it { expect(@settings[:serverport]).to eq(445) }
969
1159
  it { expect(@settings[:ca_port]).to eq("445") }
970
1160
  it { expect(@settings[:report_port]).to eq("445") }
1161
+ it { expect(@settings[:masterport]).to eq(444) }
971
1162
  end
972
1163
 
973
1164
  context 'with serverport in agent and masterport in main' do
@@ -982,6 +1173,7 @@ describe Puppet::Settings do
982
1173
  it { expect(@settings[:serverport]).to eq(444) }
983
1174
  it { expect(@settings[:ca_port]).to eq("444") }
984
1175
  it { expect(@settings[:report_port]).to eq("444") }
1176
+ it { expect(@settings[:masterport]).to eq(445) }
985
1177
  end
986
1178
 
987
1179
  context 'with masterport in main' do
@@ -994,6 +1186,7 @@ describe Puppet::Settings do
994
1186
  it { expect(@settings[:serverport]).to eq(445) }
995
1187
  it { expect(@settings[:ca_port]).to eq("445") }
996
1188
  it { expect(@settings[:report_port]).to eq("445") }
1189
+ it { expect(@settings[:masterport]).to eq(445) }
997
1190
  end
998
1191
 
999
1192
  context 'with masterport in agent' do
@@ -1006,6 +1199,7 @@ describe Puppet::Settings do
1006
1199
  it { expect(@settings[:serverport]).to eq(445) }
1007
1200
  it { expect(@settings[:ca_port]).to eq("445") }
1008
1201
  it { expect(@settings[:report_port]).to eq("445") }
1202
+ it { expect(@settings[:masterport]).to eq(445) }
1009
1203
  end
1010
1204
 
1011
1205
  context 'with serverport in agent' do
@@ -1016,7 +1210,7 @@ describe Puppet::Settings do
1016
1210
  end
1017
1211
 
1018
1212
  it { expect(@settings[:serverport]).to eq(445) }
1019
- it { expect(@settings[:masterport]).to eq(445) }
1213
+ it { expect(@settings[:masterport]).to eq(1000) }
1020
1214
  it { expect(@settings[:ca_port]).to eq("445") }
1021
1215
  it { expect(@settings[:report_port]).to eq("445") }
1022
1216
  end
@@ -1029,36 +1223,31 @@ describe Puppet::Settings do
1029
1223
  end
1030
1224
 
1031
1225
  it { expect(@settings[:serverport]).to eq(445) }
1032
- it { expect(@settings[:masterport]).to eq(445) }
1226
+ it { expect(@settings[:masterport]).to eq(1000) }
1033
1227
  it { expect(@settings[:ca_port]).to eq("445") }
1034
1228
  it { expect(@settings[:report_port]).to eq("445") }
1035
1229
  end
1036
1230
  end
1037
1231
 
1038
1232
  it "does not use the metadata from the same setting in a different section" do
1039
- default_values = {}
1040
- PuppetSpec::Settings::TEST_APP_DEFAULT_DEFINITIONS.keys.each do |key|
1041
- default_values[key] = 'default value'
1042
- end
1043
-
1044
1233
  file = make_absolute("/file")
1045
1234
  default_mode = "0600"
1046
1235
  @settings.define_settings :main, PuppetSpec::Settings::TEST_APP_DEFAULT_DEFINITIONS
1047
1236
  @settings.define_settings :server, :myfile => { :type => :file, :default => file, :desc => "a", :mode => default_mode }
1048
1237
 
1049
- text = "[server]
1050
- myfile = #{file}/foo
1051
- [agent]
1052
- myfile = #{file} {mode = 664}
1053
- "
1054
- expect(@settings).to receive(:read_file).and_return(text)
1238
+ File.write(@file, <<~CONF)
1239
+ [server]
1240
+ myfile = #{file}/foo
1241
+ [agent]
1242
+ myfile = #{file} {mode = 664}
1243
+ CONF
1055
1244
 
1056
1245
  # will start initialization as user
1057
1246
  expect(@settings.preferred_run_mode).to eq(:user)
1058
- @settings.send(:parse_config_files)
1247
+ @settings.initialize_global_settings
1059
1248
 
1060
1249
  # change app run_mode to server
1061
- @settings.initialize_app_defaults(default_values.merge(:run_mode => :server))
1250
+ @settings.initialize_app_defaults(PuppetSpec::Settings::TEST_APP_DEFAULT_VALUES.merge(:run_mode => :server))
1062
1251
  expect(@settings.preferred_run_mode).to eq(:server)
1063
1252
 
1064
1253
  # initializing the app should have reloaded the metadata based on run_mode
@@ -1070,11 +1259,12 @@ describe Puppet::Settings do
1070
1259
  values = []
1071
1260
  @settings.define_settings :section, :mysetting => {:default => "defval", :desc => "a", :hook => proc { |v| values << v }}
1072
1261
 
1073
- text = "[main]
1074
- mysetting = setval
1075
- "
1076
- expect(@settings).to receive(:read_file).and_return(text)
1077
- @settings.send(:parse_config_files)
1262
+ File.write(@file, <<~CONF)
1263
+ [main]
1264
+ mysetting = setval
1265
+ CONF
1266
+ @settings.initialize_global_settings
1267
+
1078
1268
  expect(values).to eq(["setval"])
1079
1269
  end
1080
1270
 
@@ -1082,13 +1272,14 @@ describe Puppet::Settings do
1082
1272
  values = []
1083
1273
  @settings.define_settings :section, :mysetting => {:default => "defval", :desc => "a", :hook => proc { |v| values << v }}
1084
1274
 
1085
- text = "[user]
1086
- mysetting = setval
1087
- [main]
1088
- mysetting = other
1089
- "
1090
- expect(@settings).to receive(:read_file).and_return(text)
1091
- @settings.send(:parse_config_files)
1275
+ File.write(@file, <<~CONF)
1276
+ [user]
1277
+ mysetting = setval
1278
+ [main]
1279
+ mysetting = other
1280
+ CONF
1281
+ @settings.initialize_global_settings
1282
+
1092
1283
  expect(values).to eq(["setval"])
1093
1284
  end
1094
1285
 
@@ -1097,11 +1288,12 @@ describe Puppet::Settings do
1097
1288
  @settings.define_settings :section, :base => {:default => "yay", :desc => "a", :hook => proc { |v| values << v }}
1098
1289
  @settings.define_settings :section, :mysetting => {:default => "defval", :desc => "a", :hook => proc { |v| values << v }}
1099
1290
 
1100
- text = "[main]
1101
- mysetting = $base/setval
1102
- "
1103
- expect(@settings).to receive(:read_file).and_return(text)
1104
- @settings.send(:parse_config_files)
1291
+ File.write(@file, <<~CONF)
1292
+ [main]
1293
+ mysetting = $base/setval
1294
+ CONF
1295
+ @settings.initialize_global_settings
1296
+
1105
1297
  expect(values).to eq(["yay/setval"])
1106
1298
  end
1107
1299
 
@@ -1111,23 +1303,25 @@ describe Puppet::Settings do
1111
1303
  :hook => proc { |v| hook_invoked = true },
1112
1304
  :call_hook => :on_initialize_and_write, }
1113
1305
 
1306
+ # This test relies on `confdir` defaulting to nil which causes the default
1307
+ # value of `deferred=$confdir/goose` to raise an interpolation error during
1308
+ # global initialization, and the hook to be skipped
1114
1309
  @settings.define_settings(:main,
1115
- :logdir => { :type => :directory, :default => nil, :desc => "logdir" },
1116
- :confdir => { :type => :directory, :default => nil, :desc => "confdir" },
1117
- :codedir => { :type => :directory, :default => nil, :desc => "codedir" },
1118
- :vardir => { :type => :directory, :default => nil, :desc => "vardir" })
1310
+ PuppetSpec::Settings::TEST_APP_DEFAULT_DEFINITIONS.merge(
1311
+ :confdir => { :type => :directory, :default => nil, :desc => "confdir" }))
1119
1312
 
1120
- text = <<-EOD
1121
- [main]
1122
- deferred=$confdir/goose
1313
+ File.write(@file, <<~EOD)
1314
+ [main]
1315
+ deferred=$confdir/goose
1123
1316
  EOD
1124
1317
 
1125
- allow(@settings).to receive(:read_file).and_return(text)
1126
1318
  @settings.initialize_global_settings
1127
1319
 
1128
1320
  expect(hook_invoked).to be_falsey
1129
1321
 
1130
- @settings.initialize_app_defaults(:logdir => '/path/to/logdir', :confdir => '/path/to/confdir', :vardir => '/path/to/vardir', :codedir => '/path/to/codedir')
1322
+ # And now that we initialize app defaults with `confdir`, then `deferred`
1323
+ # can be interpolated and its hook called
1324
+ @settings.initialize_app_defaults(PuppetSpec::Settings::TEST_APP_DEFAULT_VALUES.merge(:confdir => '/path/to/confdir'))
1131
1325
 
1132
1326
  expect(hook_invoked).to be_truthy
1133
1327
  expect(@settings[:deferred]).to eq(File.expand_path('/path/to/confdir/goose'))
@@ -1136,45 +1330,33 @@ describe Puppet::Settings do
1136
1330
  it "does not require the value for a setting without a hook to resolve during global setup" do
1137
1331
  @settings.define_settings :section, :can_cause_problems => {:desc => '' }
1138
1332
 
1139
- @settings.define_settings(:main,
1140
- :logdir => { :type => :directory, :default => nil, :desc => "logdir" },
1141
- :confdir => { :type => :directory, :default => nil, :desc => "confdir" },
1142
- :codedir => { :type => :directory, :default => nil, :desc => "codedir" },
1143
- :vardir => { :type => :directory, :default => nil, :desc => "vardir" })
1333
+ @settings.define_settings(:main, PuppetSpec::Settings::TEST_APP_DEFAULT_DEFINITIONS)
1144
1334
 
1145
- text = <<-EOD
1335
+ File.write(@file, <<~EOD)
1146
1336
  [main]
1147
1337
  can_cause_problems=$confdir/goose
1148
1338
  EOD
1149
1339
 
1150
- allow(@settings).to receive(:read_file).and_return(text)
1151
1340
  @settings.initialize_global_settings
1152
- @settings.initialize_app_defaults(:logdir => '/path/to/logdir', :confdir => '/path/to/confdir', :vardir => '/path/to/vardir', :codedir => '/path/to/codedir')
1341
+ @settings.initialize_app_defaults(PuppetSpec::Settings::TEST_APP_DEFAULT_VALUES.merge(:confdir => '/path/to/confdir'))
1153
1342
 
1154
- expect(@settings[:can_cause_problems]).to eq(File.expand_path('/path/to/confdir/goose'))
1343
+ expect(@settings[:can_cause_problems]).to eq('/path/to/confdir/goose')
1155
1344
  end
1156
1345
 
1157
1346
  it "should allow empty values" do
1158
1347
  @settings.define_settings :section, :myarg => { :default => "myfile", :desc => "a" }
1159
1348
 
1160
- text = "[main]
1161
- myarg =
1162
- "
1163
- allow(@settings).to receive(:read_file).and_return(text)
1164
- @settings.send(:parse_config_files)
1349
+ File.write(@file, <<~CONF)
1350
+ [main]
1351
+ myarg =
1352
+ CONF
1353
+ @settings.initialize_global_settings
1354
+
1165
1355
  expect(@settings[:myarg]).to eq("")
1166
1356
  end
1167
1357
 
1168
1358
  describe "deprecations" do
1169
1359
  let(:settings) { Puppet::Settings.new }
1170
- let(:app_defaults) {
1171
- {
1172
- :logdir => "/dev/null",
1173
- :confdir => "/dev/null",
1174
- :codedir => "/dev/null",
1175
- :vardir => "/dev/null",
1176
- }
1177
- }
1178
1360
 
1179
1361
  def assert_accessing_setting_is_deprecated(settings, setting)
1180
1362
  expect(Puppet).to receive(:deprecation_warning).with("Accessing '#{setting}' as a setting is deprecated.")
@@ -1184,12 +1366,7 @@ describe Puppet::Settings do
1184
1366
  end
1185
1367
 
1186
1368
  before(:each) do
1187
- settings.define_settings(:main, {
1188
- :logdir => { :default => 'a', :desc => 'a' },
1189
- :confdir => { :default => 'b', :desc => 'b' },
1190
- :vardir => { :default => 'c', :desc => 'c' },
1191
- :codedir => { :default => 'd', :desc => 'd' },
1192
- })
1369
+ settings.define_settings(:main, PuppetSpec::Settings::TEST_APP_DEFAULT_DEFINITIONS)
1193
1370
  end
1194
1371
 
1195
1372
  context "complete" do
@@ -1210,7 +1387,7 @@ describe Puppet::Settings do
1210
1387
  completely_deprecated_settings.parse_config(<<-CONF)
1211
1388
  completely_deprecated_setting='should warn'
1212
1389
  CONF
1213
- completely_deprecated_settings.initialize_app_defaults(app_defaults)
1390
+ completely_deprecated_settings.initialize_app_defaults(PuppetSpec::Settings::TEST_APP_DEFAULT_VALUES)
1214
1391
  end
1215
1392
 
1216
1393
  it "warns when set on the commandline" do
@@ -1218,7 +1395,7 @@ describe Puppet::Settings do
1218
1395
 
1219
1396
  args = ["--completely_deprecated_setting", "/some/value"]
1220
1397
  completely_deprecated_settings.send(:parse_global_options, args)
1221
- completely_deprecated_settings.initialize_app_defaults(app_defaults)
1398
+ completely_deprecated_settings.initialize_app_defaults(PuppetSpec::Settings::TEST_APP_DEFAULT_VALUES)
1222
1399
  end
1223
1400
 
1224
1401
  it "warns when set in code" do
@@ -1243,7 +1420,7 @@ describe Puppet::Settings do
1243
1420
  partially_deprecated_settings.parse_config(<<-CONF)
1244
1421
  partially_deprecated_setting='should warn'
1245
1422
  CONF
1246
- partially_deprecated_settings.initialize_app_defaults(app_defaults)
1423
+ partially_deprecated_settings.initialize_app_defaults(PuppetSpec::Settings::TEST_APP_DEFAULT_VALUES)
1247
1424
  end
1248
1425
 
1249
1426
  it "does not warn when manifest is set on command line" do
@@ -1251,7 +1428,7 @@ describe Puppet::Settings do
1251
1428
 
1252
1429
  args = ["--partially_deprecated_setting", "/some/value"]
1253
1430
  partially_deprecated_settings.send(:parse_global_options, args)
1254
- partially_deprecated_settings.initialize_app_defaults(app_defaults)
1431
+ partially_deprecated_settings.initialize_app_defaults(PuppetSpec::Settings::TEST_APP_DEFAULT_VALUES)
1255
1432
  end
1256
1433
 
1257
1434
  it "warns when set in code" do
@@ -1344,23 +1521,24 @@ describe Puppet::Settings do
1344
1521
 
1345
1522
  describe "when reparsing its configuration" do
1346
1523
  before do
1347
- @file = make_absolute("/test/file")
1348
- @userconfig = make_absolute("/test/userconfigfile")
1524
+ @file = tmpfile("testfile")
1525
+ Puppet::FileSystem.touch(@file)
1526
+
1349
1527
  @settings = Puppet::Settings.new
1350
1528
  @settings.define_settings :section,
1351
1529
  :config => { :type => :file, :default => @file, :desc => "a" },
1352
1530
  :one => { :default => "ONE", :desc => "a" },
1353
1531
  :two => { :default => "$one TWO", :desc => "b" },
1354
1532
  :three => { :default => "$one $two THREE", :desc => "c" }
1355
- allow(Puppet::FileSystem).to receive(:exist?).with(@file).and_return(true)
1356
- allow(Puppet::FileSystem).to receive(:exist?).with(@userconfig).and_return(false)
1357
- allow(@settings).to receive(:user_config_file).and_return(@userconfig)
1533
+
1534
+ userconfig = tmpfile("userconfig")
1535
+ allow(@settings).to receive(:user_config_file).and_return(userconfig)
1358
1536
  end
1359
1537
 
1360
1538
  it "does not create the WatchedFile instance and should not parse if the file does not exist" do
1361
- expect(Puppet::FileSystem).to receive(:exist?).with(@file).and_return(false)
1362
- expect(Puppet::Util::WatchedFile).not_to receive(:new)
1539
+ Puppet::FileSystem.unlink(@file)
1363
1540
 
1541
+ expect(Puppet::Util::WatchedFile).not_to receive(:new)
1364
1542
  expect(@settings).not_to receive(:parse_config_files)
1365
1543
 
1366
1544
  @settings.reparse_config_files
@@ -1399,8 +1577,8 @@ describe Puppet::Settings do
1399
1577
  @settings[:one] = "init"
1400
1578
 
1401
1579
  # Now replace the value
1402
- text = "[main]\none = disk-replace\n"
1403
- allow(@settings).to receive(:read_file).and_return(text)
1580
+ File.write(@file, "[main]\none = disk-replace\n")
1581
+
1404
1582
  @settings.reparse_config_files
1405
1583
  expect(@settings[:one]).to eq("disk-replace")
1406
1584
  end
@@ -1409,23 +1587,20 @@ describe Puppet::Settings do
1409
1587
  it "should retain parameters set by cli when configuration files are reparsed" do
1410
1588
  @settings.handlearg("--one", "clival")
1411
1589
 
1412
- text = "[main]\none = on-disk\n"
1413
- allow(@settings).to receive(:read_file).and_return(text)
1414
- @settings.send(:parse_config_files)
1590
+ File.write(@file, "[main]\none = on-disk\n")
1591
+ @settings.initialize_global_settings
1415
1592
 
1416
1593
  expect(@settings[:one]).to eq("clival")
1417
1594
  end
1418
1595
 
1419
1596
  it "should remove in-memory values that are no longer set in the file" do
1420
1597
  # Init the value
1421
- text = "[main]\none = disk-init\n"
1422
- expect(@settings).to receive(:read_file).and_return(text)
1598
+ File.write(@file, "[main]\none = disk-init\n")
1423
1599
  @settings.send(:parse_config_files)
1424
1600
  expect(@settings[:one]).to eq("disk-init")
1425
1601
 
1426
1602
  # Now replace the value
1427
- text = "[main]\ntwo = disk-replace\n"
1428
- expect(@settings).to receive(:read_file).and_return(text)
1603
+ File.write(@file, "[main]\ntwo = disk-replace\n")
1429
1604
  @settings.send(:parse_config_files)
1430
1605
 
1431
1606
  # The originally-overridden value should be replaced with the default
@@ -1437,14 +1612,12 @@ describe Puppet::Settings do
1437
1612
 
1438
1613
  it "should retain in-memory values if the file has a syntax error" do
1439
1614
  # Init the value
1440
- text = "[main]\none = initial-value\n"
1441
- expect(@settings).to receive(:read_file).with(@file).and_return(text)
1442
- @settings.send(:parse_config_files)
1615
+ File.write(@file, "[main]\none = initial-value\n")
1616
+ @settings.initialize_global_settings
1443
1617
  expect(@settings[:one]).to eq("initial-value")
1444
1618
 
1445
1619
  # Now replace the value with something bogus
1446
- text = "[main]\nkenny = killed-by-what-follows\n1 is 2, blah blah florp\n"
1447
- expect(@settings).to receive(:read_file).with(@file).and_return(text)
1620
+ File.write(@file, "[main]\nkenny = killed-by-what-follows\n1 is 2, blah blah florp\n")
1448
1621
  @settings.send(:parse_config_files)
1449
1622
 
1450
1623
  # The originally-overridden value should not be replaced with the default
@@ -1456,46 +1629,49 @@ describe Puppet::Settings do
1456
1629
  end
1457
1630
 
1458
1631
  it "should provide a method for creating a catalog of resources from its configuration" do
1459
- expect(Puppet::Settings.new).to respond_to(:to_catalog)
1632
+ expect(Puppet::Settings.new.to_catalog).to be_an_instance_of(Puppet::Resource::Catalog)
1460
1633
  end
1461
1634
 
1462
1635
  describe "when creating a catalog" do
1636
+ let(:maindir) { make_absolute('/maindir') }
1637
+ let(:seconddir) { make_absolute('/seconddir') }
1638
+ let(:otherdir) { make_absolute('/otherdir') }
1639
+
1463
1640
  before do
1464
1641
  @settings = Puppet::Settings.new
1465
1642
  allow(@settings).to receive(:service_user_available?).and_return(true)
1466
- @prefix = Puppet.features.posix? ? "" : "C:"
1467
1643
  end
1468
1644
 
1469
1645
  it "should add all file resources to the catalog if no sections have been specified" do
1470
1646
  @settings.define_settings :main,
1471
- :maindir => { :type => :directory, :default => @prefix+"/maindir", :desc => "a"},
1472
- :seconddir => { :type => :directory, :default => @prefix+"/seconddir", :desc => "a"}
1647
+ :maindir => { :type => :directory, :default => maindir, :desc => "a"},
1648
+ :seconddir => { :type => :directory, :default => seconddir, :desc => "a"}
1473
1649
  @settings.define_settings :other,
1474
- :otherdir => { :type => :directory, :default => @prefix+"/otherdir", :desc => "a" }
1650
+ :otherdir => { :type => :directory, :default => otherdir, :desc => "a" }
1475
1651
 
1476
1652
  catalog = @settings.to_catalog
1477
1653
 
1478
- [@prefix+"/maindir", @prefix+"/seconddir", @prefix+"/otherdir"].each do |path|
1654
+ [maindir, seconddir, otherdir].each do |path|
1479
1655
  expect(catalog.resource(:file, path)).to be_instance_of(Puppet::Resource)
1480
1656
  end
1481
1657
  end
1482
1658
 
1483
1659
  it "should add only files in the specified sections if section names are provided" do
1484
- @settings.define_settings :main, :maindir => { :type => :directory, :default => @prefix+"/maindir", :desc => "a" }
1485
- @settings.define_settings :other, :otherdir => { :type => :directory, :default => @prefix+"/otherdir", :desc => "a" }
1660
+ @settings.define_settings :main, :maindir => { :type => :directory, :default => maindir, :desc => "a" }
1661
+ @settings.define_settings :other, :otherdir => { :type => :directory, :default => otherdir, :desc => "a" }
1486
1662
  catalog = @settings.to_catalog(:main)
1487
- expect(catalog.resource(:file, @prefix+"/otherdir")).to be_nil
1488
- expect(catalog.resource(:file, @prefix+"/maindir")).to be_instance_of(Puppet::Resource)
1663
+ expect(catalog.resource(:file, otherdir)).to be_nil
1664
+ expect(catalog.resource(:file, maindir)).to be_instance_of(Puppet::Resource)
1489
1665
  end
1490
1666
 
1491
1667
  it "should not try to add the same file twice" do
1492
- @settings.define_settings :main, :maindir => { :type => :directory, :default => @prefix+"/maindir", :desc => "a" }
1493
- @settings.define_settings :other, :otherdir => { :type => :directory, :default => @prefix+"/maindir", :desc => "a" }
1668
+ @settings.define_settings :main, :maindir => { :type => :directory, :default => maindir, :desc => "a" }
1669
+ @settings.define_settings :other, :otherdir => { :type => :directory, :default => maindir, :desc => "a" }
1494
1670
  expect { @settings.to_catalog }.not_to raise_error
1495
1671
  end
1496
1672
 
1497
1673
  it "should ignore files whose :to_resource method returns nil" do
1498
- @settings.define_settings :main, :maindir => { :type => :directory, :default => @prefix+"/maindir", :desc => "a" }
1674
+ @settings.define_settings :main, :maindir => { :type => :directory, :default => maindir, :desc => "a" }
1499
1675
  expect(@settings.setting(:maindir)).to receive(:to_resource).and_return(nil)
1500
1676
 
1501
1677
  expect_any_instance_of(Puppet::Resource::Catalog).not_to receive(:add_resource)
@@ -1525,6 +1701,7 @@ describe Puppet::Settings do
1525
1701
  describe "adding default directory environment to the catalog" do
1526
1702
  let(:tmpenv) { tmpdir("envs") }
1527
1703
  let(:default_path) { "#{tmpenv}/environments" }
1704
+
1528
1705
  before(:each) do
1529
1706
  @settings.define_settings :main,
1530
1707
  :environment => { :default => "production", :desc => "env"},