From d1510f9155276d34971f86f219e37114456e4c6b Mon Sep 17 00:00:00 2001 From: Marc Boquet Date: Thu, 23 Mar 2017 19:05:20 +0100 Subject: [PATCH] Validate 'at' argument for Sidekiq::Client.push (#3407) * Validate 'at' argument for Sidekiq::Client.push * item['at'] shouldn't actually be nil --- lib/sidekiq/client.rb | 2 ++ test/test_client.rb | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/lib/sidekiq/client.rb b/lib/sidekiq/client.rb index 532d8be5..76c5b424 100644 --- a/lib/sidekiq/client.rb +++ b/lib/sidekiq/client.rb @@ -48,6 +48,7 @@ module Sidekiq # queue - the named queue to use, default 'default' # class - the worker class to call, required # args - an array of simple arguments to the perform method, must be JSON-serializable + # at - timestamp to schedule the job (optional), must be Numeric (e.g. Time.now.to_f) # retry - whether to retry this job if it fails, default true or an integer number of retries # backtrace - whether to save any error backtrace, default false # @@ -212,6 +213,7 @@ module Sidekiq raise(ArgumentError, "Job must be a Hash with 'class' and 'args' keys: { 'class' => SomeWorker, 'args' => ['bob', 1, :foo => 'bar'] }") unless item.is_a?(Hash) && item.has_key?('class'.freeze) && item.has_key?('args'.freeze) raise(ArgumentError, "Job args must be an Array") unless item['args'].is_a?(Array) raise(ArgumentError, "Job class must be either a Class or String representation of the class name") unless item['class'.freeze].is_a?(Class) || item['class'.freeze].is_a?(String) + raise(ArgumentError, "Job 'at' must be a Numeric timestamp") if item.has_key?('at'.freeze) && !item['at'].is_a?(Numeric) #raise(ArgumentError, "Arguments must be native JSON types, see https://github.com/mperham/sidekiq/wiki/Best-Practices") unless JSON.load(JSON.dump(item['args'])) == item['args'] normalized_hash(item['class'.freeze]) diff --git a/test/test_client.rb b/test/test_client.rb index d902c13f..92c468f2 100644 --- a/test/test_client.rb +++ b/test/test_client.rb @@ -23,6 +23,10 @@ class TestClient < Sidekiq::Test assert_raises ArgumentError do Sidekiq::Client.push('queue' => 'foo', 'class' => MyWorker, 'args' => 1) end + + assert_raises ArgumentError do + Sidekiq::Client.push('queue' => 'foo', 'class' => MyWorker, 'args' => [1], 'at' => Time.now) + end end end