github.com/hy3/cuto@v0.9.8-0.20160830082821-aa6652f877b7/master/main_test.go (about) 1 package main 2 3 import ( 4 "bufio" 5 "io" 6 "net" 7 "os" 8 "path/filepath" 9 "strings" 10 "testing" 11 12 "github.com/unirita/cuto/testutil" 13 ) 14 15 var testDataDir string 16 17 func TestMain(m *testing.M) { 18 os.Exit(realTestMain(m)) 19 } 20 21 func realTestMain(m *testing.M) int { 22 testDataDir = filepath.Join(testutil.GetBaseDir(), "master", "_testdata") 23 os.Chdir(testDataDir) 24 os.RemoveAll("log") 25 os.Mkdir("log", 0777) 26 27 dbBase := filepath.Join(testDataDir, "data", "test.sqlite.org") 28 dbFile := filepath.Join(testDataDir, "data", "test.sqlite") 29 copyFile(dbBase, dbFile) 30 defer os.RemoveAll(dbFile) 31 32 return m.Run() 33 } 34 35 func copyFile(srcPath string, targetPath string) error { 36 src, err := os.Open(srcPath) 37 if err != nil { 38 return err 39 } 40 defer src.Close() 41 42 target, err := os.Create(targetPath) 43 if err != nil { 44 return err 45 } 46 defer target.Close() 47 48 r := bufio.NewReader(src) 49 w := bufio.NewWriter(target) 50 buf := make([]byte, 1024) 51 for { 52 n, err := r.Read(buf) 53 if err != nil && err != io.EOF { 54 return err 55 } 56 if n == 0 { 57 break 58 } 59 w.Write(buf[:n]) 60 } 61 return w.Flush() 62 } 63 64 func runTestServant(t *testing.T, waitInitCh chan<- struct{}) { 65 listener, lerr := net.Listen("tcp", "localhost:15243") 66 waitInitCh <- struct{}{} 67 if lerr != nil { 68 t.Log(lerr) 69 return 70 } 71 72 conn, cerr := listener.Accept() 73 if cerr != nil { 74 t.Log(cerr) 75 return 76 } 77 defer conn.Close() 78 79 buf := make([]byte, 1024) 80 if _, err := conn.Read(buf); err != nil { 81 t.Log(err) 82 return 83 } 84 85 res := `{"type":"response","nid":1234,"jid":"j1","rc":0,"stat":1,"detail":"","var":"","st":"2015-04-01 12:34:56.789","et":"2015-04-01 12:35:46.123"}` 86 res += "\n" 87 88 if _, err := conn.Write([]byte(res)); err != nil { 89 t.Log(err) 90 return 91 } 92 } 93 94 func TestFetchArgs_コマンドラインオプションを取得できる(t *testing.T) { 95 os.Args = append(os.Args, "-v", "-n", "test", "-s", "-r", "123", "-c", "test.ini") 96 args := fetchArgs() 97 98 if args.versionFlag != flag_ON { 99 t.Error("-vオプションの指定を検出できなかった。") 100 } 101 if args.networkName != "test" { 102 t.Error("-nオプションの値を取得できなかった。") 103 } 104 if args.startFlag != flag_ON { 105 t.Error("-sオプションの指定を検出できなかった。") 106 } 107 if args.rerunInstance != 123 { 108 t.Error("-rオプションの指定を検出できなかった。") 109 } 110 if args.configPath != "test.ini" { 111 t.Error("-cオプションの値を取得できなかった。") 112 } 113 } 114 115 func TestRealMain_バージョン出力オプションが指定された場合(t *testing.T) { 116 c := testutil.NewStdoutCapturer() 117 118 args := new(arguments) 119 args.versionFlag = flag_ON 120 121 c.Start() 122 rc := realMain(args) 123 out := c.Stop() 124 125 if rc != rc_OK { 126 t.Errorf("想定外のrc[%d]が返された。", rc) 127 } 128 if !strings.Contains(out, Version) { 129 t.Error("出力内容が想定と違っている。") 130 t.Logf("出力: %s", out) 131 } 132 } 133 134 func TestRealMain_ネットワーク名およびインスタンスIDの両方が指定されなかった場合(t *testing.T) { 135 c := testutil.NewStdoutCapturer() 136 137 args := new(arguments) 138 139 c.Start() 140 rc := realMain(args) 141 out := c.Stop() 142 143 if rc != rc_ERROR { 144 t.Errorf("想定外のrc[%d]が返された。", rc) 145 } 146 if !strings.Contains(out, "INVALID ARGUMENT.") { 147 t.Error("出力内容が想定と違っている。") 148 t.Logf("出力: %s", out) 149 } 150 } 151 152 func TestRealMain_ネットワーク名およびインスタンスIDの両方が指定された場合(t *testing.T) { 153 c := testutil.NewStdoutCapturer() 154 155 args := new(arguments) 156 args.networkName = "test" 157 args.rerunInstance = 123 158 159 c.Start() 160 rc := realMain(args) 161 out := c.Stop() 162 163 if rc != rc_ERROR { 164 t.Errorf("想定外のrc[%d]が返された。", rc) 165 } 166 if !strings.Contains(out, "EXCEPTION") { 167 t.Error("出力内容が想定と違っている。") 168 t.Logf("出力: %s", out) 169 } 170 } 171 172 func TestRealMain_存在しない設定ファイルが指定された場合(t *testing.T) { 173 c := testutil.NewStdoutCapturer() 174 175 args := new(arguments) 176 args.networkName = "test" 177 args.configPath = "noexists.ini" 178 179 c.Start() 180 rc := realMain(args) 181 out := c.Stop() 182 183 if rc != rc_ERROR { 184 t.Errorf("想定外のrc[%d]が返された。", rc) 185 } 186 if !strings.Contains(out, "FAILED TO READ EXPAND JOB CONFIG FILE") { 187 t.Error("出力内容が想定と違っている。") 188 t.Logf("出力: %s", out) 189 } 190 } 191 192 func TestRealMain_不正な内容の設定ファイルが指定された場合(t *testing.T) { 193 c := testutil.NewStdoutCapturer() 194 195 args := new(arguments) 196 args.networkName = "test" 197 args.configPath = "configerror.ini" 198 199 c.Start() 200 rc := realMain(args) 201 out := c.Stop() 202 203 if rc != rc_ERROR { 204 t.Errorf("想定外のrc[%d]が返された。", rc) 205 } 206 if !strings.Contains(out, "CONFIG PARM IS NOT EXACT FORMAT.") { 207 t.Error("出力内容が想定と違っている。") 208 t.Logf("出力: %s", out) 209 } 210 } 211 212 func TestRealMain_指定ネットワークの定義ファイルが存在しない(t *testing.T) { 213 c := testutil.NewStdoutCapturer() 214 215 args := new(arguments) 216 args.networkName = "noexists" 217 218 c.Start() 219 rc := realMain(args) 220 out := c.Stop() 221 222 if rc != rc_ERROR { 223 t.Errorf("想定外のrc[%d]が返された。", rc) 224 } 225 if !strings.Contains(out, "FAILED TO READ BPMN FILE") { 226 t.Error("出力内容が想定と違っている。") 227 t.Logf("出力: %s", out) 228 } 229 } 230 231 func TestRealMain_ログディレクトリが存在しない場合(t *testing.T) { 232 c := testutil.NewStdoutCapturer() 233 234 args := new(arguments) 235 args.networkName = "test" 236 args.configPath = "logerror.ini" 237 238 c.Start() 239 rc := realMain(args) 240 out := c.Stop() 241 242 if rc != rc_ERROR { 243 t.Errorf("想定外のrc[%d]が返された。", rc) 244 } 245 if !strings.Contains(out, "COULD NOT INITIALIZE LOGGER.") { 246 t.Error("出力内容が想定と違っている。") 247 t.Logf("出力: %s", out) 248 } 249 } 250 251 func TestRealMain_ネットワーク定義の書式チェックのみを行う場合_エラーなし(t *testing.T) { 252 c := testutil.NewStdoutCapturer() 253 254 args := new(arguments) 255 args.networkName = "test" 256 257 c.Start() 258 rc := realMain(args) 259 out := c.Stop() 260 261 if rc != rc_OK { 262 t.Errorf("想定外のrc[%d]が返された。", rc) 263 } 264 if !strings.Contains(out, "IS VALID") { 265 t.Error("出力内容が想定と違っている。") 266 t.Logf("出力: %s", out) 267 } 268 } 269 270 func TestRealMain_ネットワーク定義の書式チェックのみを行う場合_エラーあり(t *testing.T) { 271 c := testutil.NewStdoutCapturer() 272 273 args := new(arguments) 274 args.networkName = "error" 275 276 c.Start() 277 rc := realMain(args) 278 out := c.Stop() 279 280 if rc != rc_ERROR { 281 t.Errorf("想定外のrc[%d]が返された。", rc) 282 } 283 if !strings.Contains(out, "IS NOT EXACT FORMAT") { 284 t.Error("出力内容が想定と違っている。") 285 t.Logf("出力: %s", out) 286 } 287 } 288 289 func TestRealMain_ジョブ実行を行う_正常な実行(t *testing.T) { 290 c := testutil.NewStdoutCapturer() 291 292 args := new(arguments) 293 args.networkName = "test" 294 args.startFlag = flag_ON 295 296 waitCh := make(chan struct{}, 1) 297 go runTestServant(t, waitCh) 298 <-waitCh 299 300 c.Start() 301 rc := realMain(args) 302 out := c.Stop() 303 304 if rc != rc_OK { 305 t.Errorf("想定外のrc[%d]が返された。", rc) 306 } 307 if !strings.Contains(out, "STATUS [NORMAL]") { 308 t.Error("出力内容が想定と違っている。") 309 t.Logf("出力: %s", out) 310 } 311 } 312 313 func TestRealMain_ジョブ実行を行う_拡張ジョブ定義にエラーあり(t *testing.T) { 314 c := testutil.NewStdoutCapturer() 315 316 args := new(arguments) 317 args.networkName = "jobexerror" 318 args.startFlag = flag_ON 319 320 c.Start() 321 rc := realMain(args) 322 out := c.Stop() 323 324 if rc != rc_ERROR { 325 t.Errorf("想定外のrc[%d]が返された。", rc) 326 } 327 if !strings.Contains(out, "FAILED TO READ EXPAND JOB CONFIG FILE") { 328 t.Error("出力内容が想定と違っている。") 329 t.Logf("出力: %s", out) 330 } 331 } 332 333 func TestRealMain_ジョブ実行を行う_ジョブ実行中にエラー発生(t *testing.T) { 334 c := testutil.NewStdoutCapturer() 335 336 args := new(arguments) 337 args.networkName = "runerror" 338 args.startFlag = flag_ON 339 340 c.Start() 341 rc := realMain(args) 342 out := c.Stop() 343 344 if rc != rc_ERROR { 345 t.Errorf("想定外のrc[%d]が返された。", rc) 346 } 347 if !strings.Contains(out, "STATUS [ABNORMAL]") { 348 t.Error("出力内容が想定と違っている。") 349 t.Logf("出力: %s", out) 350 } 351 } 352 353 func TestRealMain_リラン実行_既に正常終了済みの場合(t *testing.T) { 354 c := testutil.NewStdoutCapturer() 355 356 args := new(arguments) 357 args.rerunInstance = 1 358 args.startFlag = flag_ON 359 360 c.Start() 361 rc := realMain(args) 362 out := c.Stop() 363 364 if rc != rc_OK { 365 t.Errorf("想定外のrc[%d]が返された。", rc) 366 } 367 if !strings.Contains(out, "CTM029I") { 368 t.Errorf("想定されるメッセージ[%s]が出力されていない。", "CTM029I") 369 t.Logf("出力: %s", out) 370 } 371 } 372 373 func TestRealMain_リラン実行_存在しないインスタンスIDの場合(t *testing.T) { 374 c := testutil.NewStdoutCapturer() 375 376 args := new(arguments) 377 args.rerunInstance = 2 378 args.startFlag = flag_ON 379 380 c.Start() 381 rc := realMain(args) 382 out := c.Stop() 383 384 if rc != rc_ERROR { 385 t.Errorf("想定外のrc[%d]が返された。", rc) 386 } 387 if !strings.Contains(out, "CTM019E") { 388 t.Errorf("想定されるメッセージ[%s]が出力されていない。", "CTM019I") 389 t.Logf("出力: %s", out) 390 } 391 }