76 lines
1.1 KiB
Go
76 lines
1.1 KiB
Go
// Copyright (c) 2020 Tailscale Inc & AUTHORS All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package syncs
|
|
|
|
import (
|
|
"context"
|
|
"testing"
|
|
)
|
|
|
|
func TestWaitGroupChan(t *testing.T) {
|
|
wg := NewWaitGroupChan()
|
|
|
|
wantNotDone := func() {
|
|
t.Helper()
|
|
select {
|
|
case <-wg.DoneChan():
|
|
t.Fatal("done too early")
|
|
default:
|
|
}
|
|
}
|
|
|
|
wantDone := func() {
|
|
t.Helper()
|
|
select {
|
|
case <-wg.DoneChan():
|
|
default:
|
|
t.Fatal("expected to be done")
|
|
}
|
|
}
|
|
|
|
wg.Add(2)
|
|
wantNotDone()
|
|
|
|
wg.Decr()
|
|
wantNotDone()
|
|
|
|
wg.Decr()
|
|
wantDone()
|
|
wantDone()
|
|
}
|
|
|
|
func TestClosedChan(t *testing.T) {
|
|
ch := ClosedChan()
|
|
for i := 0; i < 2; i++ {
|
|
select {
|
|
case <-ch:
|
|
default:
|
|
t.Fatal("not closed")
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestSemaphore(t *testing.T) {
|
|
s := NewSemaphore(2)
|
|
s.Acquire()
|
|
if !s.TryAcquire() {
|
|
t.Fatal("want true")
|
|
}
|
|
if s.TryAcquire() {
|
|
t.Fatal("want false")
|
|
}
|
|
ctx, cancel := context.WithCancel(context.Background())
|
|
cancel()
|
|
if s.AcquireContext(ctx) {
|
|
t.Fatal("want false")
|
|
}
|
|
s.Release()
|
|
if !s.AcquireContext(context.Background()) {
|
|
t.Fatal("want true")
|
|
}
|
|
s.Release()
|
|
s.Release()
|
|
}
|