summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTim Smith <tsmith@chef.io>2020-06-15 22:28:02 -0700
committerGitHub <noreply@github.com>2020-06-15 22:28:02 -0700
commit5314111f2ee818f905725d85b1b350d6d59eede4 (patch)
tree4816fc41a31167cfe3fc4234e3887f3cdb7ca462
parentad345a5d39e3aa36b56b94481a010dcef0571dda (diff)
parent6a28f8724d33eb5a02ed475dd883e697b0561a36 (diff)
downloadchef-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.rb12
-rw-r--r--lib/chef/resource/cron.rb157
-rw-r--r--lib/chef/resource/cron/_cron_shared.rb99
-rw-r--r--lib/chef/resource/cron/cron.rb46
-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.rb7
-rw-r--r--lib/chef/resources.rb4
-rw-r--r--spec/functional/resource/cron_spec.rb10
-rw-r--r--spec/unit/provider/cron_spec.rb58
-rw-r--r--spec/unit/resource/cron_spec.rb4
-rw-r--r--spec/unit/resource/helpers/cron_validations_spec.rb6
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