minitest-chef-handler 0.6.9 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (41) hide show
  1. data/.gitignore +1 -1
  2. data/.travis.yml +4 -0
  3. data/Appraisals +7 -0
  4. data/Berksfile +4 -0
  5. data/Gemfile +3 -0
  6. data/History.txt +6 -0
  7. data/README.md +23 -17
  8. data/Rakefile +7 -3
  9. data/Vagrantfile +17 -4
  10. data/examples/spec_examples/files/default/tests/minitest/{example_test.rb → default_test.rb} +15 -21
  11. data/examples/spec_examples/metadata.rb +1 -0
  12. data/gemfiles/chef_10.gemfile +8 -0
  13. data/gemfiles/chef_11.gemfile +8 -0
  14. data/lib/minitest-chef-handler/assertions.rb +41 -0
  15. data/lib/minitest-chef-handler/ci_runner.rb +1 -0
  16. data/lib/minitest-chef-handler/resources.rb +10 -4
  17. data/minitest-chef-handler.gemspec +8 -3
  18. data/spec/minitest-chef-handler/assertions_spec.rb +158 -4
  19. data/spec/minitest-chef-handler/resources_spec.rb +25 -4
  20. data/spec/spec_helper.rb +7 -3
  21. metadata +95 -23
  22. data/examples/chef-handler-cookbook/cookbooks/chef_handler/README.md +0 -115
  23. data/examples/chef-handler-cookbook/cookbooks/chef_handler/attributes/default.rb +0 -21
  24. data/examples/chef-handler-cookbook/cookbooks/chef_handler/files/default/handlers/README +0 -1
  25. data/examples/chef-handler-cookbook/cookbooks/chef_handler/metadata.json +0 -29
  26. data/examples/chef-handler-cookbook/cookbooks/chef_handler/metadata.rb +0 -6
  27. data/examples/chef-handler-cookbook/cookbooks/chef_handler/providers/default.rb +0 -83
  28. data/examples/chef-handler-cookbook/cookbooks/chef_handler/recipes/default.rb +0 -31
  29. data/examples/chef-handler-cookbook/cookbooks/chef_handler/recipes/json_file.rb +0 -28
  30. data/examples/chef-handler-cookbook/cookbooks/chef_handler/recipes/minitest.rb +0 -24
  31. data/examples/chef-handler-cookbook/cookbooks/chef_handler/resources/default.rb +0 -34
  32. data/examples/simple-solo/cookbooks/foo/recipes/default.rb +0 -1
  33. data/examples/simple-solo/cookbooks/foo/test/test_foo.rb +0 -9
  34. data/examples/simple-solo/dna.json +0 -3
  35. data/examples/simple-solo/solo.rb +0 -10
  36. data/examples/simple-solo/spec/foo_spec.rb +0 -9
  37. data/examples/simple-solo/test/test_foo.rb +0 -9
  38. data/gemfile_chef_10 +0 -3
  39. data/gemfile_chef_11 +0 -4
  40. data/script/bootstrap +0 -11
  41. data/script/test +0 -28
data/.gitignore CHANGED
@@ -3,7 +3,7 @@
3
3
  .bundle
4
4
  .config
5
5
  .yardoc
6
- Gemfile.lock
6
+ *.lock
7
7
  InstalledFiles
8
8
  _yardoc
9
9
  coverage
data/.travis.yml ADDED
@@ -0,0 +1,4 @@
1
+ rvm:
2
+ - 1.8.7
3
+ - 1.9.3
4
+ - 2.0
data/Appraisals ADDED
@@ -0,0 +1,7 @@
1
+ appraise "chef-10" do
2
+ gem "chef", "~> 10.0"
3
+ end
4
+
5
+ appraise "chef-11" do
6
+ gem "chef", "~> 11.0"
7
+ end
data/Berksfile ADDED
@@ -0,0 +1,4 @@
1
+ site :opscode
2
+
3
+ cookbook "minitest-handler", ">= 0.1.3"
4
+ cookbook "spec_examples", :path => "./examples/spec_examples"
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source "https://rubygems.org"
2
+ gemspec
3
+ gem "vagrant", ">= 1.1", :git => "git://github.com/mitchellh/vagrant.git", :ref => "11ad0392758b6b3f4b8a44332c66a79e94cef1eb" # current master has some network issues ...
data/History.txt CHANGED
@@ -1,3 +1,9 @@
1
+ === 1.0.0 / 03-29-2013
2
+
3
+ * 1 new feature:
4
+
5
+ * More assertions.
6
+
1
7
  === 0.6.9 / 03-23-2013
2
8
 
3
9
  * 1 bug fix:
data/README.md CHANGED
@@ -2,15 +2,17 @@
2
2
 
3
3
  Run minitest suites after your Chef recipes to check the status of your system.
4
4
 
5
+ [![Build Status](https://travis-ci.org/calavera/minitest-chef-handler.png)](https://travis-ci.org/calavera/minitest-chef-handler)
6
+
5
7
  # Installation
6
8
 
7
- ```
8
- $ gem install minitest-chef-handler
9
+ ```Bash
10
+ gem install minitest-chef-handler
9
11
  ```
10
12
 
11
13
  ## Usage
12
14
 
13
- Add the report handler to your client.rb or solo.rb file:
15
+ Option 1: Add the report handler to your client.rb or solo.rb file:
14
16
 
15
17
  ```ruby
16
18
  require 'minitest-chef-handler'
@@ -18,6 +20,15 @@ require 'minitest-chef-handler'
18
20
  report_handlers << MiniTest::Chef::Handler.new
19
21
  ```
20
22
 
23
+ Options 2: Using [minitest-handler](https://github.com/btm/minitest-handler-cookbook)
24
+ ```Ruby
25
+ # Vagrantfile
26
+ chef.run_list = [
27
+ "your-recipes",
28
+ "minitest-handler"
29
+ ]
30
+ ```
31
+
21
32
  ### Test cases
22
33
 
23
34
  Write your tests as normal MiniTest cases extending from MiniTest::Chef::TestCase:
@@ -87,7 +98,12 @@ can also make assertions like these:
87
98
  file("/etc/fstab").must_have(:mode, "644")
88
99
  package("less").must_be_installed
89
100
  service("chef-client").must_be_running
101
+ assert_directory "/etc", "root", "root", "755"
102
+ assert_file "/etc/fstab", "root", "root", "644"
103
+ assert_sh "ls /etc"
104
+ assert_logrotate "/etc/logrotate.d/mysql"
90
105
  ```
106
+ and [many more](lib/minitest-chef-handler/assertions.rb)
91
107
 
92
108
  The resources supported are: `cron`, `directory`, `file`, `group`, `ifconfig`,
93
109
  `link`, `mount`, `package`, `service` and `user`.
@@ -156,20 +172,10 @@ The instructions above have described how to use it in a Chef solo installation.
156
172
 
157
173
  ## Development
158
174
 
159
- Minitest-chef-handler should work with versions 10.x and versions 11.x of Chef.
160
-
161
- There are just two commands that you need to know to hack on this library.
162
-
163
- 1. Load both versions of Chef dependencies:
164
-
165
- ```
166
- $ script/bootstrap
167
- ```
168
-
169
- 2. Run unit and integration tests agains both versions of Chef:
170
-
171
- ```
172
- $ script/test
175
+ ```Ruby
176
+ bundle
177
+ bundle exec rake # unit tests
178
+ bundle exec vagrant up # integration tests (install virtualbox first and vagrant destroy -f afterwards to clean up)
173
179
  ```
174
180
 
175
181
  ## Copyright
data/Rakefile CHANGED
@@ -1,8 +1,12 @@
1
- #!/usr/bin/env rake
1
+ require "bundler/setup"
2
2
  require "bundler/gem_tasks"
3
3
  require "rake/testtask"
4
+ require "appraisal"
4
5
 
5
- Rake::TestTask.new do |t|
6
- t.name = 'spec'
6
+ Rake::TestTask.new(:spec) do |t|
7
7
  t.pattern = 'spec/**/*_spec.rb'
8
8
  end
9
+
10
+ task :default do
11
+ sh "rake appraisal:install && rake appraisal spec"
12
+ end
data/Vagrantfile CHANGED
@@ -1,8 +1,21 @@
1
+ require "berkshelf/vagrant"
2
+
3
+ unless ARGV[0] == "destroy"
4
+ # use current files, not the released gem from rubygems
5
+ result = `rake build`
6
+ raise "BUILD FAILED: #{result}" unless $?.success?
7
+ package = result[%r{pkg/.*}].sub(/\.$/,"")
8
+ end
9
+
1
10
  Vagrant::Config.run do |config|
2
- config.vm.box = "natty64"
11
+ config.vm.box = "precise64"
12
+ config.vm.provision :shell, :inline => "gem install /vagrant/#{package} --no-rdoc --no-ri"
3
13
  config.vm.provision :chef_solo do |chef|
4
- chef.cookbooks_path = "examples/cookbooks"
5
- chef.add_recipe "chef_handler::minitest"
6
- chef.add_recipe "foo"
14
+ #chef.log_level = :debug
15
+ #chef.json = {"minitest" => {"verbose" => true}}
16
+ chef.run_list = [
17
+ "recipe[spec_examples]",
18
+ "minitest-handler",
19
+ ]
7
20
  end
8
21
  end
@@ -6,15 +6,7 @@ require 'minitest/spec'
6
6
  # Copyright 2012, Opscode, Inc.
7
7
  #
8
8
  describe_recipe 'spec_examples::default' do
9
-
10
- # It's often convenient to load these includes in a separate helper along with
11
- # your own helper methods, but here we just include them directly:
12
- include MiniTest::Chef::Assertions
13
- include MiniTest::Chef::Context
14
- include MiniTest::Chef::Resources
15
-
16
9
  describe "files" do
17
-
18
10
  # = Testing that a file exists =
19
11
  #
20
12
  # The simplest assertion is that a file exists following the Chef run:
@@ -61,6 +53,7 @@ describe_recipe 'spec_examples::default' do
61
53
  # You don't want to get too carried away doing this but it can be useful.
62
54
  it "only root can modify the config file" do
63
55
  file("/etc/fstab").must_have(:mode, "644").with(:owner, "root").and(:group, "root")
56
+ assert_file "/etc/fstab", "root", "root", 0644
64
57
  end
65
58
 
66
59
  # Alternatively you could express it like this so each assertion is nicely
@@ -98,19 +91,21 @@ describe_recipe 'spec_examples::default' do
98
91
 
99
92
  # The file existence and permissions matchers are also valid for
100
93
  # directories:
101
- it { directory("/etc/").must_exist.with(:owner, "root") }
94
+ it "creates directories" do
95
+ directory("/etc/").must_exist.with(:owner, "root")
96
+ assert_directory "/etc", "root", "root", 0755
97
+ end
102
98
 
103
99
  # = Links =
104
100
 
105
101
  it "symlinks the foo in" do
106
102
  link("/tmp/foo-symbolic").must_exist.with(
107
103
  :link_type, :symbolic).and(:to, "/tmp/foo")
104
+ assert_symlinked_file "/tmp/foo-symbolic", "root", "root", 0600
108
105
  end
109
-
110
106
  end
111
107
 
112
108
  describe "packages" do
113
-
114
109
  # = Checking for package install =
115
110
  it "installs my favorite pager" do
116
111
  package("less").must_be_installed
@@ -136,26 +131,23 @@ describe_recipe 'spec_examples::default' do
136
131
 
137
132
  # = Package versions =
138
133
  it "installs the package with the right version" do
139
- package("less").must_be_installed.with(:version, "436-1")
134
+ package("less").must_be_installed.with(:version, "444-1ubuntu1")
140
135
  end
141
136
  end
142
137
 
143
138
  describe "services" do
144
-
145
139
  # You can assert that a service must be running following the converge:
146
140
  it "runs as a daemon" do
147
- service("chef-client").must_be_running
141
+ service("ntp").must_be_running
148
142
  end
149
143
 
150
144
  # And that it will start when the server boots:
151
145
  it "boots on startup" do
152
- service("chef-client").must_be_enabled
146
+ service("ntp").must_be_enabled
153
147
  end
154
-
155
148
  end
156
149
 
157
150
  describe "users and groups" do
158
-
159
151
  # = Users =
160
152
 
161
153
  # Check if a user has been created:
@@ -198,7 +190,6 @@ describe_recipe 'spec_examples::default' do
198
190
  end
199
191
 
200
192
  describe "cron entries" do
201
-
202
193
  it "creates a crontab entry" do
203
194
  cron("noop").must_exist.with(:hour, "5").and(:minute, "0").and(:day, "*")
204
195
  end
@@ -206,7 +197,6 @@ describe_recipe 'spec_examples::default' do
206
197
  it "removes the self-destruct countdown" do
207
198
  cron("self-destruct").wont_exist
208
199
  end
209
-
210
200
  end
211
201
 
212
202
  # Note that the syntax for testing the mount resource is slightly different.
@@ -218,7 +208,6 @@ describe_recipe 'spec_examples::default' do
218
208
  end
219
209
 
220
210
  describe "networking" do
221
-
222
211
  # = Test network interface settings =
223
212
  describe "ifconfig" do
224
213
  it "has the expected network interfaces configured" do
@@ -226,7 +215,12 @@ describe_recipe 'spec_examples::default' do
226
215
  ifconfig(node['ipaddress'], :device => "eth1").wont_exist
227
216
  end
228
217
  end
229
-
230
218
  end
231
219
 
220
+ describe "misc" do
221
+ it "can run assert_sh" do
222
+ result = assert_sh("ls /vagrant")
223
+ assert_includes result, "Gemfile"
224
+ end
225
+ end
232
226
  end
@@ -3,3 +3,4 @@ maintainer_email "andrew@kotirisoftware.com"
3
3
  license "MIT"
4
4
  description "MiniTest::Spec examples for minitest-chef-handler"
5
5
  version "0.1.0"
6
+ name "spec_examples"
@@ -0,0 +1,8 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "vagrant", ">= 1.1", :git=>"git://github.com/mitchellh/vagrant.git", :ref=>"11ad0392758b6b3f4b8a44332c66a79e94cef1eb"
6
+ gem "chef", "~> 10.0"
7
+
8
+ gemspec :path=>"../"
@@ -0,0 +1,8 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "vagrant", ">= 1.1", :git=>"git://github.com/mitchellh/vagrant.git", :ref=>"11ad0392758b6b3f4b8a44332c66a79e94cef1eb"
6
+ gem "chef", "~> 11.0"
7
+
8
+ gemspec :path=>"../"
@@ -124,6 +124,47 @@ module MiniTest
124
124
  service
125
125
  end
126
126
 
127
+ def assert_directory(dir, *args)
128
+ assert File.directory?(dir), "Expected #{dir} is be a directory"
129
+ assert_acl(dir, *args)
130
+ end
131
+
132
+ def assert_file(file, *args)
133
+ assert File.file?(file), "Expected #{file} is be a file"
134
+ assert_acl(file, *args)
135
+ end
136
+
137
+ def assert_acl(file, owner, group, mode)
138
+ file(file).
139
+ must_have(:owner, owner).
140
+ must_have(:group, group).
141
+ must_have(:mode, mode)
142
+ end
143
+
144
+ def assert_symlinked_file(file, *args)
145
+ assert File.symlink?(file), "Expected #{file} to be a symlink"
146
+ assert File.read(file, 1), "Expected #{file} to be linked to an existing file"
147
+ assert_acl file, *args
148
+ end
149
+
150
+ def assert_symlinked_directory(directory, *args)
151
+ assert File.symlink?(directory), "Expected #{directory} to be a symlink"
152
+ assert_sh "ls #{directory}/", "Expected #{directory} to link to an existing directory"
153
+ assert_acl directory, *args
154
+ end
155
+
156
+ def assert_logrotate(file)
157
+ assert_file file, "root", "root", 0644
158
+ assert_sh "logrotate -d #{file}", "Expected #{file} to pass logrotate validation"
159
+ end
160
+
161
+ def assert_sh(command, text=nil)
162
+ text ||= "Expected #{command} to succeed"
163
+ out = `#{command} 2>&1`
164
+ assert $?.success?, "#{text}, but failed with: #{out}"
165
+ out
166
+ end
167
+
127
168
  end
128
169
  end
129
170
  end
@@ -1,4 +1,5 @@
1
1
  require 'ci/reporter/minitest'
2
+
2
3
  module MiniTest
3
4
  module Chef
4
5
  class CIRunner < CI::Reporter::Runner
@@ -35,11 +35,17 @@ module MiniTest
35
35
  register_resource(:mount, :device)
36
36
 
37
37
  ::Chef::Resource.class_eval do
38
- def with(attribute, values)
38
+ def with(attribute, values, failure_message=nil)
39
39
  mt = Object.extend(MiniTest::Assertions)
40
40
  actual_values = resource_value(attribute)
41
- mt.assert_equal values, actual_values,
42
- "The #{resource_name} does not have the expected #{attribute}"
41
+ details = " #{path}" if respond_to?(:path)
42
+
43
+ failure_message ||= "The #{resource_name}#{details} does not have the expected #{attribute}"
44
+ if attribute == :mode
45
+ values = values.to_s(8) if values.is_a?(Integer) # better diff since 0755 would be shown as 493
46
+ values = values.to_s.sub(/^0+/, "") # better diff, ignore leading zeros
47
+ end
48
+ mt.assert_equal values, actual_values, failure_message
43
49
  self
44
50
  end
45
51
 
@@ -52,7 +58,7 @@ module MiniTest
52
58
  case attribute
53
59
  when :mode
54
60
  return nil unless mode
55
- mode.kind_of?(Integer) ? mode.to_s(8) : mode.to_s
61
+ mode.kind_of?(Integer) ? mode.to_s(8) : mode.to_s.sub(/^0+/, "")
56
62
  when :owner || :user
57
63
  return nil unless owner
58
64
  owner.is_a?(Integer) ? Etc.getpwuid(owner).name : Etc.getpwnam(owner).name
@@ -11,11 +11,16 @@ Gem::Specification.new do |gem|
11
11
  gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
12
12
  gem.name = "minitest-chef-handler"
13
13
  gem.require_paths = ["lib"]
14
- gem.version = '0.6.9'
14
+ gem.version = '1.0.0'
15
15
 
16
16
  gem.add_dependency('minitest')
17
17
  gem.add_dependency('chef')
18
18
  gem.add_dependency('ci_reporter')
19
- gem.add_development_dependency('rake')
20
- gem.add_development_dependency('mocha')
19
+ gem.add_development_dependency "rake"
20
+ gem.add_development_dependency "mocha"
21
+ gem.add_development_dependency "appraisal"
22
+ gem.add_development_dependency "ffi", ">= 1"
23
+ gem.add_development_dependency "vagrant", ">= 1.1"
24
+ gem.add_development_dependency "berkshelf", ">= 1.3.1"
25
+ gem.add_development_dependency "berkshelf-vagrant"
21
26
  end
@@ -1,9 +1,14 @@
1
1
  require File.expand_path('../../spec_helper', __FILE__)
2
+ require "minitest-chef-handler/resources"
2
3
 
3
4
  describe MiniTest::Chef::Assertions do
4
-
5
5
  include MiniTest::Chef::Assertions
6
6
 
7
+ before do
8
+ Etc.stubs(:getpwnam).returns stub(:name => "me")
9
+ Etc.stubs(:getgrnam).returns stub(:name => "family")
10
+ end
11
+
7
12
  def resource_for(hash)
8
13
  Class.new do
9
14
  hash.each_pair do |key,value|
@@ -12,16 +17,38 @@ describe MiniTest::Chef::Assertions do
12
17
  end.new
13
18
  end
14
19
 
20
+ def file(path)
21
+ file = ::Chef::Resource::File.new(path)
22
+ def file.mode; 0755;end
23
+ def file.owner; "xxx";end
24
+ def file.group; "xxx";end
25
+ file
26
+ end
27
+
15
28
  module MiniTest::Chef::Assertions
16
29
  class File
17
- def self.read(path)
18
- '# Generated by Chef'
30
+ def self.read(path, to=-1)
31
+ '# Generated by Chef'[0..to]
19
32
  end
33
+
20
34
  def self.mtime(path)
21
35
  Time.now.utc
22
36
  end
37
+
23
38
  def self.exists?(path)
24
- path == '/etc/foo'
39
+ ["/etc", "/etc/foo", "/etc/baz", "/etc/gar"].include?(path)
40
+ end
41
+
42
+ def self.directory?(path)
43
+ ['/etc', '/etc/gar'].include?(path)
44
+ end
45
+
46
+ def self.file?(path)
47
+ ['/etc/foo'].include?(path)
48
+ end
49
+
50
+ def self.symlink?(path)
51
+ ['/etc/baz', '/etc/gar'].include?(path)
25
52
  end
26
53
  end
27
54
  end
@@ -290,4 +317,131 @@ describe MiniTest::Chef::Assertions do
290
317
  end
291
318
  end
292
319
 
320
+ describe "#assert_acl" do
321
+ it "does not blow up if everything is correct" do
322
+ assert_acl("/etc", "me", "family", 0755)
323
+ end
324
+
325
+ it "verifies that it has the correct owner" do
326
+ assert_triggered "The file /etc does not have the expected owner.\nExpected: \"foo\"\n Actual: \"me\"" do
327
+ assert_acl("/etc", "foo", "bar", 0755)
328
+ end
329
+ end
330
+
331
+ it "verifies that it has the correct group" do
332
+ assert_triggered "The file /etc does not have the expected group.\nExpected: \"bar\"\n Actual: \"family\"" do
333
+ assert_acl("/etc", "me", "bar", 0755)
334
+ end
335
+ end
336
+
337
+ it "verifies that it has the correct mode" do
338
+ assert_triggered "The file /etc does not have the expected mode.\nExpected: \"750\"\n Actual: \"755\"" do
339
+ assert_acl("/etc", "me", "family", 0750)
340
+ end
341
+ end
342
+ end
343
+
344
+ describe "#assert_directory" do
345
+ it "does not blow up if everything is correct" do
346
+ assert_directory("/etc", "me", "family", 0755)
347
+ end
348
+
349
+ it "verifies that it is a directory" do
350
+ assert_triggered "Expected /etc/foo is be a directory" do
351
+ assert_directory("/etc/foo", "foo", "bar", 0755)
352
+ end
353
+ end
354
+
355
+ it "verifies that it has the correct acl" do
356
+ assert_triggered "The file /etc does not have the expected owner.\nExpected: \"foo\"\n Actual: \"me\"" do
357
+ assert_directory("/etc", "foo", "bar", 0755)
358
+ end
359
+ end
360
+ end
361
+
362
+ describe "#assert_file" do
363
+ it "does not blow up if everything is correct" do
364
+ assert_file("/etc/foo", "me", "family", 0755)
365
+ end
366
+
367
+ it "verifies that it is a file" do
368
+ assert_triggered "Expected /etc is be a file" do
369
+ assert_file("/etc", "foo", "bar", 0755)
370
+ end
371
+ end
372
+
373
+ it "verifies that it has the correct acl" do
374
+ assert_triggered "The file /etc/foo does not have the expected owner.\nExpected: \"foo\"\n Actual: \"me\"" do
375
+ assert_file("/etc/foo", "foo", "bar", 0755)
376
+ end
377
+ end
378
+ end
379
+
380
+ describe "#assert_symlinked_file" do
381
+ it "does not blow up if everything is correct" do
382
+ assert_symlinked_file("/etc/baz", "me", "family", 0755)
383
+ end
384
+
385
+ it "verifies that it is a symlink" do
386
+ assert_triggered "Expected /etc/foo to be a symlink" do
387
+ assert_symlinked_file("/etc/foo", "foo", "bar", 0755)
388
+ end
389
+ end
390
+
391
+ it "verifies that it has the correct acl" do
392
+ assert_triggered "The file /etc/baz does not have the expected owner.\nExpected: \"foo\"\n Actual: \"me\"" do
393
+ assert_symlinked_file("/etc/baz", "foo", "bar", 0755)
394
+ end
395
+ end
396
+ end
397
+
398
+ describe "#assert_symlinked_directory" do
399
+ def assert_sh(*args)
400
+ end
401
+
402
+ it "does not blow up if everything is correct" do
403
+ assert_symlinked_directory("/etc/gar", "me", "family", 0755)
404
+ end
405
+
406
+ it "verifies that it is a symlink" do
407
+ assert_triggered "Expected /etc/foo to be a symlink" do
408
+ assert_symlinked_directory("/etc/foo", "foo", "bar", 0755)
409
+ end
410
+ end
411
+
412
+ it "verifies that it has the correct acl" do
413
+ assert_triggered "The file /etc/gar does not have the expected owner.\nExpected: \"foo\"\n Actual: \"me\"" do
414
+ assert_symlinked_directory("/etc/gar", "foo", "bar", 0755)
415
+ end
416
+ end
417
+ end
418
+
419
+ describe "#assert_logrotate" do
420
+ def assert_sh(*args)
421
+ end
422
+
423
+ def file(path)
424
+ file = super
425
+ def file.mode; 0644;end
426
+ file
427
+ end
428
+
429
+ it "does not blow up if everything is correct" do
430
+ Etc.stubs(:getpwnam).returns stub(:name => "root")
431
+ Etc.stubs(:getgrnam).returns stub(:name => "root")
432
+ assert_logrotate("/etc/foo")
433
+ end
434
+ end
435
+
436
+ describe "#assert_sh" do
437
+ it "does not blow up if everything is correct" do
438
+ assert_sh("true")
439
+ end
440
+
441
+ it "fails when command fails" do
442
+ assert_triggered "Expected echo ABC && false to succeed, but failed with: ABC" do
443
+ assert_sh("echo ABC && false")
444
+ end
445
+ end
446
+ end
293
447
  end