|
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() |
|
|
|
if num.Load() != 100 { |
|
t.Errorf("num error, num: %d", num.Load()) |
|
} else { |
|
t.Logf("num success, num: %d", num.Load()) |
|
} |
|
} |
|
|