github.com/MOXA-ISD/edge-library-libcompose@v0.4.1-0.20200417083957-c90441e63650/utils/util_inparallel_test.go (about)

     1  // +build !race
     2  
     3  package utils
     4  
     5  import (
     6  	"fmt"
     7  	"sync"
     8  	"testing"
     9  )
    10  
    11  type safeMap struct {
    12  	mu sync.RWMutex
    13  	m  map[int]bool
    14  }
    15  
    16  func (s *safeMap) Add(index int, ok bool) {
    17  	s.mu.Lock()
    18  	defer s.mu.Unlock()
    19  	s.m[index] = ok
    20  }
    21  
    22  func (s *safeMap) Read() map[int]bool {
    23  	s.mu.RLock()
    24  	defer s.mu.RUnlock()
    25  	return s.m
    26  }
    27  
    28  func TestInParallel(t *testing.T) {
    29  	size := 5
    30  	booleanMap := safeMap{
    31  		m: make(map[int]bool, size+1),
    32  	}
    33  	tasks := InParallel{}
    34  	for i := 0; i < size; i++ {
    35  		task := func(index int) func() error {
    36  			return func() error {
    37  				booleanMap.Add(index, true)
    38  				return nil
    39  			}
    40  		}(i)
    41  		tasks.Add(task)
    42  	}
    43  	err := tasks.Wait()
    44  	if err != nil {
    45  		t.Fatal(err)
    46  	}
    47  	// Make sure every value is true
    48  	for _, value := range booleanMap.Read() {
    49  		if !value {
    50  			t.Fatalf("booleanMap expected to contain only true values, got at least one false")
    51  		}
    52  	}
    53  }
    54  
    55  func TestInParallelError(t *testing.T) {
    56  	size := 5
    57  	booleanMap := safeMap{
    58  		m: make(map[int]bool, size+1),
    59  	}
    60  	tasks := InParallel{}
    61  	for i := 0; i < size; i++ {
    62  		task := func(index int) func() error {
    63  			return func() error {
    64  				booleanMap.Add(index, false)
    65  				t.Log("index", index)
    66  				if index%2 == 0 {
    67  					t.Log("return an error for", index)
    68  					return fmt.Errorf("Error with %v", index)
    69  				}
    70  				booleanMap.Add(index, true)
    71  				return nil
    72  			}
    73  		}(i)
    74  		tasks.Add(task)
    75  	}
    76  	err := tasks.Wait()
    77  	if err == nil {
    78  		t.Fatalf("Expected an error on Wait, got nothing.")
    79  	}
    80  	for key, value := range booleanMap.Read() {
    81  		if key%2 != 0 && !value {
    82  			t.Fatalf("booleanMap expected to contain true values on odd number, got %v", booleanMap)
    83  		}
    84  	}
    85  }