This commit is contained in:
@@ -0,0 +1,89 @@
|
||||
package dataext
|
||||
|
||||
import (
|
||||
"context"
|
||||
"testing"
|
||||
"time"
|
||||
)
|
||||
|
||||
func TestMultiMutex_LockDifferentKeys(t *testing.T) {
|
||||
mm := NewMultiMutex[string]()
|
||||
mm.Lock("a")
|
||||
mm.Lock("b")
|
||||
mm.Unlock("a")
|
||||
mm.Unlock("b")
|
||||
}
|
||||
|
||||
func TestMultiMutex_TryLockSameKey(t *testing.T) {
|
||||
mm := NewMultiMutex[string]()
|
||||
if !mm.TryLock("k") {
|
||||
t.Fatal("TryLock should succeed first time")
|
||||
}
|
||||
if mm.TryLock("k") {
|
||||
t.Fatal("TryLock should fail second time")
|
||||
}
|
||||
mm.Unlock("k")
|
||||
if !mm.TryLock("k") {
|
||||
t.Fatal("TryLock should succeed after unlock")
|
||||
}
|
||||
mm.Unlock("k")
|
||||
}
|
||||
|
||||
func TestMultiMutex_TryLockDifferentKeys(t *testing.T) {
|
||||
mm := NewMultiMutex[int]()
|
||||
if !mm.TryLock(1) {
|
||||
t.Fatal("TryLock(1) failed")
|
||||
}
|
||||
if !mm.TryLock(2) {
|
||||
t.Fatal("TryLock(2) failed - different keys should be independent")
|
||||
}
|
||||
mm.Unlock(1)
|
||||
mm.Unlock(2)
|
||||
}
|
||||
|
||||
func TestMultiMutex_RLockMultiple(t *testing.T) {
|
||||
mm := NewMultiMutex[string]()
|
||||
if !mm.RTryLock("k") {
|
||||
t.Fatal("first RTryLock failed")
|
||||
}
|
||||
if !mm.RTryLock("k") {
|
||||
t.Fatal("second RTryLock failed")
|
||||
}
|
||||
mm.RUnlock("k")
|
||||
mm.RUnlock("k")
|
||||
}
|
||||
|
||||
func TestMultiMutex_TryLockWithTimeout(t *testing.T) {
|
||||
mm := NewMultiMutex[string]()
|
||||
mm.Lock("k")
|
||||
if mm.TryLockWithTimeout("k", 10*time.Millisecond) {
|
||||
t.Fatal("expected timeout failure")
|
||||
}
|
||||
mm.Unlock("k")
|
||||
}
|
||||
|
||||
func TestMultiMutex_TryLockWithContext(t *testing.T) {
|
||||
mm := NewMultiMutex[string]()
|
||||
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Millisecond)
|
||||
defer cancel()
|
||||
if !mm.TryLockWithContext(ctx, "k") {
|
||||
t.Fatal("TryLockWithContext should succeed on free key")
|
||||
}
|
||||
mm.Unlock("k")
|
||||
}
|
||||
|
||||
func TestMultiMutex_GetAndGetCAS(t *testing.T) {
|
||||
mm := NewMultiMutex[string]()
|
||||
l := mm.Get("a")
|
||||
if l == nil {
|
||||
t.Fatal("Get returned nil")
|
||||
}
|
||||
cas := mm.GetCAS("a")
|
||||
if cas == nil {
|
||||
t.Fatal("GetCAS returned nil")
|
||||
}
|
||||
rl := mm.RLocker("a")
|
||||
if rl == nil {
|
||||
t.Fatal("RLocker returned nil")
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user