mirror of
https://gitee.com/dromara/mayfly-go
synced 2025-11-30 04:50:26 +08:00
!84 fix: 修复数据库备份与恢复问题
* refactor dbScheduler * fix: 按团队名称检索团队 * feat: 创建数据库资源时支持全选数据库 * refactor dbScheduler * fix: 修复数据库备份与恢复问题
This commit is contained in:
@@ -2,6 +2,7 @@ package runner
|
||||
|
||||
import (
|
||||
"context"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
"mayfly-go/pkg/utils/timex"
|
||||
"sync"
|
||||
@@ -11,72 +12,35 @@ import (
|
||||
|
||||
var _ Job = &testJob{}
|
||||
|
||||
func newTestJob(key string, runTime time.Duration) *testJob {
|
||||
func newTestJob(key string) *testJob {
|
||||
return &testJob{
|
||||
deadline: time.Now(),
|
||||
Key: key,
|
||||
run: func(ctx context.Context) {
|
||||
timex.SleepWithContext(ctx, runTime)
|
||||
},
|
||||
Key: key,
|
||||
}
|
||||
}
|
||||
|
||||
type testJob struct {
|
||||
run RunFunc
|
||||
Key JobKey
|
||||
status JobStatus
|
||||
ran bool
|
||||
deadline time.Time
|
||||
Key JobKey
|
||||
status int
|
||||
}
|
||||
|
||||
func (t *testJob) Update(_ Job) {
|
||||
}
|
||||
|
||||
func (t *testJob) GetDeadline() time.Time {
|
||||
return t.deadline
|
||||
}
|
||||
|
||||
func (t *testJob) Schedule() bool {
|
||||
return !t.ran
|
||||
}
|
||||
|
||||
func (t *testJob) Run(ctx context.Context) {
|
||||
if t.run == nil {
|
||||
return
|
||||
}
|
||||
t.run(ctx)
|
||||
t.ran = true
|
||||
}
|
||||
|
||||
func (t *testJob) Runnable(_ NextFunc) bool {
|
||||
return true
|
||||
}
|
||||
func (t *testJob) Update(_ Job) {}
|
||||
|
||||
func (t *testJob) GetKey() JobKey {
|
||||
return t.Key
|
||||
}
|
||||
|
||||
func (t *testJob) GetStatus() JobStatus {
|
||||
return t.status
|
||||
}
|
||||
|
||||
func (t *testJob) SetStatus(status JobStatus) {
|
||||
t.status = status
|
||||
}
|
||||
|
||||
func TestRunner_Close(t *testing.T) {
|
||||
runner := NewRunner[*testJob](1)
|
||||
signal := make(chan struct{}, 1)
|
||||
waiting := sync.WaitGroup{}
|
||||
waiting.Add(1)
|
||||
runner := NewRunner[*testJob](1, func(ctx context.Context, job *testJob) {
|
||||
waiting.Done()
|
||||
timex.SleepWithContext(ctx, time.Hour)
|
||||
signal <- struct{}{}
|
||||
})
|
||||
go func() {
|
||||
job := &testJob{
|
||||
Key: "close",
|
||||
run: func(ctx context.Context) {
|
||||
waiting.Done()
|
||||
timex.SleepWithContext(ctx, time.Hour)
|
||||
signal <- struct{}{}
|
||||
},
|
||||
}
|
||||
_ = runner.Add(context.Background(), job)
|
||||
}()
|
||||
@@ -95,55 +59,65 @@ func TestRunner_AddJob(t *testing.T) {
|
||||
type testCase struct {
|
||||
name string
|
||||
job *testJob
|
||||
want bool
|
||||
want error
|
||||
}
|
||||
testCases := []testCase{
|
||||
{
|
||||
name: "first job",
|
||||
job: newTestJob("single", time.Hour),
|
||||
want: true,
|
||||
job: newTestJob("single"),
|
||||
want: nil,
|
||||
},
|
||||
{
|
||||
name: "second job",
|
||||
job: newTestJob("dual", time.Hour),
|
||||
want: true,
|
||||
},
|
||||
{
|
||||
name: "non repetitive job",
|
||||
job: newTestJob("single", time.Hour),
|
||||
want: true,
|
||||
job: newTestJob("dual"),
|
||||
want: nil,
|
||||
},
|
||||
{
|
||||
name: "repetitive job",
|
||||
job: newTestJob("dual", time.Hour),
|
||||
want: true,
|
||||
job: newTestJob("dual"),
|
||||
want: ErrExist,
|
||||
},
|
||||
}
|
||||
runner := NewRunner[*testJob](1)
|
||||
runner := NewRunner[*testJob](1, func(ctx context.Context, job *testJob) {
|
||||
timex.SleepWithContext(ctx, time.Hour)
|
||||
})
|
||||
defer runner.Close()
|
||||
for _, tc := range testCases {
|
||||
err := runner.Add(context.Background(), tc.job)
|
||||
if tc.want != nil {
|
||||
require.ErrorIs(t, err, tc.want)
|
||||
continue
|
||||
}
|
||||
require.NoError(t, err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestJob_UpdateStatus(t *testing.T) {
|
||||
const d = time.Millisecond * 20
|
||||
runner := NewRunner[*testJob](1)
|
||||
running := newTestJob("running", d*2)
|
||||
waiting := newTestJob("waiting", d*2)
|
||||
_ = runner.Add(context.Background(), running)
|
||||
_ = runner.Add(context.Background(), waiting)
|
||||
const (
|
||||
unknown = iota
|
||||
running
|
||||
finished
|
||||
)
|
||||
runner := NewRunner[*testJob](1, func(ctx context.Context, job *testJob) {
|
||||
job.status = running
|
||||
timex.SleepWithContext(ctx, d*2)
|
||||
job.status = finished
|
||||
})
|
||||
first := newTestJob("first")
|
||||
second := newTestJob("second")
|
||||
_ = runner.Add(context.Background(), first)
|
||||
_ = runner.Add(context.Background(), second)
|
||||
|
||||
time.Sleep(d)
|
||||
require.Equal(t, JobRunning, running.status)
|
||||
require.Equal(t, JobWaiting, waiting.status)
|
||||
assert.Equal(t, running, first.status)
|
||||
assert.Equal(t, unknown, second.status)
|
||||
|
||||
time.Sleep(d * 2)
|
||||
require.Equal(t, JobRemoved, running.status)
|
||||
require.Equal(t, JobRunning, waiting.status)
|
||||
assert.Equal(t, finished, first.status)
|
||||
assert.Equal(t, running, second.status)
|
||||
|
||||
time.Sleep(d * 2)
|
||||
require.Equal(t, JobRemoved, running.status)
|
||||
require.Equal(t, JobRemoved, waiting.status)
|
||||
assert.Equal(t, finished, first.status)
|
||||
assert.Equal(t, finished, second.status)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user