puppet 6.25.1-x64-mingw32 → 6.26.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 (82) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +2 -2
  3. data/Gemfile.lock +24 -17
  4. data/lib/puppet/application/lookup.rb +78 -24
  5. data/lib/puppet/concurrent/thread_local_singleton.rb +5 -3
  6. data/lib/puppet/configurer.rb +2 -12
  7. data/lib/puppet/defaults.rb +14 -3
  8. data/lib/puppet/face/generate.rb +2 -0
  9. data/lib/puppet/file_serving/metadata.rb +3 -0
  10. data/lib/puppet/file_system/file_impl.rb +7 -7
  11. data/lib/puppet/file_system/jruby.rb +1 -1
  12. data/lib/puppet/file_system/windows.rb +4 -4
  13. data/lib/puppet/file_system.rb +1 -1
  14. data/lib/puppet/functions/versioncmp.rb +6 -2
  15. data/lib/puppet/generate/type.rb +9 -0
  16. data/lib/puppet/node.rb +1 -1
  17. data/lib/puppet/pops/parser/code_merger.rb +4 -4
  18. data/lib/puppet/pops/parser/egrammar.ra +2 -0
  19. data/lib/puppet/pops/parser/eparser.rb +813 -794
  20. data/lib/puppet/pops/serialization/to_data_converter.rb +6 -18
  21. data/lib/puppet/provider/service/init.rb +5 -4
  22. data/lib/puppet/ssl/verifier.rb +6 -0
  23. data/lib/puppet/transaction/persistence.rb +22 -12
  24. data/lib/puppet/type/file/data_sync.rb +1 -1
  25. data/lib/puppet/type/user.rb +40 -38
  26. data/lib/puppet/util/json.rb +17 -0
  27. data/lib/puppet/util/log.rb +7 -2
  28. data/lib/puppet/util/monkey_patches.rb +6 -0
  29. data/lib/puppet/util/package.rb +25 -16
  30. data/lib/puppet/util/yaml.rb +21 -2
  31. data/lib/puppet/version.rb +1 -1
  32. data/lib/puppet.rb +1 -0
  33. data/locales/puppet.pot +5 -10454
  34. data/man/man5/puppet.conf.5 +21 -2
  35. data/man/man8/puppet-agent.8 +1 -1
  36. data/man/man8/puppet-apply.8 +1 -1
  37. data/man/man8/puppet-catalog.8 +1 -1
  38. data/man/man8/puppet-config.8 +1 -1
  39. data/man/man8/puppet-describe.8 +1 -1
  40. data/man/man8/puppet-device.8 +1 -1
  41. data/man/man8/puppet-doc.8 +1 -1
  42. data/man/man8/puppet-epp.8 +1 -1
  43. data/man/man8/puppet-facts.8 +1 -1
  44. data/man/man8/puppet-filebucket.8 +1 -1
  45. data/man/man8/puppet-generate.8 +1 -1
  46. data/man/man8/puppet-help.8 +1 -1
  47. data/man/man8/puppet-key.8 +1 -1
  48. data/man/man8/puppet-lookup.8 +9 -6
  49. data/man/man8/puppet-man.8 +1 -1
  50. data/man/man8/puppet-module.8 +1 -1
  51. data/man/man8/puppet-node.8 +1 -1
  52. data/man/man8/puppet-parser.8 +1 -1
  53. data/man/man8/puppet-plugin.8 +1 -1
  54. data/man/man8/puppet-report.8 +1 -1
  55. data/man/man8/puppet-resource.8 +1 -1
  56. data/man/man8/puppet-script.8 +1 -1
  57. data/man/man8/puppet-ssl.8 +1 -1
  58. data/man/man8/puppet-status.8 +1 -1
  59. data/man/man8/puppet.8 +2 -2
  60. data/spec/fixtures/unit/forge/bacula.json +1 -1
  61. data/spec/integration/application/lookup_spec.rb +32 -6
  62. data/spec/shared_contexts/l10n.rb +5 -0
  63. data/spec/unit/application/lookup_spec.rb +131 -10
  64. data/spec/unit/concurrent/thread_local_singleton_spec.rb +39 -0
  65. data/spec/unit/configurer_spec.rb +90 -58
  66. data/spec/unit/face/generate_spec.rb +64 -0
  67. data/spec/unit/file_system_spec.rb +34 -4
  68. data/spec/unit/forge/module_release_spec.rb +3 -3
  69. data/spec/unit/functions/versioncmp_spec.rb +40 -4
  70. data/spec/unit/node_spec.rb +6 -0
  71. data/spec/unit/pops/parser/parse_containers_spec.rb +2 -2
  72. data/spec/unit/pops/serialization/to_from_hr_spec.rb +0 -58
  73. data/spec/unit/pops/validator/validator_spec.rb +5 -0
  74. data/spec/unit/provider/service/gentoo_spec.rb +6 -5
  75. data/spec/unit/provider/service/init_spec.rb +15 -9
  76. data/spec/unit/provider/service/openwrt_spec.rb +21 -29
  77. data/spec/unit/provider/service/redhat_spec.rb +3 -2
  78. data/spec/unit/transaction/persistence_spec.rb +51 -0
  79. data/spec/unit/type/user_spec.rb +0 -45
  80. data/spec/unit/util/json_spec.rb +126 -0
  81. data/spec/unit/util/yaml_spec.rb +54 -29
  82. metadata +7 -3
@@ -0,0 +1,39 @@
1
+ require 'spec_helper'
2
+ require 'puppet/concurrent/thread_local_singleton'
3
+
4
+ class PuppetSpec::Singleton
5
+ extend Puppet::Concurrent::ThreadLocalSingleton
6
+ end
7
+
8
+ # Use the `equal?` matcher to ensure we get the same object
9
+ describe Puppet::Concurrent::ThreadLocalSingleton do
10
+ it 'returns the same object for a single thread' do
11
+ expect(PuppetSpec::Singleton.singleton).to equal(PuppetSpec::Singleton.singleton)
12
+ end
13
+
14
+ it 'is not inherited for a newly created thread' do
15
+ main_thread_local = PuppetSpec::Singleton.singleton
16
+ Thread.new do
17
+ expect(main_thread_local).to_not equal(PuppetSpec::Singleton.singleton)
18
+ end.join
19
+ end
20
+
21
+ it 'does not leak outside a thread' do
22
+ thread_local = nil
23
+ Thread.new do
24
+ thread_local = PuppetSpec::Singleton.singleton
25
+ end.join
26
+ expect(thread_local).to_not equal(PuppetSpec::Singleton.singleton)
27
+ end
28
+
29
+ it 'is different for each thread' do
30
+ locals = []
31
+ Thread.new do
32
+ locals << PuppetSpec::Singleton.singleton
33
+ end.join
34
+ Thread.new do
35
+ locals << PuppetSpec::Singleton.singleton
36
+ end.join
37
+ expect(locals.first).to_not equal(locals.last)
38
+ end
39
+ end
@@ -1128,88 +1128,120 @@ describe Puppet::Configurer do
1128
1128
  converged_environment: #{last_server_specified_environment}
1129
1129
  run_mode: agent
1130
1130
  SUMMARY
1131
+ end
1131
1132
 
1132
- expect(Puppet::Node.indirection).not_to receive(:find)
1133
+ describe "when the use_last_environment is set to true" do
1134
+ before do
1135
+ expect(Puppet::Node.indirection).not_to receive(:find)
1133
1136
  .with(anything, hash_including(:ignore_cache => true, :fail_on_404 => true))
1134
- end
1137
+ end
1135
1138
 
1136
- it "prefers the environment set via cli" do
1137
- Puppet.settings.handlearg('--environment', 'usethis')
1138
- configurer.run
1139
+ it "prefers the environment set via cli" do
1140
+ Puppet.settings.handlearg('--environment', 'usethis')
1141
+ configurer.run
1139
1142
 
1140
- expect(configurer.environment).to eq('usethis')
1141
- end
1143
+ expect(configurer.environment).to eq('usethis')
1144
+ end
1142
1145
 
1143
- it "prefers the environment set via lastrunfile over config" do
1144
- FileUtils.mkdir_p(Puppet[:confdir])
1145
- set_puppet_conf(Puppet[:confdir], <<~CONF)
1146
- [main]
1147
- environment = usethis
1148
- lastrunfile = #{Puppet[:lastrunfile]}
1149
- CONF
1146
+ it "prefers the environment set via lastrunfile over config" do
1147
+ FileUtils.mkdir_p(Puppet[:confdir])
1148
+ set_puppet_conf(Puppet[:confdir], <<~CONF)
1149
+ [main]
1150
+ environment = usethis
1151
+ lastrunfile = #{Puppet[:lastrunfile]}
1152
+ CONF
1150
1153
 
1151
- Puppet.initialize_settings
1152
- configurer.run
1154
+ Puppet.initialize_settings
1155
+ configurer.run
1153
1156
 
1154
- expect(configurer.environment).to eq(last_server_specified_environment)
1155
- end
1157
+ expect(configurer.environment).to eq(last_server_specified_environment)
1158
+ end
1156
1159
 
1157
- it "uses the environment from Puppet[:environment] if given a catalog" do
1158
- configurer.run(catalog: catalog)
1160
+ it "uses the environment from Puppet[:environment] if given a catalog" do
1161
+ configurer.run(catalog: catalog)
1159
1162
 
1160
- expect(configurer.environment).to eq(Puppet[:environment])
1161
- end
1163
+ expect(configurer.environment).to eq(Puppet[:environment])
1164
+ end
1162
1165
 
1163
- it "uses the environment from Puppet[:environment] if use_cached_catalog = true" do
1164
- Puppet[:use_cached_catalog] = true
1165
- expects_cached_catalog_only(catalog)
1166
- configurer.run
1166
+ it "uses the environment from Puppet[:environment] if use_cached_catalog = true" do
1167
+ Puppet[:use_cached_catalog] = true
1168
+ expects_cached_catalog_only(catalog)
1169
+ configurer.run
1167
1170
 
1168
- expect(configurer.environment).to eq(Puppet[:environment])
1169
- end
1171
+ expect(configurer.environment).to eq(Puppet[:environment])
1172
+ end
1170
1173
 
1171
- describe "when the environment is not set via CLI" do
1172
- it "uses the environment found in lastrunfile if the key exists" do
1173
- configurer.run
1174
+ describe "when the environment is not set via CLI" do
1175
+ it "uses the environment found in lastrunfile if the key exists" do
1176
+ configurer.run
1174
1177
 
1175
- expect(configurer.environment).to eq(last_server_specified_environment)
1178
+ expect(configurer.environment).to eq(last_server_specified_environment)
1179
+ end
1180
+
1181
+ it "pushes the converged environment found in lastrunfile over the existing context" do
1182
+ initial_env = Puppet::Node::Environment.remote('production')
1183
+ Puppet.push_context(
1184
+ current_environment: initial_env,
1185
+ loaders: Puppet::Pops::Loaders.new(initial_env, true))
1186
+
1187
+ expect(Puppet).to receive(:push_context).with(
1188
+ hash_including(:current_environment, :loaders),
1189
+ "Local node environment #{last_server_specified_environment} for configurer transaction"
1190
+ ).once.and_call_original
1191
+
1192
+ configurer.run
1193
+ end
1194
+
1195
+ it "uses the environment from Puppet[:environment] if strict_environment_mode is set" do
1196
+ Puppet[:strict_environment_mode] = true
1197
+ configurer.run
1198
+
1199
+ expect(configurer.environment).to eq(Puppet[:environment])
1200
+ end
1201
+
1202
+ it "uses the environment from Puppet[:environment] if initial_environment is the same as converged_environment" do
1203
+ Puppet[:lastrunfile] = file_containing('last_run_summary.yaml', <<~SUMMARY)
1204
+ ---
1205
+ version:
1206
+ config: 1624882680
1207
+ puppet: 6.24.0
1208
+ application:
1209
+ initial_environment: development
1210
+ converged_environment: development
1211
+ run_mode: agent
1212
+ SUMMARY
1213
+ configurer.run
1214
+
1215
+ expect(configurer.environment).to eq(Puppet[:environment])
1216
+ end
1176
1217
  end
1218
+ end
1177
1219
 
1178
- it "pushes the converged environment found in lastrunfile over the existing context" do
1179
- initial_env = Puppet::Node::Environment.remote('production')
1180
- Puppet.push_context(
1181
- current_environment: initial_env,
1182
- loaders: Puppet::Pops::Loaders.new(initial_env, true))
1220
+ describe "when the use_last_environment setting is set to false" do
1221
+ let(:node_environment) { Puppet::Node::Environment.remote(:salam) }
1222
+ let(:node) { Puppet::Node.new(Puppet[:node_name_value]) }
1183
1223
 
1184
- expect(Puppet).to receive(:push_context).with(
1185
- hash_including(:current_environment, :loaders),
1186
- "Local node environment #{last_server_specified_environment} for configurer transaction"
1187
- ).once.and_call_original
1224
+ before do
1225
+ Puppet[:use_last_environment] = false
1226
+ node.environment = node_environment
1188
1227
 
1189
- configurer.run
1228
+ allow(Puppet::Node.indirection).to receive(:find)
1229
+ allow(Puppet::Node.indirection).to receive(:find)
1230
+ .with(anything, hash_including(:ignore_cache => true, :fail_on_404 => true))
1231
+ .and_return(node)
1190
1232
  end
1191
1233
 
1192
- it "uses the environment from Puppet[:environment] if strict_environment_mode is set" do
1193
- Puppet[:strict_environment_mode] = true
1194
- configurer.run
1234
+ it "does a node request" do
1235
+ expect(Puppet::Node.indirection).to receive(:find)
1236
+ .with(anything, hash_including(:ignore_cache => true, :fail_on_404 => true))
1195
1237
 
1196
- expect(configurer.environment).to eq(Puppet[:environment])
1238
+ configurer.run
1197
1239
  end
1198
1240
 
1199
- it "uses the environment from Puppet[:environment] if initial_environment is the same as converged_environment" do
1200
- Puppet[:lastrunfile] = file_containing('last_run_summary.yaml', <<~SUMMARY)
1201
- ---
1202
- version:
1203
- config: 1624882680
1204
- puppet: 6.24.0
1205
- application:
1206
- initial_environment: development
1207
- converged_environment: development
1208
- run_mode: agent
1209
- SUMMARY
1241
+ it "uses the node environment from the node request" do
1210
1242
  configurer.run
1211
1243
 
1212
- expect(configurer.environment).to eq(Puppet[:environment])
1244
+ expect(configurer.environment).to eq(node_environment.name.to_s)
1213
1245
  end
1214
1246
  end
1215
1247
  end
@@ -221,6 +221,70 @@ describe Puppet::Face[:generate, :current] do
221
221
  end
222
222
 
223
223
  end
224
+
225
+ context "in an environment with a faulty type" do
226
+ let(:dir) do
227
+ dir_containing('environments', { 'testing_generate2' => {
228
+ 'environment.conf' => "modulepath = modules",
229
+ 'manifests' => { 'site.pp' => "" },
230
+ 'modules' => {
231
+ 'm3' => {
232
+ 'lib' => { 'puppet' => { 'type' => {
233
+ 'test3.rb' => <<-EOF
234
+ module Puppet
235
+ Type.newtype(:test3) do
236
+ @doc = "Docs for resource"
237
+ def self.title_patterns
238
+ identity = lambda {|x| x}
239
+ [
240
+ [
241
+ /^(.*)_(.*)$/,
242
+ [
243
+ [:name, identity ]
244
+ ]
245
+ ]
246
+ ]
247
+ end
248
+ newproperty(:message) do
249
+ desc "Docs for 'message' property"
250
+ end
251
+ newparam(:name) do
252
+ desc "Docs for 'name' parameter"
253
+ isnamevar
254
+ end
255
+ end; end
256
+ EOF
257
+ } }
258
+ }
259
+ }
260
+ }}})
261
+ end
262
+
263
+ let(:modulepath) do
264
+ File.join(dir, 'testing_generate2', 'modules')
265
+ end
266
+
267
+ let(:m3) do
268
+ File.join(modulepath, 'm3')
269
+ end
270
+
271
+ around(:each) do |example|
272
+ Puppet.settings.initialize_global_settings
273
+ Puppet[:manifest] = ''
274
+ loader = Puppet::Environments::Directories.new(dir, [])
275
+ Puppet.override(:environments => loader) do
276
+ Puppet.override(:current_environment => loader.get('testing_generate2')) do
277
+ example.run
278
+ end
279
+ end
280
+ end
281
+
282
+ it 'fails when using procs for title patterns' do
283
+ expect {
284
+ genface.types(:format => 'pcore')
285
+ }.to exit_with(1)
286
+ end
287
+ end
224
288
  end
225
289
 
226
290
  def from_an_interactive_terminal
@@ -984,11 +984,12 @@ describe "Puppet::FileSystem" do
984
984
  end
985
985
 
986
986
  it 'preserves file ownership' do
987
- allow(Puppet::FileSystem).to receive(:lstat)
988
- .with(Puppet::FileSystem.pathname(dest))
989
- .and_return(double(uid: 1, gid: 2))
987
+ FileUtils.touch(dest)
988
+ allow(File).to receive(:lstat).and_call_original
989
+ allow(File).to receive(:lstat).with(Pathname.new(dest)).and_return(double(uid: 1, gid: 2, 'directory?': false))
990
990
 
991
- expect(FileUtils).to receive(:chown).with(1, 2, /#{dest}/)
991
+ allow(File).to receive(:chown).and_call_original
992
+ expect(FileUtils).to receive(:chown).with(1, 2, any_args)
992
993
 
993
994
  Puppet::FileSystem.replace_file(dest, 0644) { |f| f.write(content) }
994
995
  end
@@ -1163,4 +1164,33 @@ describe "Puppet::FileSystem" do
1163
1164
  expect(File.mtime(dest)).to be_within(1).of(tomorrow)
1164
1165
  end
1165
1166
  end
1167
+
1168
+ context '#chmod' do
1169
+ let(:dest) { tmpfile('abs_file') }
1170
+
1171
+ it "changes the mode given an absolute string" do
1172
+ Puppet::FileSystem.touch(dest)
1173
+ Puppet::FileSystem.chmod(0644, dest)
1174
+ expect(File.stat(dest).mode & 0777).to eq(0644)
1175
+ end
1176
+
1177
+ it "returns true if given an absolute pathname" do
1178
+ Puppet::FileSystem.touch(dest)
1179
+ Puppet::FileSystem.chmod(0644, Pathname.new(dest))
1180
+ expect(File.stat(dest).mode & 0777).to eq(0644)
1181
+ end
1182
+
1183
+ it "raises if the file doesn't exist" do
1184
+ klass = Puppet::Util::Platform.windows? ? Puppet::Error : Errno::ENOENT
1185
+ expect {
1186
+ Puppet::FileSystem.chmod(0644, dest)
1187
+ }.to raise_error(klass)
1188
+ end
1189
+
1190
+ it "raises ArgumentError if dest is invalid" do
1191
+ expect {
1192
+ Puppet::FileSystem.chmod(0644, nil)
1193
+ }.to raise_error(ArgumentError, /expected Pathname, got: 'NilClass'/)
1194
+ end
1195
+ end
1166
1196
  end
@@ -90,7 +90,7 @@ describe Puppet::Forge::ModuleRelease do
90
90
  "checksums": { },
91
91
  "version": "#{module_version}",
92
92
  "description": "Standard Library for Puppet Modules",
93
- "source": "git://github.com/puppetlabs/puppetlabs-stdlib.git",
93
+ "source": "https://github.com/puppetlabs/puppetlabs-stdlib",
94
94
  "project_page": "https://github.com/puppetlabs/puppetlabs-stdlib",
95
95
  "summary": "Puppet Module Standard Library",
96
96
  "dependencies": [
@@ -204,7 +204,7 @@ describe Puppet::Forge::ModuleRelease do
204
204
  "checksums": { },
205
205
  "version": "#{module_version}",
206
206
  "description": "Standard Library for Puppet Modules",
207
- "source": "git://github.com/puppetlabs/puppetlabs-stdlib.git",
207
+ "source": "https://github.com/puppetlabs/puppetlabs-stdlib",
208
208
  "project_page": "https://github.com/puppetlabs/puppetlabs-stdlib",
209
209
  "summary": "Puppet Module Standard Library",
210
210
  "author": "#{module_author}",
@@ -279,7 +279,7 @@ describe Puppet::Forge::ModuleRelease do
279
279
  "checksums": { },
280
280
  "version": "#{module_version}",
281
281
  "description": "Standard Library for Puppet Modules",
282
- "source": "git://github.com/puppetlabs/puppetlabs-stdlib.git",
282
+ "source": "https://github.com/puppetlabs/puppetlabs-stdlib",
283
283
  "project_page": "https://github.com/puppetlabs/puppetlabs-stdlib",
284
284
  "summary": "Puppet Module Standard Library",
285
285
  "dependencies": [
@@ -19,16 +19,52 @@ describe "the versioncmp function" do
19
19
  let(:type_parser) { Puppet::Pops::Types::TypeParser.singleton }
20
20
 
21
21
  it 'should raise an Error if there is less than 2 arguments' do
22
- expect { versioncmp('a,b') }.to raise_error(/expects 2 arguments, got 1/)
22
+ expect { versioncmp('a,b') }.to raise_error(/expects between 2 and 3 arguments, got 1/)
23
23
  end
24
24
 
25
- it 'should raise an Error if there is more than 2 arguments' do
26
- expect { versioncmp('a,b','foo', 'bar') }.to raise_error(/expects 2 arguments, got 3/)
25
+ it 'should raise an Error if there is more than 3 arguments' do
26
+ expect { versioncmp('a,b','foo', false, 'bar') }.to raise_error(/expects between 2 and 3 arguments, got 4/)
27
27
  end
28
28
 
29
29
  it "should call Puppet::Util::Package.versioncmp (included in scope)" do
30
- expect(Puppet::Util::Package).to receive(:versioncmp).with('1.2', '1.3').and_return(-1)
30
+ expect(Puppet::Util::Package).to receive(:versioncmp).with('1.2', '1.3', false).and_return(-1)
31
31
 
32
32
  expect(versioncmp('1.2', '1.3')).to eq(-1)
33
33
  end
34
+
35
+ context "when ignore_trailing_zeroes is true" do
36
+ it "should equate versions with 2 elements and dots but with unnecessary zero" do
37
+ expect(versioncmp("10.1.0", "10.1", true)).to eq(0)
38
+ end
39
+
40
+ it "should equate versions with 1 element and dot but with unnecessary zero" do
41
+ expect(versioncmp("11.0", "11", true)).to eq(0)
42
+ end
43
+
44
+ it "should equate versions with 1 element and dot but with unnecessary zeros" do
45
+ expect(versioncmp("11.00", "11", true)).to eq(0)
46
+ end
47
+
48
+ it "should equate versions with dots and iregular zeroes" do
49
+ expect(versioncmp("11.0.00", "11", true)).to eq(0)
50
+ end
51
+
52
+ it "should equate versions with dashes" do
53
+ expect(versioncmp("10.1-0", "10.1.0-0", true)).to eq(0)
54
+ end
55
+
56
+ it "should compare versions with dashes after normalization" do
57
+ expect(versioncmp("10.1-1", "10.1.0-0", true)).to eq(1)
58
+ end
59
+
60
+ it "should not normalize versions if zeros are not trailing" do
61
+ expect(versioncmp("1.1", "1.0.1", true)).to eq(1)
62
+ end
63
+ end
64
+
65
+ context "when ignore_trailing_zeroes is false" do
66
+ it "should not equate versions if zeros are not trailing" do
67
+ expect(versioncmp("1.1", "1.0.1")).to eq(1)
68
+ end
69
+ end
34
70
  end
@@ -40,6 +40,12 @@ describe Puppet::Node do
40
40
  expect(node.environment.name).to eq(:bar)
41
41
  end
42
42
 
43
+ it "sets environment_name with the correct environment name" do
44
+ node = Puppet::Node.new("foo")
45
+ node.environment = Puppet::Node::Environment.remote('www123')
46
+ expect(node.environment_name).to eq(:www123)
47
+ end
48
+
43
49
  it "allows its environment to be set by parameters after initialization" do
44
50
  node = Puppet::Node.new("foo")
45
51
  node.parameters["environment"] = :bar
@@ -106,7 +106,7 @@ describe "egrammar parsing containers" do
106
106
 
107
107
  context 'it should allow keywords as attribute names' do
108
108
  ['and', 'case', 'class', 'default', 'define', 'else', 'elsif', 'if', 'in', 'inherits', 'node', 'or',
109
- 'undef', 'unless', 'type', 'attr', 'function', 'private'].each do |keyword|
109
+ 'undef', 'unless', 'type', 'attr', 'function', 'private', 'plan', 'apply'].each do |keyword|
110
110
  it "such as #{keyword}" do
111
111
  expect { parse("class x ($#{keyword}){} class { x: #{keyword} => 1 }") }.to_not raise_error
112
112
  end
@@ -178,7 +178,7 @@ describe "egrammar parsing containers" do
178
178
 
179
179
  context 'it should allow keywords as attribute names' do
180
180
  ['and', 'case', 'class', 'default', 'define', 'else', 'elsif', 'if', 'in', 'inherits', 'node', 'or',
181
- 'undef', 'unless', 'type', 'attr', 'function', 'private'].each do |keyword|
181
+ 'undef', 'unless', 'type', 'attr', 'function', 'private', 'plan', 'apply'].each do |keyword|
182
182
  it "such as #{keyword}" do
183
183
  expect {parse("define x ($#{keyword}){} x { y: #{keyword} => 1 }")}.to_not raise_error
184
184
  end
@@ -559,29 +559,6 @@ module Serialization
559
559
  expect(warnings).to eql(["['key'] contains the special value default. It will be converted to the String 'default'"])
560
560
  end
561
561
  end
562
- context 'and force_symbol set to true' do
563
- let(:to_converter) { ToDataConverter.new(:rich_data => false, :force_symbol => true) }
564
-
565
- it 'A Hash with Symbol values is converted to hash with Symbol values' do
566
- val = { 'one' => :one, 'two' => :two }
567
- Puppet::Util::Log.with_destination(Puppet::Test::LogCollector.new(logs)) do
568
-
569
- # write and read methods does not work here as we cannot force Symbols in Json.
570
- # and a hash with symbol values cannot be an instance of Types::TypeFactory.data.
571
- # Using YAML for this instead
572
- io.reopen
573
- value = to_converter.convert(val)
574
- io << [value].to_yaml
575
- io.rewind
576
-
577
- val2 = from_converter.convert(YAML::load(io.read)[0])
578
-
579
- expect(val2).to be_a(Hash)
580
- expect(val2).to eql({ 'one' => :one, 'two' => :two })
581
- end
582
- expect(warnings).to be_empty
583
- end
584
- end
585
562
  end
586
563
 
587
564
  context 'with rich_data is set to true' do
@@ -655,41 +632,6 @@ module Serialization
655
632
  end.to raise_error(/Cannot create a Pcore::TimestampType from a (Fixnum|Integer)/)
656
633
  end
657
634
  end
658
-
659
- context 'when data is unknown' do
660
- let(:to_converter) { ToDataConverter.new(:message_prefix => 'Test Hash') }
661
- let(:logs) { [] }
662
- let(:warnings) { logs.select { |log| log.level == :warning }.map { |log| log.message } }
663
- let(:val) { Class.new }
664
-
665
- context 'and :silence_warnings undefined or set to false' do
666
- it 'convert the unknown data to string with warnings' do
667
- Puppet::Util::Log.with_destination(Puppet::Test::LogCollector.new(logs)) do
668
- write(val)
669
- val2 = read
670
- expect(val2).to be_a(String)
671
- expect(val2).to match(/Class/)
672
- end
673
- expect(warnings).to eql([
674
- "Test Hash contains a #{val.class} value. It will be converted to the String '#{val.to_s}'"])
675
- end
676
- end
677
-
678
- context 'and :silence_warnings undefined or set to true' do
679
- let(:to_converter) { ToDataConverter.new(:message_prefix => 'Test Hash', :silence_warnings => true) }
680
-
681
- it 'convert the unknown data to string without warnings if silence_warnings set to true' do
682
- val = Class.new
683
- Puppet::Util::Log.with_destination(Puppet::Test::LogCollector.new(logs)) do
684
- write(val)
685
- val2 = read
686
- expect(val2).to be_a(String)
687
- expect(val2).to match(/Class/)
688
- end
689
- expect(warnings).to be_empty
690
- end
691
- end
692
- end
693
635
  end
694
636
  end
695
637
  end
@@ -432,6 +432,11 @@ describe "validating 4x" do
432
432
  expect(acceptor.error_count).to eql(0)
433
433
  end
434
434
 
435
+ it 'allows apply to be used as a resource attribute name' do
436
+ acceptor = validate(parse('apply("foo.example.com") { sometype { "resourcetitle": apply => "applyvalue" } }'))
437
+ expect(acceptor.error_count).to eql(0)
438
+ end
439
+
435
440
  it 'accepts multiple arguments' do
436
441
  acceptor = validate(parse('apply(["foo.example.com"], { "other" => "args" }) { }'))
437
442
  expect(acceptor.error_count).to eql(0)
@@ -10,8 +10,8 @@ describe 'Puppet::Type::Service::Provider::Gentoo',
10
10
 
11
11
  before :each do
12
12
  allow(Puppet::Type.type(:service)).to receive(:defaultprovider).and_return(provider_class)
13
- allow(FileTest).to receive(:file?).with('/sbin/rc-update').and_return(true)
14
- allow(FileTest).to receive(:executable?).with('/sbin/rc-update').and_return(true)
13
+ allow(Puppet::FileSystem).to receive(:file?).with('/sbin/rc-update').and_return(true)
14
+ allow(Puppet::FileSystem).to receive(:executable?).with('/sbin/rc-update').and_return(true)
15
15
  allow(Facter).to receive(:value).with(:operatingsystem).and_return('Gentoo')
16
16
  allow(Facter).to receive(:value).with(:osfamily).and_return('Gentoo')
17
17
 
@@ -52,13 +52,14 @@ describe 'Puppet::Type::Service::Provider::Gentoo',
52
52
  end
53
53
 
54
54
  it "should get a list of services from /etc/init.d but exclude helper scripts" do
55
- expect(FileTest).to receive(:directory?).with('/etc/init.d').and_return(true)
55
+ allow(Puppet::FileSystem).to receive(:directory?).and_call_original
56
+ allow(Puppet::FileSystem).to receive(:directory?).with('/etc/init.d').and_return(true)
56
57
  expect(Dir).to receive(:entries).with('/etc/init.d').and_return(initscripts)
57
58
  (initscripts - helperscripts).each do |script|
58
- expect(FileTest).to receive(:executable?).with("/etc/init.d/#{script}").and_return(true)
59
+ expect(Puppet::FileSystem).to receive(:executable?).with("/etc/init.d/#{script}").and_return(true)
59
60
  end
60
61
  helperscripts.each do |script|
61
- expect(FileTest).not_to receive(:executable?).with("/etc/init.d/#{script}")
62
+ expect(Puppet::FileSystem).not_to receive(:executable?).with("/etc/init.d/#{script}")
62
63
  end
63
64
 
64
65
  allow(Puppet::FileSystem).to receive(:symlink?).and_return(false)
@@ -85,14 +85,20 @@ describe 'Puppet::Type::Service::Provider::Init',
85
85
  @services = ['one', 'two', 'three', 'four', 'umountfs']
86
86
  allow(Dir).to receive(:entries).and_call_original
87
87
  allow(Dir).to receive(:entries).with('tmp').and_return(@services)
88
- expect(FileTest).to receive(:directory?).with('tmp').and_return(true)
89
- allow(FileTest).to receive(:executable?).and_return(true)
88
+ allow(Puppet::FileSystem).to receive(:directory?).and_call_original
89
+ allow(Puppet::FileSystem).to receive(:directory?).with('tmp').and_return(true)
90
+ allow(Puppet::FileSystem).to receive(:executable?).and_return(true)
90
91
  end
91
92
 
92
93
  it "should return instances for all services" do
93
94
  expect(provider_class.instances.map(&:name)).to eq(@services)
94
95
  end
95
96
 
97
+ it "should omit directories from the service list" do
98
+ expect(Puppet::FileSystem).to receive(:directory?).with('tmp/four').and_return(true)
99
+ expect(provider_class.instances.map(&:name)).to eq(@services - ['four'])
100
+ end
101
+
96
102
  it "should omit an array of services from exclude list" do
97
103
  exclude = ['two', 'four']
98
104
  expect(provider_class.get_services(provider_class.defpath, exclude).map(&:name)).to eq(@services - exclude)
@@ -140,9 +146,9 @@ describe 'Puppet::Type::Service::Provider::Init',
140
146
 
141
147
  describe "when checking valid paths" do
142
148
  it "should discard paths that do not exist" do
143
- expect(File).to receive(:directory?).with(paths[0]).and_return(false)
149
+ expect(Puppet::FileSystem).to receive(:directory?).with(paths[0]).and_return(false)
144
150
  expect(Puppet::FileSystem).to receive(:exist?).with(paths[0]).and_return(false)
145
- expect(File).to receive(:directory?).with(paths[1]).and_return(true)
151
+ expect(Puppet::FileSystem).to receive(:directory?).with(paths[1]).and_return(true)
146
152
 
147
153
  expect(provider.paths).to eq([paths[1]])
148
154
  end
@@ -150,7 +156,7 @@ describe 'Puppet::Type::Service::Provider::Init',
150
156
  it "should discard paths that are not directories" do
151
157
  paths.each do |path|
152
158
  expect(Puppet::FileSystem).to receive(:exist?).with(path).and_return(true)
153
- expect(File).to receive(:directory?).with(path).and_return(false)
159
+ expect(Puppet::FileSystem).to receive(:directory?).with(path).and_return(false)
154
160
  end
155
161
  expect(provider.paths).to be_empty
156
162
  end
@@ -158,7 +164,7 @@ describe 'Puppet::Type::Service::Provider::Init',
158
164
 
159
165
  describe "when searching for the init script" do
160
166
  before :each do
161
- paths.each {|path| expect(File).to receive(:directory?).with(path).and_return(true) }
167
+ paths.each {|path| expect(Puppet::FileSystem).to receive(:directory?).with(path).and_return(true) }
162
168
  end
163
169
 
164
170
  it "should be able to find the init script in the service path" do
@@ -191,9 +197,9 @@ describe 'Puppet::Type::Service::Provider::Init',
191
197
 
192
198
  describe "if the init script is present" do
193
199
  before :each do
194
- allow(File).to receive(:directory?).and_call_original
195
- allow(File).to receive(:directory?).with("/service/path").and_return(true)
196
- allow(File).to receive(:directory?).with("/alt/service/path").and_return(true)
200
+ allow(Puppet::FileSystem).to receive(:directory?).and_call_original
201
+ allow(Puppet::FileSystem).to receive(:directory?).with("/service/path").and_return(true)
202
+ allow(Puppet::FileSystem).to receive(:directory?).with("/alt/service/path").and_return(true)
197
203
  allow(Puppet::FileSystem).to receive(:exist?).with("/service/path/myservice").and_return(true)
198
204
  end
199
205