atomicerror_test.go 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. package errorx
  2. import (
  3. "errors"
  4. "sync"
  5. "sync/atomic"
  6. "testing"
  7. "github.com/stretchr/testify/assert"
  8. )
  9. var errDummy = errors.New("hello")
  10. func TestAtomicError(t *testing.T) {
  11. var err AtomicError
  12. err.Set(errDummy)
  13. assert.Equal(t, errDummy, err.Load())
  14. }
  15. func TestAtomicErrorSetNil(t *testing.T) {
  16. var (
  17. errNil error
  18. err AtomicError
  19. )
  20. err.Set(errNil)
  21. assert.Equal(t, errNil, err.Load())
  22. }
  23. func TestAtomicErrorNil(t *testing.T) {
  24. var err AtomicError
  25. assert.Nil(t, err.Load())
  26. }
  27. func BenchmarkAtomicError(b *testing.B) {
  28. var aerr AtomicError
  29. wg := sync.WaitGroup{}
  30. b.Run("Load", func(b *testing.B) {
  31. var done uint32
  32. go func() {
  33. for {
  34. if atomic.LoadUint32(&done) != 0 {
  35. break
  36. }
  37. wg.Add(1)
  38. go func() {
  39. aerr.Set(errDummy)
  40. wg.Done()
  41. }()
  42. }
  43. }()
  44. b.ResetTimer()
  45. for i := 0; i < b.N; i++ {
  46. _ = aerr.Load()
  47. }
  48. b.StopTimer()
  49. atomic.StoreUint32(&done, 1)
  50. wg.Wait()
  51. })
  52. b.Run("Set", func(b *testing.B) {
  53. var done uint32
  54. go func() {
  55. for {
  56. if atomic.LoadUint32(&done) != 0 {
  57. break
  58. }
  59. wg.Add(1)
  60. go func() {
  61. _ = aerr.Load()
  62. wg.Done()
  63. }()
  64. }
  65. }()
  66. b.ResetTimer()
  67. for i := 0; i < b.N; i++ {
  68. aerr.Set(errDummy)
  69. }
  70. b.StopTimer()
  71. atomic.StoreUint32(&done, 1)
  72. wg.Wait()
  73. })
  74. }