90 lines
1.8 KiB
Go
90 lines
1.8 KiB
Go
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")
|
|
}
|
|
}
|