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  }