github.com/blend/go-sdk@v1.20240719.1/async/latch_test.go (about)

     1  /*
     2  
     3  Copyright (c) 2024 - Present. Blend Labs, Inc. All rights reserved
     4  Use of this source code is governed by a MIT license that can be found in the LICENSE file.
     5  
     6  */
     7  
     8  package async
     9  
    10  import (
    11  	"testing"
    12  
    13  	"github.com/blend/go-sdk/assert"
    14  )
    15  
    16  func TestLatch(t *testing.T) {
    17  	assert := assert.New(t)
    18  
    19  	l := NewLatch()
    20  
    21  	var didStart bool
    22  	var didAbort bool
    23  	var didGetWork bool
    24  
    25  	work := make(chan bool)
    26  	workComplete := make(chan bool)
    27  
    28  	l.Starting()
    29  	assert.True(l.IsStarting())
    30  	assert.False(l.IsStarted())
    31  	assert.False(l.IsStopping())
    32  	assert.False(l.IsStopped())
    33  
    34  	go func() {
    35  		l.Started()
    36  		didStart = true
    37  		for {
    38  			select {
    39  			case <-work:
    40  				didGetWork = true
    41  				workComplete <- true
    42  			case <-l.NotifyStopping():
    43  				didAbort = true
    44  				l.Stopped()
    45  				return
    46  			}
    47  		}
    48  	}()
    49  	<-l.NotifyStarted()
    50  
    51  	work <- true
    52  	assert.True(l.IsStarted())
    53  
    54  	// wait for work to happen.
    55  	<-workComplete
    56  
    57  	// signal stop
    58  	l.Stopping()
    59  	<-l.NotifyStopped()
    60  
    61  	assert.True(didStart)
    62  	assert.True(didAbort)
    63  	assert.True(didGetWork)
    64  	assert.False(l.IsStopping())
    65  	assert.False(l.IsStarted())
    66  	assert.True(l.IsStopped())
    67  
    68  	didAbort = false
    69  	assert.False(didAbort)
    70  	assert.False(l.IsStopping())
    71  	assert.False(l.IsStarted())
    72  	assert.True(l.IsStopped())
    73  }