Skip to content

Commit 195e292

Browse files
committed
add tests and cleanup when context stop
1 parent 3dc84f4 commit 195e292

2 files changed

Lines changed: 79 additions & 1 deletion

File tree

internal/tasks/tasks.go

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package tasks
22

33
import (
4+
"context"
45
"fmt"
56
"time"
67

@@ -70,7 +71,7 @@ func (ts *Tasks) Cleanup(failed int) {
7071
}
7172

7273
// Execute tasks with interactive display and cleanup on fail
73-
func (ts *Tasks) Execute(data interface{}) (interface{}, error) {
74+
func (ts *Tasks) Execute(ctx context.Context, data interface{}) (interface{}, error) {
7475
var err error
7576
totalTasks := len(ts.tasks)
7677
spin := spinner.New(spinner.CharSets[11], 100*time.Millisecond)
@@ -88,6 +89,15 @@ func (ts *Tasks) Execute(data interface{}) (interface{}, error) {
8889
return nil, fmt.Errorf("task %d %q failed: %w", i+1, task.Name, err)
8990
}
9091

92+
select {
93+
case <-ctx.Done():
94+
spin.Stop()
95+
fmt.Println("context canceled, cleaning up created resources")
96+
ts.Cleanup(i + 1)
97+
return nil, fmt.Errorf("task %d %q failed: context canceled", i+1, task.Name)
98+
default:
99+
}
100+
91101
spin.Stop()
92102
}
93103

internal/tasks/tasks_test.go

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
package tasks_test
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"testing"
7+
8+
"github.com/alecthomas/assert"
9+
"github.com/scaleway/scaleway-cli/v2/internal/tasks"
10+
)
11+
12+
func TestCleanup(t *testing.T) {
13+
ts := tasks.Begin()
14+
15+
clean := 0
16+
17+
tasks.AddWithCleanUp(ts, "Task 1", func(_ interface{}) (interface{}, string, error) {
18+
return nil, "", nil
19+
}, func(string) error {
20+
clean += 1
21+
return nil
22+
})
23+
tasks.AddWithCleanUp(ts, "Task 2", func(_ interface{}) (interface{}, string, error) {
24+
return nil, "", nil
25+
}, func(string) error {
26+
clean += 1
27+
return nil
28+
})
29+
tasks.AddWithCleanUp(ts, "Task 3", func(_ interface{}) (interface{}, string, error) {
30+
return nil, "", fmt.Errorf("fail")
31+
}, func(string) error {
32+
clean += 1
33+
return nil
34+
})
35+
_, err := ts.Execute(context.Background(), nil)
36+
assert.NotNil(t, err, "Execute should return error after cleanup")
37+
assert.Equal(t, clean, 2, "2 task cleanup should have been executed")
38+
}
39+
40+
func TestCleanupOnContext(t *testing.T) {
41+
ts := tasks.Begin()
42+
43+
clean := 0
44+
ctx, cancel := context.WithCancel(context.Background())
45+
46+
tasks.AddWithCleanUp(ts, "Task 1", func(_ interface{}) (interface{}, string, error) {
47+
return nil, "", nil
48+
}, func(string) error {
49+
clean += 1
50+
return nil
51+
})
52+
tasks.AddWithCleanUp(ts, "Task 2", func(_ interface{}) (interface{}, string, error) {
53+
return nil, "", nil
54+
}, func(string) error {
55+
clean += 1
56+
return nil
57+
})
58+
tasks.AddWithCleanUp(ts, "Task 3", func(_ interface{}) (interface{}, string, error) {
59+
cancel()
60+
return nil, "", nil
61+
}, func(string) error {
62+
clean += 1
63+
return nil
64+
})
65+
_, err := ts.Execute(ctx, nil)
66+
assert.NotNil(t, err)
67+
assert.Equal(t, clean, 3, "3 task cleanup should have been executed")
68+
}

0 commit comments

Comments
 (0)