github.com/triarius/goreleaser@v1.12.5/internal/semerrgroup/sem_test.go (about) 1 package semerrgroup 2 3 import ( 4 "fmt" 5 "sync" 6 "testing" 7 "time" 8 9 "github.com/triarius/goreleaser/internal/pipe" 10 "github.com/stretchr/testify/require" 11 ) 12 13 func TestSemaphore(t *testing.T) { 14 for _, i := range []int{1, 4} { 15 t.Run(fmt.Sprintf("limit-%d", i), func(t *testing.T) { 16 g := New(i) 17 var lock sync.Mutex 18 var counter int 19 for i := 0; i < 10; i++ { 20 g.Go(func() error { 21 time.Sleep(10 * time.Millisecond) 22 lock.Lock() 23 counter++ 24 lock.Unlock() 25 return nil 26 }) 27 } 28 require.NoError(t, g.Wait()) 29 require.Equal(t, counter, 10) 30 }) 31 } 32 } 33 34 func TestSemaphoreOrder(t *testing.T) { 35 num := 10 36 g := New(1) 37 output := []int{} 38 for i := 0; i < num; i++ { 39 i := i 40 g.Go(func() error { 41 output = append(output, i) 42 return nil 43 }) 44 } 45 require.NoError(t, g.Wait()) 46 require.Equal(t, []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, output) 47 } 48 49 func TestSemaphoreError(t *testing.T) { 50 for _, i := range []int{1, 4} { 51 t.Run(fmt.Sprintf("limit-%d", i), func(t *testing.T) { 52 g := New(i) 53 var lock sync.Mutex 54 output := []int{} 55 for i := 0; i < 10; i++ { 56 i := i 57 g.Go(func() error { 58 lock.Lock() 59 defer lock.Unlock() 60 output = append(output, i) 61 return fmt.Errorf("fake err") 62 }) 63 } 64 require.EqualError(t, g.Wait(), "fake err") 65 require.Len(t, output, 10) 66 }) 67 } 68 } 69 70 func TestSemaphoreSkipAware(t *testing.T) { 71 for _, i := range []int{1, 4} { 72 t.Run(fmt.Sprintf("limit-%d", i), func(t *testing.T) { 73 g := NewSkipAware(New(i)) 74 var lock sync.Mutex 75 var counter int 76 for i := 0; i < 10; i++ { 77 g.Go(func() error { 78 time.Sleep(10 * time.Millisecond) 79 lock.Lock() 80 counter++ 81 lock.Unlock() 82 return pipe.Skip("fake skip") 83 }) 84 } 85 require.EqualError(t, g.Wait(), "fake skip") 86 require.Equal(t, counter, 10) 87 }) 88 } 89 } 90 91 func TestSemaphoreSkipAndRealError(t *testing.T) { 92 g := NewSkipAware(New(10)) 93 for i := 0; i < 100; i++ { 94 g.Go(func() error { 95 time.Sleep(10 * time.Millisecond) 96 return pipe.Skip("fake skip") 97 }) 98 } 99 g.Go(func() error { 100 time.Sleep(10 * time.Millisecond) 101 return fmt.Errorf("errrrrr") 102 }) 103 require.EqualError(t, g.Wait(), "errrrrr") 104 }