mirror of
https://gitee.com/johng/gf
synced 2026-06-07 02:12:11 +08:00
82 lines
1.3 KiB
Go
82 lines
1.3 KiB
Go
package semaphore
|
|
|
|
import (
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
func TestSemaphoreAcquireRelease(t *testing.T) {
|
|
sem := New(3, 1*time.Second)
|
|
|
|
for i := 0; i < 10; i++ {
|
|
if err := sem.Acquire(); err != nil {
|
|
t.Error(err)
|
|
}
|
|
if err := sem.Acquire(); err != nil {
|
|
t.Error(err)
|
|
}
|
|
if err := sem.Acquire(); err != nil {
|
|
t.Error(err)
|
|
}
|
|
sem.Release()
|
|
sem.Release()
|
|
sem.Release()
|
|
}
|
|
}
|
|
|
|
func TestSemaphoreBlockTimeout(t *testing.T) {
|
|
sem := New(1, 200*time.Millisecond)
|
|
|
|
if err := sem.Acquire(); err != nil {
|
|
t.Error(err)
|
|
}
|
|
|
|
start := time.Now()
|
|
if err := sem.Acquire(); err != ErrNoTickets {
|
|
t.Error(err)
|
|
}
|
|
if start.Add(200 * time.Millisecond).After(time.Now()) {
|
|
t.Error("semaphore did not wait long enough")
|
|
}
|
|
|
|
sem.Release()
|
|
if err := sem.Acquire(); err != nil {
|
|
t.Error(err)
|
|
}
|
|
}
|
|
|
|
func TestSemaphoreEmpty(t *testing.T) {
|
|
sem := New(2, 200*time.Millisecond)
|
|
|
|
if !sem.IsEmpty() {
|
|
t.Error("semaphore should be empty")
|
|
}
|
|
|
|
sem.Acquire()
|
|
|
|
if sem.IsEmpty() {
|
|
t.Error("semaphore should not be empty")
|
|
}
|
|
|
|
sem.Release()
|
|
|
|
if !sem.IsEmpty() {
|
|
t.Error("semaphore should be empty")
|
|
}
|
|
}
|
|
|
|
func ExampleSemaphore() {
|
|
sem := New(3, 1*time.Second)
|
|
|
|
for i := 0; i < 10; i++ {
|
|
go func() {
|
|
if err := sem.Acquire(); err != nil {
|
|
return //could not acquire semaphore
|
|
}
|
|
defer sem.Release()
|
|
|
|
// do something semaphore-guarded
|
|
}()
|
|
}
|
|
}
|