diff options
author | Jorie Tappa <jorie@jorietappa.com> | 2018-07-31 14:56:46 -0500 |
---|---|---|
committer | Jorie Tappa <jorie@jorietappa.com> | 2018-07-31 16:07:37 -0500 |
commit | a2af7dd0b9713f279724d2c7e6f17bfd8ce2d95b (patch) | |
tree | 6a90efd716578c7449ec69051279150308884414 /spec/integration/provider | |
parent | e74dce11298298889a40879aad1e2fcc27fa0559 (diff) | |
download | puppet-cron_core-a2af7dd0b9713f279724d2c7e6f17bfd8ce2d95b.tar.gz puppet-cron_core-a2af7dd0b9713f279724d2c7e6f17bfd8ce2d95b.tar.bz2 |
Initial cron import from puppet 7a4c5f07bdf61a7bc7aa32a50e99489a604eac52
Diffstat (limited to 'spec/integration/provider')
-rw-r--r-- | spec/integration/provider/cron/crontab_spec.rb | 242 |
1 files changed, 242 insertions, 0 deletions
diff --git a/spec/integration/provider/cron/crontab_spec.rb b/spec/integration/provider/cron/crontab_spec.rb new file mode 100644 index 0000000..192674f --- /dev/null +++ b/spec/integration/provider/cron/crontab_spec.rb @@ -0,0 +1,242 @@ +#!/usr/bin/env ruby + +require 'spec_helper' +require 'puppet/file_bucket/dipper' +require 'puppet_spec/compiler' + +describe Puppet::Type.type(:cron).provider(:crontab), '(integration)', :unless => Puppet.features.microsoft_windows? do + include PuppetSpec::Files + include PuppetSpec::Compiler + + before :each do + Puppet::Type.type(:cron).stubs(:defaultprovider).returns described_class + described_class.stubs(:suitable?).returns true + Puppet::FileBucket::Dipper.any_instance.stubs(:backup) # Don't backup to filebucket + + # I don't want to execute anything + described_class.stubs(:filetype).returns Puppet::Util::FileType::FileTypeFlat + described_class.stubs(:default_target).returns crontab_user1 + + # I don't want to stub Time.now to get a static header because I don't know + # where Time.now is used elsewhere, so just go with a very simple header + described_class.stubs(:header).returns "# HEADER: some simple\n# HEADER: header\n" + FileUtils.cp(my_fixture('crontab_user1'), crontab_user1) + FileUtils.cp(my_fixture('crontab_user2'), crontab_user2) + end + + after :each do + described_class.clear + end + + let :crontab_user1 do + tmpfile('cron_integration_specs') + end + + let :crontab_user2 do + tmpfile('cron_integration_specs') + end + + def expect_output(fixture_name) + expect(File.read(crontab_user1)).to eq(File.read(my_fixture(fixture_name))) + end + + describe "when managing a cron entry" do + + it "should be able to purge unmanaged entries" do + apply_with_error_check(<<-MANIFEST) + cron { + 'only managed entry': + ensure => 'present', + command => '/bin/true', + target => '#{crontab_user1}', + } + resources { 'cron': purge => 'true' } + MANIFEST + expect_output('purged') + end + + describe "with ensure absent" do + it "should do nothing if entry already absent" do + apply_with_error_check(<<-MANIFEST) + cron { + 'no_such_entry': + ensure => 'absent', + target => '#{crontab_user1}', + } + MANIFEST + expect_output('crontab_user1') + end + + it "should remove the resource from crontab if present" do + apply_with_error_check(<<-MANIFEST) + cron { + 'My daily failure': + ensure => 'absent', + target => '#{crontab_user1}', + } + MANIFEST + expect_output('remove_named_resource') + end + + it "should remove a matching cronentry if present" do + apply_with_error_check(<<-MANIFEST) + cron { + 'no_such_named_resource_in_crontab': + ensure => absent, + minute => [ '17-19', '22' ], + hour => [ '0-23/2' ], + weekday => 'Tue', + command => '/bin/unnamed_regular_command', + target => '#{crontab_user1}', + } + MANIFEST + expect_output('remove_unnamed_resource') + end + end + + describe "with ensure present" do + + context "and no command specified" do + it "should work if the resource is already present" do + apply_with_error_check(<<-MANIFEST) + cron { + 'My daily failure': + special => 'daily', + target => '#{crontab_user1}', + } + MANIFEST + expect_output('crontab_user1') + end + it "should fail if the resource needs creating" do + manifest = <<-MANIFEST + cron { + 'Entirely new resource': + special => 'daily', + target => '#{crontab_user1}', + } + MANIFEST + apply_compiled_manifest(manifest) do |res| + if res.ref == 'Cron[Entirely new resource]' + res.expects(:err).with(regexp_matches(/no command/)) + else + res.expects(:err).never + end + end + end + end + + it "should do nothing if entry already present" do + apply_with_error_check(<<-MANIFEST) + cron { + 'My daily failure': + special => 'daily', + command => '/bin/false', + target => '#{crontab_user1}', + } + MANIFEST + expect_output('crontab_user1') + end + + it "should work correctly when managing 'target' but not 'user'" do + apply_with_error_check(<<-MANIFEST) + cron { + 'My daily failure': + special => 'daily', + command => '/bin/false', + target => '#{crontab_user1}', + } + MANIFEST + expect_output('crontab_user1') + end + + it "should do nothing if a matching entry already present" do + apply_with_error_check(<<-MANIFEST) + cron { + 'no_such_named_resource_in_crontab': + ensure => present, + minute => [ '17-19', '22' ], + hour => [ '0-23/2' ], + command => '/bin/unnamed_regular_command', + target => '#{crontab_user1}', + } + MANIFEST + expect_output('crontab_user1') + end + + it "should add a new normal entry if currently absent" do + apply_with_error_check(<<-MANIFEST) + cron { + 'new entry': + ensure => present, + minute => '12', + weekday => 'Tue', + command => '/bin/new', + environment => [ + 'MAILTO=""', + 'SHELL=/bin/bash' + ], + target => '#{crontab_user1}', + } + MANIFEST + expect_output('create_normal_entry') + end + + it "should add a new special entry if currently absent" do + apply_with_error_check(<<-MANIFEST) + cron { + 'new special entry': + ensure => present, + special => 'reboot', + command => 'echo "Booted" 1>&2', + environment => 'MAILTO=bob@company.com', + target => '#{crontab_user1}', + } + MANIFEST + expect_output('create_special_entry') + end + + it "should change existing entry if out of sync" do + apply_with_error_check(<<-MANIFEST) + cron { + 'Monthly job': + ensure => present, + special => 'monthly', + #minute => ['22'], + command => '/usr/bin/monthly', + environment => [], + target => '#{crontab_user1}', + } + MANIFEST + expect_output('modify_entry') + end + it "should change a special schedule to numeric if requested" do + apply_with_error_check(<<-MANIFEST) + cron { + 'My daily failure': + special => 'absent', + command => '/bin/false', + target => '#{crontab_user1}', + } + MANIFEST + expect_output('unspecialized') + end + it "should not try to move an entry from one file to another" do + # force the parsedfile provider to also parse user1's crontab + apply_with_error_check(<<-MANIFEST) + cron { + 'foo': + ensure => absent, + target => '#{crontab_user1}'; + 'My daily failure': + special => 'daily', + command => "/bin/false", + target => '#{crontab_user2}', + } + MANIFEST + expect(File.read(crontab_user1)).to eq(File.read(my_fixture('moved_cronjob_input1'))) + expect(File.read(crontab_user2)).to eq(File.read(my_fixture('moved_cronjob_input2'))) + end + end + end + +end |