github.com/gogf/gf@v1.16.9/internal/rwmutex/rwmutex_z_unit_test.go (about) 1 // Copyright GoFrame Author(https://goframe.org). All Rights Reserved. 2 // 3 // This Source Code Form is subject to the terms of the MIT License. 4 // If a copy of the MIT was not distributed with this file, 5 // You can obtain one at https://github.com/gogf/gf. 6 7 package rwmutex_test 8 9 import ( 10 "testing" 11 "time" 12 13 "github.com/gogf/gf/container/garray" 14 "github.com/gogf/gf/internal/rwmutex" 15 "github.com/gogf/gf/test/gtest" 16 ) 17 18 func TestRwmutexIsSafe(t *testing.T) { 19 gtest.C(t, func(t *gtest.T) { 20 lock := rwmutex.New() 21 t.Assert(lock.IsSafe(), false) 22 23 lock = rwmutex.New(false) 24 t.Assert(lock.IsSafe(), false) 25 26 lock = rwmutex.New(false, false) 27 t.Assert(lock.IsSafe(), false) 28 29 lock = rwmutex.New(true, false) 30 t.Assert(lock.IsSafe(), true) 31 32 lock = rwmutex.New(true, true) 33 t.Assert(lock.IsSafe(), true) 34 35 lock = rwmutex.New(true) 36 t.Assert(lock.IsSafe(), true) 37 }) 38 } 39 40 func TestSafeRwmutex(t *testing.T) { 41 gtest.C(t, func(t *gtest.T) { 42 safeLock := rwmutex.New(true) 43 array := garray.New(true) 44 45 go func() { 46 safeLock.Lock() 47 array.Append(1) 48 time.Sleep(100 * time.Millisecond) 49 array.Append(1) 50 safeLock.Unlock() 51 }() 52 go func() { 53 time.Sleep(10 * time.Millisecond) 54 safeLock.Lock() 55 array.Append(1) 56 time.Sleep(200 * time.Millisecond) 57 array.Append(1) 58 safeLock.Unlock() 59 }() 60 time.Sleep(50 * time.Millisecond) 61 t.Assert(array.Len(), 1) 62 time.Sleep(80 * time.Millisecond) 63 t.Assert(array.Len(), 3) 64 time.Sleep(100 * time.Millisecond) 65 t.Assert(array.Len(), 3) 66 time.Sleep(100 * time.Millisecond) 67 t.Assert(array.Len(), 4) 68 }) 69 } 70 71 func TestSafeReaderRwmutex(t *testing.T) { 72 gtest.C(t, func(t *gtest.T) { 73 safeLock := rwmutex.New(true) 74 array := garray.New(true) 75 76 go func() { 77 safeLock.RLock() 78 array.Append(1) 79 time.Sleep(100 * time.Millisecond) 80 array.Append(1) 81 safeLock.RUnlock() 82 }() 83 go func() { 84 time.Sleep(10 * time.Millisecond) 85 safeLock.RLock() 86 array.Append(1) 87 time.Sleep(200 * time.Millisecond) 88 array.Append(1) 89 time.Sleep(100 * time.Millisecond) 90 array.Append(1) 91 safeLock.RUnlock() 92 }() 93 go func() { 94 time.Sleep(50 * time.Millisecond) 95 safeLock.Lock() 96 array.Append(1) 97 safeLock.Unlock() 98 }() 99 time.Sleep(50 * time.Millisecond) 100 t.Assert(array.Len(), 2) 101 time.Sleep(100 * time.Millisecond) 102 t.Assert(array.Len(), 3) 103 time.Sleep(100 * time.Millisecond) 104 t.Assert(array.Len(), 4) 105 time.Sleep(100 * time.Millisecond) 106 t.Assert(array.Len(), 6) 107 }) 108 } 109 110 func TestUnsafeRwmutex(t *testing.T) { 111 gtest.C(t, func(t *gtest.T) { 112 unsafeLock := rwmutex.New() 113 array := garray.New(true) 114 115 go func() { 116 unsafeLock.Lock() 117 array.Append(1) 118 time.Sleep(100 * time.Millisecond) 119 array.Append(1) 120 unsafeLock.Unlock() 121 }() 122 go func() { 123 time.Sleep(10 * time.Millisecond) 124 unsafeLock.Lock() 125 array.Append(1) 126 time.Sleep(200 * time.Millisecond) 127 array.Append(1) 128 unsafeLock.Unlock() 129 }() 130 time.Sleep(50 * time.Millisecond) 131 t.Assert(array.Len(), 2) 132 time.Sleep(100 * time.Millisecond) 133 t.Assert(array.Len(), 3) 134 time.Sleep(50 * time.Millisecond) 135 t.Assert(array.Len(), 3) 136 time.Sleep(100 * time.Millisecond) 137 t.Assert(array.Len(), 4) 138 }) 139 }