1
0

node_traffic_sync_job_test.go 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. package job
  2. import (
  3. "sync"
  4. "testing"
  5. )
  6. func TestAtomicBool_DefaultIsFalse(t *testing.T) {
  7. var a atomicBool
  8. if a.takeAndReset() {
  9. t.Fatal("default atomicBool should report false")
  10. }
  11. }
  12. func TestAtomicBool_SetThenTakeReturnsTrueOnce(t *testing.T) {
  13. var a atomicBool
  14. a.set()
  15. if !a.takeAndReset() {
  16. t.Fatal("takeAndReset after set should return true")
  17. }
  18. if a.takeAndReset() {
  19. t.Fatal("second takeAndReset should return false (state was reset)")
  20. }
  21. }
  22. func TestAtomicBool_SetIsIdempotent(t *testing.T) {
  23. var a atomicBool
  24. a.set()
  25. a.set()
  26. a.set()
  27. if !a.takeAndReset() {
  28. t.Fatal("repeated set should still leave the flag true")
  29. }
  30. if a.takeAndReset() {
  31. t.Fatal("flag should be cleared after the first take")
  32. }
  33. }
  34. func TestAtomicBool_ConcurrentSettersExactlyOneTakeWins(t *testing.T) {
  35. var a atomicBool
  36. const setters = 100
  37. const readers = 20
  38. var wg sync.WaitGroup
  39. for range setters {
  40. wg.Go(func() {
  41. a.set()
  42. })
  43. }
  44. wg.Wait()
  45. trueCount := 0
  46. var rwg sync.WaitGroup
  47. var mu sync.Mutex
  48. for range readers {
  49. rwg.Go(func() {
  50. if a.takeAndReset() {
  51. mu.Lock()
  52. trueCount++
  53. mu.Unlock()
  54. }
  55. })
  56. }
  57. rwg.Wait()
  58. if trueCount != 1 {
  59. t.Fatalf("expected exactly one reader to observe true, got %d", trueCount)
  60. }
  61. }