blob: f914c8848f99d0f803b1bbbf8c2a849b5b02d01c [file] [log] [blame]
Giorgi Lekveishvili77ee2dc2023-12-11 16:51:10 +04001package tasks
2
3import (
4 "fmt"
Giorgi Lekveishvili0a0ca0e2024-04-01 09:07:41 +04005 "sync"
Giorgi Lekveishvili77ee2dc2023-12-11 16:51:10 +04006 "testing"
Giorgi Lekveishvili0a0ca0e2024-04-01 09:07:41 +04007 "time"
Giorgi Lekveishvili77ee2dc2023-12-11 16:51:10 +04008)
9
10func TestLeaf(t *testing.T) {
11 l := newLeafTask("leaf", func() error {
12 return nil
13 })
14 done := make(chan error)
15 l.OnDone(func(err error) {
16 done <- err
17 })
18 go l.Start()
19 err := <-done
20 if err != nil {
21 t.Fatalf("Expected nil, got %s", err.Error())
22 }
23}
24
25func TestSequentialSuccess(t *testing.T) {
26 one := newLeafTask("one", func() error {
27 return nil
28 })
29 two := newLeafTask("two", func() error {
30 return nil
31 })
Giorgi Lekveishvili5c1b06e2024-03-28 15:19:44 +040032 l := newSequentialParentTask("parent", true, &one, &two)
Giorgi Lekveishvili77ee2dc2023-12-11 16:51:10 +040033 done := make(chan error)
34 l.OnDone(func(err error) {
35 done <- err
36 })
37 go l.Start()
38 err := <-done
39 if err != nil {
40 t.Fatalf("Expected nil, got %s", err.Error())
41 }
42}
43
44func TestSequentialFailsFirst(t *testing.T) {
45 one := newLeafTask("one", func() error {
46 return fmt.Errorf("one")
47 })
48 two := newLeafTask("two", func() error {
49 return nil
50 })
Giorgi Lekveishvili5c1b06e2024-03-28 15:19:44 +040051 l := newSequentialParentTask("parent", true, &one, &two)
Giorgi Lekveishvili77ee2dc2023-12-11 16:51:10 +040052 done := make(chan error)
53 l.OnDone(func(err error) {
54 done <- err
55 })
56 go l.Start()
57 err := <-done
58 if err == nil || err.Error() != "one" {
59 t.Fatalf("Expected one, got %s", err)
60 }
61}
62
63func TestSequentialFailsSecond(t *testing.T) {
64 one := newLeafTask("one", func() error {
65 fmt.Println("one")
66 return nil
67 })
68 two := newLeafTask("two", func() error {
69 fmt.Println("two")
70 return fmt.Errorf("two")
71 })
Giorgi Lekveishvili5c1b06e2024-03-28 15:19:44 +040072 l := newSequentialParentTask("parent", true, &one, &two)
Giorgi Lekveishvili77ee2dc2023-12-11 16:51:10 +040073 done := make(chan error)
74 l.OnDone(func(err error) {
75 done <- err
76 })
77 go l.Start()
78 err := <-done
79 if err == nil || err.Error() != "two" {
80 t.Fatalf("Expected two, got %s", err)
81 }
82}
Giorgi Lekveishvili0a0ca0e2024-04-01 09:07:41 +040083
84func TestConcurrentTaskSucceeds_WaitsForAllChildren(t *testing.T) {
85 cnt := 0
86 var m sync.Mutex
87 one := newLeafTask("one", func() error {
88 m.Lock()
89 defer m.Unlock()
90 cnt++
91 return nil
92 })
93 two := newLeafTask("two", func() error {
94 time.Sleep(1 * time.Second)
95 m.Lock()
96 defer m.Unlock()
97 cnt++
98 return nil
99 })
100 l := newConcurrentParentTask("parent", true, &one, &two)
101 done := make(chan error)
102 l.OnDone(func(err error) {
103 done <- err
104 })
105 go l.Start()
106 err := <-done
107 if err != nil {
108 t.Fatalf("Expected nil, got %s", err.Error())
109 }
110 if cnt != 2 {
111 t.Fatalf("Expected 2, got %d", cnt)
112 }
113}