forked from TrueCloudLab/frostfs-node
[#901] util: implement Release
for PseudWorkerPool
Signed-off-by: Evgenii Stratonikov <evgeniy@nspcc.ru>
This commit is contained in:
parent
616013cb8a
commit
0beaed2ef4
3 changed files with 87 additions and 5 deletions
52
pkg/util/worker_pool_test.go
Normal file
52
pkg/util/worker_pool_test.go
Normal file
|
@ -0,0 +1,52 @@
|
|||
package util
|
||||
|
||||
import (
|
||||
"sync"
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestSyncWorkerPool(t *testing.T) {
|
||||
t.Run("submit to released pool", func(t *testing.T) {
|
||||
p := NewPseudoWorkerPool()
|
||||
p.Release()
|
||||
require.Equal(t, ErrPoolClosed, p.Submit(func() {}))
|
||||
})
|
||||
t.Run("create and wait", func(t *testing.T) {
|
||||
p := NewPseudoWorkerPool()
|
||||
ch1, ch2 := make(chan struct{}), make(chan struct{})
|
||||
wg := new(sync.WaitGroup)
|
||||
wg.Add(2)
|
||||
go func(t *testing.T) {
|
||||
defer wg.Done()
|
||||
err := p.Submit(newControlledReturnFunc(ch1))
|
||||
require.NoError(t, err)
|
||||
}(t)
|
||||
go func(t *testing.T) {
|
||||
defer wg.Done()
|
||||
err := p.Submit(newControlledReturnFunc(ch2))
|
||||
require.NoError(t, err)
|
||||
}(t)
|
||||
|
||||
// Make sure functions were submitted.
|
||||
<-ch1
|
||||
<-ch2
|
||||
p.Release()
|
||||
require.Equal(t, ErrPoolClosed, p.Submit(func() {}))
|
||||
|
||||
close(ch1)
|
||||
close(ch2)
|
||||
wg.Wait()
|
||||
})
|
||||
}
|
||||
|
||||
// newControlledReturnFunc returns function which signals in ch after
|
||||
// it has started and waits for some value in channel to return.
|
||||
// ch must be unbuffered.
|
||||
func newControlledReturnFunc(ch chan struct{}) func() {
|
||||
return func() {
|
||||
ch <- struct{}{}
|
||||
<-ch
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue