fix: calling start multiple times should no-op (#901)

* fix: calling start multiple times should no-op

* give test more time after start

* add a mutex
This commit is contained in:
John Roesler 2025-11-26 13:38:55 -06:00 committed by GitHub
parent 974802ab3b
commit 9cc3be7cff
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 40 additions and 0 deletions

View File

@ -824,6 +824,11 @@ func (s *scheduler) RemoveJob(id uuid.UUID) error {
}
func (s *scheduler) Start() {
if s.started.Load() {
s.logger.Warn("gocron: scheduler already started")
return
}
select {
case <-s.shutdownCtx.Done():
case s.startCh <- struct{}{}:

View File

@ -578,6 +578,41 @@ func TestScheduler_Shutdown(t *testing.T) {
})
}
func TestScheduler_Start(t *testing.T) {
defer verifyNoGoroutineLeaks(t)
t.Run("calling start multiple times is a no-op", func(t *testing.T) {
s := newTestScheduler(t)
var counter int
var mu sync.Mutex
_, err := s.NewJob(
DurationJob(
100*time.Millisecond,
),
NewTask(
func() {
mu.Lock()
counter++
mu.Unlock()
},
),
)
require.NoError(t, err)
s.Start()
s.Start()
s.Start()
time.Sleep(1000 * time.Millisecond)
require.NoError(t, s.Shutdown())
assert.Contains(t, []int{9, 10}, counter)
})
}
func TestScheduler_NewJob(t *testing.T) {
defer verifyNoGoroutineLeaks(t)
tests := []struct {