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  }