github.com/amane3/goreleaser@v0.182.0/internal/semerrgroup/sem_test.go (about)

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