package progress import ( "context" "fmt" "testing" "time" ) func TestProgressManager(t *testing.T) { c := make(chan struct{}) m := NewProgressManager() taskId := m.StartTask(context.Background(), "testing", func(ctx context.Context, progress IProgressReporter) error { defer close(c) progress.SetTotal(100) for range 100 { progress.AddProgress(1) time.Sleep(110 * time.Millisecond) } return nil }) go func() { task, _ := m.GetTask(taskId) for { select { case <-c: return default: } progress, total := task.Progress.Get() if total != 0 { fmt.Printf("task %s progress: %.2f%%\n", task.Name, float64(progress)/float64(total)*100) if progress == total { return } } time.Sleep(300 * time.Millisecond) } }() <-c }