package tache_test import ( "log/slog" "os" "sync/atomic" "testing" "time" "github.com/alist-org/alist/v3/pkg/tache" ) type TestTask struct { tache.Base Data string do func(*TestTask) error } func (t *TestTask) Run() error { return t.do(t) } func TestManager_Add(t *testing.T) { tm := tache.NewManager[*TestTask]() task := &TestTask{} tm.Add(task) t.Logf("%+v", task) } func TestWithRetry(t *testing.T) { tm := tache.NewManager[*TestTask](tache.WithMaxRetry(3), tache.WithWorks(1)) var num atomic.Int64 for i := int64(0); i < 10; i++ { task := &TestTask{ do: func(task *TestTask) error { num.Add(1) if num.Load() < i*3 { return tache.NewErr("test") } return nil }, } tm.Add(task) } tm.Wait() tasks := tm.GetAll() for _, task := range tasks { t.Logf("%+v", task) } } func TestWithPersistPath(t *testing.T) { tm := tache.NewManager[*TestTask](tache.WithPersistPath("./test.json")) task := &TestTask{ do: func(task *TestTask) error { return nil }, Data: "haha", } tm.Add(task) tm.Wait() t.Logf("%+v", task) time.Sleep(4 * time.Second) } func TestMultiTasks(t *testing.T) { tm := tache.NewManager[*TestTask](tache.WithWorks(3), tache.WithLogger(slog.New(slog.NewTextHandler(os.Stderr, &slog.HandlerOptions{ AddSource: true, Level: slog.LevelDebug, ReplaceAttr: nil, })))) var num atomic.Int64 for i := 0; i < 100; i++ { tm.Add(&TestTask{ do: func(task *TestTask) error { num.Add(1) return nil }, }) } tm.Wait() //time.Sleep(3 * time.Second) if num.Load() != 100 { t.Errorf("num error, num: %d", num.Load()) } else { t.Logf("num success, num: %d", num.Load()) } }