Files
wehub-resource-sync 498b235461
Build and test / Build and test AMD64 Ubuntu 22.04 (push) Failing after 0s
Publish Builder / amazonlinux2023 (push) Failing after 1s
Build and test / UT for Go (push) Has been skipped
Publish KRTE Images / KRTE (push) Failing after 1s
Build and test / Integration Test (push) Has been skipped
Build and test / Upload Code Coverage (push) Has been skipped
Publish Builder / rockylinux9 (push) Failing after 1s
Publish Builder / ubuntu22.04 (push) Failing after 0s
Publish Builder / ubuntu24.04 (push) Failing after 0s
Publish Gpu Builder / publish-gpu-builder (push) Failing after 1s
Publish Test Images / PyTest (push) Failing after 0s
Build and test / UT for Cpp (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 12:31:17 +08:00

132 lines
2.3 KiB
Go

package lock
import (
"sync"
"testing"
"time"
"github.com/stretchr/testify/assert"
)
func TestKeyLock(t *testing.T) {
keys := []string{"Milvus", "Blazing", "Fast"}
keyLock := NewKeyLock[string]()
keyLock.Lock(keys[0])
keyLock.Lock(keys[1])
keyLock.Lock(keys[2])
// should work
wg := sync.WaitGroup{}
wg.Add(2)
go func() {
keyLock.Lock(keys[0])
keyLock.Unlock(keys[0])
wg.Done()
}()
go func() {
keyLock.Lock(keys[0])
keyLock.Unlock(keys[0])
wg.Done()
}()
assert.Equal(t, keyLock.size(), 3)
time.Sleep(10 * time.Millisecond)
keyLock.Unlock(keys[0])
keyLock.Unlock(keys[1])
keyLock.Unlock(keys[2])
wg.Wait()
assert.Equal(t, keyLock.size(), 0)
}
func TestKeyRLock(t *testing.T) {
keys := []string{"Milvus", "Blazing", "Fast"}
keyLock := NewKeyLock[string]()
keyLock.RLock(keys[0])
keyLock.RLock(keys[0])
// should work
wg := sync.WaitGroup{}
wg.Add(1)
go func() {
keyLock.Lock(keys[0])
keyLock.Unlock(keys[0])
wg.Done()
}()
time.Sleep(10 * time.Millisecond)
keyLock.RUnlock(keys[0])
keyLock.RUnlock(keys[0])
wg.Wait()
assert.Equal(t, keyLock.size(), 0)
}
func TestNewKeyLock(t *testing.T) {
keyLock := NewKeyLock[string]()
keyLock.Lock("a")
keyLock.Lock("b")
keyLock.Unlock("a")
keyLock.Unlock("b")
assert.Equal(t, 0, keyLock.size())
keyLock.keyLocksMutex.Lock()
keyLen := len(keyLock.refLocks)
keyLock.keyLocksMutex.Unlock()
assert.Equal(t, 0, keyLen)
}
func TestKeyLockTryLock(t *testing.T) {
keyLock := NewKeyLock[string]()
ok := keyLock.TryLock("a")
assert.True(t, ok)
ok = keyLock.TryLock("b")
assert.True(t, ok)
ok = keyLock.TryLock("a")
assert.False(t, ok)
ok = keyLock.TryLock("b")
assert.False(t, ok)
ok = keyLock.TryRLock("a")
assert.False(t, ok)
ok = keyLock.TryRLock("b")
assert.False(t, ok)
assert.Equal(t, 2, keyLock.size())
keyLock.Unlock("a")
keyLock.Unlock("b")
assert.Zero(t, keyLock.size())
ok = keyLock.TryRLock("a")
assert.True(t, ok)
ok = keyLock.TryRLock("b")
assert.True(t, ok)
ok = keyLock.TryLock("a")
assert.False(t, ok)
ok = keyLock.TryLock("b")
assert.False(t, ok)
ok = keyLock.TryRLock("a")
assert.True(t, ok)
ok = keyLock.TryRLock("b")
assert.True(t, ok)
assert.Equal(t, 2, keyLock.size())
keyLock.RUnlock("a")
keyLock.RUnlock("b")
assert.Equal(t, 2, keyLock.size())
keyLock.RUnlock("a")
keyLock.RUnlock("b")
assert.Equal(t, 0, keyLock.size())
}