github.com/unirita/cuto@v0.9.8-0.20160830082821-aa6652f877b7/show/main_test.go (about) 1 // Copyright 2015 unirita Inc. 2 // Created 2015/04/10 shanxia 3 4 package main 5 6 import ( 7 "fmt" 8 "os" 9 "os/exec" 10 "path/filepath" 11 "runtime" 12 "strings" 13 "syscall" 14 "testing" 15 "time" 16 17 "github.com/unirita/cuto/console" 18 "github.com/unirita/cuto/db" 19 "github.com/unirita/cuto/show/gen" 20 "github.com/unirita/cuto/testutil" 21 ) 22 23 // テスト結果確認用の一時出力ファイル。 24 const output_file string = "showtest.log" 25 26 var ( 27 confPath = setConfigPath() 28 confFile = setConfigFile() 29 ) 30 var diffCommand = getDiff() 31 32 func getDiff() string { 33 if runtime.GOOS == "windows" { 34 return "fc" 35 } else { 36 return "diff" 37 } 38 } 39 40 func setConfigPath() string { 41 return filepath.Join(testutil.GetBaseDir(), "show", "_testdata") 42 } 43 func setConfigFile() string { 44 return filepath.Join(confPath, "show_test.ini") 45 } 46 47 func init() { 48 time.Local = time.FixedZone("JST", 9*60*60) 49 50 os.Chdir(confPath) // 設定ファイル内を固定するため、作業フォルダを固定する。 51 } 52 53 func vefiry_stdout(output_file, vefiry_file string) error { 54 params := []string{output_file, vefiry_file} 55 cmd := exec.Command(diffCommand, params...) 56 err := cmd.Run() 57 if err != nil { 58 if e2, ok := err.(*exec.ExitError); ok { 59 if s, ok := e2.Sys().(syscall.WaitStatus); ok { 60 return fmt.Errorf("不正な戻り値[%v]が返りました。", s.ExitStatus()) 61 } else { 62 return fmt.Errorf("不正な結果です。") 63 } 64 } else { 65 return fmt.Errorf("不正な結果です。") 66 } 67 } 68 return nil 69 } 70 71 func TestRealMain_1日分のジョブネットを表示(t *testing.T) { 72 vefiry_file := "showtest_verify1.txt" 73 arg := &arguments{ 74 jobnet: "", 75 from: "20150415", 76 to: "20150415", 77 status: "", 78 format: "", 79 config: confFile, 80 isUTC: true, 81 } 82 ce := testutil.NewStderrCapturer() 83 ce.Start() 84 co := testutil.NewStdoutCapturer() 85 co.Start() 86 87 ret := realMain(arg) 88 if ret != rc_OK { 89 t.Errorf("戻り値[%v]が返るはずが、[%v]が返りました。", rc_OK, ret) 90 } 91 cout := co.Stop() 92 cerr := ce.Stop() 93 if len(cerr) > 0 { 94 t.Errorf("エラーが出力されています。 - %v", cerr) 95 } 96 if _, exist := os.Stat(output_file); exist != nil { 97 os.Remove(output_file) 98 } 99 file, _ := os.OpenFile(output_file, os.O_CREATE|os.O_WRONLY, 0666) 100 file.WriteString(cout) 101 file.Close() 102 103 err := vefiry_stdout(output_file, vefiry_file) 104 if err != nil { 105 t.Errorf("不正な出力結果です。 - %v", err) 106 } 107 } 108 109 func TestRealMain_0件のジョブネットを表示(t *testing.T) { 110 arg := &arguments{ 111 jobnet: "JNET", 112 from: "", 113 to: "", 114 status: "normal", 115 format: "csv", 116 config: confFile, 117 } 118 ce := testutil.NewStderrCapturer() 119 ce.Start() 120 co := testutil.NewStdoutCapturer() 121 co.Start() 122 123 ret := realMain(arg) 124 if ret != rc_NOTHING { 125 t.Errorf("戻り値[%v]が返るはずが、[%v]が返りました。", rc_NOTHING, ret) 126 } 127 cout := co.Stop() 128 cerr := ce.Stop() 129 if len(cerr) > 0 { 130 t.Errorf("エラーが出力されています。 - %v", cerr) 131 } 132 if len(cout) > 0 { 133 t.Errorf("出力されないはずが、何か出力されました。 - %v", cout) 134 } 135 } 136 137 func TestRealMain_ヘルプを表示(t *testing.T) { 138 arg := &arguments{ 139 help: true, 140 jobnet: "", 141 from: "20150416", 142 to: "20150416", 143 status: "", 144 format: "", 145 config: confFile, 146 } 147 ce := testutil.NewStderrCapturer() 148 ce.Start() 149 co := testutil.NewStdoutCapturer() 150 co.Start() 151 152 ret := realMain(arg) 153 if ret != rc_OK { 154 t.Errorf("戻り値[%v]が返るべきところ、[%v]が返りました。", rc_OK, ret) 155 } 156 157 cout := co.Stop() 158 cerr := ce.Stop() 159 if len(cout) > 0 { 160 t.Errorf("不正な標準出力が出力されています。 - %v", cout) 161 } 162 if cerr != console.USAGE_SHOW { 163 t.Errorf("stderrへの出力値[%s]が想定と違います。", cerr) 164 } 165 } 166 167 func TestRealMain_バージョン情報を表示(t *testing.T) { 168 arg := &arguments{ 169 v: true, 170 jobnet: "", 171 from: "20150416", 172 to: "20150416", 173 status: "", 174 format: "", 175 config: confFile, 176 } 177 ce := testutil.NewStderrCapturer() 178 ce.Start() 179 co := testutil.NewStdoutCapturer() 180 co.Start() 181 182 ret := realMain(arg) 183 if ret != rc_OK { 184 t.Errorf("戻り値[%v]が返るべきところ、[%v]が返りました。", rc_OK, ret) 185 } 186 187 cout := co.Stop() 188 cerr := ce.Stop() 189 if len(cout) > 0 { 190 t.Errorf("不正な標準出力が出力されています。 - %v", cout) 191 } 192 if !strings.Contains(cerr, Version) { 193 t.Errorf("stderrへの出力値[%s]が想定と違います。", cerr) 194 } 195 } 196 197 func TestRealMain_不正なFROM(t *testing.T) { 198 arg := &arguments{ 199 jobnet: "", 200 from: "20150416X", 201 to: "20150416", 202 status: "", 203 format: "", 204 config: confFile, 205 } 206 ce := testutil.NewStderrCapturer() 207 ce.Start() 208 co := testutil.NewStdoutCapturer() 209 co.Start() 210 211 ret := realMain(arg) 212 if ret != rc_PARMERR { 213 t.Errorf("戻り値[%v]が返るべきところ、[%v]が返りました。", rc_PARMERR, ret) 214 } 215 216 cout := co.Stop() 217 cerr := ce.Stop() 218 if len(cout) > 0 { 219 t.Errorf("不正な標準出力です。 - %v", cout) 220 } 221 if !strings.Contains(cerr, console.USAGE_SHOW) { 222 t.Errorf("不正な標準エラー出力です。 - %v", cerr) 223 } 224 } 225 226 func TestRealMain_不正なTO(t *testing.T) { 227 arg := &arguments{ 228 jobnet: "", 229 from: "20150416", 230 to: "20150416X", 231 status: "", 232 format: "", 233 config: confFile, 234 } 235 ce := testutil.NewStderrCapturer() 236 ce.Start() 237 co := testutil.NewStdoutCapturer() 238 co.Start() 239 240 ret := realMain(arg) 241 if ret != rc_PARMERR { 242 t.Errorf("戻り値[%v]が返るべきところ、[%v]が返りました。", rc_PARMERR, ret) 243 } 244 245 cout := co.Stop() 246 cerr := ce.Stop() 247 if len(cout) > 0 { 248 t.Errorf("不正な標準出力です。 - %v", cout) 249 } 250 if !strings.Contains(cerr, console.USAGE_SHOW) { 251 t.Errorf("不正な標準エラー出力です。 - %v", cerr) 252 } 253 } 254 255 func TestRealMain_不正なStatus(t *testing.T) { 256 arg := &arguments{ 257 jobnet: "", 258 from: "20150416", 259 to: "20150416", 260 status: "abc", 261 format: "", 262 config: confFile, 263 } 264 ce := testutil.NewStderrCapturer() 265 ce.Start() 266 co := testutil.NewStdoutCapturer() 267 co.Start() 268 269 ret := realMain(arg) 270 if ret != rc_PARMERR { 271 t.Errorf("戻り値[%v]が返るべきところ、[%v]が返りました。", rc_PARMERR, ret) 272 } 273 274 cout := co.Stop() 275 cerr := ce.Stop() 276 if len(cout) > 0 { 277 t.Errorf("不正な標準出力です。 - %v", cout) 278 } 279 if !strings.Contains(cerr, console.USAGE_SHOW) { 280 t.Errorf("不正な標準エラー出力です。 - %v", cerr) 281 } 282 } 283 284 func TestRealMain_不正なFormat(t *testing.T) { 285 arg := &arguments{ 286 jobnet: "", 287 from: "20150416", 288 to: "20150416", 289 status: "", 290 format: "abc", 291 config: confFile, 292 } 293 ce := testutil.NewStderrCapturer() 294 ce.Start() 295 co := testutil.NewStdoutCapturer() 296 co.Start() 297 298 ret := realMain(arg) 299 if ret != rc_PARMERR { 300 t.Errorf("戻り値[%v]が返るべきところ、[%v]が返りました。", rc_PARMERR, ret) 301 } 302 303 cout := co.Stop() 304 cerr := ce.Stop() 305 if len(cout) > 0 { 306 t.Errorf("不正な標準出力です。 - %v", cout) 307 } 308 if !strings.Contains(cerr, console.USAGE_SHOW) { 309 t.Errorf("不正な標準エラー出力です。 - %v", cerr) 310 } 311 } 312 313 func TestRealMain_不正な設定ファイル(t *testing.T) { 314 arg := &arguments{ 315 jobnet: "", 316 from: "20150416", 317 to: "20150416", 318 status: "", 319 format: "", 320 config: "error.ini", 321 } 322 ce := testutil.NewStderrCapturer() 323 ce.Start() 324 co := testutil.NewStdoutCapturer() 325 co.Start() 326 327 ret := realMain(arg) 328 if ret != rc_PARMERR { 329 t.Errorf("戻り値[%v]が返るべきところ、[%v]が返りました。", rc_PARMERR, ret) 330 } 331 332 cout := co.Stop() 333 cerr := ce.Stop() 334 if len(cout) > 0 { 335 t.Errorf("不正な標準出力です。 - %v", cout) 336 } 337 if !strings.Contains(cerr, "error.ini") { 338 t.Errorf("不正な標準エラー出力です。 - %v", cerr) 339 } 340 } 341 342 func TestRealMain_RuntimeErrorX(t *testing.T) { 343 arg := &arguments{ 344 jobnet: "", 345 from: "20150414", 346 to: "20150416", 347 status: "", 348 format: "", 349 config: filepath.Join(confPath, "show_testX.ini"), 350 } 351 ce := testutil.NewStderrCapturer() 352 ce.Start() 353 co := testutil.NewStdoutCapturer() 354 co.Start() 355 356 ret := realMain(arg) 357 if ret != rc_ERROR { 358 t.Errorf("戻り値[%v]が返るべきところ、[%v]が返りました。", rc_ERROR, ret) 359 } 360 361 cout := co.Stop() 362 cerr := ce.Stop() 363 if len(cout) > 0 { 364 t.Errorf("不正な標準出力です。 - %v", cout) 365 } 366 if !strings.Contains(cerr, "AN INTERNAL ERROR OCCURRED.") { 367 t.Errorf("不正な標準エラー出力です。 - %v", cerr) 368 } 369 } 370 371 func TestRealMain_RuntimeErrorY(t *testing.T) { 372 arg := &arguments{ 373 jobnet: "", 374 from: "20150414", 375 to: "20150416", 376 status: "", 377 format: "", 378 config: filepath.Join(confPath, "show_testY.ini"), 379 } 380 ce := testutil.NewStderrCapturer() 381 ce.Start() 382 co := testutil.NewStdoutCapturer() 383 co.Start() 384 385 ret := realMain(arg) 386 if ret != rc_ERROR { 387 t.Errorf("戻り値[%v]が返るべきところ、[%v]が返りました。", rc_ERROR, ret) 388 } 389 390 cout := co.Stop() 391 cerr := ce.Stop() 392 if len(cout) > 0 { 393 t.Errorf("不正な標準出力です。 - %v", cout) 394 } 395 if !strings.Contains(cerr, "AN INTERNAL ERROR OCCURRED.") { 396 t.Errorf("不正な標準エラー出力です。 - %v", cerr) 397 } 398 } 399 400 func TestGetStatusType_指定毎に返るステータスを確認(t *testing.T) { 401 s, err := getStatusType("running") 402 if err != nil { 403 t.Errorf("成功する予定が、エラーになった。 - %v", err) 404 } else if s != db.RUNNING { 405 t.Errorf("ステータス[%v]が返る予定が、[%v]が返った。", db.RUNNING, s) 406 } 407 408 s, err = getStatusType("normal") 409 if err != nil { 410 t.Errorf("成功する予定が、エラーになった。 - %v", err) 411 } else if s != db.NORMAL { 412 t.Errorf("ステータス[%v]が返る予定が、[%v]が返った。", db.NORMAL, s) 413 } 414 415 s, err = getStatusType("abnormal") 416 if err != nil { 417 t.Errorf("成功する予定が、エラーになった。 - %v", err) 418 } else if s != db.ABNORMAL { 419 t.Errorf("ステータス[%v]が返る予定が、[%v]が返った。", db.ABNORMAL, s) 420 } 421 422 s, err = getStatusType("warn") 423 if err != nil { 424 t.Errorf("成功する予定が、エラーになった。 - %v", err) 425 } else if s != db.WARN { 426 t.Errorf("ステータス[%v]が返る予定が、[%v]が返った。", db.WARN, s) 427 } 428 429 s, err = getStatusType("") 430 if err != nil { 431 t.Errorf("成功する予定が、エラーになった。 - %v", err) 432 } else if s != -1 { 433 t.Errorf("ステータス[%v]が返る予定が、[%v]が返った。", -1, s) 434 } 435 436 s, err = getStatusType("X") 437 if err == nil { 438 t.Error("失敗する予定が、エラーが返らなかった。") 439 } 440 } 441 442 func TestGetSeparatorType_指定毎に返るジェネレーターを確認(t *testing.T) { 443 g := getSeparatorType("") 444 switch g.(type) { 445 case *gen.JsonGenerator: 446 default: 447 t.Error("JsonGeneratorになるべきところ、異なる型が返った。") 448 } 449 450 g = getSeparatorType("json") 451 switch g.(type) { 452 case *gen.JsonGenerator: 453 default: 454 t.Error("JsonGeneratorになるべきところ、異なる型が返った。") 455 } 456 457 g = getSeparatorType("csv") 458 switch g.(type) { 459 case *gen.CsvGenerator: 460 default: 461 t.Error("CsvGeneratorになるべきところ、異なる型が返った。") 462 } 463 464 g = getSeparatorType("X") 465 if g != nil { 466 t.Error("誤った指定をしたにもかかわらず、nilが返らない。") 467 } 468 } 469 470 func TestShowVersion_バージョン表示(t *testing.T) { 471 c := testutil.NewStderrCapturer() 472 c.Start() 473 474 showVersion() 475 476 output := c.Stop() 477 if output != fmt.Sprintf("%v show-utility version.\n", Version) { 478 t.Errorf("stderrへの出力値[%s]が想定と違います。", output) 479 } 480 } 481 482 func TestShowUsage_Usage表示(t *testing.T) { 483 c := testutil.NewStderrCapturer() 484 c.Start() 485 486 showUsage() 487 488 output := c.Stop() 489 if output != console.USAGE_SHOW { 490 t.Errorf("stderrへの出力値[%s]が想定と違います。", output) 491 } 492 } 493 494 func TestFetchArgs_実行時引数のフェッチ(t *testing.T) { 495 fetchArgs() 496 } 497 498 func TestParseFromTo_UTCの場合(t *testing.T) { 499 from, to, err := parseFromTo("20150725", "20150801", true) 500 if err != nil { 501 t.Fatalf("想定外のエラーが発生した: %s", err) 502 } 503 if from != "2015-07-25 00:00:00.000" { 504 t.Errorf("fromの値が想定と違っている。") 505 t.Logf("想定値: %s", "2015-07-25 00:00:00.000") 506 t.Logf("実績値: %s", from) 507 } 508 if to != "2015-08-01 23:59:59.999" { 509 t.Errorf("toの値が想定と違っている。") 510 t.Logf("想定値: %s", "2015-08-01 23:59:59.999") 511 t.Logf("実績値: %s", to) 512 } 513 } 514 515 func TestParseFromTo_Localtimeの場合(t *testing.T) { 516 from, to, err := parseFromTo("20150725", "20150801", false) 517 if err != nil { 518 t.Fatalf("想定外のエラーが発生した: %s", err) 519 } 520 if from != "2015-07-24 15:00:00.000" { 521 t.Errorf("fromの値が想定と違っている。") 522 t.Logf("想定値: %s", "2015-07-24 15:00:00.000") 523 t.Logf("実績値: %s", from) 524 } 525 if to != "2015-08-01 14:59:59.999" { 526 t.Errorf("toの値が想定と違っている。") 527 t.Logf("想定値: %s", "2015-08-01 14:59:59.999") 528 t.Logf("実績値: %s", to) 529 } 530 } 531 532 func TestParseFromTo_指定なしの場合(t *testing.T) { 533 from, to, err := parseFromTo("", "", true) 534 if err != nil { 535 t.Fatalf("想定外のエラーが発生した: %s", err) 536 } 537 if from != "" { 538 t.Errorf("想定外のfrom[%s]が返却された。", from) 539 } 540 if to != "" { 541 t.Errorf("想定外のto[%s]が返却された。", to) 542 } 543 }