diff --git a/tools/cron/cron.go b/tools/cron/cron.go index ef8cb9ab..d3f1d1d0 100644 --- a/tools/cron/cron.go +++ b/tools/cron/cron.go @@ -117,6 +117,14 @@ func (c *Cron) RemoveAll() { c.jobs = map[string]*job{} } +// Total returns the current total number of registered cron jobs. +func (c *Cron) Total() int { + c.RLock() + defer c.RUnlock() + + return len(c.jobs) +} + // Stop stops the current cron ticker (if not already). // // You can resume the ticker by calling Start(). @@ -139,9 +147,8 @@ func (c *Cron) Start() { c.Stop() c.Lock() - defer c.Unlock() - c.ticker = time.NewTicker(c.interval) + c.Unlock() go func() { for t := range c.ticker.C { diff --git a/tools/cron/cron_test.go b/tools/cron/cron_test.go index 1bf7ec84..b802067f 100644 --- a/tools/cron/cron_test.go +++ b/tools/cron/cron_test.go @@ -169,6 +169,31 @@ func TestCronRemoveAll(t *testing.T) { } } +func TestCronTotal(t *testing.T) { + c := New() + + if v := c.Total(); v != 0 { + t.Fatalf("Expected 0 jobs, got %v", v) + } + + if err := c.Add("test1", "* * * * *", func() {}); err != nil { + t.Fatal(err) + } + + if err := c.Add("test2", "* * * * *", func() {}); err != nil { + t.Fatal(err) + } + + // overwrite + if err := c.Add("test1", "* * * * *", func() {}); err != nil { + t.Fatal(err) + } + + if v := c.Total(); v != 2 { + t.Fatalf("Expected 2 jobs, got %v", v) + } +} + func TestCronStartStop(t *testing.T) { c := New()