| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- package job
- import (
- "sync"
- "testing"
- )
- func TestAtomicBool_DefaultIsFalse(t *testing.T) {
- var a atomicBool
- if a.takeAndReset() {
- t.Fatal("default atomicBool should report false")
- }
- }
- func TestAtomicBool_SetThenTakeReturnsTrueOnce(t *testing.T) {
- var a atomicBool
- a.set()
- if !a.takeAndReset() {
- t.Fatal("takeAndReset after set should return true")
- }
- if a.takeAndReset() {
- t.Fatal("second takeAndReset should return false (state was reset)")
- }
- }
- func TestAtomicBool_SetIsIdempotent(t *testing.T) {
- var a atomicBool
- a.set()
- a.set()
- a.set()
- if !a.takeAndReset() {
- t.Fatal("repeated set should still leave the flag true")
- }
- if a.takeAndReset() {
- t.Fatal("flag should be cleared after the first take")
- }
- }
- func TestAtomicBool_ConcurrentSettersExactlyOneTakeWins(t *testing.T) {
- var a atomicBool
- const setters = 100
- const readers = 20
- var wg sync.WaitGroup
- for range setters {
- wg.Go(func() {
- a.set()
- })
- }
- wg.Wait()
- trueCount := 0
- var rwg sync.WaitGroup
- var mu sync.Mutex
- for range readers {
- rwg.Go(func() {
- if a.takeAndReset() {
- mu.Lock()
- trueCount++
- mu.Unlock()
- }
- })
- }
- rwg.Wait()
- if trueCount != 1 {
- t.Fatalf("expected exactly one reader to observe true, got %d", trueCount)
- }
- }
|