| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- // 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()
- }
|