github.com/lingyao2333/mo-zero@v1.4.1/core/syncx/cond_test.go (about) 1 package syncx 2 3 import ( 4 "sync" 5 "testing" 6 "time" 7 8 "github.com/stretchr/testify/assert" 9 ) 10 11 func TestTimeoutCondWait(t *testing.T) { 12 var wait sync.WaitGroup 13 cond := NewCond() 14 wait.Add(2) 15 go func() { 16 cond.Wait() 17 wait.Done() 18 }() 19 time.Sleep(time.Duration(50) * time.Millisecond) 20 go func() { 21 cond.Signal() 22 wait.Done() 23 }() 24 wait.Wait() 25 } 26 27 func TestTimeoutCondWaitTimeout(t *testing.T) { 28 var wait sync.WaitGroup 29 cond := NewCond() 30 wait.Add(1) 31 go func() { 32 cond.WaitWithTimeout(time.Duration(500) * time.Millisecond) 33 wait.Done() 34 }() 35 wait.Wait() 36 } 37 38 func TestTimeoutCondWaitTimeoutRemain(t *testing.T) { 39 var wait sync.WaitGroup 40 cond := NewCond() 41 wait.Add(2) 42 ch := make(chan time.Duration, 1) 43 defer close(ch) 44 timeout := time.Duration(2000) * time.Millisecond 45 go func() { 46 remainTimeout, _ := cond.WaitWithTimeout(timeout) 47 ch <- remainTimeout 48 wait.Done() 49 }() 50 sleep(200) 51 go func() { 52 cond.Signal() 53 wait.Done() 54 }() 55 wait.Wait() 56 remainTimeout := <-ch 57 assert.True(t, remainTimeout < timeout, "expect remainTimeout %v < %v", remainTimeout, timeout) 58 assert.True(t, remainTimeout >= time.Duration(200)*time.Millisecond, 59 "expect remainTimeout %v >= 200 millisecond", remainTimeout) 60 } 61 62 func TestSignalNoWait(t *testing.T) { 63 cond := NewCond() 64 cond.Signal() 65 } 66 67 func sleep(millisecond int) { 68 time.Sleep(time.Duration(millisecond) * time.Millisecond) 69 }