Skip to content

Commit

Permalink
test: for goner/urllib/schedule.go
Browse files Browse the repository at this point in the history
  • Loading branch information
dapeng committed May 22, 2024
1 parent c39e736 commit 88da187
Show file tree
Hide file tree
Showing 4 changed files with 170 additions and 10 deletions.
2 changes: 2 additions & 0 deletions goner/schedule/interface.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ type JobName string
// @Param lockTtl 锁定时长
type RunFuncOnceAt func(spec string, jobName JobName, fn func())

//go:generate sh -c "mockgen -package=schedule -self_package=github.com/gone-io/gone/goner/schedule -source=interface.go|gone mock -o mock_test.go"

type Scheduler interface {

//Cron use: Cron(run facility.RunFuncOnceAt)
Expand Down
100 changes: 100 additions & 0 deletions goner/schedule/mock_test.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

21 changes: 11 additions & 10 deletions goner/schedule/schedule.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,39 +3,40 @@ package schedule
import (
"fmt"
"github.com/gone-io/gone"
"github.com/gone-io/gone/goner/logrus"
"github.com/gone-io/gone/goner/redis"
"github.com/gone-io/gone/goner/tracer"
"github.com/robfig/cron/v3"
"time"
)

func NewSchedule() (gone.Angel, gone.GonerId) {
func NewSchedule() (gone.Goner, gone.GonerId) {
return &schedule{}, gone.IdGoneSchedule
}

type schedule struct {
gone.Flag
cronTab *cron.Cron
logrus.Logger `gone:"gone-logger"`
tracer tracer.Tracer `gone:"gone-tracer"`
Locker redis.Locker `gone:"gone-redis-locker"`
schedulers []Scheduler `gone:"*"`
cronTab *cron.Cron
gone.Logger `gone:"gone-logger"`
tracer gone.Tracer `gone:"gone-tracer"`
locker redis.Locker `gone:"gone-redis-locker"`
schedulers []Scheduler `gone:"*"`

lockTime time.Duration `gone:"config,schedule.lockTime,default=10s"`
checkPeriod time.Duration `gone:"config,schedule.checkPeriod,default=2s"`
}

func (s *schedule) Start(gone.Cemetery) error {
func (s *schedule) AfterRevive() error {
s.cronTab = cron.New(cron.WithSeconds())
return nil
}

func (s *schedule) Start(gone.Cemetery) error {
for _, o := range s.schedulers {
o.Cron(func(spec string, jobName JobName, fn func()) {
lockKey := fmt.Sprintf("lock-job:%s", jobName)

_, err := s.cronTab.AddFunc(spec, func() {
s.tracer.RecoverSetTraceId("", func() {
err := s.Locker.LockAndDo(lockKey, fn, s.lockTime, s.checkPeriod)
err := s.locker.LockAndDo(lockKey, fn, s.lockTime, s.checkPeriod)
if err != nil {
s.Warnf("cron get lock err:%v", err)
}
Expand Down
57 changes: 57 additions & 0 deletions goner/schedule/schedule_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package schedule

import (
"github.com/golang/mock/gomock"
"github.com/gone-io/gone"
"github.com/gone-io/gone/goner/config"
"github.com/gone-io/gone/goner/logrus"
"github.com/gone-io/gone/goner/redis"
"github.com/gone-io/gone/goner/tracer"
"github.com/stretchr/testify/assert"
"testing"
"time"
)

func Test_schedule_AfterRevive(t *testing.T) {
s := schedule{}
err := s.AfterRevive()
assert.Nil(t, err)
assert.NotNil(t, s.cronTab)
}

type locker struct {
gone.Flag
redis.Locker
}

func (l *locker) LockAndDo(key string, fn func(), lockTime, checkPeriod time.Duration) (err error) {
fn()
return nil
}

func Test_schedule_Start(t *testing.T) {
controller := gomock.NewController(t)
defer controller.Finish()

i := 0
scheduler := NewMockScheduler(controller)
scheduler.EXPECT().Cron(gomock.Any()).Do(func(run RunFuncOnceAt) {
run("0/1 * * * * *", "test", func() {
println("test")
i++
})
})

gone.Prepare(tracer.Priest, logrus.Priest, config.Priest, func(cemetery gone.Cemetery) error {
cemetery.Bury(&locker{}, gone.IdGoneRedisLocker)
cemetery.Bury(NewSchedule())
cemetery.Bury(scheduler)
return nil
}).AfterStart(func(in struct {
s schedule `gone:"*"`
}) {
time.Sleep(2 * time.Second)
}).AfterStop(func() {
assert.Equal(t, 2, i)
}).Run()
}

0 comments on commit 88da187

Please sign in to comment.