github.com/unirita/cuto@v0.9.8-0.20160830082821-aa6652f877b7/servant/job/job_unix_test.go (about) 1 // Copyright 2015 unirita Inc. 2 // Created 2015/04/10 shanxia 3 4 // +build darwin linux 5 6 package job 7 8 import ( 9 "bufio" 10 "os" 11 "strings" 12 "testing" 13 14 "github.com/unirita/cuto/db" 15 "github.com/unirita/cuto/message" 16 ) 17 18 const testServantIni = "servant_l.ini" 19 20 func TestDoJobRequest_拡張子無しSHジョブが正常に実行できる(t *testing.T) { 21 req := &message.Request{ 22 Type: "request", 23 NID: 201, 24 JID: "serviceTask_001", 25 Path: "job", 26 Param: "XX 0", 27 Env: "TESTENV1=ENVENV+ENV0=AAAAA+ENV2=BBBB", 28 Workspace: "", 29 WarnRC: 4, 30 WarnStr: "WARN", 31 ErrRC: 12, 32 ErrStr: "ERR", 33 } 34 stCh := make(chan string, 1) 35 res := DoJobRequest(req, conf, stCh) 36 if len(<-stCh) == 0 { 37 t.Error("ジョブ開始時間が送信されていない.") 38 } 39 close(stCh) 40 41 if req.NID != res.NID { 42 t.Error("NIDがリクエストとレスポンスで異なる.") 43 } 44 if req.JID != res.JID { 45 t.Error("IDがリクエストとレスポンスで異なる.") 46 } 47 if res.RC != 0 { 48 t.Errorf("ジョブが正常終了するはずなのに異常終了した. - %v", res.RC) 49 } 50 if len(res.Detail) > 0 { 51 t.Error("ジョブが正常終了するはずなのに、エラーメッセージがある.", res.Detail) 52 } 53 if len(res.Var) == 0 { 54 t.Error("テストコード側の変数機能が未実装.") 55 } else if res.Var != "ENVENV XX" { 56 t.Errorf("変数の値が不正[%s].もしくは引数渡しに問題あり.", res.Var) 57 } 58 if len(res.St) == 0 { 59 t.Error("ジョブ開始時間が無い.") 60 } 61 if len(res.Et) == 0 { 62 t.Error("ジョブ終了時間が無い.") 63 } 64 65 file, err := os.Open(createJoblogFileName(req, stToLocalTimestamp(res.St), res.NID, res.JID)) 66 if err != nil { 67 t.Error("ジョブログがない。", err.Error()) 68 } 69 defer file.Close() 70 scanner := bufio.NewScanner(file) 71 var env1, env2, env3 bool 72 for scanner.Scan() { 73 line := scanner.Text() 74 if -1 != strings.Index(line, "ENVENV") { 75 env1 = true 76 } else if -1 != strings.Index(line, "AAAAA") { 77 env2 = true 78 } else if -1 != strings.Index(line, "BBBB") { 79 env3 = true 80 } 81 } 82 if !env1 || !env2 || !env3 { 83 t.Error("環境変数が正常に渡っていない可能性があります。", env1, env2, env3) 84 } 85 } 86 87 func TestDoJobRequest_パス指定ありCSHジョブが正常に実行できる(t *testing.T) { 88 req := &message.Request{ 89 Type: "request", 90 NID: 202, 91 JID: "serviceTask_002", 92 Path: "job.csh", 93 Param: "", 94 Env: "TESTENV1=ENVENVENV", 95 Workspace: testJobPath, 96 WarnRC: 4, 97 WarnStr: "WARN", 98 ErrRC: 12, 99 ErrStr: "ERR", 100 } 101 102 stCh := make(chan string, 1) 103 res := DoJobRequest(req, conf, stCh) 104 close(stCh) 105 if res.RC != 0 { 106 t.Errorf("ジョブが正常終了するはずなのに異常終了した. - %v", res.RC) 107 } 108 if len(res.Detail) > 0 { 109 t.Error("ジョブが正常終了するはずなのに、エラーメッセージがある.", res.Detail) 110 } 111 if len(res.Var) == 0 { 112 t.Error("変数なし.") 113 } else if res.Var != "ENVENVENV" { 114 t.Errorf("変数内容が不正.[%s]", res.Var) 115 } 116 if len(res.St) == 0 { 117 t.Error("ジョブ開始時間が無い.") 118 } 119 if len(res.Et) == 0 { 120 t.Error("ジョブ終了時間が無い.") 121 } 122 file, err := os.Open(createJoblogFileName(req, stToLocalTimestamp(res.St), res.NID, res.JID)) 123 if err != nil { 124 t.Error("ジョブログがない。", err.Error()) 125 } 126 defer file.Close() 127 } 128 129 func TestDoJobRequest_存在しないジョブ(t *testing.T) { 130 req := &message.Request{ 131 Type: "request", 132 NID: 203, 133 JID: "serviceTask_003", 134 Path: "nothing.bat", 135 Param: "", 136 Env: "TESTENV1=ENVENVENV", 137 Workspace: testJobPath, 138 WarnRC: 4, 139 WarnStr: "WARN", 140 ErrRC: 12, 141 ErrStr: "ERR", 142 } 143 144 stCh := make(chan string, 1) 145 res := DoJobRequest(req, conf, stCh) 146 close(stCh) 147 if res.RC != 0 { 148 t.Error("実行失敗の場合、RCは0のはず.") 149 } 150 if len(res.Detail) == 0 { 151 t.Error("異常終了メッセージが存在しない.") 152 } 153 if len(res.Var) > 0 { 154 t.Error("テストコード側の変数機能が未実装.") 155 } 156 if len(res.St) != 0 { 157 t.Error("ジョブ開始時間がある.") 158 } 159 if len(res.Et) != 0 { 160 t.Error("ジョブ終了時間がある.") 161 } 162 } 163 func TestDoJobRequest_RCで警告終了するジョブ_閾値と同じ(t *testing.T) { 164 req := &message.Request{ 165 Type: "request", 166 NID: 204, 167 JID: "serviceTask_004", 168 Path: "job.bash", 169 Param: "X 4", 170 Env: "TESTENV1=ENVENVENV", 171 Workspace: testJobPath, 172 WarnRC: 4, 173 WarnStr: "WARN", 174 ErrRC: 12, 175 ErrStr: "ERR", 176 } 177 178 stCh := make(chan string, 1) 179 res := DoJobRequest(req, conf, stCh) 180 close(stCh) 181 if res.RC != 4 { 182 t.Errorf("RCは4のはず. - %v", res.RC) 183 } 184 if len(res.Var) == 0 { 185 t.Error("変数なし.") 186 } else if res.Var != "ENVENVENV X" { 187 t.Errorf("変数内容が不正.[%s]", res.Var) 188 } 189 if len(res.St) == 0 { 190 t.Error("ジョブ開始時間がない.") 191 } 192 if len(res.Et) == 0 { 193 t.Error("ジョブ終了時間がない.") 194 } 195 if res.Stat != db.WARN { 196 t.Error("statが警告終了ではない") 197 } 198 if res.Detail != detailWarnRC { 199 t.Errorf("想定外のメッセージ - %v", res.Detail) 200 } 201 file, err := os.Open(createJoblogFileName(req, stToLocalTimestamp(res.St), res.NID, res.JID)) 202 if err != nil { 203 t.Error("ジョブログが存在しない.") 204 } 205 defer file.Close() 206 } 207 func TestDoJobRequest_RCで異常終了するジョブ_閾値と同じ(t *testing.T) { 208 req := &message.Request{ 209 Type: "request", 210 NID: 205, 211 JID: "serviceTask_004", 212 Path: "job.bash", 213 Param: "X 12", 214 Env: "TESTENV1=ENVENVENV", 215 Workspace: testJobPath, 216 WarnRC: 4, 217 WarnStr: "WARN", 218 ErrRC: 12, 219 ErrStr: "ERR", 220 } 221 222 stCh := make(chan string, 1) 223 res := DoJobRequest(req, conf, stCh) 224 close(stCh) 225 if res.RC != 12 { 226 t.Errorf("RCは12のはず. - %v", res.RC) 227 } 228 if len(res.Var) == 0 { 229 t.Error("変数なし.") 230 } else if res.Var != "ENVENVENV X" { 231 t.Errorf("変数内容が不正.[%s]", res.Var) 232 } 233 if len(res.St) == 0 { 234 t.Error("ジョブ開始時間がない.") 235 } 236 if len(res.Et) == 0 { 237 t.Error("ジョブ終了時間がない.") 238 } 239 if res.Stat != db.ABNORMAL { 240 t.Error("statが異常終了ではない") 241 } 242 if res.Detail != detailErrRC { 243 t.Errorf("想定外のメッセージ - %v", res.Detail) 244 } 245 file, err := os.Open(createJoblogFileName(req, stToLocalTimestamp(res.St), res.NID, res.JID)) 246 if err != nil { 247 t.Error("ジョブログが存在しない.") 248 } 249 defer file.Close() 250 } 251 252 func TestDoJobRequest_標準出力で警告終了するジョブ_RC確認なし(t *testing.T) { 253 req := &message.Request{ 254 Type: "request", 255 NID: 206, 256 JID: "serviceTask_004", 257 Path: "job.ksh", 258 Param: "\"A B\"", 259 Env: "TESTENV1=!!!WARNING!!!", 260 Workspace: testJobPath, 261 WarnRC: 0, 262 WarnStr: "WARN", 263 ErrRC: 12, 264 ErrStr: "ERR", 265 } 266 267 stCh := make(chan string, 1) 268 res := DoJobRequest(req, conf, stCh) 269 close(stCh) 270 if res.RC != 0 { 271 t.Error("RCは0のはず.") 272 } 273 if len(res.Var) == 0 { 274 t.Error("変数なし.") 275 } else if res.Var != "!!!WARNING!!! A B" { 276 t.Errorf("変数内容が不正.[%s]", res.Var) 277 } 278 if len(res.St) == 0 { 279 t.Error("ジョブ開始時間がない.") 280 } 281 if len(res.Et) == 0 { 282 t.Error("ジョブ終了時間がない.") 283 } 284 if res.Stat != db.WARN { 285 t.Error("statが警告終了ではない") 286 } 287 if res.Detail != detailWarnPtn { 288 t.Errorf("想定外のメッセージ - %v", res.Detail) 289 } 290 file, err := os.Open(createJoblogFileName(req, stToLocalTimestamp(res.St), res.NID, res.JID)) 291 if err != nil { 292 t.Error("ジョブログが存在しない.") 293 } 294 defer file.Close() 295 } 296 func TestDoJobRequest_標準エラー出力で異常終了するzshジョブ_RC確認なし(t *testing.T) { 297 req := &message.Request{ 298 Type: "request", 299 NID: 207, 300 JID: "serviceTask_006", 301 Path: "stderr.zsh", 302 Param: "!!!ERROR", 303 Env: "", 304 Workspace: testJobPath, 305 WarnRC: 4, 306 WarnStr: "WARN", 307 ErrRC: 12, 308 ErrStr: "ERR", 309 } 310 311 stCh := make(chan string, 1) 312 res := DoJobRequest(req, conf, stCh) 313 close(stCh) 314 if res.RC != 0 { 315 t.Error("RCは0のはず.") 316 } 317 if len(res.Var) == 0 { 318 t.Error("変数なし.") 319 } else if res.Var != "Argument1=!!!ERROR" { 320 t.Errorf("変数内容が不正.[%s]", res.Var) 321 } 322 if len(res.St) == 0 { 323 t.Error("ジョブ開始時間がない.") 324 } 325 if len(res.Et) == 0 { 326 t.Error("ジョブ終了時間がない.") 327 } 328 if res.Stat != db.ABNORMAL { 329 t.Error("statが異常終了ではない") 330 } 331 if res.Detail != detailErrPtn { 332 t.Errorf("想定外のメッセージ - %v", res.Detail) 333 } 334 file, err := os.Open(createJoblogFileName(req, stToLocalTimestamp(res.St), res.NID, res.JID)) 335 if err != nil { 336 t.Error("ジョブログが存在しない.") 337 } 338 defer file.Close() 339 } 340 341 func TestDoJobRequest_タイムアウト時間を超えたら異常終了する(t *testing.T) { 342 req := &message.Request{ 343 Type: "request", 344 NID: 208, 345 JID: "serviceTask_001", 346 Path: "twosec.sh", 347 Param: "", 348 Env: "", 349 Workspace: testJobPath, 350 WarnRC: 0, 351 WarnStr: "", 352 ErrRC: 0, 353 ErrStr: "", 354 Timeout: 1, 355 } 356 357 stCh := make(chan string, 1) 358 res := DoJobRequest(req, conf, stCh) 359 close(stCh) 360 if res.RC != 0 { 361 t.Errorf("戻り値が想定外 - %v", res.RC) 362 } 363 if res.Stat != db.ABNORMAL { 364 t.Error("異常終了するはずが、正常終了している。") 365 } 366 if len(res.Detail) == 0 { 367 t.Error("異常メッセージがセットされていない。") 368 } 369 }