From c8a1110a96f61ba88bc97ff0ce5b72de4ad10c08 Mon Sep 17 00:00:00 2001 From: ridwanakf Date: Sat, 11 Jul 2020 17:36:36 +0700 Subject: [PATCH 1/3] add corner test case --- scheduler_test.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/scheduler_test.go b/scheduler_test.go index 7b717904..cf5ee7ca 100644 --- a/scheduler_test.go +++ b/scheduler_test.go @@ -369,11 +369,12 @@ func TestRemove(t *testing.T) { scheduler := NewScheduler(time.UTC) scheduler.Every(1).Minute().Do(task) scheduler.Every(1).Minute().Do(taskWithParams, 1, "hello") + scheduler.Every(1).Minute().Do(task) - assert.Equal(t, 2, scheduler.Len(), "Incorrect number of jobs") + assert.Equal(t, 3, scheduler.Len(), "Incorrect number of jobs") scheduler.Remove(task) - assert.Equal(t, 1, scheduler.Len(), "Incorrect number of jobs after removing 1 job") + assert.Equal(t, 1, scheduler.Len(), "Incorrect number of jobs after removing 2 job") scheduler.Remove(task) assert.Equal(t, 1, scheduler.Len(), "Incorrect number of jobs after removing non-existent job") From 0e454821ad628fa1799b2f70cdf46f465d48dee2 Mon Sep 17 00:00:00 2001 From: ridwanakf Date: Sat, 11 Jul 2020 17:37:04 +0700 Subject: [PATCH 2/3] bugfix removeByCondition slice bounds out of range --- scheduler.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/scheduler.go b/scheduler.go index bfbcfcf8..f8481518 100644 --- a/scheduler.go +++ b/scheduler.go @@ -213,9 +213,11 @@ func (s *Scheduler) RemoveByReference(j *Job) { } func (s *Scheduler) removeByCondition(shouldRemove func(*Job) bool) { - for i, job := range s.jobs { - if shouldRemove(job) { + for i := 0; i < len(s.jobs); { + if shouldRemove(s.jobs[i]) { s.jobs = removeAtIndex(s.jobs, i) + } else { + i++ } } } From e5c1592735edd34ab601e45783320ea6717350a4 Mon Sep 17 00:00:00 2001 From: ridwanakf Date: Tue, 14 Jul 2020 00:18:21 +0700 Subject: [PATCH 3/3] change logic by retaining job instead --- scheduler.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/scheduler.go b/scheduler.go index f8481518..d004c576 100644 --- a/scheduler.go +++ b/scheduler.go @@ -213,13 +213,13 @@ func (s *Scheduler) RemoveByReference(j *Job) { } func (s *Scheduler) removeByCondition(shouldRemove func(*Job) bool) { - for i := 0; i < len(s.jobs); { - if shouldRemove(s.jobs[i]) { - s.jobs = removeAtIndex(s.jobs, i) - } else { - i++ + retainedJobs := make([]*Job, 0) + for _, job := range s.jobs { + if !shouldRemove(job) { + retainedJobs = append(retainedJobs, job) } } + s.jobs = retainedJobs } // RemoveJobByTag will Remove Jobs by Tag