portlock - portlock_test.go
1 package portlock
2
3 import (
4 "runtime"
5 "sync"
6 "testing"
7 )
8
9 var _ sync.Locker = &mutex{}
10
11 func HammerMutex(m Locker, loops int, cdone chan bool) {
12 for i := 0; i < loops; i++ {
13 if i%3 == 0 {
14 if m.TryLock() {
15 m.Unlock()
16 }
17 continue
18 }
19 m.Lock()
20 m.Unlock()
21 }
22 cdone <- true
23 }
24
25 func TestMutex(t *testing.T) {
26 if n := runtime.SetMutexProfileFraction(1); n != 0 {
27 t.Logf("got mutexrate %d expected 0", n)
28 }
29 defer runtime.SetMutexProfileFraction(0)
30
31 m := New(":9999")
32
33 m.Lock()
34 if m.TryLock() {
35 t.Fatalf("TryLock succeeded with mutex locked")
36 }
37 m.Unlock()
38 if !m.TryLock() {
39 t.Fatalf("TryLock failed with mutex unlocked")
40 }
41 m.Unlock()
42
43 c := make(chan bool)
44 for i := 0; i < 10; i++ {
45 go HammerMutex(m, 1000, c)
46 }
47 for i := 0; i < 10; i++ {
48 <-c
49 }
50 }
51