github.com/hy3/cuto@v0.9.8-0.20160830082821-aa6652f877b7/util/lock_unix_test.go (about) 1 // Copyright 2015 unirita Inc. 2 // Created 2015/04/10 shanxia 3 4 // +build darwin linux 5 6 package util 7 8 import ( 9 "os" 10 "path/filepath" 11 "testing" 12 13 "github.com/unirita/cuto/testutil" 14 ) 15 16 var ( 17 lockFile = "unit_test.lock" 18 ) 19 20 func init() { 21 os.Remove(filepath.Join(lockFilePath, lockFile)) 22 } 23 24 func TestNewFileLock_初期化できる(t *testing.T) { 25 l, err := InitLock(lockFile) 26 if err != nil { 27 t.Errorf("同期処理の初期化に失敗しました。 - %s", err.Error()) 28 } 29 defer l.TermLock() 30 } 31 32 func TestNewFileLock_初期化に失敗(t *testing.T) { 33 _, err := InitLock("") 34 if err == nil { 35 t.Error("同期処理の初期化に成功しました。") 36 } 37 } 38 39 func TestLock_初期化せずにロック(t *testing.T) { 40 l, err := InitLock("") 41 if err != nil { 42 err := l.Lock(0) 43 if err == nil { 44 t.Error("初期化せずにロックしたが、成功した。") 45 } 46 } else { 47 t.Error("同期処理の初期化に失敗しました。 - %v", err) 48 } 49 defer l.TermLock() 50 } 51 52 func TestLock_ロックする(t *testing.T) { 53 l, err := InitLock(lockFile) 54 if err != nil { 55 t.Fatalf("同期処理の初期化に失敗しました。 - %s", err.Error()) 56 } 57 defer l.TermLock() 58 59 err = l.Lock(0) 60 if err != nil { 61 t.Errorf("ロックに失敗しました。 - %v", err) 62 } 63 defer l.Unlock() 64 65 if _, err = os.Stat(filepath.Join(lockFilePath, lockFile)); err != nil { 66 t.Errorf("ロックファイルが存在しない。 - %v", err) 67 } 68 } 69 70 //func TestLock_上位の権限プロセスがロック中のためにロックに失敗する(t *testing.T) { 71 // l, err := InitLock(lockFile) 72 // if err != nil { 73 // t.Fatalf("同期処理の初期化に失敗しました。 - %s", err.Error()) 74 // } 75 // defer l.TermLock() 76 // // 他プロセスによってロック 77 // file, err := os.OpenFile(filepath.Join(lockFilePath, lockFile), os.O_CREATE|os.O_WRONLY, 0600) 78 // if err != nil { 79 // t.Fatalf("ロックファイルの作成失敗。 - %v", err) 80 // } 81 // defer os.Remove(filepath.Join(lockFilePath, lockFile)) 82 // file.WriteString("1") // init.d or launch.d or system 83 // file.Close() 84 85 // c := testutil.NewStderrCapturer() 86 // c.Start() 87 // defer c.Stop() 88 89 // err = l.Lock(0) 90 // if err == nil { 91 // t.Error("他プロセスのロック中に、ロック成功しました。") 92 // defer l.Unlock() 93 // } else if err != ErrBusy { 94 // t.Errorf("予期しないエラーが返りました。 - %v", err) 95 // } 96 //} 97 98 //func TestLock_他プロセスがロック中なのでロックに失敗する(t *testing.T) { 99 // l, err := InitLock(lockFile) 100 // if err != nil { 101 // t.Fatalf("同期処理の初期化に失敗しました。 - %s", err.Error()) 102 // } 103 // defer l.TermLock() 104 // // 他プロセスによってロック 105 // file, err := os.OpenFile(filepath.Join(lockFilePath, lockFile), os.O_CREATE|os.O_WRONLY, 0600) 106 // if err != nil { 107 // t.Fatalf("ロックファイルの作成失敗。 - %v", err) 108 // } 109 // defer os.Remove(filepath.Join(lockFilePath, lockFile)) 110 // file.WriteString("1") // init.d or launch.d or system 111 // file.Close() 112 113 // c := testutil.NewStderrCapturer() 114 // c.Start() 115 // defer c.Stop() 116 117 // err = l.Lock(100) 118 // if err == nil { 119 // t.Error("他プロセスのロック中に、ロック成功しました。") 120 // defer l.Unlock() 121 // } else if err != ErrBusy { 122 // t.Errorf("予期しないエラーが返りました。 - %v", err) 123 // } 124 //} 125 126 func TestLock_ロックファイルが残っている状態でロックに成功する(t *testing.T) { 127 l, err := InitLock(lockFile) 128 if err != nil { 129 t.Fatalf("同期処理の初期化に失敗しました。 - %s", err.Error()) 130 } 131 defer l.TermLock() 132 // 他プロセスによってロック 133 file, err := os.OpenFile(filepath.Join(lockFilePath, lockFile), os.O_CREATE|os.O_WRONLY, 0600) 134 if err != nil { 135 t.Fatalf("ロックファイルの作成失敗。 - %v", err) 136 } 137 defer os.Remove(filepath.Join(lockFilePath, lockFile)) 138 file.WriteString("99999") // ありえないプロセス 139 file.Close() 140 141 c := testutil.NewStderrCapturer() 142 c.Start() 143 defer c.Stop() 144 145 err = l.Lock(1) 146 if err != nil && err != ErrBusy { 147 t.Errorf("予期しないエラーが発生しました - %v", err) 148 } 149 if err == nil { 150 l.Unlock() 151 } 152 } 153 154 func TestLock_不正なロックファイルが残っている状態でロックに成功する(t *testing.T) { 155 l, err := InitLock(lockFile) 156 if err != nil { 157 t.Fatalf("同期処理の初期化に失敗しました。 - %s", err.Error()) 158 } 159 defer l.TermLock() 160 // 他プロセスによってロック 161 file, err := os.OpenFile(filepath.Join(lockFilePath, lockFile), os.O_CREATE|os.O_WRONLY, 0600) 162 if err != nil { 163 t.Fatalf("ロックファイルの作成失敗。 - %v", err) 164 } 165 defer os.Remove(filepath.Join(lockFilePath, lockFile)) 166 file.WriteString("A") // ありえないプロセス 167 file.Close() 168 169 c := testutil.NewStderrCapturer() 170 c.Start() 171 defer c.Stop() 172 173 err = l.Lock(1) 174 if err != nil && err != ErrBusy { 175 t.Errorf("予期しないエラーが発生しました - %v", err) 176 } 177 if err == nil { 178 l.Unlock() 179 } 180 } 181 182 func TestUnlock_初期化前にアンロックする(t *testing.T) { 183 l, err := InitLock("") 184 if err != nil { 185 err := l.Unlock() 186 if err == nil { 187 t.Error("初期化せずにアンロックしたが、成功した。") 188 } 189 } else { 190 t.Error("同期処理の初期化に失敗しました。 - %v", err) 191 } 192 defer l.TermLock() 193 } 194 195 func TestUnlock_ロック前にアンロックする(t *testing.T) { 196 l, err := InitLock(lockFile) 197 if err != nil { 198 t.Fatalf("同期処理の初期化に失敗しました。 - %s", err.Error()) 199 } 200 defer l.TermLock() 201 err = l.Unlock() 202 if err == nil { 203 t.Error("アンロックに失敗すべきところ、成功しました。") 204 } 205 } 206 207 //func TestUnlock_他プロセスがロック中なのでアンロックに失敗(t *testing.T) { 208 // l, err := InitLock(lockFile) 209 // if err != nil { 210 // t.Fatalf("同期処理の初期化に失敗しました。 - %s", err.Error()) 211 // } 212 // defer l.TermLock() 213 // // 他プロセスによってロック 214 // file, err := os.OpenFile(filepath.Join(lockFilePath, lockFile), os.O_CREATE|os.O_WRONLY, 0600) 215 // if err != nil { 216 // t.Fatalf("ロックファイルの作成失敗。 - %v", err) 217 // } 218 // defer os.Remove(filepath.Join(lockFilePath, lockFile)) 219 // file.WriteString("99999") // ありえないプロセス 220 // file.Close() 221 222 // err = l.Unlock() 223 // if err == nil { 224 // t.Error("アンロックに失敗すべきところ、成功しました。") 225 // } else if err.Error() != "Not locked." { 226 // t.Errorf("想定外のエラーが返りました。 - %v", err) 227 // } 228 //} 229 230 //func TestUnlock_不正なロック中でアンロックに失敗(t *testing.T) { 231 // l, err := InitLock(lockFile) 232 // if err != nil { 233 // t.Fatalf("同期処理の初期化に失敗しました。 - %s", err.Error()) 234 // } 235 // defer l.TermLock() 236 // // 他プロセスによってロック 237 // file, err := os.OpenFile(filepath.Join(lockFilePath, lockFile), os.O_CREATE|os.O_WRONLY, 0600) 238 // if err != nil { 239 // t.Fatalf("ロックファイルの作成失敗。 - %v", err) 240 // } 241 // defer os.Remove(filepath.Join(lockFilePath, lockFile)) 242 // file.WriteString("S") // ありえないプロセス 243 // file.Close() 244 245 // err = l.Unlock() 246 // if err == nil { 247 // t.Error("アンロックに失敗すべきところ、成功しました。") 248 // } else if err != errInvalidPid { 249 // t.Errorf("想定外のエラーが返りました。 - %v", err) 250 // } 251 //}