github.com/hslam/atomic@v1.0.0/bytes_test.go (about) 1 // Copyright (c) 2020 Meng Huang (mhboy@outlook.com) 2 // This package is licensed under a MIT license that can be found in the LICENSE file. 3 4 package atomic 5 6 import ( 7 "sync" 8 "testing" 9 ) 10 11 func TestBytesEqual(t *testing.T) { 12 var a = []byte{1, 2, 3} 13 var b = []byte{1, 2, 3} 14 if !bytesEqual(a, b) { 15 t.Error("fail") 16 } 17 } 18 19 func TestBytes(t *testing.T) { 20 var val = []byte{1, 2, 3} 21 addr := NewBytes(val) 22 if !bytesEqual(addr.Load(), val) { 23 t.Error(addr.Load()) 24 } 25 addr.Store(val[:2]) 26 if !bytesEqual(addr.Load(), val[:2]) { 27 t.Error(addr.Load()) 28 } 29 var delta = val[2:] 30 if !bytesEqual(addr.Add(delta), val) { 31 t.Error(addr.Load()) 32 } 33 if !bytesEqual(addr.Load(), val) { 34 t.Error(addr.Load()) 35 } 36 var new = []byte{4, 5, 6} 37 if !bytesEqual(addr.Swap(new), val) { 38 t.Error(addr.Load()) 39 } 40 var old = new 41 new = []byte{7, 8, 9} 42 if !addr.CompareAndSwap(old, new) { 43 t.Error(addr.Load()) 44 } 45 if addr.CompareAndSwap(old, new) { 46 t.Error(addr.Load()) 47 } 48 49 addr = &Bytes{} 50 if addr.Load() != nil || !bytesEqual(addr.Load(), []byte{}) { 51 t.Error(addr.Load()) 52 } 53 } 54 55 func TestAddBytes(t *testing.T) { 56 addr := NewBytes(nil) 57 var wg sync.WaitGroup 58 for i := 0; i < 8192; i++ { 59 wg.Add(1) 60 go func() { 61 defer wg.Done() 62 addr.Add(nil) 63 }() 64 } 65 wg.Wait() 66 } 67 68 func TestCompareAndSwapBytes(t *testing.T) { 69 addr := NewBytes(nil) 70 var wg sync.WaitGroup 71 for i := 0; i < 8192; i++ { 72 wg.Add(1) 73 go func() { 74 defer wg.Done() 75 addr.CompareAndSwap(nil, nil) 76 }() 77 } 78 wg.Wait() 79 } 80 81 func TestSwapBytes(t *testing.T) { 82 addr := NewBytes(nil) 83 var wg sync.WaitGroup 84 for i := 0; i < 8192; i++ { 85 wg.Add(1) 86 go func() { 87 defer wg.Done() 88 addr.Swap(nil) 89 }() 90 } 91 wg.Wait() 92 } 93 94 func BenchmarkSwapBytes(b *testing.B) { 95 addr := NewBytes(nil) 96 for i := 0; i < b.N; i++ { 97 addr.Swap(nil) 98 } 99 } 100 101 func BenchmarkCompareAndSwapBytes(b *testing.B) { 102 addr := NewBytes(nil) 103 for i := 0; i < b.N; i++ { 104 addr.CompareAndSwap(nil, nil) 105 } 106 } 107 108 func BenchmarkAddBytes(b *testing.B) { 109 addr := NewBytes(nil) 110 for i := 0; i < b.N; i++ { 111 addr.Add(nil) 112 } 113 } 114 115 func BenchmarkStoreBytes(b *testing.B) { 116 addr := NewBytes(nil) 117 for i := 0; i < b.N; i++ { 118 addr.Store(nil) 119 } 120 } 121 122 func BenchmarkLoadBytes(b *testing.B) { 123 addr := NewBytes(nil) 124 for i := 0; i < b.N; i++ { 125 addr.Load() 126 } 127 }