@@ -5,36 +5,78 @@ import (
55 "fmt"
66 "os"
77 "runtime"
8+ "strconv"
9+ "strings"
810 "testing"
911 "time"
1012
1113 "github.com/alecthomas/assert"
1214 "github.com/scaleway/scaleway-cli/v2/internal/tasks"
1315)
1416
17+ func TestGeneric (t * testing.T ) {
18+ ts := tasks .Begin ()
19+
20+ tasks .Add (ts , "convert int to string" , func (t * tasks.Task , args int ) (nextArgs string , err error ) {
21+ return fmt .Sprintf ("%d" , args ), nil
22+ })
23+ tasks .Add (ts , "convert string to int and divide by 4" , func (t * tasks.Task , args string ) (nextArgs int , err error ) {
24+ i , err := strconv .ParseInt (args , 10 , 32 )
25+ if err != nil {
26+ return 0 , err
27+ }
28+ return int (i ) / 4 , nil
29+ })
30+
31+ res , err := ts .Execute (context .Background (), 12 )
32+ assert .Nil (t , err )
33+ assert .Equal (t , 3 , res )
34+ }
35+
36+ func TestInvalidGeneric (t * testing.T ) {
37+ defer func () {
38+ if r := recover (); r == nil {
39+ t .Errorf ("The code did not panic" )
40+ }
41+ }()
42+
43+ ts := tasks .Begin ()
44+
45+ tasks .Add (ts , "convert int to string" , func (t * tasks.Task , args int ) (nextArgs string , err error ) {
46+ return fmt .Sprintf ("%d" , args ), nil
47+ })
48+ tasks .Add (ts , "divide by 4" , func (t * tasks.Task , args int ) (nextArgs int , err error ) {
49+ return args / 4 , nil
50+ })
51+ }
52+
1553func TestCleanup (t * testing.T ) {
1654 ts := tasks .Begin ()
1755
1856 clean := 0
1957
20- tasks .AddWithCleanUp (ts , "Task 1" , func (context.Context , interface {}) (interface {}, string , error ) {
21- return nil , "" , nil
22- }, func (context.Context , string ) error {
23- clean ++
24- return nil
58+ tasks .Add (ts , "TaskFunc 1" , func (task * tasks.Task , args interface {}) (nextArgs interface {}, err error ) {
59+ task .AddToCleanUp (func (ctx context.Context ) error {
60+ clean ++
61+ return nil
62+ })
63+ return nil , nil
2564 })
26- tasks .AddWithCleanUp (ts , "Task 2" , func (context.Context , interface {}) (interface {}, string , error ) {
27- return nil , "" , nil
28- }, func (context.Context , string ) error {
29- clean ++
30- return nil
65+ tasks .Add (ts , "TaskFunc 2" , func (task * tasks.Task , args interface {}) (nextArgs interface {}, err error ) {
66+ task .AddToCleanUp (func (ctx context.Context ) error {
67+ clean ++
68+ return nil
69+ })
70+ return nil , nil
3171 })
32- tasks .AddWithCleanUp (ts , "Task 3" , func (context.Context , interface {}) (interface {}, string , error ) {
33- return nil , "" , fmt .Errorf ("fail" )
34- }, func (context.Context , string ) error {
35- clean ++
36- return nil
72+ tasks .Add (ts , "TaskFunc 3" , func (task * tasks.Task , args interface {}) (nextArgs interface {}, err error ) {
73+ task .AddToCleanUp (func (ctx context.Context ) error {
74+ clean ++
75+ return nil
76+ })
77+ return nil , fmt .Errorf ("fail" )
3778 })
79+
3880 _ , err := ts .Execute (context .Background (), nil )
3981 assert .NotNil (t , err , "Execute should return error after cleanup" )
4082 assert .Equal (t , clean , 2 , "2 task cleanup should have been executed" )
@@ -49,48 +91,46 @@ func TestCleanupOnContext(t *testing.T) {
4991 clean := 0
5092 ctx := context .Background ()
5193
52- tasks .AddWithCleanUp (ts , "Task 1" ,
53- func (context.Context , interface {}) (interface {}, string , error ) {
54- return nil , "" , nil
55- }, func (context.Context , string ) error {
94+ tasks .Add (ts , "TaskFunc 1" , func (task * tasks.Task , args interface {}) (nextArgs interface {}, err error ) {
95+ task .AddToCleanUp (func (ctx context.Context ) error {
5696 clean ++
5797 return nil
58- },
59- )
60- tasks .AddWithCleanUp (ts , "Task 2" ,
61- func (context.Context , interface {}) (interface {}, string , error ) {
62- return nil , "" , nil
63- }, func (context.Context , string ) error {
98+ })
99+ return nil , nil
100+ })
101+ tasks .Add (ts , "TaskFunc 2" , func (task * tasks.Task , args interface {}) (nextArgs interface {}, err error ) {
102+ task .AddToCleanUp (func (ctx context.Context ) error {
64103 clean ++
65104 return nil
66- },
67- )
68- tasks .AddWithCleanUp (ts , "Task 3" ,
69- func (ctx context.Context , _ interface {}) (interface {}, string , error ) {
70- p , err := os .FindProcess (os .Getpid ())
71- if err != nil {
72- return nil , "" , err
73- }
74-
75- // Interrupt tasks, as done with Ctrl-C
76- err = p .Signal (os .Interrupt )
77- if err != nil {
78- t .Fatal (err )
79- }
80-
81- select {
82- case <- time .After (time .Second ):
83- return nil , "" , nil
84- case <- ctx .Done ():
85- return nil , "" , fmt .Errorf ("interrupted" )
86- }
87- }, func (context.Context , string ) error {
105+ })
106+ return nil , nil
107+ })
108+ tasks .Add (ts , "TaskFunc 3" , func (task * tasks.Task , args interface {}) (nextArgs interface {}, err error ) {
109+ task .AddToCleanUp (func (ctx context.Context ) error {
88110 clean ++
89111 return nil
90- },
91- )
112+ })
113+ p , err := os .FindProcess (os .Getpid ())
114+ if err != nil {
115+ return nil , err
116+ }
117+
118+ // Interrupt tasks, as done with Ctrl-C
119+ err = p .Signal (os .Interrupt )
120+ if err != nil {
121+ t .Fatal (err )
122+ }
123+
124+ select {
125+ case <- task .Ctx .Done ():
126+ return nil , fmt .Errorf ("interrupted" )
127+ case <- time .After (time .Second * 3 ):
128+ return nil , nil
129+ }
130+ })
92131
93132 _ , err := ts .Execute (ctx , nil )
94133 assert .NotNil (t , err , "context should have been interrupted" )
134+ assert .True (t , strings .Contains (err .Error (), "interrupted" ), "error is not interrupted: %s" , err )
95135 assert .Equal (t , clean , 2 , "2 task cleanup should have been executed" )
96136}
0 commit comments