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  }