github.com/hy3/cuto@v0.9.8-0.20160830082821-aa6652f877b7/util/lock_windows_test.go (about) 1 // Copyright 2015 unirita Inc. 2 // Created 2015/04/10 shanxia 3 4 package util 5 6 import ( 7 _ "runtime" 8 "sync" 9 "testing" 10 "time" 11 ) 12 13 func TestInitMutex_初期化できる(t *testing.T) { 14 hLock, err := InitLock("testInit") 15 if err != nil { 16 t.Errorf("初期化に失敗しました。 - %v\n", err) 17 } 18 if hLock == nil { 19 t.Error("排他オブジェクトがnilを返しました。") 20 } 21 defer hLock.TermLock() 22 } 23 24 func TestTerm_破棄できる(t *testing.T) { 25 hLock, err := InitLock("testTerm") 26 if hLock == nil { 27 t.Fatal(err) 28 return 29 } 30 31 if err = hLock.TermLock(); err != nil { 32 t.Fatal(err) 33 } 34 } 35 36 func TestLock_ロックできる(t *testing.T) { 37 hLock, err := InitLock("testLock") 38 if hLock == nil { 39 t.Fatal(err) 40 return 41 } 42 defer hLock.TermLock() 43 44 if hLock.IsLock() { 45 t.Error("ロック前にもかかわらず、trueが返りました。") 46 } 47 err = hLock.Lock(2) 48 if err != nil { 49 t.Errorf("ロックに成功すべきところ、失敗しました。 - %v\n", err) 50 } 51 defer hLock.Unlock() 52 if !hLock.IsLock() { 53 t.Error("ロック中にもかかわらず、falseが返りました。") 54 } 55 } 56 57 func TestUnlock_アンロックできる(t *testing.T) { 58 hLock, err := InitLock("testUnlock") 59 if hLock == nil { 60 t.Fatal(err) 61 return 62 } 63 defer hLock.TermLock() 64 65 err = hLock.Lock(2) 66 if err != nil { 67 t.Fatalf("ロックに成功すべきところ、失敗しました。 - %v\n", err) 68 } 69 if !hLock.IsLock() { 70 t.Error("ロック中にもかかわらず、falseが返りました。") 71 } 72 if err = hLock.Unlock(); err != nil { 73 t.Errorf("アンロックに成功すべきところ、失敗しました。 - %s", err) 74 } 75 if hLock.IsLock() { 76 t.Error("アンロック後にもかかわらず、trueが返りました。") 77 } 78 } 79 80 func TestUnlock_ロックしていないがアンロックする(t *testing.T) { 81 hLock, err := InitLock("testUnlock2") 82 if hLock == nil { 83 t.Fatal(err) 84 return 85 } 86 defer hLock.TermLock() 87 88 if err = hLock.Unlock(); err != nil { 89 t.Errorf("アンロックに成功すべきところ、失敗しました。 - %s", err) 90 } 91 } 92 93 var msg string 94 95 func parallel(wg *sync.WaitGroup, m *sync.Mutex, hLock *LockHandle) { 96 97 m.Lock() 98 99 if err := hLock.Lock(10000); err != nil { 100 panic(err) 101 } 102 defer hLock.Unlock() 103 104 m.Unlock() 105 106 msg += "a" 107 time.Sleep(100 * time.Millisecond) 108 msg += "b" 109 time.Sleep(100 * time.Millisecond) 110 msg += "c" 111 time.Sleep(100 * time.Millisecond) 112 msg += "d" 113 114 wg.Done() 115 } 116 117 //func TestLock_goルーチンを利用した排他確認(t *testing.T) { 118 // hLock, err := InitMutex("testGo") 119 // if hLock == nil { 120 // panic(err) 121 // return 122 // } 123 // defer hLock.TermMutex() 124 125 // runtime.GOMAXPROCS(runtime.NumCPU()) 126 // wg := new(sync.WaitGroup) 127 128 // lock, err := InitMutex("testGo") 129 // if err != nil { 130 // panic(err) 131 // return 132 // } 133 // defer lock.TermMutex() 134 135 // var m sync.Mutex 136 // for i := 0; i < 3; i++ { 137 // wg.Add(1) 138 // go parallel(wg, &m, hLock) 139 // } 140 // wg.Wait() 141 142 // if msg != "abcdabcdabcd" { 143 // t.Errorf("同期処理が正常に動作していないため、不正なメッセージが生成されました。[%v]\n", msg) 144 // } 145 //}