github.com/Schaudge/grailbase@v0.0.0-20240223061707-44c758a471c0/sync/ctxsync/cond_test.go (about)

     1  // Copyright 2018 GRAIL, Inc. All rights reserved.
     2  // Use of this source code is governed by the Apache 2.0
     3  // license that can be found in the LICENSE file.
     4  
     5  package ctxsync
     6  
     7  import (
     8  	"context"
     9  	"sync"
    10  	"testing"
    11  )
    12  
    13  func TestContextCond(t *testing.T) {
    14  	var (
    15  		mu          sync.Mutex
    16  		cond        = NewCond(&mu)
    17  		start, done sync.WaitGroup
    18  	)
    19  	const N = 100
    20  	start.Add(N)
    21  	done.Add(N)
    22  	errs := make([]error, N)
    23  	for i := 0; i < N; i++ {
    24  		go func(idx int) {
    25  			mu.Lock()
    26  			start.Done()
    27  			if err := cond.Wait(context.Background()); err != nil {
    28  				errs[idx] = err
    29  			}
    30  			mu.Unlock()
    31  			done.Done()
    32  		}(i)
    33  	}
    34  
    35  	start.Wait()
    36  	mu.Lock()
    37  	cond.Broadcast()
    38  	mu.Unlock()
    39  	done.Wait()
    40  	for _, err := range errs {
    41  		if err != nil {
    42  			t.Fatal(err)
    43  		}
    44  	}
    45  }
    46  
    47  func TestContextCondErr(t *testing.T) {
    48  	var (
    49  		mu   sync.Mutex
    50  		cond = NewCond(&mu)
    51  	)
    52  	ctx, cancel := context.WithCancel(context.Background())
    53  	cancel()
    54  	mu.Lock()
    55  	if got, want := cond.Wait(ctx), context.Canceled; got != want {
    56  		t.Errorf("got %v, want %v", got, want)
    57  	}
    58  }