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 }