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  }