rspec-puppet 2.6.9 → 2.6.10

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9e358d6951d64d0bd46d40657619cebac5c90af8
4
- data.tar.gz: e2af0a6d7a995fe41b0d155f2dc1c20055911da8
3
+ metadata.gz: 79d6d3a697c31a222aeeed78ed607388ea642626
4
+ data.tar.gz: 22bcbe25913fcc858d11f4d5842525fd5f891dd9
5
5
  SHA512:
6
- metadata.gz: f0994991a27eddd126547940ae9a8b667dd7f08a7084b90f35c7a005cdb4b58974b580110908a7afa2a4034429964ee79181531b50cfa6028a016dcf9e8e27f2
7
- data.tar.gz: 35ca0b9c0b1c1c60a2b736b05652c216322ee5ae1f47d2cb2c85080c93e9ba90e19f88d4f458424df8a9af37625050b16b3f13a02f7a4ecf9b31f1f586916e8c
6
+ metadata.gz: e4eb8e8725a5373c0b4fb965b0ac0804ec6003696f5e202cabf88240412b5fe35613a5613544ce22b3c31ce6a055b8463206d7b6c0cb13be427d1c4d812e68fb
7
+ data.tar.gz: da2762a48d9cf1096c84eb01faf1595709a3bffb8cbb3b95128feb7f2c8e9a1527d8bfa8892cc1798f7342cb1f0c86145b3c5df2b522c9cdb3d3bced10f17104
@@ -2,6 +2,53 @@
2
2
  All notable changes to this project will be documented in this file. This
3
3
  project adheres to [Semantic Versioning](http://semver.org/).
4
4
 
5
+ ## [2.6.10]
6
+
7
+ ### Fixed
8
+
9
+ * Replaced deprecated `File.exists?` calls in `rspec-puppet-init` with
10
+ `File.exist?`, which behaves much more reliably in respect to symlinks.
11
+ * Stubbed out `Puppet::Util::Windows::Security.supports_acl?` when compiling
12
+ the catalogue as this check only make sense when applying the resources to
13
+ a host and prevents testing Windows File resources on non-Windows hosts.
14
+ * The cached default provider for native types is now reset before compiling
15
+ a new catalogue.
16
+ * Resource titles that contain single quotes are now rendered correctly,
17
+ allowing them to be tested.
18
+ * When pretending to be a different platform, the methods in
19
+ `Puppet::Util::Platform` are now stubbed after the catalogue has been
20
+ compiled, allowing path related logic in custom facts to behave as expected.
21
+ * A mock version of `Win32::TaskScheduler` has been added to rspec-puppet.
22
+ This will be loaded when running rspec-puppet on a non-Windows host in order
23
+ to allow testing of catalogues containing Scheduled\_task resources.
24
+ * Stubbed out the `manages_symlinks` feature on
25
+ `Puppet::Type::File::ProviderWindows` as this can only be evaluated at apply
26
+ time and prevents testing Windows File resources that manage symlinks on
27
+ non-Windows hosts.
28
+ * Fixed unhandled exception when testing resource parameters where the
29
+ expected value is an Array or a Hash and the actual value is a different
30
+ data type.
31
+ * A mock version of `Win32::Registry` has been added to rspec-puppet. This
32
+ will be loaded when running rspec-puppet on a non-Windows host in order to
33
+ allow testing of catalogues that contain Exec resources that use the
34
+ `powershell` provider from the `puppetlabs/puppetlabs-powershell` module.
35
+ * Fixed a case where the order in which tests are run can cause a resource
36
+ that is being tested to be falsely reported as untested in the coverage
37
+ report.
38
+
39
+ ### Changed
40
+
41
+ * The tests for the `compile` matcher have been updated to support the new
42
+ error message format introduced in Puppet 5.3.4.
43
+ * The builtin `$server_facts` hash is now populated on versions of Puppet that
44
+ support it (Puppet >= 4.3). This is not currently enabled by default, but
45
+ can be enabled by setting `RSpec.configuration.trusted_server_facts` to
46
+ `true`.
47
+ * `$facts['os']['family']` and `$facts['os']['name']` are now checked when
48
+ determining if rspec-puppet needs to pretend to be running on a different
49
+ platform (previously only `$facts['operatingsystem']` and
50
+ `$facts['osfamily']` were used).
51
+
5
52
  ## [2.6.9]
6
53
 
7
54
  ### Fixed
data/README.md CHANGED
@@ -105,6 +105,14 @@ Boolean | `false` | >=3.4, 4.x, 5.x
105
105
  Configures rspec-puppet to use the `$trusted` hash when compiling the
106
106
  catalogues.
107
107
 
108
+ #### trusted\_server\_facts
109
+ Type | Default | Puppet Version(s)
110
+ ------- | ------- | -----------------
111
+ Boolean | `false` | >=4.3, 5.x
112
+
113
+ Configures rspec-puppet to use the `$server_facts` hash when compiling the
114
+ catalogues.
115
+
108
116
  #### confdir
109
117
  Type | Default | Puppet Version(s)
110
118
  ------ | --------------- | ------------------
@@ -1047,6 +1055,7 @@ be excluded from the coverage report.
1047
1055
  * [puppetlabs_spec_helper](https://github.com/puppetlabs/puppetlabs_spec_helper): shared spec helpers to setup puppet
1048
1056
  * [rspec-puppet-augeas](https://github.com/domcleal/rspec-puppet-augeas): RSpec tests for Augeas resources inside Puppet manifests
1049
1057
  * [jimdo-rspec-puppet-helpers](https://github.com/Jimdo/jimdo-rspec-puppet-helpers): Tests the contents of a file with a source
1058
+ * [puppet-catalog_rspec](https://github.com/enterprisemodules/puppet-catalog_rspec): Ease development of specs by dumping the Puppet catalog as RSpec code
1050
1059
 
1051
1060
  * Fact providers
1052
1061
  * [rspec-puppet-facts](https://github.com/mcanevet/rspec-puppet-facts): Simplify your unit tests by looping on every supported Operating System and populating facts.
@@ -23,6 +23,10 @@ module RSpec::Puppet
23
23
  def self.rspec_puppet_example?
24
24
  RSpec::Puppet::EventListener.rspec_puppet_example?
25
25
  end
26
+
27
+ def self.current_example
28
+ RSpec::Puppet::EventListener.current_example
29
+ end
26
30
  end
27
31
 
28
32
  require 'rspec-puppet/monkey_patches'
@@ -49,6 +53,17 @@ RSpec.configure do |c|
49
53
  c.add_setting :adapter
50
54
  c.add_setting :platform, :default => Puppet::Util::Platform.actual_platform
51
55
 
56
+ c.instance_eval do
57
+ def trusted_server_facts
58
+ @trusted_server_facts.nil? ? false : @trusted_server_facts
59
+ end
60
+
61
+ def trusted_server_facts=(value)
62
+ @trusted_server_facts = value
63
+ adapter.setup_puppet(RSpec::Puppet.current_example) unless adapter.nil?
64
+ end
65
+ end
66
+
52
67
  c.before(:all) do
53
68
  if RSpec.configuration.setup_fixtures?
54
69
  RSpec::Puppet::Setup.safe_setup_directories(nil, false)
@@ -150,6 +150,7 @@ module RSpec::Puppet
150
150
  [:hiera_config, :hiera_config],
151
151
  [:strict_variables, :strict_variables],
152
152
  [:manifest, :manifest],
153
+ [:trusted_server_facts, :trusted_server_facts]
153
154
  ])
154
155
  end
155
156
 
@@ -119,6 +119,8 @@ module RSpec::Puppet
119
119
  def results
120
120
  report = {}
121
121
 
122
+ @collection.delete_if { |name, _| filtered?(name) }
123
+
122
124
  report[:total] = @collection.size
123
125
  report[:touched] = @collection.count { |_, resource| resource.touched? }
124
126
  report[:untouched] = report[:total] - report[:touched]
@@ -87,6 +87,11 @@ module RSpec::Puppet
87
87
  def check_hash(expected, actual)
88
88
  op = @should_match ? :"==" : :"!="
89
89
 
90
+ unless actual.class.send(op, expected.class)
91
+ @errors << MatchError.new(@parameter, expected, actual, !@should_match)
92
+ return false
93
+ end
94
+
90
95
  unless expected.keys.size.send(op, actual.keys.size)
91
96
  return false
92
97
  end
@@ -99,6 +104,11 @@ module RSpec::Puppet
99
104
  def check_array(expected, actual)
100
105
  op = @should_match ? :"==" : :"!="
101
106
 
107
+ unless actual.class.send(op, expected.class)
108
+ @errors << MatchError.new(@parameter, expected, actual, !@should_match)
109
+ return false
110
+ end
111
+
102
112
  unless expected.size.send(op, actual.size)
103
113
  return false
104
114
  end
@@ -11,8 +11,13 @@ class RSpec::Puppet::EventListener
11
11
  def self.example_started(example)
12
12
  if rspec3?
13
13
  @rspec_puppet_example = example.example.example_group.ancestors.include?(RSpec::Puppet::Support)
14
+ @current_example = example.example
15
+ if !@current_example.respond_to?(:environment) && @current_example.respond_to?(:example_group_instance)
16
+ @current_example = @current_example.example_group_instance
17
+ end
14
18
  else
15
19
  @rspec_puppet_example = example.example_group.ancestors.include?(RSpec::Puppet::Support)
20
+ @current_example = example
16
21
  end
17
22
  end
18
23
 
@@ -39,10 +44,17 @@ class RSpec::Puppet::EventListener
39
44
 
40
45
  @rspec3
41
46
  end
47
+
48
+ def self.current_example
49
+ @current_example
50
+ end
42
51
  end
43
52
 
44
53
  RSpec.configuration.reporter.register_listener(RSpec::Puppet::EventListener, :example_started, :example_pending, :example_passed, :example_failed)
45
54
 
55
+ require 'rspec-puppet/monkey_patches/win32/taskscheduler'
56
+ require 'rspec-puppet/monkey_patches/win32/registry'
57
+
46
58
  module Puppet
47
59
  # Allow rspec-puppet to prevent Puppet::Type from automatically picking
48
60
  # a provider for a resource. We need to do this because in order to fully
@@ -272,13 +284,38 @@ Puppet::Type.type(:exec).paramclass(:user).validate do |value|
272
284
  end
273
285
  end
274
286
 
287
+ # Stub out Puppet::Util::Windows::Security.supports_acl? if it has been
288
+ # defined. This check only makes sense when applying the catalogue to a host
289
+ # and so can be safely stubbed out for unit testing.
290
+ Puppet::Type.type(:file).provide(:windows).class_eval do
291
+ old_supports_acl = instance_method(:supports_acl?) if respond_to?(:supports_acl?)
292
+
293
+ def supports_acl?(path)
294
+ if RSpec::Puppet.rspec_puppet_example?
295
+ true
296
+ else
297
+ old_supports_acl.bind(self).call(value)
298
+ end
299
+ end
300
+
301
+ old_manages_symlinks = instance_method(:manages_symlinks?) if respond_to?(:manages_symlinks?)
302
+
303
+ def manages_symlinks?
304
+ if RSpec::Puppet.rspec_puppet_example?
305
+ true
306
+ else
307
+ old_manages_symlinks.bind(self).call(value)
308
+ end
309
+ end
310
+ end
311
+
275
312
  # Prevent Puppet from requiring 'puppet/util/windows' if we're pretending to be
276
313
  # windows, otherwise it will require other libraries that probably won't be
277
314
  # available on non-windows hosts.
278
315
  module Kernel
279
316
  alias :old_require :require
280
317
  def require(path)
281
- return if path == 'puppet/util/windows' && RSpec::Puppet.rspec_puppet_example? && Puppet::Util::Platform.pretend_windows?
318
+ return if (['puppet/util/windows', 'win32/registry'].include?(path)) && RSpec::Puppet.rspec_puppet_example? && Puppet::Util::Platform.pretend_windows?
282
319
  old_require(path)
283
320
  end
284
321
  end
@@ -0,0 +1,79 @@
1
+ module RSpec
2
+ module Puppet
3
+ module Win32
4
+ class Registry
5
+ module Constants
6
+ HKEY_CLASSES_ROOT = 0x80000000
7
+ HKEY_CURRENT_USER = 0x80000001
8
+ HKEY_LOCAL_MACHINE = 0x80000002
9
+ HKEY_USERS = 0x80000003
10
+ HKEY_PERFORMANCE_DATA = 0x80000004
11
+ HKEY_PERFORMANCE_TEXT = 0x80000050
12
+ HKEY_PERFORMANCE_NLSTEXT = 0x80000060
13
+ HKEY_CURRENT_CONFIG = 0x80000005
14
+ HKEY_DYN_DATA = 0x80000006
15
+
16
+ REG_NONE = 0
17
+ REG_SZ = 1
18
+ REG_EXPAND_SZ = 2
19
+ REG_BINARY = 3
20
+ REG_DWORD = 4
21
+ REG_DWORD_LITTLE_ENDIAN = 4
22
+ REG_DWORD_BIG_ENDIAN = 5
23
+ REG_LINK = 6
24
+ REG_MULTI_SZ = 7
25
+ REG_RESOURCE_LIST = 8
26
+ REG_FULL_RESOURCE_DESCRIPTOR = 9
27
+ REG_RESOURCE_REQUIREMENTS_LIST = 10
28
+ REG_QWORD = 11
29
+ REG_QWORD_LITTLE_ENDIAN = 11
30
+
31
+ STANDARD_RIGHTS_READ = 0x00020000
32
+ STANDARD_RIGHTS_WRITE = 0x00020000
33
+ KEY_QUERY_VALUE = 0x0001
34
+ KEY_SET_VALUE = 0x0002
35
+ KEY_CREATE_SUB_KEY = 0x0004
36
+ KEY_ENUMERATE_SUB_KEYS = 0x0008
37
+ KEY_NOTIFY = 0x0010
38
+ KEY_CREATE_LINK = 0x0020
39
+ KEY_READ = STANDARD_RIGHTS_READ |
40
+ KEY_QUERY_VALUE | KEY_ENUMERATE_SUB_KEYS | KEY_NOTIFY
41
+ KEY_WRITE = STANDARD_RIGHTS_WRITE |
42
+ KEY_SET_VALUE | KEY_CREATE_SUB_KEY
43
+ KEY_EXECUTE = KEY_READ
44
+ KEY_ALL_ACCESS = KEY_READ | KEY_WRITE | KEY_CREATE_LINK
45
+
46
+ REG_OPTION_RESERVED = 0x0000
47
+ REG_OPTION_NON_VOLATILE = 0x0000
48
+ REG_OPTION_VOLATILE = 0x0001
49
+ REG_OPTION_CREATE_LINK = 0x0002
50
+ REG_OPTION_BACKUP_RESTORE = 0x0004
51
+ REG_OPTION_OPEN_LINK = 0x0008
52
+ REG_LEGAL_OPTION = REG_OPTION_RESERVED |
53
+ REG_OPTION_NON_VOLATILE | REG_OPTION_CREATE_LINK |
54
+ REG_OPTION_BACKUP_RESTORE | REG_OPTION_OPEN_LINK
55
+
56
+ REG_CREATED_NEW_KEY = 1
57
+ REG_OPENED_EXISTING_KEY = 2
58
+
59
+ REG_WHOLE_HIVE_VOLATILE = 0x0001
60
+ REG_REFRESH_HIVE = 0x0002
61
+ REG_NO_LAZY_FLUSH = 0x0004
62
+ REG_FORCE_RESTORE = 0x0008
63
+
64
+ MAX_KEY_LENGTH = 514
65
+ MAX_VALUE_LENGTH = 32768
66
+ end
67
+ include Constants
68
+ end
69
+ end
70
+ end
71
+ end
72
+
73
+ begin
74
+ require 'win32/registry'
75
+ rescue LoadError
76
+ module Win32
77
+ Registry = RSpec::Puppet::Win32::Registry
78
+ end
79
+ end
@@ -0,0 +1,159 @@
1
+ # Create our dummy Win32::TaskScheduler with the consts defined from
2
+ # https://github.com/djberg96/win32-taskscheduler/blob/ole/lib/win32/taskscheduler.rb
3
+ module RSpec
4
+ module Puppet
5
+ module Win32
6
+ class TaskScheduler
7
+ TASK_TIME_TRIGGER_ONCE = 0
8
+ TASK_TIME_TRIGGER_DAILY = 1
9
+ TASK_TIME_TRIGGER_WEEKLY = 2
10
+ TASK_TIME_TRIGGER_MONTHLYDATE = 3
11
+ TASK_TIME_TRIGGER_MONTHLYDOW = 4
12
+ TASK_EVENT_TRIGGER_ON_IDLE = 5
13
+ TASK_EVENT_TRIGGER_AT_SYSTEMSTART = 6
14
+ TASK_EVENT_TRIGGER_AT_LOGON = 7
15
+ ONCE = TASK_TIME_TRIGGER_ONCE
16
+ DAILY = TASK_TIME_TRIGGER_DAILY
17
+ WEEKLY = TASK_TIME_TRIGGER_WEEKLY
18
+ MONTHLYDATE = TASK_TIME_TRIGGER_MONTHLYDATE
19
+ MONTHLYDOW = TASK_TIME_TRIGGER_MONTHLYDOW
20
+ ON_IDLE = TASK_EVENT_TRIGGER_ON_IDLE
21
+ AT_SYSTEMSTART = TASK_EVENT_TRIGGER_AT_SYSTEMSTART
22
+ AT_LOGON = TASK_EVENT_TRIGGER_AT_LOGON
23
+
24
+ TASK_SUNDAY = 0x1
25
+ TASK_MONDAY = 0x2
26
+ TASK_TUESDAY = 0x4
27
+ TASK_WEDNESDAY = 0x8
28
+ TASK_THURSDAY = 0x10
29
+ TASK_FRIDAY = 0x20
30
+ TASK_SATURDAY = 0x40
31
+ SUNDAY = TASK_SUNDAY
32
+ MONDAY = TASK_MONDAY
33
+ TUESDAY = TASK_TUESDAY
34
+ WEDNESDAY = TASK_WEDNESDAY
35
+ THURSDAY = TASK_THURSDAY
36
+ FRIDAY = TASK_FRIDAY
37
+ SATURDAY = TASK_SATURDAY
38
+
39
+ TASK_FIRST_WEEK = 1
40
+ TASK_SECOND_WEEK = 2
41
+ TASK_THIRD_WEEK = 3
42
+ TASK_FOURTH_WEEK = 4
43
+ TASK_LAST_WEEK = 5
44
+ FIRST_WEEK = TASK_FIRST_WEEK
45
+ SECOND_WEEK = TASK_SECOND_WEEK
46
+ THIRD_WEEK = TASK_THIRD_WEEK
47
+ FOURTH_WEEK = TASK_FOURTH_WEEK
48
+ LAST_WEEK = TASK_LAST_WEEK
49
+
50
+ TASK_JANUARY = 0x1
51
+ TASK_FEBRUARY = 0x2
52
+ TASK_MARCH = 0x4
53
+ TASK_APRIL = 0x8
54
+ TASK_MAY = 0x10
55
+ TASK_JUNE = 0x20
56
+ TASK_JULY = 0x40
57
+ TASK_AUGUST = 0x80
58
+ TASK_SEPTEMBER = 0x100
59
+ TASK_OCTOBER = 0x200
60
+ TASK_NOVEMBER = 0x400
61
+ TASK_DECEMBER = 0x800
62
+ JANUARY = TASK_JANUARY
63
+ FEBRUARY = TASK_FEBRUARY
64
+ MARCH = TASK_MARCH
65
+ APRIL = TASK_APRIL
66
+ MAY = TASK_MAY
67
+ JUNE = TASK_JUNE
68
+ JULY = TASK_JULY
69
+ AUGUST = TASK_AUGUST
70
+ SEPTEMBER = TASK_SEPTEMBER
71
+ OCTOBER = TASK_OCTOBER
72
+ NOVEMBER = TASK_NOVEMBER
73
+ DECEMBER = TASK_DECEMBER
74
+
75
+ TASK_FLAG_INTERACTIVE = 0x1
76
+ TASK_FLAG_DELETE_WHEN_DONE = 0x2
77
+ TASK_FLAG_DISABLED = 0x4
78
+ TASK_FLAG_START_ONLY_IF_IDLE = 0x10
79
+ TASK_FLAG_KILL_ON_IDLE_END = 0x20
80
+ TASK_FLAG_DONT_START_IF_ON_BATTERIES = 0x40
81
+ TASK_FLAG_KILL_IF_GOING_ON_BATTERIES = 0x80
82
+ TASK_FLAG_RUN_ONLY_IF_DOCKED = 0x100
83
+ TASK_FLAG_HIDDEN = 0x200
84
+ TASK_FLAG_RUN_IF_CONNECTED_TO_INTERNET = 0x400
85
+ TASK_FLAG_RESTART_ON_IDLE_RESUME = 0x800
86
+ TASK_FLAG_SYSTEM_REQUIRED = 0x1000
87
+ TASK_FLAG_RUN_ONLY_IF_LOGGED_ON = 0x2000
88
+ INTERACTIVE = TASK_FLAG_INTERACTIVE
89
+ DELETE_WHEN_DONE = TASK_FLAG_DELETE_WHEN_DONE
90
+ DISABLED = TASK_FLAG_DISABLED
91
+ START_ONLY_IF_IDLE = TASK_FLAG_START_ONLY_IF_IDLE
92
+ KILL_ON_IDLE_END = TASK_FLAG_KILL_ON_IDLE_END
93
+ DONT_START_IF_ON_BATTERIES = TASK_FLAG_DONT_START_IF_ON_BATTERIES
94
+ KILL_IF_GOING_ON_BATTERIES = TASK_FLAG_KILL_IF_GOING_ON_BATTERIES
95
+ RUN_ONLY_IF_DOCKED = TASK_FLAG_RUN_ONLY_IF_DOCKED
96
+ HIDDEN = TASK_FLAG_HIDDEN
97
+ RUN_IF_CONNECTED_TO_INTERNET = TASK_FLAG_RUN_IF_CONNECTED_TO_INTERNET
98
+ RESTART_ON_IDLE_RESUME = TASK_FLAG_RESTART_ON_IDLE_RESUME
99
+ SYSTEM_REQUIRED = TASK_FLAG_SYSTEM_REQUIRED
100
+ RUN_ONLY_IF_LOGGED_ON = TASK_FLAG_RUN_ONLY_IF_LOGGED_ON
101
+
102
+ TASK_TRIGGER_FLAG_HAS_END_DATE = 0x1
103
+ TASK_TRIGGER_FLAG_KILL_AT_DURATION_END = 0x2
104
+ TASK_TRIGGER_FLAG_DISABLED = 0x4
105
+ FLAG_HAS_END_DATE = TASK_TRIGGER_FLAG_HAS_END_DATE
106
+ FLAG_KILL_AT_DURATION_END = TASK_TRIGGER_FLAG_KILL_AT_DURATION_END
107
+ FLAG_DISABLED = TASK_TRIGGER_FLAG_DISABLED
108
+
109
+ TASK_MAX_RUN_TIMES = 1440
110
+ TASKS_TO_RETRIEVE = 5
111
+ MAX_RUN_TIMES = TASK_MAX_RUN_TIMES
112
+
113
+ TASK_VALIDATE_ONLY = 0x1
114
+ TASK_CREATE = 0x2
115
+ TASK_UPDATE = 0x4
116
+ TASK_CREATE_OR_UPDATE = 0x6
117
+ TASK_DISABLE = 0x8
118
+ TASK_DONT_ADD_PRINCIPAL_ACE = 0x10
119
+ TASK_IGNORE_REGISTRATION_TRIGGERS = 0x20
120
+
121
+ TASK_LOGON_NONE = 0
122
+ TASK_LOGON_PASSWORD = 1
123
+ TASK_LOGON_S4U = 2
124
+ TASK_LOGON_INTERACTIVE_TOKEN = 3
125
+ TASK_LOGON_GROUP = 4
126
+ TASK_LOGON_SERVICE_ACCOUNT = 5
127
+ TASK_LOGON_INTERACTIVE_TOKEN_OR_PASSWORD = 6
128
+
129
+ REALTIME_PRIORITY_CLASS = 0
130
+ HIGH_PRIORITY_CLASS = 1
131
+ ABOVE_NORMAL_PRIORITY_CLASS = 2
132
+ NORMAL_PRIORITY_CLASS = 4
133
+ BELOW_NORMAL_PRIORITY_CLASS = 7
134
+ IDLE_PRIORITY_CLASS = 9
135
+ REALTIME = REALTIME_PRIORITY_CLASS
136
+ HIGH = HIGH_PRIORITY_CLASS
137
+ ABOVE_NORMAL = ABOVE_NORMAL_PRIORITY_CLASS
138
+ NORMAL = NORMAL_PRIORITY_CLASS
139
+ BELOW_NORMAL = BELOW_NORMAL_PRIORITY_CLASS
140
+ IDLE = IDLE_PRIORITY_CLASS
141
+
142
+ CLSCTX_INPROC_SERVER = 0x1
143
+ CLSID_CTask = [0x148BD520,0xA2AB,0x11CE,0xB1,0x1F,0x00,0xAA,0x00,0x53,0x05,0x03].pack('LSSC8')
144
+ CLSID_CTaskScheduler = [0x148BD52A,0xA2AB,0x11CE,0xB1,0x1F,0x00,0xAA,0x00,0x53,0x05,0x03].pack('LSSC8')
145
+ IID_ITaskScheduler = [0x148BD527,0xA2AB,0x11CE,0xB1,0x1F,0x00,0xAA,0x00,0x53,0x05,0x03].pack('LSSC8')
146
+ IID_ITask = [0x148BD524,0xA2AB,0x11CE,0xB1,0x1F,0x00,0xAA,0x00,0x53,0x05,0x03].pack('LSSC8')
147
+ IID_IPersistFile = [0x0000010b,0x0000,0x0000,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46].pack('LSSC8')
148
+ end
149
+ end
150
+ end
151
+ end
152
+
153
+ begin
154
+ require 'win32/taskscheduler'
155
+ rescue LoadError
156
+ module Win32
157
+ TaskScheduler = RSpec::Puppet::Win32::TaskScheduler
158
+ end
159
+ end
@@ -109,7 +109,7 @@ END
109
109
  end
110
110
 
111
111
  def self.safe_mkdir(dir, verbose=true)
112
- if File.exists? dir
112
+ if File.exist? dir
113
113
  unless File.directory? dir
114
114
  $stderr.puts "!! #{dir} already exists and is not a directory"
115
115
  end
@@ -124,7 +124,7 @@ END
124
124
  end
125
125
 
126
126
  def self.safe_touch(file)
127
- if File.exists? file
127
+ if File.exist? file
128
128
  unless File.file? file
129
129
  $stderr.puts "!! #{file} already exists and is not a regular file"
130
130
  end
@@ -135,7 +135,7 @@ END
135
135
  end
136
136
 
137
137
  def self.safe_create_file(filename, content)
138
- if File.exists? filename
138
+ if File.exist? filename
139
139
  old_content = File.read(filename)
140
140
  if old_content != content
141
141
  $stderr.puts "!! #{filename} already exists and differs from template"
@@ -154,7 +154,7 @@ END
154
154
  end
155
155
 
156
156
  def self.safe_make_link(source, target, verbose=true)
157
- if File.exists?(target)
157
+ if File.exist?(target)
158
158
  unless File.symlink?(target) && File.readlink(target) == File.expand_path(source)
159
159
  $stderr.puts "!! #{target} already exists and is not a symlink"
160
160
  end
@@ -54,17 +54,29 @@ module RSpec::Puppet
54
54
 
55
55
  munged_facts = facts_hash(nodename(type))
56
56
 
57
- ['operatingsystem', 'osfamily'].each do |os_fact|
58
- if munged_facts.key?(os_fact)
59
- if munged_facts[os_fact].to_s.downcase == 'windows'
60
- RSpec::Puppet::Consts.stub_consts_for(:windows)
61
- else
62
- RSpec::Puppet::Consts.stub_consts_for(:posix)
63
- end
57
+ pretend_platform = find_pretend_platform(munged_facts)
58
+ RSpec::Puppet::Consts.stub_consts_for(pretend_platform) unless pretend_platform.nil?
59
+ end
60
+
61
+ def find_pretend_platform(test_facts)
62
+ from_value = lambda { |value|
63
+ value.to_s.downcase == 'windows' ? :windows : :posix
64
+ }
65
+
66
+ ['operatingsystem', 'osfamily', 'os'].each do |os_fact|
67
+ return from_value.call(test_facts[os_fact]) if test_facts.key?(os_fact)
68
+ end
69
+
70
+ if test_facts.key?('os') && test_facts['os'].is_a?(Hash)
71
+ ['name', 'family'].each do |os_hash_key|
72
+ return from_value.call(test_facts['os'][os_hash_key]) if test_facts['os'].key?(os_hash_key)
64
73
  end
65
74
  end
75
+
76
+ nil
66
77
  end
67
78
 
79
+
68
80
  def load_catalogue(type, exported = false, manifest_opts = {})
69
81
  with_vardir do
70
82
  node_name = nodename(type)
@@ -72,8 +84,10 @@ module RSpec::Puppet
72
84
  hiera_config_value = self.respond_to?(:hiera_config) ? hiera_config : nil
73
85
  hiera_data_value = self.respond_to?(:hiera_data) ? hiera_data : nil
74
86
 
75
- catalogue = build_catalog(node_name, facts_hash(node_name), trusted_facts_hash(node_name), hiera_config_value,
76
- build_code(type, manifest_opts), exported, node_params_hash, hiera_data_value)
87
+ build_facts = facts_hash(node_name)
88
+ catalogue = build_catalog(node_name, build_facts, trusted_facts_hash(node_name), hiera_config_value,
89
+ build_code(type, manifest_opts), exported, node_params_hash, hiera_data_value,
90
+ RSpec.configuration.trusted_server_facts)
77
91
 
78
92
  test_module = type == :host ? nil : class_name.split('::').first
79
93
  if type == :define
@@ -83,6 +97,9 @@ module RSpec::Puppet
83
97
  end
84
98
  RSpec::Puppet::Coverage.add_from_catalog(catalogue, test_module)
85
99
 
100
+ pretend_platform = find_pretend_platform(build_facts)
101
+ Puppet::Util::Platform.pretend_to_be(pretend_platform) unless pretend_platform.nil?
102
+
86
103
  catalogue
87
104
  end
88
105
  end
@@ -132,15 +149,15 @@ module RSpec::Puppet
132
149
  end
133
150
  elsif type == :application
134
151
  if opts.has_key?(:params)
135
- "site { #{class_name} { '#{title}': #{param_str(opts[:params])} } }"
152
+ "site { #{class_name} { #{sanitise_resource_title(title)}: #{param_str(opts[:params])} } }"
136
153
  else
137
154
  raise ArgumentError, "You need to provide params for an application"
138
155
  end
139
156
  elsif type == :define
140
157
  title_str = if title.is_a?(Array)
141
- '[' + title.map { |r| "'#{r}'" }.join(', ') + ']'
158
+ '[' + title.map { |r| sanitise_resource_title(r) }.join(', ') + ']'
142
159
  else
143
- "'#{title}'"
160
+ sanitise_resource_title(title)
144
161
  end
145
162
  if opts.has_key?(:params)
146
163
  "#{class_name} { #{title_str}: #{param_str(opts[:params])} }"
@@ -154,6 +171,10 @@ module RSpec::Puppet
154
171
  end
155
172
  end
156
173
 
174
+ def sanitise_resource_title(title)
175
+ title.include?("'") ? title.inspect : "'#{title}'"
176
+ end
177
+
157
178
  def nodename(type)
158
179
  return node if self.respond_to?(:node)
159
180
  if [:class, :define, :function, :application].include? type
@@ -264,6 +285,34 @@ module RSpec::Puppet
264
285
  extensions
265
286
  end
266
287
 
288
+ def server_facts_hash
289
+ server_facts = {}
290
+
291
+ # Add our server version to the fact list
292
+ server_facts["serverversion"] = Puppet.version.to_s
293
+
294
+ # And then add the server name and IP
295
+ {"servername" => "fqdn",
296
+ "serverip" => "ipaddress"
297
+ }.each do |var, fact|
298
+ if value = Facter.value(fact)
299
+ server_facts[var] = value
300
+ else
301
+ warn "Could not retrieve fact #{fact}"
302
+ end
303
+ end
304
+
305
+ if server_facts["servername"].nil?
306
+ host = Facter.value(:hostname)
307
+ if domain = Facter.value(:domain)
308
+ server_facts["servername"] = [host, domain].join(".")
309
+ else
310
+ server_facts["servername"] = host
311
+ end
312
+ end
313
+ server_facts
314
+ end
315
+
267
316
  def str_from_value(value)
268
317
  case value
269
318
  when Hash
@@ -337,6 +386,8 @@ module RSpec::Puppet
337
386
 
338
387
  stub_facts! facts_val
339
388
 
389
+ Puppet::Type.eachtype { |type| type.defaultprovider = nil }
390
+
340
391
  node_facts = Puppet::Node::Facts.new(nodename, facts_val.dup)
341
392
  node_params = facts_val.merge(node_params)
342
393
 
@@ -351,26 +402,20 @@ module RSpec::Puppet
351
402
  )
352
403
  end
353
404
 
405
+ if Puppet::Util::Package.versioncmp(Puppet.version, '4.3.0') >= 0
406
+ node_obj.add_server_facts(server_facts_hash)
407
+ end
408
+
354
409
  adapter.catalog(node_obj, exported)
355
410
  end
356
411
 
357
412
  def stub_facts!(facts)
358
413
  Puppet.settings[:autosign] = false
414
+ Facter.clear
359
415
  facts.each { |k, v| Facter.add(k) { setcode { v } } }
360
416
  end
361
417
 
362
418
  def build_catalog(*args)
363
- build_facts = args[1]
364
- ['operatingsystem', 'osfamily'].each do |os_fact|
365
- if build_facts.key?(os_fact)
366
- if build_facts[os_fact].to_s.downcase == 'windows'
367
- Puppet::Util::Platform.pretend_to_be :windows
368
- else
369
- Puppet::Util::Platform.pretend_to_be :posix
370
- end
371
- end
372
- end
373
-
374
419
  @@cache.get(*args) do |*args|
375
420
  build_catalog_without_cache(*args)
376
421
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rspec-puppet
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.6.9
4
+ version: 2.6.10
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tim Sharpe
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-09-12 00:00:00.000000000 Z
11
+ date: 2018-03-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec
@@ -60,6 +60,8 @@ files:
60
60
  - lib/rspec-puppet/matchers/run.rb
61
61
  - lib/rspec-puppet/matchers/type_matchers.rb
62
62
  - lib/rspec-puppet/monkey_patches.rb
63
+ - lib/rspec-puppet/monkey_patches/win32/registry.rb
64
+ - lib/rspec-puppet/monkey_patches/win32/taskscheduler.rb
63
65
  - lib/rspec-puppet/rake_task.rb
64
66
  - lib/rspec-puppet/raw_string.rb
65
67
  - lib/rspec-puppet/setup.rb
@@ -86,7 +88,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
86
88
  version: '0'
87
89
  requirements: []
88
90
  rubyforge_project:
89
- rubygems_version: 2.6.11
91
+ rubygems_version: 2.6.13
90
92
  signing_key:
91
93
  specification_version: 4
92
94
  summary: RSpec tests for your Puppet manifests