diff --git a/app/jobs/jobbase.go b/app/jobs/jobbase.go index 19fab0f3..49561ebd 100644 --- a/app/jobs/jobbase.go +++ b/app/jobs/jobbase.go @@ -209,7 +209,7 @@ func (e *ExecJob) addJob(c *cron.Cron) (int, error) { // Remove 移除任务 func Remove(c *cron.Cron, entryID int) chan bool { - ch := make(chan bool) + ch := make(chan bool, 1) go func() { c.Remove(cron.EntryID(entryID)) fmt.Println(time.Now().Format(timeFormat), " [INFO] JobCore Remove success ,info entryID :", entryID) diff --git a/app/jobs/service/sys_job.go b/app/jobs/service/sys_job.go index d27b5402..401b6750 100644 --- a/app/jobs/service/sys_job.go +++ b/app/jobs/service/sys_job.go @@ -39,7 +39,7 @@ func (e *SysJob) RemoveJob(c *dto.GeneralDelDto) error { } case <-time.After(time.Second * 1): e.Msg = "操作超时!" - return nil + return errors.New(e.Msg) } return nil } diff --git a/app/jobs/service/sys_job_test.go b/app/jobs/service/sys_job_test.go new file mode 100644 index 00000000..8447c519 --- /dev/null +++ b/app/jobs/service/sys_job_test.go @@ -0,0 +1,88 @@ +package service + +import ( + "testing" + "time" + + "github.com/glebarez/sqlite" + coreservice "github.com/go-admin-team/go-admin-core/v2/sdk/service" + "github.com/robfig/cron/v3" + "gorm.io/gorm" + + "go-admin/app/jobs/models" + "go-admin/common/dto" +) + +type blockedSchedule struct { + started chan struct{} + release chan struct{} +} + +func (s blockedSchedule) Next(now time.Time) time.Time { + close(s.started) + <-s.release + return now.Add(time.Hour) +} + +func TestRemoveJob(t *testing.T) { + for _, blocked := range []bool{false, true} { + name := "success" + if blocked { + name = "timeout" + } + t.Run(name, func(t *testing.T) { + db, err := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{}) + if err != nil { + t.Fatal(err) + } + sqlDB, err := db.DB() + if err != nil { + t.Fatal(err) + } + t.Cleanup(func() { _ = sqlDB.Close() }) + if err := db.AutoMigrate(&models.SysJob{}); err != nil { + t.Fatal(err) + } + + c := cron.New() + schedule := blockedSchedule{make(chan struct{}), make(chan struct{})} + entryID := c.Schedule(schedule, cron.FuncJob(func() {})) + if blocked { + c.Start() + t.Cleanup(func() { + close(schedule.release) + <-c.Stop().Done() + }) + select { + case <-schedule.started: + case <-time.After(5 * time.Second): + t.Fatal("scheduler did not start") + } + } + job := models.SysJob{EntryId: int(entryID)} + if err := db.Create(&job).Error; err != nil { + t.Fatal(err) + } + s := SysJob{Service: coreservice.Service{Orm: db}, Cron: c} + err = s.RemoveJob(&dto.GeneralDelDto{Id: job.JobId}) + if blocked { + if err == nil || err.Error() != "操作超时!" { + t.Errorf("RemoveJob error = %v, want timeout error", err) + } + } else if err != nil { + t.Fatal(err) + } + var saved models.SysJob + if err := db.First(&saved, job.JobId).Error; err != nil { + t.Fatal(err) + } + wantEntryID := 0 + if blocked { + wantEntryID = int(entryID) + } + if saved.EntryId != wantEntryID { + t.Errorf("entry_id = %d, want %d", saved.EntryId, wantEntryID) + } + }) + } +}