inspec 0.22.1 → 0.23

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: 4b5f2bef15c7f0f158ae2491912c6d61cb0b55f6
4
- data.tar.gz: 1f27bbc177e50b663f76d4a48cfb87c8bd513bfe
3
+ metadata.gz: 8531472157b9bbcf1f5cfae47afb58e26768955d
4
+ data.tar.gz: e11d0a1081f017dedb9a5c207790d6c599286058
5
5
  SHA512:
6
- metadata.gz: 4c07f9a7e558f6e3491b348179d7f867e04d723b5ec5fc40c60293d0b1f61e39e17c52f607c1856c8c1258f344084b10f5452c3569b41205d8c4bf37e2149130
7
- data.tar.gz: b3d4af5f18744254ff7f88ae755c438e04c62b93b5fc7eefb4d7475e99bc11e16d3216453496d4464334ff6fbce0ef6aec5cb86a3b2979f8367255cceba8f780
6
+ metadata.gz: ba616285cc0d78bd09a257367933ec1b16ce53c4ef8db770cf5a8a3885ff7fd885589d1b568982bfa0d5fe76d30cacebece6f40622a9e6d66e116759b608b0ad
7
+ data.tar.gz: 91e3dfc02e260cef1c4d0b518717b40c6068b225748bb8a26f263a709cfd4ea9d60ec5d9e52fcd11e608a31dafe389888ab94cb15ff3838edaef6030693364cd
@@ -1,7 +1,26 @@
1
1
  # Change Log
2
2
 
3
- ## [0.22.1](https://github.com/chef/inspec/tree/0.22.1) (2016-05-18)
4
- [Full Changelog](https://github.com/chef/inspec/compare/v0.22.0...0.22.1)
3
+ ## [0.23](https://github.com/chef/inspec/tree/0.23) (2016-05-31)
4
+ [Full Changelog](https://github.com/chef/inspec/compare/v0.22.1...0.23)
5
+
6
+ **Implemented enhancements:**
7
+
8
+ - connect `port` and filter table [\#776](https://github.com/chef/inspec/pull/776) ([arlimus](https://github.com/arlimus))
9
+ - add resource to filter table blocks [\#775](https://github.com/chef/inspec/pull/775) ([arlimus](https://github.com/arlimus))
10
+ - add helper methods for os resource [\#774](https://github.com/chef/inspec/pull/774) ([chris-rock](https://github.com/chris-rock))
11
+
12
+ **Closed issues:**
13
+
14
+ - inspec hangs on command\('ausearch -k docker'\).stdout [\#768](https://github.com/chef/inspec/issues/768)
15
+ - registry\_key test failing on Windows 2008 R2 [\#767](https://github.com/chef/inspec/issues/767)
16
+ - InSpec login successful with wrong username [\#766](https://github.com/chef/inspec/issues/766)
17
+
18
+ **Merged pull requests:**
19
+
20
+ - update readme with blogs [\#769](https://github.com/chef/inspec/pull/769) ([chris-rock](https://github.com/chris-rock))
21
+
22
+ ## [v0.22.1](https://github.com/chef/inspec/tree/v0.22.1) (2016-05-18)
23
+ [Full Changelog](https://github.com/chef/inspec/compare/v0.22.0...v0.22.1)
5
24
 
6
25
  **Fixed bugs:**
7
26
 
data/README.md CHANGED
@@ -210,7 +210,26 @@ Which will provide you with:
210
210
 
211
211
  ## Documentation
212
212
 
213
- Documentation is available: https://github.com/chef/inspec/tree/master/docs
213
+ Documentation
214
+
215
+ * https://github.com/chef/inspec/tree/master/docs
216
+
217
+ Blogs:
218
+
219
+ * [The Road to InSpec](https://www.chef.io/blog/2015/11/04/the-road-to-inspec/)
220
+ * [Introduction to InSpec](http://tfitch.com/automation-tools-bootcamp/inspec.html)
221
+ * [InSpec Tutorial: Day 1 - Hello World](http://www.anniehedgie.com/inspec-basics-1)
222
+ * [InSpec Tutorial: Day 2 - Command Resource Blog Logo](http://www.anniehedgie.com/inspec-basics-2)
223
+ * [InSpec Tutorial: Day 3 - File Resource](http://www.anniehedgie.com/inspec-basics-3)
224
+ * [InSpec Tutorial: Day 4 - Custom Matchers](http://www.anniehedgie.com/inspec-basics-4)
225
+ * [Windows infrastructure testing using InSpec – Part I](http://datatomix.com/?p=236)
226
+ * [Windows infrastructure testing using InSpec and Profiles – Part II](http://datatomix.com/?p=238)
227
+ * [Testing Ansible with Inspec](http://scienceofficersblog.blogspot.de/2016/02/testing-ansible-with-inspec.html)
228
+
229
+ Podcasts:
230
+
231
+ * [InSpec Foodfight](http://foodfightshow.org/2016/02/inspec.html)
232
+ * [Test Driven Infrastructure With Arthur Maltson And Michael Goetz](https://www.arresteddevops.com/tdi/)
214
233
 
215
234
  ## Share your Profiles
216
235
 
@@ -3,5 +3,5 @@
3
3
  # author: Christoph Hartmann
4
4
 
5
5
  module Inspec
6
- VERSION = '0.22.1'.freeze
6
+ VERSION = '0.23'.freeze
7
7
  end
@@ -7,9 +7,17 @@ module Inspec::Resources
7
7
  name 'os'
8
8
  desc 'Use the os InSpec audit resource to test the platform on which the system is running.'
9
9
  example "
10
- describe os[:family] do
10
+ describe os.family do
11
11
  it { should eq 'redhat' }
12
12
  end
13
+
14
+ describe os.redhat? do
15
+ it { should eq true }
16
+ end
17
+
18
+ describe os.linux? do
19
+ it { should eq true }
20
+ end
13
21
  "
14
22
 
15
23
  # reuse helper methods from backend
@@ -25,6 +33,15 @@ module Inspec::Resources
25
33
  inspec.backend.os[name]
26
34
  end
27
35
 
36
+ # add helper methods for easy access of properties
37
+ # allows users to use os.name, os.family, os.release, os.arch
38
+ %w{name family release arch}.each do |property|
39
+ define_method(property.to_sym) do
40
+ inspec.backend.os[property.to_sym]
41
+ end
42
+ end
43
+
44
+ # helper to collect a hash object easily
28
45
  def params
29
46
  {
30
47
  name: inspec.backend.os[:name],
@@ -3,6 +3,8 @@
3
3
  # author: Dominik Richter
4
4
 
5
5
  require 'utils/parser'
6
+ require 'utils/filter'
7
+
6
8
  # Usage:
7
9
  # describe port(80) do
8
10
  # it { should be_listening }
@@ -25,11 +27,17 @@ module Inspec::Resources
25
27
  it { should be_listening }
26
28
  its('protocols') {should eq ['tcp']}
27
29
  end
30
+
31
+ describe port.where { protocol =~ /tcp/ && port > 80 } do
32
+ it { should_not be_listening }
33
+ end
28
34
  "
29
35
 
30
- def initialize(ip = nil, port) # rubocop:disable OptionalArguments
31
- @ip = ip
32
- @port = port
36
+ def initialize(*args)
37
+ args.unshift(nil) if args.length <= 1 # add the ip address to the front
38
+ @ip = args[0]
39
+ @port = args[1]
40
+
33
41
  @port_manager = nil
34
42
  @cache = nil
35
43
  os = inspec.os
@@ -53,32 +61,19 @@ module Inspec::Resources
53
61
  end
54
62
  end
55
63
 
56
- def listening?(_protocol = nil, _local_address = nil)
57
- info.size > 0
58
- end
59
-
60
- def protocols
61
- res = info.map { |x| x[:protocol] }.uniq.compact
62
- res.size > 0 ? res : []
63
- end
64
-
65
- def processes
66
- res = info.map { |x| x[:process] }.uniq.compact
67
- res.size > 0 ? res : []
68
- end
69
-
70
- def addresses
71
- res = info.map { |x| x[:address] }.uniq.compact
72
- res.size > 0 ? res : []
73
- end
74
-
75
- def pids
76
- res = info.map { |x| x[:pid] }.uniq.compact
77
- res.size > 0 ? res : []
78
- end
64
+ filter = FilterTable.create
65
+ filter.add_accessor(:where)
66
+ .add_accessor(:entries)
67
+ .add(:ports, field: 'port', style: :simple)
68
+ .add(:addresses, field: 'address', style: :simple)
69
+ .add(:protocols, field: 'protocol', style: :simple)
70
+ .add(:processes, field: 'process', style: :simple)
71
+ .add(:pids, field: 'pid', style: :simple)
72
+ .add(:listening?) { |x| x.entries.length > 0 }
73
+ filter.connect(self, :info)
79
74
 
80
75
  def to_s
81
- "Port #{@port}"
76
+ "Port #{@port}"
82
77
  end
83
78
 
84
79
  private
@@ -88,22 +83,24 @@ module Inspec::Resources
88
83
  # abort if os detection has not worked
89
84
  return @cache = [] if @port_manager.nil?
90
85
  # query ports
91
- ports = @port_manager.info || []
92
- @cache = ports.select { |p| p[:port] == @port && (!@ip || p[:address] == @ip) }
86
+ cache = @port_manager.info || []
87
+ cache.select! { |x| x['port'] == @port } unless @port.nil?
88
+ cache.select! { |x| x['address'] == @ip } unless @ip.nil?
89
+ @cache = cache
93
90
  end
94
91
  end
95
92
 
96
93
  # implements an info method and returns all ip adresses and protocols for
97
94
  # each port
98
95
  # [{
99
- # port: 22,
100
- # address: '0.0.0.0'
101
- # protocol: 'tcp'
96
+ # 'port' => 22,
97
+ # 'address' => '0.0.0.0'
98
+ # 'protocol' => 'tcp'
102
99
  # },
103
100
  # {
104
- # port: 22,
105
- # address: '::'
106
- # protocol: 'tcp6'
101
+ # 'port' => 22,
102
+ # 'address' => '::'
103
+ # 'protocol' => 'tcp6'
107
104
  # }]
108
105
  class PortsInfo
109
106
  attr_reader :inspec
@@ -132,11 +129,9 @@ module Inspec::Resources
132
129
 
133
130
  ports.map { |x|
134
131
  {
135
- port: x['LocalPort'],
136
- address: x['LocalAddress'],
137
- protocol: 'tcp',
138
- process: nil,
139
- pid: nil,
132
+ 'port' => x['LocalPort'],
133
+ 'address' => x['LocalAddress'],
134
+ 'protocol' => 'tcp',
140
135
  }
141
136
  }
142
137
  end
@@ -168,11 +163,11 @@ module Inspec::Resources
168
163
  port_ids.each do |port_str|
169
164
  # should not break on ipv6 addresses
170
165
  ipv, proto, port, host = port_str.split(':', 4)
171
- ports.push({ port: port.to_i,
172
- address: host,
173
- protocol: ipv == 'ipv6' ? proto + '6' : proto,
174
- process: cmd,
175
- pid: pid.to_i })
166
+ ports.push({ 'port' => port.to_i,
167
+ 'address' => host,
168
+ 'protocol' => ipv == 'ipv6' ? proto + '6' : proto,
169
+ 'process' => cmd,
170
+ 'pid' => pid.to_i })
176
171
  end
177
172
  end
178
173
 
@@ -260,7 +255,7 @@ module Inspec::Resources
260
255
  port_info = parse_netstat_line(line)
261
256
 
262
257
  # only push protocols we are interested in
263
- next unless %w{tcp tcp6 udp udp6}.include?(port_info[:protocol])
258
+ next unless %w{tcp tcp6 udp udp6}.include?(port_info['protocol'])
264
259
  ports.push(port_info)
265
260
  end
266
261
  ports
@@ -310,13 +305,12 @@ module Inspec::Resources
310
305
  pid = pid.to_i if pid =~ /^\d+$/
311
306
  process = process[1]
312
307
 
313
- # map data
314
308
  {
315
- port: port,
316
- address: host,
317
- protocol: protocol,
318
- process: process,
319
- pid: pid,
309
+ 'port' => port,
310
+ 'address' => host,
311
+ 'protocol' => protocol,
312
+ 'process' => process,
313
+ 'pid' => pid,
320
314
  }
321
315
  end
322
316
  end
@@ -333,7 +327,7 @@ module Inspec::Resources
333
327
  port_info = parse_sockstat_line(line)
334
328
 
335
329
  # push data, if not headerfile
336
- next unless %w{tcp tcp6 udp udp6}.include?(port_info[:protocol])
330
+ next unless %w{tcp tcp6 udp udp6}.include?(port_info['protocol'])
337
331
  ports.push(port_info)
338
332
  end
339
333
  ports
@@ -386,13 +380,12 @@ module Inspec::Resources
386
380
  protocol = 'tcp' if protocol.eql?('tcp4')
387
381
  protocol = 'udp' if protocol.eql?('udp4')
388
382
 
389
- # map data
390
383
  {
391
- port: port,
392
- address: host,
393
- protocol: protocol,
394
- process: process,
395
- pid: pid,
384
+ 'port' => port,
385
+ 'address' => host,
386
+ 'protocol' => protocol,
387
+ 'process' => process,
388
+ 'pid' => pid,
396
389
  }
397
390
  end
398
391
  end
@@ -423,11 +416,9 @@ module Inspec::Resources
423
416
  local_addr[local_addr.rindex('.')] = ':'
424
417
  host, port = parse_net_address(local_addr, protocol)
425
418
  {
426
- port: port,
427
- address: host,
428
- protocol: protocol,
429
- process: nil, # we do not have pid on solaris
430
- pid: nil, # we do not have pid on solaris
419
+ 'port' => port,
420
+ 'address' => host,
421
+ 'protocol' => protocol,
431
422
  }
432
423
  }
433
424
  ports
@@ -447,11 +438,11 @@ module Inspec::Resources
447
438
  # parse all lines
448
439
  cmd.each_line do |line|
449
440
  port_info = parse_netstat_line(line)
450
- next unless %w{tcp tcp6 udp udp6}.include?(port_info[:protocol])
441
+ next unless %w{tcp tcp6 udp udp6}.include?(port_info['protocol'])
451
442
  ports.push(port_info)
452
443
  end
453
444
  # select all ports, where we `listen`
454
- ports.select { |val| val if 'listen'.casecmp(val[:state]) == 0 }
445
+ ports.select { |val| val if 'listen'.casecmp(val['state']) == 0 }
455
446
  end
456
447
 
457
448
  def parse_netstat_line(line)
@@ -468,12 +459,10 @@ module Inspec::Resources
468
459
  host, port = parse_net_address(local_addr, protocol)
469
460
  # map data
470
461
  {
471
- port: port,
472
- address: host,
473
- protocol: protocol,
474
- state: state,
475
- process: nil,
476
- pid: nil,
462
+ 'port' => port,
463
+ 'address' => host,
464
+ 'protocol' => protocol,
465
+ 'state' => state,
477
466
  }
478
467
  end
479
468
  end
@@ -40,7 +40,7 @@ module FilterTable
40
40
  end
41
41
 
42
42
  class Table
43
- attr_reader :params
43
+ attr_reader :params, :resource
44
44
  def initialize(resource, params, filters)
45
45
  @resource = resource
46
46
  @params = params
@@ -81,10 +81,10 @@ module FilterTable
81
81
  end
82
82
  end
83
83
 
84
- def get_fields(*fields)
84
+ def get_field(field)
85
85
  @params.map do |line|
86
- fields.map { |f| line[f] }
87
- end.flatten
86
+ line[field]
87
+ end
88
88
  end
89
89
 
90
90
  def to_s
@@ -132,17 +132,20 @@ module FilterTable
132
132
  end
133
133
 
134
134
  class Factory
135
+ Connector = Struct.new(:field_name, :block, :opts)
136
+
135
137
  def initialize
136
138
  @accessors = []
137
- @fields = {}
138
- @blocks = {}
139
+ @connectors = {}
139
140
  end
140
141
 
141
- def connect(resource, table_accessor) # rubocop:disable Metrics/AbcSize
142
+ def connect(resource, table_accessor)
142
143
  # create the table structure
143
- fields = @fields
144
- blocks = @blocks
145
- struct_fields = fields.values
144
+ connectors = @connectors
145
+ struct_fields = connectors.values.map(&:field_name)
146
+ connector_blocks = connectors.map do |method, c|
147
+ [method.to_sym, create_connector(c)]
148
+ end
146
149
 
147
150
  # the struct to hold single items from the #entries method
148
151
  entry_struct = Struct.new(*struct_fields.map(&:to_sym)) do
@@ -154,13 +157,8 @@ module FilterTable
154
157
 
155
158
  # the main filter table
156
159
  table = Class.new(Table) {
157
- fields.each do |method, field_name|
158
- block = blocks[method]
159
- define_method method.to_sym do |condition = Show, &cond_block|
160
- return block.call(self, condition) unless block.nil?
161
- return where(nil).get_fields(field_name) if condition == Show && !block_given?
162
- where({ field_name => condition }, &cond_block)
163
- end
160
+ connector_blocks.each do |x|
161
+ define_method x[0], &x[1]
164
162
  end
165
163
 
166
164
  define_method :new_entry do |hashmap, filter = ''|
@@ -172,7 +170,7 @@ module FilterTable
172
170
  }
173
171
 
174
172
  # define all access methods with the parent resource
175
- accessors = @accessors + @fields.keys
173
+ accessors = @accessors + @connectors.keys
176
174
  accessors.each do |method_name|
177
175
  resource.send(:define_method, method_name.to_sym) do |*args, &block|
178
176
  filter = table.new(self, method(table_accessor).call, ' with')
@@ -194,11 +192,26 @@ module FilterTable
194
192
  throw RuntimeError, "Called filter.add for resource #{@resource} with method name nil!"
195
193
  end
196
194
 
197
- field_name = opts[:field] || method_name
198
- @fields[method_name.to_sym] = field_name
199
- @blocks[method_name.to_sym] = block
195
+ @connectors[method_name.to_sym] =
196
+ Connector.new(opts[:field] || method_name, block, opts)
200
197
  self
201
198
  end
199
+
200
+ private
201
+
202
+ def create_connector(c)
203
+ return ->(cond = Show) { c.block.call(self, cond) } if !c.block.nil?
204
+
205
+ lambda { |condition = Show, &cond_block|
206
+ if condition == Show && !block_given?
207
+ r = where(nil).get_field(c.field_name)
208
+ r = r.flatten.uniq.compact if c.opts[:style] == :simple
209
+ r
210
+ else
211
+ where({ c.field_name => condition }, &cond_block)
212
+ end
213
+ }
214
+ end
202
215
  end
203
216
 
204
217
  def self.create
@@ -51,7 +51,7 @@ class MockLoader
51
51
  ubuntu1204: { family: 'ubuntu', release: '12.04', arch: 'x86_64' },
52
52
  ubuntu1404: { family: 'ubuntu', release: '14.04', arch: 'x86_64' },
53
53
  ubuntu1504: { family: 'ubuntu', release: '15.04', arch: 'x86_64' },
54
- windows: { family: 'windows', release: nil, arch: nil },
54
+ windows: { family: 'windows', release: '6.2.9200', arch: 'x86_64' },
55
55
  wrlinux: { family: 'wrlinux', release: '7.0(3)I2(2)', arch: 'x86_64' },
56
56
  solaris11: { family: "solaris", release: '11', arch: 'i386'},
57
57
  solaris10: { family: "solaris", release: '10', arch: 'i386'},
@@ -0,0 +1,40 @@
1
+ # encoding: utf-8
2
+ # author: Christoph Hartmann
3
+ # author: Dominik Richter
4
+
5
+ require 'helper'
6
+ require 'inspec/resource'
7
+
8
+ describe 'Inspec::Resources::Os' do
9
+ it 'verify os parsing on CentOS' do
10
+ resource = MockLoader.new(:centos7).load_resource('os')
11
+ _(resource.name).must_equal nil
12
+ _(resource.family).must_equal 'redhat'
13
+ _(resource.release).must_equal '7.1.1503'
14
+ _(resource.arch).must_equal 'x86_64'
15
+ end
16
+
17
+ it 'read env variable on Windows' do
18
+ resource = MockLoader.new(:windows).load_resource('os')
19
+ _(resource.name).must_equal nil
20
+ _(resource.family).must_equal 'windows'
21
+ _(resource.release).must_equal '6.2.9200'
22
+ _(resource.arch).must_equal 'x86_64'
23
+ end
24
+
25
+ it 'verify os parsing on Debian' do
26
+ resource = MockLoader.new(:debian8).load_resource('os')
27
+ _(resource.name).must_equal nil
28
+ _(resource.family).must_equal 'debian'
29
+ _(resource.release).must_equal '8'
30
+ _(resource.arch).must_equal 'x86_64'
31
+ end
32
+
33
+ it 'verify os parsing on Ubuntu' do
34
+ resource = MockLoader.new(:ubuntu1504).load_resource('os')
35
+ _(resource.name).must_equal nil
36
+ _(resource.family).must_equal 'ubuntu'
37
+ _(resource.release).must_equal '15.04'
38
+ _(resource.arch).must_equal 'x86_64'
39
+ end
40
+ end
@@ -15,6 +15,26 @@ describe 'Inspec::Resources::Port' do
15
15
  _(resource.addresses).must_equal ["0.0.0.0", "::"]
16
16
  end
17
17
 
18
+ it 'lists all ports' do
19
+ resource = MockLoader.new(:ubuntu1404).load_resource('port')
20
+ _(resource.entries.length).must_equal 4
21
+ _(resource.listening?).must_equal true
22
+ _(resource.protocols).must_equal %w{ tcp tcp6 udp }
23
+ _(resource.pids).must_equal [1, 2043, 545]
24
+ _(resource.processes).must_equal ['sshd', 'pidgin', 'rpcbind']
25
+ _(resource.addresses).must_equal ['0.0.0.0', '::']
26
+ end
27
+
28
+ it 'filter ports by conditions' do
29
+ resource = MockLoader.new(:ubuntu1404).load_resource('port').where { protocol =~ /udp/i }
30
+ _(resource.entries.length).must_equal 1
31
+ _(resource.listening?).must_equal true
32
+ _(resource.protocols).must_equal ['udp']
33
+ _(resource.pids).must_equal [545]
34
+ _(resource.processes).must_equal ['rpcbind']
35
+ _(resource.addresses).must_equal ['0.0.0.0']
36
+ end
37
+
18
38
  it 'verify UDP port on Ubuntu 14.04' do
19
39
  resource = MockLoader.new(:ubuntu1404).load_resource('port', 111)
20
40
  _(resource.listening?).must_equal true
@@ -28,6 +28,13 @@ describe FilterTable do
28
28
  factory.must_be_kind_of FilterTable::Factory
29
29
  end
30
30
 
31
+ it 'retrieves the resource from all entries' do
32
+ factory.add_accessor(:where)
33
+ .add(:baz?) { |x| x.resource }
34
+ .connect(resource, :data)
35
+ instance.baz?.must_equal instance
36
+ end
37
+
31
38
  describe 'when calling add_accessor' do
32
39
  it 'is chainable' do
33
40
  factory.add_accessor(:sth).must_equal factory
@@ -62,6 +69,19 @@ describe FilterTable do
62
69
  factory.add(:baz).connect(resource, :data)
63
70
  instance.baz(123).must_be_kind_of(FilterTable::Table)
64
71
  end
72
+
73
+ it 'retrieves all entries' do
74
+ factory.add(:foo).connect(resource, :data)
75
+ instance.foo.must_equal([3, 2, 2])
76
+ end
77
+
78
+ it 'retrieves entries with simple style' do
79
+ factory.add(:foo, style: :simple)
80
+ .add(:num, style: :simple)
81
+ .connect(resource, :data)
82
+ instance.foo.must_equal([3, 2])
83
+ instance.num.must_equal([1, 2])
84
+ end
65
85
  end
66
86
 
67
87
  describe 'when calling entries' do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: inspec
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.22.1
4
+ version: '0.23'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dominik Richter
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-05-18 00:00:00.000000000 Z
11
+ date: 2016-05-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: r-train
@@ -591,6 +591,7 @@ files:
591
591
  - test/unit/resources/ntp_conf_test.rb
592
592
  - test/unit/resources/oneget_test.rb
593
593
  - test/unit/resources/os_env_test.rb
594
+ - test/unit/resources/os_test.rb
594
595
  - test/unit/resources/package_test.rb
595
596
  - test/unit/resources/passwd_test.rb
596
597
  - test/unit/resources/pip_test.rb
@@ -868,6 +869,7 @@ test_files:
868
869
  - test/unit/resources/ntp_conf_test.rb
869
870
  - test/unit/resources/oneget_test.rb
870
871
  - test/unit/resources/os_env_test.rb
872
+ - test/unit/resources/os_test.rb
871
873
  - test/unit/resources/package_test.rb
872
874
  - test/unit/resources/passwd_test.rb
873
875
  - test/unit/resources/pip_test.rb