From cb4e36f59190ae4e09da9ec2b07f51c626e53d75 Mon Sep 17 00:00:00 2001 From: "zcool321@sina.com" <1234qwer> Date: Sat, 15 Jun 2019 22:19:37 +0800 Subject: [PATCH] update rwmutex test2 --- g/internal/rwmutex/rwmutex_z_unit_test.go | 134 +++++++++++++++++++--- 1 file changed, 117 insertions(+), 17 deletions(-) diff --git a/g/internal/rwmutex/rwmutex_z_unit_test.go b/g/internal/rwmutex/rwmutex_z_unit_test.go index d6ada7ada..2c5cccbc1 100644 --- a/g/internal/rwmutex/rwmutex_z_unit_test.go +++ b/g/internal/rwmutex/rwmutex_z_unit_test.go @@ -7,32 +7,132 @@ package rwmutex_test import ( + "github.com/gogf/gf/g/container/garray" "github.com/gogf/gf/g/internal/rwmutex" "github.com/gogf/gf/g/test/gtest" "testing" + "time" ) -func TestRwmutex(t *testing.T) { +func TestRwmutexIsSafe(t *testing.T) { gtest.Case(t, func() { lock := rwmutex.New() - lock.Lock() - lock.Unlock() - lock.RLock() - lock.RUnlock() gtest.Assert(lock.IsSafe(), true) - safeLock1 := rwmutex.New(false) - safeLock1.Lock() - safeLock1.Unlock() - safeLock1.RLock() - safeLock1.RUnlock() - gtest.Assert(safeLock1.IsSafe(), true) + lock = rwmutex.New(false) + gtest.Assert(lock.IsSafe(), true) - unsafeLock1 := rwmutex.New(true) - unsafeLock1.Lock() - unsafeLock1.Unlock() - unsafeLock1.RLock() - unsafeLock1.RUnlock() - gtest.Assert(unsafeLock1.IsSafe(), false) + lock = rwmutex.New(false, false) + gtest.Assert(lock.IsSafe(), true) + + lock = rwmutex.New(true, false) + gtest.Assert(lock.IsSafe(), false) + + lock = rwmutex.New(true, true) + gtest.Assert(lock.IsSafe(), false) + + lock = rwmutex.New(true) + gtest.Assert(lock.IsSafe(), false) + }) +} + +func TestSafeRwmutex(t *testing.T) { + gtest.Case(t, func() { + safeLock := rwmutex.New() + array := garray.New() + + go func() { + safeLock.Lock() + array.Append(1) + time.Sleep(100 * time.Millisecond) + array.Append(1) + safeLock.Unlock() + }() + go func() { + time.Sleep(10 * time.Millisecond) + safeLock.Lock() + array.Append(1) + time.Sleep(200 * time.Millisecond) + array.Append(1) + safeLock.Unlock() + }() + time.Sleep(50 * time.Millisecond) + gtest.Assert(array.Len(), 1) + time.Sleep(80 * time.Millisecond) + gtest.Assert(array.Len(), 3) + time.Sleep(100 * time.Millisecond) + gtest.Assert(array.Len(), 3) + time.Sleep(100 * time.Millisecond) + gtest.Assert(array.Len(), 4) + }) +} + +func TestSafeReaderRwmutex(t *testing.T) { + gtest.Case(t, func() { + safeLock := rwmutex.New() + array := garray.New() + + go func() { + safeLock.RLock() + array.Append(1) + time.Sleep(100 * time.Millisecond) + array.Append(1) + safeLock.RUnlock() + }() + go func() { + time.Sleep(10 * time.Millisecond) + safeLock.RLock() + array.Append(1) + time.Sleep(200 * time.Millisecond) + array.Append(1) + time.Sleep(100 * time.Millisecond) + array.Append(1) + safeLock.RUnlock() + }() + go func() { + time.Sleep(50 * time.Millisecond) + safeLock.Lock() + array.Append(1) + safeLock.Unlock() + }() + time.Sleep(50 * time.Millisecond) + gtest.Assert(array.Len(), 2) + time.Sleep(100 * time.Millisecond) + gtest.Assert(array.Len(), 3) + time.Sleep(100 * time.Millisecond) + gtest.Assert(array.Len(), 4) + time.Sleep(100 * time.Millisecond) + gtest.Assert(array.Len(), 6) + }) +} + +func TestUnsafeRwmutex(t *testing.T) { + gtest.Case(t, func() { + unsafeLock := rwmutex.New(true) + array := garray.New() + + go func() { + unsafeLock.Lock() + array.Append(1) + time.Sleep(100 * time.Millisecond) + array.Append(1) + unsafeLock.Unlock() + }() + go func() { + time.Sleep(10 * time.Millisecond) + unsafeLock.Lock() + array.Append(1) + time.Sleep(200 * time.Millisecond) + array.Append(1) + unsafeLock.Unlock() + }() + time.Sleep(50 * time.Millisecond) + gtest.Assert(array.Len(), 2) + time.Sleep(100 * time.Millisecond) + gtest.Assert(array.Len(), 3) + time.Sleep(50 * time.Millisecond) + gtest.Assert(array.Len(), 3) + time.Sleep(100 * time.Millisecond) + gtest.Assert(array.Len(), 4) }) }