diff options
author | Tim Smith <tsmith@chef.io> | 2020-06-15 22:28:02 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-06-15 22:28:02 -0700 |
commit | 5314111f2ee818f905725d85b1b350d6d59eede4 (patch) | |
tree | 4816fc41a31167cfe3fc4234e3887f3cdb7ca462 | |
parent | ad345a5d39e3aa36b56b94481a010dcef0571dda (diff) | |
parent | 6a28f8724d33eb5a02ed475dd883e697b0561a36 (diff) | |
download | chef-5314111f2ee818f905725d85b1b350d6d59eede4.tar.gz |
Merge pull request #10001 from chef/cron_cleanup
Cron and Cron_d resource weekday property fixes
-rw-r--r-- | lib/chef/provider/cron.rb | 12 | ||||
-rw-r--r-- | lib/chef/resource/cron.rb | 157 | ||||
-rw-r--r-- | lib/chef/resource/cron/_cron_shared.rb | 99 | ||||
-rw-r--r-- | lib/chef/resource/cron/cron.rb | 46 | ||||
-rw-r--r-- | lib/chef/resource/cron/cron_d.rb (renamed from lib/chef/resource/cron_d.rb) | 94 | ||||
-rw-r--r-- | lib/chef/resource/helpers/cron_validations.rb | 7 | ||||
-rw-r--r-- | lib/chef/resources.rb | 4 | ||||
-rw-r--r-- | spec/functional/resource/cron_spec.rb | 10 | ||||
-rw-r--r-- | spec/unit/provider/cron_spec.rb | 58 | ||||
-rw-r--r-- | spec/unit/resource/cron_spec.rb | 4 | ||||
-rw-r--r-- | spec/unit/resource/helpers/cron_validations_spec.rb | 6 |
11 files changed, 185 insertions, 312 deletions
diff --git a/lib/chef/provider/cron.rb b/lib/chef/provider/cron.rb index 8a978b7eca..622f8f5e63 100644 --- a/lib/chef/provider/cron.rb +++ b/lib/chef/provider/cron.rb @@ -15,7 +15,6 @@ # See the License for the specific language governing permissions and # limitations under the License. # - require_relative "../log" require_relative "../provider" @@ -27,8 +26,6 @@ class Chef SPECIAL_TIME_VALUES = %i{reboot yearly annually monthly weekly daily midnight hourly}.freeze CRON_ATTRIBUTES = %i{minute hour day month weekday time command mailto path shell home environment}.freeze - WEEKDAY_SYMBOLS = %i{sunday monday tuesday wednesday thursday friday saturday}.freeze - CRON_PATTERN = %r{\A([-0-9*,/]+)\s([-0-9*,/]+)\s([-0-9*,/]+)\s([-0-9*,/]+|[a-zA-Z]{3})\s([-0-9*,/]+|[a-zA-Z]{3})\s(.*)}.freeze SPECIAL_PATTERN = /\A(@(#{SPECIAL_TIME_VALUES.join('|')}))\s(.*)/.freeze ENV_PATTERN = /\A(\S+)=(\S*)/.freeze @@ -288,15 +285,6 @@ class Chef newcron.join("\n") end - - def weekday_in_crontab - weekday_in_crontab = WEEKDAY_SYMBOLS.index(new_resource.weekday) - if weekday_in_crontab.nil? - new_resource.weekday - else - weekday_in_crontab.to_s - end - end end end end diff --git a/lib/chef/resource/cron.rb b/lib/chef/resource/cron.rb deleted file mode 100644 index 79cf5642af..0000000000 --- a/lib/chef/resource/cron.rb +++ /dev/null @@ -1,157 +0,0 @@ -# -# Author:: Bryan McLellan (btm@loftninjas.org) -# Author:: Tyler Cloke (<tyler@chef.io>) -# Copyright:: Copyright 2009-2016, Bryan McLellan -# License:: Apache License, Version 2.0 -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -require_relative "../resource" -require_relative "helpers/cron_validations" -require_relative "../provider/cron" # do not remove. we actually need this below - -class Chef - class Resource - class Cron < Chef::Resource - unified_mode true - provides :cron - - description "Use the **cron** resource to manage cron entries for time-based job scheduling. Properties for a schedule will default to * if not provided. The cron resource requires access to a crontab program, typically cron." - - state_attrs :minute, :hour, :day, :month, :weekday, :user - - default_action :create - allowed_actions :create, :delete - - def initialize(name, run_context = nil) - super - @month = "*" - @weekday = "*" - end - - property :minute, [Integer, String], - description: "The minute at which the cron entry should run (`0 - 59`).", - default: "*", callbacks: { - "should be a valid minute spec" => ->(spec) { Chef::ResourceHelpers::CronValidations.validate_numeric(spec, 0, 59) }, - } - - property :hour, [Integer, String], - description: "The hour at which the cron entry is to run (`0 - 23`).", - default: "*", callbacks: { - "should be a valid hour spec" => ->(spec) { Chef::ResourceHelpers::CronValidations.validate_numeric(spec, 0, 23) }, - } - - property :day, [Integer, String], - description: "The day of month at which the cron entry should run (`1 - 31`).", - default: "*", callbacks: { - "should be a valid day spec" => ->(spec) { Chef::ResourceHelpers::CronValidations.validate_numeric(spec, 1, 31) }, - } - - property :month, [Integer, String], - description: "The month in the year on which a cron entry is to run (`1 - 12`, `jan-dec`, or `*`).", - default: "*", callbacks: { - "should be a valid month spec" => ->(spec) { Chef::ResourceHelpers::CronValidations.validate_month(spec) }, - } - - def weekday(arg = nil) - if arg.is_a?(Integer) - converted_arg = arg.to_s - else - converted_arg = arg - end - begin - error_message = "You provided '#{arg}' as a weekday, acceptable values are " - error_message << Provider::Cron::WEEKDAY_SYMBOLS.map { |sym| ":#{sym}" }.join(", ") - error_message << " and a string in crontab format" - if (arg.is_a?(Symbol) && !Provider::Cron::WEEKDAY_SYMBOLS.include?(arg)) || - (!arg.is_a?(Symbol) && integerize(arg) > 7) || - (!arg.is_a?(Symbol) && integerize(arg) < 0) - raise RangeError, error_message - end - rescue ArgumentError - end - set_or_return( - :weekday, - converted_arg, - kind_of: [String, Symbol] - ) - end - - property :time, Symbol, - description: "A time interval.", - equal_to: Chef::Provider::Cron::SPECIAL_TIME_VALUES - - property :mailto, String, - description: "Set the `MAILTO` environment variable." - - property :path, String, - description: "Set the `PATH` environment variable." - - property :home, String, - description: "Set the `HOME` environment variable." - - property :shell, String, - description: "Set the `SHELL` environment variable." - - property :command, String, - description: "The command to be run, or the path to a file that contains the command to be run.", - identity: true - - property :user, String, - description: "The name of the user that runs the command. If the user property is changed, the original user for the crontab program continues to run until that crontab program is deleted. This property is not applicable on the AIX platform.", - default: "root" - - property :environment, Hash, - description: "A Hash containing additional arbitrary environment variables under which the cron job will be run in the form of `({'ENV_VARIABLE' => 'VALUE'})`.", - default: lazy { {} } - - TIMEOUT_OPTS = %w{duration preserve-status foreground kill-after signal}.freeze - TIMEOUT_REGEX = /\A\S+/.freeze - - property :time_out, Hash, - description: "A Hash of timeouts in the form of `({'OPTION' => 'VALUE'})`. - Accepted valid options are: - `preserve-status` (BOOL, default: 'false'), - `foreground` (BOOL, default: 'false'), - `kill-after` (in seconds), - `signal` (a name like 'HUP' or a number)", - default: lazy { {} }, - introduced: "15.7", - coerce: proc { |h| - if h.is_a?(Hash) - invalid_keys = h.keys - TIMEOUT_OPTS - unless invalid_keys.empty? - error_msg = "Key of option time_out must be equal to one of: \"#{TIMEOUT_OPTS.join('", "')}\"! You passed \"#{invalid_keys.join(", ")}\"." - raise Chef::Exceptions::ValidationFailed, error_msg - end - unless h.values.all? { |x| x =~ TIMEOUT_REGEX } - error_msg = "Values of option time_out should be non-empty string without any leading whitespace." - raise Chef::Exceptions::ValidationFailed, error_msg - end - h - elsif h.is_a?(Integer) || h.is_a?(String) - { "duration" => h } - end - } - - private - - def integerize(integerish) - Integer(integerish) - rescue TypeError - 0 - end - end - end -end diff --git a/lib/chef/resource/cron/_cron_shared.rb b/lib/chef/resource/cron/_cron_shared.rb new file mode 100644 index 0000000000..b2e200d27a --- /dev/null +++ b/lib/chef/resource/cron/_cron_shared.rb @@ -0,0 +1,99 @@ +unified_mode true + +TIMEOUT_OPTS = %w{duration preserve-status foreground kill-after signal}.freeze +TIMEOUT_REGEX = /\A\S+/.freeze +WEEKDAYS = { + sunday: "0", monday: "1", tuesday: "2", wednesday: "3", thursday: "4", friday: "5", saturday: "6", + sun: "0", mon: "1", tue: "2", wed: "3", thu: "4", fri: "5", sat: "6" +}.freeze + +property :minute, [Integer, String], + description: "The minute at which the cron entry should run (`0 - 59`).", + default: "*", callbacks: { + "should be a valid minute spec" => ->(spec) { Chef::ResourceHelpers::CronValidations.validate_numeric(spec, 0, 59) }, + } + +property :hour, [Integer, String], + description: "The hour at which the cron entry is to run (`0 - 23`).", + default: "*", callbacks: { + "should be a valid hour spec" => ->(spec) { Chef::ResourceHelpers::CronValidations.validate_numeric(spec, 0, 23) }, + } + +property :day, [Integer, String], + description: "The day of month at which the cron entry should run (`1 - 31`).", + default: "*", callbacks: { + "should be a valid day spec" => ->(spec) { Chef::ResourceHelpers::CronValidations.validate_numeric(spec, 1, 31) }, + } + +property :month, [Integer, String], + description: "The month in the year on which a cron entry is to run (`1 - 12`, `jan-dec`, or `*`).", + default: "*", callbacks: { + "should be a valid month spec" => ->(spec) { Chef::ResourceHelpers::CronValidations.validate_month(spec) }, + } + +property :weekday, [Integer, String, Symbol], + description: "The day of the week on which this entry is to run (`0-7`, `mon-sun`, `monday-sunday`, or `*`), where Sunday is both `0` and `7`.", + default: "*", coerce: proc { |wday| weekday_in_crontab(wday) }, + callbacks: { + "should be a valid weekday spec" => ->(spec) { Chef::ResourceHelpers::CronValidations.validate_dow(spec) }, + } + +property :shell, String, + description: "Set the `SHELL` environment variable." + +property :path, String, + description: "Set the `PATH` environment variable." + +property :home, String, + description: "Set the `HOME` environment variable." + +property :mailto, String, + description: "Set the `MAILTO` environment variable." + +property :command, String, + description: "The command to be run, or the path to a file that contains the command to be run.", + identity: true, + required: [:create] + +property :user, String, + description: "The name of the user that runs the command.", + default: "root" + +property :environment, Hash, + description: "A Hash containing additional arbitrary environment variables under which the cron job will be run in the form of `({'ENV_VARIABLE' => 'VALUE'})`.", + default: lazy { {} } + +property :time_out, Hash, + description: "A Hash of timeouts in the form of `({'OPTION' => 'VALUE'})`. + Accepted valid options are: + `preserve-status` (BOOL, default: 'false'), + `foreground` (BOOL, default: 'false'), + `kill-after` (in seconds), + `signal` (a name like 'HUP' or a number)", + default: lazy { {} }, + introduced: "15.7", + coerce: proc { |h| + if h.is_a?(Hash) + invalid_keys = h.keys - TIMEOUT_OPTS + unless invalid_keys.empty? + error_msg = "Key of option time_out must be equal to one of: \"#{TIMEOUT_OPTS.join('", "')}\"! You passed \"#{invalid_keys.join(", ")}\"." + raise Chef::Exceptions::ValidationFailed, error_msg + end + unless h.values.all? { |x| x =~ TIMEOUT_REGEX } + error_msg = "Values of option time_out should be non-empty strings without any leading whitespace." + raise Chef::Exceptions::ValidationFailed, error_msg + end + h + elsif h.is_a?(Integer) || h.is_a?(String) + { "duration" => h } + end + } + +private +# Convert weekday input value into crontab format that +# could be written in the crontab +# @return [Integer, String] A weekday formed as per the user inputs. +def weekday_in_crontab(wday) + weekday = wday.to_s.downcase.to_sym + WEEKDAYS[weekday] || wday +end
\ No newline at end of file diff --git a/lib/chef/resource/cron/cron.rb b/lib/chef/resource/cron/cron.rb new file mode 100644 index 0000000000..31d6efcfde --- /dev/null +++ b/lib/chef/resource/cron/cron.rb @@ -0,0 +1,46 @@ +# +# Author:: Bryan McLellan (btm@loftninjas.org) +# Author:: Tyler Cloke (<tyler@chef.io>) +# Copyright:: Copyright 2009-2016, Bryan McLellan +# License:: Apache License, Version 2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +require_relative "../../resource" +require_relative "../helpers/cron_validations" +require_relative "../../provider/cron" # do not remove. we actually need this below + +class Chef + class Resource + class Cron < Chef::Resource + unified_mode true + + use "cron_shared" + + provides :cron + + description "Use the **cron** resource to manage cron entries for time-based job scheduling. Properties for a schedule will default to * if not provided. The cron resource requires access to a crontab program, typically cron." + + state_attrs :minute, :hour, :day, :month, :weekday, :user + + default_action :create + allowed_actions :create, :delete + + property :time, Symbol, + description: "A time interval.", + equal_to: Chef::Provider::Cron::SPECIAL_TIME_VALUES + + end + end +end diff --git a/lib/chef/resource/cron_d.rb b/lib/chef/resource/cron/cron_d.rb index c60240acc2..3a913b22c3 100644 --- a/lib/chef/resource/cron_d.rb +++ b/lib/chef/resource/cron/cron_d.rb @@ -15,15 +15,18 @@ # limitations under the License. # -require_relative "../resource" -require_relative "helpers/cron_validations" +require_relative "../../resource" +require_relative "../helpers/cron_validations" require "shellwords" unless defined?(Shellwords) -require_relative "../dist" +require_relative "../../dist" class Chef class Resource class CronD < Chef::Resource unified_mode true + + use "cron_shared" + provides :cron_d introduced "14.4" @@ -98,92 +101,9 @@ class Chef description: "Schedule your cron job with one of the special predefined value instead of ** * pattern.", equal_to: %w{ @reboot @yearly @annually @monthly @weekly @daily @midnight @hourly } - property :minute, [Integer, String], - description: "The minute at which the cron entry should run (`0 - 59`).", - default: "*", callbacks: { - "should be a valid minute spec" => ->(spec) { Chef::ResourceHelpers::CronValidations.validate_numeric(spec, 0, 59) }, - } - - property :hour, [Integer, String], - description: "The hour at which the cron entry is to run (`0 - 23`).", - default: "*", callbacks: { - "should be a valid hour spec" => ->(spec) { Chef::ResourceHelpers::CronValidations.validate_numeric(spec, 0, 23) }, - } - - property :day, [Integer, String], - description: "The day of month at which the cron entry should run (`1 - 31`).", - default: "*", callbacks: { - "should be a valid day spec" => ->(spec) { Chef::ResourceHelpers::CronValidations.validate_numeric(spec, 1, 31) }, - } - - property :month, [Integer, String], - description: "The month in the year on which a cron entry is to run (`1 - 12`, `jan-dec`, or `*`).", - default: "*", callbacks: { - "should be a valid month spec" => ->(spec) { Chef::ResourceHelpers::CronValidations.validate_month(spec) }, - } - - property :weekday, [Integer, String], - description: "The day of the week on which this entry is to run (`0-7`, `mon-sun`, or `*`), where Sunday is both `0` and `7`.", - default: "*", callbacks: { - "should be a valid weekday spec" => ->(spec) { Chef::ResourceHelpers::CronValidations.validate_dow(spec) }, - } - - property :command, String, - description: "The command to run.", - required: [:create] - - property :user, String, - description: "The name of the user that runs the command.", - default: "root" - - property :mailto, String, - description: "Set the `MAILTO` environment variable in the cron.d file." - - property :path, String, - description: "Set the `PATH` environment variable in the cron.d file." - - property :home, String, - description: "Set the `HOME` environment variable in the cron.d file." - - property :shell, String, - description: "Set the `SHELL` environment variable in the cron.d file." - property :comment, String, description: "A comment to place in the cron.d file." - property :environment, Hash, - description: "A Hash containing additional arbitrary environment variables under which the cron job will be run in the form of `({'ENV_VARIABLE' => 'VALUE'})`.", - default: lazy { {} } - - TIMEOUT_OPTS = %w{duration preserve-status foreground kill-after signal}.freeze - TIMEOUT_REGEX = /\A\S+/.freeze - - property :time_out, Hash, - description: "A Hash of timeouts in the form of `({'OPTION' => 'VALUE'})`. - Accepted valid options are: - `preserve-status` (BOOL, default: 'false'), - `foreground` (BOOL, default: 'false'), - `kill-after` (in seconds), - `signal` (a name like 'HUP' or a number)", - default: lazy { {} }, - introduced: "15.7", - coerce: proc { |h| - if h.is_a?(Hash) - invalid_keys = h.keys - TIMEOUT_OPTS - unless invalid_keys.empty? - error_msg = "Key of option time_out must be equal to one of: \"#{TIMEOUT_OPTS.join('", "')}\"! You passed \"#{invalid_keys.join(", ")}\"." - raise Chef::Exceptions::ValidationFailed, error_msg - end - unless h.values.all? { |x| x =~ TIMEOUT_REGEX } - error_msg = "Values of option time_out should be non-empty string without any leading whitespace." - raise Chef::Exceptions::ValidationFailed, error_msg - end - h - elsif h.is_a?(Integer) || h.is_a?(String) - { "duration" => h } - end - } - property :mode, [String, Integer], description: "The octal mode of the generated crontab file.", default: "0600" @@ -238,7 +158,7 @@ class Chef # @todo this is Chef 12 era cleanup. Someday we should remove it all template "/etc/cron.d/#{sanitized_name}" do - source ::File.expand_path("../support/cron.d.erb", __FILE__) + source ::File.expand_path("../../support/cron.d.erb", __FILE__) local true mode new_resource.mode variables( diff --git a/lib/chef/resource/helpers/cron_validations.rb b/lib/chef/resource/helpers/cron_validations.rb index 8b5e9a22c4..60861be617 100644 --- a/lib/chef/resource/helpers/cron_validations.rb +++ b/lib/chef/resource/helpers/cron_validations.rb @@ -62,13 +62,16 @@ class Chef end end - # validate the provided day of the week is sun-sat, 0-7, or * + # validate the provided day of the week is sun-sat, sunday-saturday, 0-7, or * + # Added crontab param to check cron resource # @param spec the value to validate # @return [Boolean] valid or not? def validate_dow(spec) + spec = spec.to_s spec == "*" || validate_numeric(spec, 0, 7) || - %w{sun mon tue wed thu fri sat}.include?(String(spec).downcase) + %w{sun mon tue wed thu fri sat}.include?(spec.downcase) || + %w{sunday monday tuesday wednesday thursday friday saturday}.include?(spec.downcase) end # validate the day of the month is 1-31 diff --git a/lib/chef/resources.rb b/lib/chef/resources.rb index 847c9740b4..619ffe6f6f 100644 --- a/lib/chef/resources.rb +++ b/lib/chef/resources.rb @@ -38,9 +38,9 @@ require_relative "resource/chocolatey_config" require_relative "resource/chocolatey_feature" require_relative "resource/chocolatey_package" require_relative "resource/chocolatey_source" -require_relative "resource/cron" +require_relative "resource/cron/cron" require_relative "resource/cron_access" -require_relative "resource/cron_d" +require_relative "resource/cron/cron_d" require_relative "resource/csh" require_relative "resource/directory" require_relative "resource/dmg_package" diff --git a/spec/functional/resource/cron_spec.rb b/spec/functional/resource/cron_spec.rb index 66f630018e..ed4905b980 100644 --- a/spec/functional/resource/cron_spec.rb +++ b/spec/functional/resource/cron_spec.rb @@ -80,6 +80,16 @@ describe Chef::Resource::Cron, :requires_root, :unix_only do 5.times { new_resource.run_action(:create) } cron_should_exists(new_resource.name, new_resource.command) end + + # Test cron for day of week + weekdays = { Mon: 1, tuesday: 2, '3': 3, 'thursday': 4, 'Fri': 5, 6 => 6 } + weekdays.each do |key, value| + it "should create crontab entry and set #{value} for #{key} as weekday" do + new_resource.weekday key + expect { new_resource.run_action(:create) }.not_to raise_error + cron_should_exists(new_resource.name, new_resource.command) + end + end end describe "delete action" do diff --git a/spec/unit/provider/cron_spec.rb b/spec/unit/provider/cron_spec.rb index bebde66a8b..76f170312e 100644 --- a/spec/unit/provider/cron_spec.rb +++ b/spec/unit/provider/cron_spec.rb @@ -15,7 +15,6 @@ # See the License for the specific language governing permissions and # limitations under the License. # - require "spec_helper" describe Chef::Provider::Cron do @@ -322,7 +321,7 @@ describe Chef::Provider::Cron do expect(cron.hour).to eq("5") expect(cron.day).to eq("*") expect(cron.month).to eq("Jan") - expect(cron.weekday).to eq("Mon") + expect(cron.weekday).to eq("1") expect(cron.command).to eq("/bin/true param1 param2") end @@ -338,6 +337,7 @@ describe Chef::Provider::Cron do 0 2 * * * /some/other/command # Chef Name: cronhole some stuff + * * * * * /bin/true CRONTAB cron = @provider.load_current_resource expect(@provider.cron_exists).to eq(true) @@ -347,7 +347,7 @@ describe Chef::Provider::Cron do expect(cron.month).to eq("*") expect(cron.weekday).to eq("*") expect(cron.time).to eq(nil) - expect(cron.command).to eq(nil) + expect(cron.command).to eq("/bin/true") end it "should not pick up a commented out crontab line" do @@ -355,6 +355,7 @@ describe Chef::Provider::Cron do 0 2 * * * /some/other/command # Chef Name: cronhole some stuff + * * * * * /bin/true #* 5 * 1 * /bin/true param1 param2 CRONTAB cron = @provider.load_current_resource @@ -365,7 +366,7 @@ describe Chef::Provider::Cron do expect(cron.month).to eq("*") expect(cron.weekday).to eq("*") expect(cron.time).to eq(nil) - expect(cron.command).to eq(nil) + expect(cron.command).to eq("/bin/true") end it "should not pick up a later crontab entry" do @@ -373,6 +374,7 @@ describe Chef::Provider::Cron do 0 2 * * * /some/other/command # Chef Name: cronhole some stuff + * * * * * /bin/true #* 5 * 1 * /bin/true param1 param2 # Chef Name: something else 2 * 1 * * /bin/false @@ -387,7 +389,7 @@ describe Chef::Provider::Cron do expect(cron.month).to eq("*") expect(cron.weekday).to eq("*") expect(cron.time).to eq(nil) - expect(cron.command).to eq(nil) + expect(cron.command).to eq("/bin/true") end end end @@ -1040,48 +1042,6 @@ describe Chef::Provider::Cron do end end - describe "weekday_in_crontab" do - context "when weekday is symbol" do - it "should return weekday in crontab format" do - @new_resource.weekday :wednesday - expect(@provider.send(:weekday_in_crontab)).to eq("3") - end - - it "should raise an error with an unknown weekday" do - expect { @new_resource.weekday :caturday }.to raise_error(RangeError) - end - end - - context "when weekday is a number in a string" do - it "should return the string" do - @new_resource.weekday "3" - expect(@provider.send(:weekday_in_crontab)).to eq("3") - end - - it "should raise an error with an out of range number" do - expect { @new_resource.weekday "-1" }.to raise_error(RangeError) - end - end - - context "when weekday is string with the name of the week" do - it "should return the string" do - @new_resource.weekday "mon" - expect(@provider.send(:weekday_in_crontab)).to eq("mon") - end - end - - context "when weekday is an integer" do - it "should return the integer" do - @new_resource.weekday 1 - expect(@provider.send(:weekday_in_crontab)).to eq("1") - end - - it "should raise an error with an out of range integer" do - expect { @new_resource.weekday 45 }.to raise_error(RangeError) - end - end - end - describe "#env_var_str" do context "when no env vars are set" do it "returns an empty string" do @@ -1196,8 +1156,8 @@ describe Chef::Provider::Cron do context "Without command, passed" do context "as nil" do it "returns an empty string with a next line" do - @new_resource.command nil - expect(@provider.send(:cmd_str)).to eq(" \n") + @new_resource.command "bin/true" + expect(@provider.send(:cmd_str)).to eq(" bin/true\n") end end context "as an empty string" do diff --git a/spec/unit/resource/cron_spec.rb b/spec/unit/resource/cron_spec.rb index 4322d6c24b..c9dbef06c6 100644 --- a/spec/unit/resource/cron_spec.rb +++ b/spec/unit/resource/cron_spec.rb @@ -132,10 +132,10 @@ describe Chef::Resource::Cron do describe "weekday" do it "rejects any weekday over 7" do - expect { resource.weekday "8" }.to raise_error(RangeError) + expect { resource.weekday "8" }.to raise_error(Chef::Exceptions::ValidationFailed) end it "rejects any symbols which don't represent day of week" do - expect { resource.weekday :foo }.to raise_error(RangeError) + expect { resource.weekday :foo }.to raise_error(Chef::Exceptions::ValidationFailed) end end diff --git a/spec/unit/resource/helpers/cron_validations_spec.rb b/spec/unit/resource/helpers/cron_validations_spec.rb index 6b7d8f592c..9ec58e8b5f 100644 --- a/spec/unit/resource/helpers/cron_validations_spec.rb +++ b/spec/unit/resource/helpers/cron_validations_spec.rb @@ -34,8 +34,12 @@ describe Chef::ResourceHelpers::CronValidations do expect(Chef::ResourceHelpers::CronValidations.validate_dow(8)).to be false end + it "it accepts the string day with full name" do + expect(Chef::ResourceHelpers::CronValidations.validate_dow("monday")).to be true + end + it "returns false for an invalid string" do - expect(Chef::ResourceHelpers::CronValidations.validate_dow("monday")).to be false + expect(Chef::ResourceHelpers::CronValidations.validate_dow("funday")).to be false end end |