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