1 Star 0 Fork 0

siddontang / tlock

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
lock_test.go 2.17 KB
一键复制 编辑 原始数据 按行查看 历史
package tlock
import (
"sync"
"time"
. "gopkg.in/check.v1"
)
type lockTestSuite struct {
}
var _ = Suite(&lockTestSuite{})
func (s *lockTestSuite) TestKeyLock(c *C) {
g := NewKeyLockerGroup()
var wg sync.WaitGroup
wg.Add(1)
go func() {
defer wg.Done()
g.Lock("a", "b")
g.Unlock("a", "b")
}()
time.Sleep(1 * time.Second)
g.Lock("b", "a")
g.Unlock("a", "b")
wg.Wait()
wg.Add(1)
go func() {
defer wg.Done()
g.Lock("a")
time.Sleep(2 * time.Second)
g.Unlock("a")
}()
time.Sleep(1 * time.Second)
b := g.LockTimeout(100*time.Millisecond, "a")
c.Assert(b, Equals, false)
wg.Wait()
b = g.LockTimeout(100*time.Millisecond, "a")
c.Assert(b, Equals, true)
g.Unlock("a")
wg.Add(1)
go func() {
defer wg.Done()
g.Lock("a")
time.Sleep(2 * time.Second)
g.Unlock("a")
}()
time.Sleep(1 * time.Second)
b = g.LockTimeout(100*time.Millisecond, "a")
c.Assert(b, Equals, false)
wg.Wait()
b = g.LockTimeout(100*time.Millisecond, "a")
c.Assert(b, Equals, true)
g.Unlock("a")
}
func (s *lockTestSuite) TestPathLock(c *C) {
g := NewPathLockerGroup()
var wg sync.WaitGroup
wg.Add(1)
go func() {
defer wg.Done()
g.Lock("a/b")
g.Unlock("a/b")
}()
time.Sleep(1 * time.Second)
g.Lock("a/b")
g.Unlock("a/b")
wg.Wait()
wg.Add(1)
go func() {
defer wg.Done()
g.Lock("a")
time.Sleep(2 * time.Second)
g.Unlock("a")
}()
time.Sleep(1 * time.Second)
b := g.LockTimeout(100*time.Millisecond, "a/b")
c.Assert(b, Equals, false)
wg.Wait()
b = g.LockTimeout(100*time.Millisecond, "a/b")
c.Assert(b, Equals, true)
g.Unlock("a/b")
wg.Add(1)
go func() {
defer wg.Done()
g.Lock("a/b")
time.Sleep(2 * time.Second)
g.Unlock("a/b")
}()
time.Sleep(1 * time.Second)
b = g.LockTimeout(100*time.Millisecond, "a")
c.Assert(b, Equals, false)
wg.Wait()
b = g.LockTimeout(100*time.Millisecond, "a")
c.Assert(b, Equals, true)
g.Unlock("a")
g.Lock("a/b/c")
g.Lock("a/b/d")
g.Unlock("a/b/c")
g.Unlock("a/b/d")
}
func (s *lockTestSuite) TestDuplicatedNames(c *C) {
g1 := NewKeyLockerGroup()
g1.Lock("a", "a")
g1.Unlock("a", "a")
g2 := NewPathLockerGroup()
g2.Lock("a/b/c", "a/b/c")
g2.Unlock("a/b/c", "a/b/c")
}
1
https://gitee.com/siddontang/tlock.git
git@gitee.com:siddontang/tlock.git
siddontang
tlock
tlock
master

搜索帮助