github.com/hy3/cuto@v0.9.8-0.20160830082821-aa6652f877b7/servant/job/job_windows_test.go (about)

     1  // Copyright 2015 unirita Inc.
     2  // Created 2015/04/10 shanxia
     3  
     4  package job
     5  
     6  import (
     7  	"bufio"
     8  	"os"
     9  	"strings"
    10  	"testing"
    11  
    12  	"github.com/unirita/cuto/db"
    13  	"github.com/unirita/cuto/message"
    14  )
    15  
    16  const testServantIni = "servant.ini"
    17  
    18  func TestDoJobRequest_ジョブが正常に実行できる(t *testing.T) {
    19  	req := &message.Request{
    20  		Type:      "request",
    21  		NID:       101,
    22  		JID:       "serviceTask_001",
    23  		Path:      "job.bat",
    24  		Param:     "XX 0",
    25  		Env:       "TESTENV1=ENVENV+ENV0=AAAAA+ENV2=BBBB",
    26  		Workspace: "",
    27  		WarnRC:    4,
    28  		WarnStr:   "WARN",
    29  		ErrRC:     12,
    30  		ErrStr:    "ERR",
    31  	}
    32  
    33  	stCh := make(chan string, 1)
    34  	res := DoJobRequest(req, conf, stCh)
    35  	if len(<-stCh) == 0 {
    36  		t.Error("ジョブ開始時間が送信されていない.")
    37  	}
    38  	close(stCh)
    39  
    40  	if req.NID != res.NID {
    41  		t.Error("NIDがリクエストとレスポンスで異なる.")
    42  	}
    43  	if req.JID != res.JID {
    44  		t.Error("IDがリクエストとレスポンスで異なる.")
    45  	}
    46  	if res.RC != 0 {
    47  		t.Errorf("ジョブが正常終了するはずなのに異常終了した. - ", res.RC)
    48  	}
    49  	if len(res.Detail) > 0 {
    50  		t.Error("ジョブが正常終了するはずなのに、エラーメッセージがある.", res.Detail)
    51  	}
    52  	if len(res.Var) == 0 {
    53  		t.Error("テストコード側の変数機能が未実装.")
    54  	} else if res.Var != "ENVENV XX" {
    55  		t.Errorf("変数の値が不正[%s].もしくは引数渡しに問題あり.", res.Var)
    56  	}
    57  	if len(res.St) == 0 {
    58  		t.Error("ジョブ開始時間が無い.")
    59  	}
    60  	if len(res.Et) == 0 {
    61  		t.Error("ジョブ終了時間が無い.")
    62  	}
    63  
    64  	file, err := os.Open(createJoblogFileName(req, stToLocalTimestamp(res.St), res.NID, res.JID))
    65  	if err != nil {
    66  		t.Error("ジョブログがない。", err.Error())
    67  	}
    68  	defer file.Close()
    69  	scanner := bufio.NewScanner(file)
    70  	var env1, env2, env3 bool
    71  	for scanner.Scan() {
    72  		line := scanner.Text()
    73  		if -1 != strings.Index(line, "ENVENV") {
    74  			env1 = true
    75  		} else if -1 != strings.Index(line, "AAAAA") {
    76  			env2 = true
    77  		} else if -1 != strings.Index(line, "BBBB") {
    78  			env3 = true
    79  		}
    80  	}
    81  	if !env1 || !env2 || !env3 {
    82  		t.Error("環境変数が正常に渡っていない可能性があります。", env1, env2, env3)
    83  	}
    84  }
    85  
    86  func TestDoJobRequest_パス指定あり引数なしジョブが正常に実行できる(t *testing.T) {
    87  	req := &message.Request{
    88  		Type:      "request",
    89  		NID:       102,
    90  		JID:       "serviceTask_002",
    91  		Path:      "job.bat",
    92  		Param:     "",
    93  		Env:       "TESTENV1=ENVENVENV",
    94  		Workspace: "C:\\Go",
    95  		WarnRC:    4,
    96  		WarnStr:   "WARN",
    97  		ErrRC:     12,
    98  		ErrStr:    "ERR",
    99  	}
   100  
   101  	stCh := make(chan string, 1)
   102  	res := DoJobRequest(req, conf, stCh)
   103  	close(stCh)
   104  	if res.RC != 0 {
   105  		t.Error("ジョブが正常終了するはずなのに異常終了した.")
   106  	}
   107  	if len(res.Detail) > 0 {
   108  		t.Error("ジョブが正常終了するはずなのに、エラーメッセージがある.", res.Detail)
   109  	}
   110  	if len(res.Var) == 0 {
   111  		t.Error("変数なし.")
   112  	} else if res.Var != "ENVENVENV " {
   113  		t.Errorf("変数内容が不正.[%s]", res.Var)
   114  	}
   115  	if len(res.St) == 0 {
   116  		t.Error("ジョブ開始時間が無い.")
   117  	}
   118  	if len(res.Et) == 0 {
   119  		t.Error("ジョブ終了時間が無い.")
   120  	}
   121  	file, err := os.Open(createJoblogFileName(req, stToLocalTimestamp(res.St), res.NID, res.JID))
   122  	if err != nil {
   123  		t.Error("ジョブログがない。", err.Error())
   124  	}
   125  	defer file.Close()
   126  }
   127  
   128  func TestDoJobRequest_存在しないジョブ(t *testing.T) {
   129  	req := &message.Request{
   130  		Type:      "request",
   131  		NID:       103,
   132  		JID:       "serviceTask_003",
   133  		Path:      "nothing.bat",
   134  		Param:     "",
   135  		Env:       "TESTENV1=ENVENVENV",
   136  		Workspace: "C:\\Go",
   137  		WarnRC:    4,
   138  		WarnStr:   "WARN",
   139  		ErrRC:     12,
   140  		ErrStr:    "ERR",
   141  	}
   142  
   143  	stCh := make(chan string, 1)
   144  	res := DoJobRequest(req, conf, stCh)
   145  	close(stCh)
   146  	if res.RC != 0 {
   147  		t.Error("実行失敗の場合、RCは0のはず.")
   148  	}
   149  	if len(res.Detail) == 0 {
   150  		t.Error("異常終了メッセージが存在しない.")
   151  	}
   152  	if len(res.Var) > 0 {
   153  		t.Error("テストコード側の変数機能が未実装.")
   154  	}
   155  	if len(res.St) != 0 {
   156  		t.Error("ジョブ開始時間がある.")
   157  	}
   158  	if len(res.Et) != 0 {
   159  		t.Error("ジョブ終了時間がある.")
   160  	}
   161  }
   162  
   163  func TestDoJobRequest_RCで警告終了するジョブ_閾値と同じ(t *testing.T) {
   164  	req := &message.Request{
   165  		Type:      "request",
   166  		NID:       104,
   167  		JID:       "serviceTask_004",
   168  		Path:      "job.bat",
   169  		Param:     "X 4",
   170  		Env:       "TESTENV1=ENVENVENV",
   171  		Workspace: "C:\\Go",
   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.Error("RCは4のはず.")
   183  	}
   184  	if len(res.Detail) == 0 {
   185  		t.Error("異常終了メッセージが存在しない.")
   186  	} else if res.Detail != detailWarnRC {
   187  		t.Errorf("想定外のメッセージ - %s", res.Detail)
   188  	}
   189  	if len(res.Var) == 0 {
   190  		t.Error("変数なし.")
   191  	} else if res.Var != "ENVENVENV X" {
   192  		t.Errorf("変数内容が不正.[%s]", res.Var)
   193  	}
   194  	if len(res.St) == 0 {
   195  		t.Error("ジョブ開始時間がない.")
   196  	}
   197  	if len(res.Et) == 0 {
   198  		t.Error("ジョブ終了時間がない.")
   199  	}
   200  	if res.Stat != db.WARN {
   201  		t.Error("statが警告終了ではない")
   202  	}
   203  	file, err := os.Open(createJoblogFileName(req, stToLocalTimestamp(res.St), res.NID, res.JID))
   204  	if err != nil {
   205  		t.Error("ジョブログが存在しない.")
   206  	}
   207  	defer file.Close()
   208  }
   209  
   210  func TestDoJobRequest_RCで警告終了するがチェックしないジョブ(t *testing.T) {
   211  	req := &message.Request{
   212  		Type:      "request",
   213  		NID:       105,
   214  		JID:       "serviceTask_005",
   215  		Path:      "job.bat",
   216  		Param:     "X 4",
   217  		Env:       "TESTENV1=ENVENVENV",
   218  		Workspace: "C:\\Go",
   219  		WarnRC:    0,
   220  		WarnStr:   "WARN",
   221  		ErrRC:     12,
   222  		ErrStr:    "ERR",
   223  	}
   224  
   225  	stCh := make(chan string, 1)
   226  	res := DoJobRequest(req, conf, stCh)
   227  	close(stCh)
   228  	if res.RC != 4 {
   229  		t.Error("RCは4のはず.")
   230  	}
   231  	if len(res.Detail) != 0 {
   232  		t.Error("異常終了メッセージが存在しない.")
   233  	}
   234  	if len(res.Var) == 0 {
   235  		t.Error("テストコード側の変数機能が未実装.")
   236  	}
   237  	if len(res.St) == 0 {
   238  		t.Error("ジョブ開始時間がない.")
   239  	}
   240  	if len(res.Et) == 0 {
   241  		t.Error("ジョブ終了時間がない.")
   242  	}
   243  	if res.Stat != db.NORMAL {
   244  		t.Error("statが正常終了ではない")
   245  	}
   246  	file, err := os.Open(createJoblogFileName(req, stToLocalTimestamp(res.St), res.NID, res.JID))
   247  	if err != nil {
   248  		t.Error("ジョブログが存在しない.")
   249  	}
   250  	defer file.Close()
   251  }
   252  
   253  func TestDoJobRequest_RCで警告終了しないジョブ_閾値未満(t *testing.T) {
   254  	req := &message.Request{
   255  		Type:      "request",
   256  		NID:       106,
   257  		JID:       "serviceTask_006",
   258  		Path:      "job.bat",
   259  		Param:     "X 3",
   260  		Env:       "TESTENV1=ENVENVENV",
   261  		Workspace: "C:\\Go",
   262  		WarnRC:    4,
   263  		WarnStr:   "WARN",
   264  		ErrRC:     12,
   265  		ErrStr:    "ERR",
   266  	}
   267  
   268  	stCh := make(chan string, 1)
   269  	res := DoJobRequest(req, conf, stCh)
   270  	close(stCh)
   271  	if res.RC != 3 {
   272  		t.Error("RCは3のはず.")
   273  	}
   274  	if len(res.Detail) != 0 {
   275  		t.Error("異常終了メッセージが存在しない.")
   276  	}
   277  	if len(res.Var) == 0 {
   278  		t.Error("変数なし.")
   279  	} else if res.Var != "ENVENVENV X" {
   280  		t.Errorf("変数内容が不正.[%s]", res.Var)
   281  	}
   282  	if len(res.St) == 0 {
   283  		t.Error("ジョブ開始時間がない.")
   284  	}
   285  	if len(res.Et) == 0 {
   286  		t.Error("ジョブ終了時間がない.")
   287  	}
   288  	if res.Stat != db.NORMAL {
   289  		t.Error("statが正常終了ではない")
   290  	}
   291  	file, err := os.Open(createJoblogFileName(req, stToLocalTimestamp(res.St), res.NID, res.JID))
   292  	if err != nil {
   293  		t.Error("ジョブログが存在しない.")
   294  	}
   295  	defer file.Close()
   296  }
   297  
   298  func TestDoJobRequest_標準出力で警告終了するジョブ_RC確認なし(t *testing.T) {
   299  	req := &message.Request{
   300  		Type:      "request",
   301  		NID:       107,
   302  		JID:       "serviceTask_007",
   303  		Path:      "job.bat",
   304  		Param:     "AB 0",
   305  		Env:       "TESTENV1=!!!WARNING!!!",
   306  		Workspace: "C:\\Go",
   307  		WarnRC:    0,
   308  		WarnStr:   "WARN",
   309  		ErrRC:     0,
   310  		ErrStr:    "ERR",
   311  	}
   312  
   313  	stCh := make(chan string, 1)
   314  	res := DoJobRequest(req, conf, stCh)
   315  	close(stCh)
   316  	if res.RC != 0 {
   317  		t.Errorf("RCは0のはず. RC(%v)", res.RC)
   318  	}
   319  	if len(res.Detail) == 0 {
   320  		t.Error("異常終了メッセージが存在しない.")
   321  	} else if res.Detail != detailWarnPtn {
   322  		t.Errorf("想定外のメッセージ - %v", res.Detail)
   323  	}
   324  	if len(res.Var) == 0 {
   325  		t.Error("変数なし.")
   326  	} else if res.Var != "!!!WARNING!!! AB" {
   327  		t.Errorf("変数内容が不正.[%s]", res.Var)
   328  	}
   329  	if len(res.St) == 0 {
   330  		t.Error("ジョブ開始時間がない.")
   331  	}
   332  	if len(res.Et) == 0 {
   333  		t.Error("ジョブ終了時間がない.")
   334  	}
   335  	if res.Stat != db.WARN {
   336  		t.Error("statが警告終了ではない")
   337  	}
   338  	file, err := os.Open(createJoblogFileName(req, stToLocalTimestamp(res.St), res.NID, res.JID))
   339  	if err != nil {
   340  		t.Error("ジョブログが存在しない.")
   341  	}
   342  	defer file.Close()
   343  }
   344  
   345  func TestDoJobRequest_標準出力で警告終了するがチェックしないジョブ(t *testing.T) {
   346  	req := &message.Request{
   347  		Type:      "request",
   348  		NID:       108,
   349  		JID:       "serviceTask_008",
   350  		Path:      "job.bat",
   351  		Param:     "A",
   352  		Env:       "TESTENV1=!!!WARNING!!!",
   353  		Workspace: "C:\\Go",
   354  		WarnRC:    0,
   355  		WarnStr:   "",
   356  		ErrRC:     12,
   357  		ErrStr:    "ERR",
   358  	}
   359  
   360  	stCh := make(chan string, 1)
   361  	res := DoJobRequest(req, conf, stCh)
   362  	close(stCh)
   363  	if res.RC != 0 {
   364  		t.Error("RCは0のはず.")
   365  	}
   366  	if len(res.Detail) != 0 {
   367  		t.Error("異常終了メッセージが存在しない.")
   368  	}
   369  	if len(res.Var) == 0 {
   370  		t.Error("変数なし.")
   371  	} else if res.Var != "!!!WARNING!!! A" {
   372  		t.Errorf("変数内容が不正.[%s]", res.Var)
   373  	}
   374  	if len(res.St) == 0 {
   375  		t.Error("ジョブ開始時間がない.")
   376  	}
   377  	if len(res.Et) == 0 {
   378  		t.Error("ジョブ終了時間がない.")
   379  	}
   380  	if res.Stat != db.NORMAL {
   381  		t.Error("statが正常終了ではない")
   382  	}
   383  	file, err := os.Open(createJoblogFileName(req, stToLocalTimestamp(res.St), res.NID, res.JID))
   384  	if err != nil {
   385  		t.Error("ジョブログが存在しない.")
   386  	}
   387  	defer file.Close()
   388  }
   389  
   390  func TestDoJobRequest_JSジョブが正常に実行できる(t *testing.T) {
   391  	req := &message.Request{
   392  		Type:      "request",
   393  		NID:       109,
   394  		JID:       "serviceTask_009",
   395  		Path:      "job.js",
   396  		Param:     "A B",
   397  		Env:       "",
   398  		Workspace: "C:\\Go",
   399  		WarnRC:    4,
   400  		WarnStr:   "WARN",
   401  		ErrRC:     12,
   402  		ErrStr:    "ERR",
   403  	}
   404  
   405  	stCh := make(chan string, 1)
   406  	res := DoJobRequest(req, conf, stCh)
   407  	close(stCh)
   408  	if res.RC != 0 {
   409  		t.Errorf("ジョブが正常終了するはずなのに異常終了した. RC(%v)", res.RC)
   410  	}
   411  	if len(res.Detail) > 0 {
   412  		t.Error("ジョブが正常終了するはずなのに、エラーメッセージがある.", res.Detail)
   413  	}
   414  	if len(res.Var) == 0 {
   415  		t.Error("変数なし.")
   416  	} else if res.Var != "Argument2=B" {
   417  		t.Errorf("変数内容が不正.[%s]", res.Var)
   418  	}
   419  	if len(res.St) == 0 {
   420  		t.Error("ジョブ開始時間が無い.")
   421  	}
   422  	if len(res.Et) == 0 {
   423  		t.Error("ジョブ終了時間が無い.")
   424  	}
   425  	if strings.Index(res.Et, "20140330110120") != -1 {
   426  		t.Error("テストのテスト")
   427  	}
   428  	file, err := os.Open(createJoblogFileName(req, stToLocalTimestamp(res.St), res.NID, res.JID))
   429  	if err != nil {
   430  		t.Error("ジョブログがない。", err.Error())
   431  	}
   432  	defer file.Close()
   433  }
   434  
   435  func TestDoJobRequest_標準エラー出力で警告終了するVBSジョブ_RC確認なし(t *testing.T) {
   436  	req := &message.Request{
   437  		Type:      "request",
   438  		NID:       110,
   439  		JID:       "serviceTask_010",
   440  		Path:      "stderr.vbs",
   441  		Param:     "!!!WARN",
   442  		Env:       "",
   443  		Workspace: "C:\\Go",
   444  		WarnRC:    4,
   445  		WarnStr:   "WARN",
   446  		ErrRC:     12,
   447  		ErrStr:    "ERR",
   448  	}
   449  
   450  	stCh := make(chan string, 1)
   451  	res := DoJobRequest(req, conf, stCh)
   452  	close(stCh)
   453  	if res.RC != 0 {
   454  		t.Error("RCは0のはず.")
   455  	}
   456  	if len(res.Detail) == 0 {
   457  		t.Error("異常終了メッセージが存在しない.")
   458  	} else if res.Detail != detailWarnPtn {
   459  		t.Errorf("想定外のメッセージ - %v", res.Detail)
   460  	}
   461  	if len(res.Var) == 0 {
   462  		t.Error("変数なし.")
   463  	} else if res.Var != "Argument1=!!!WARN" {
   464  		t.Errorf("変数内容が不正.[%s]", res.Var)
   465  	}
   466  	if len(res.St) == 0 {
   467  		t.Error("ジョブ開始時間がない.")
   468  	}
   469  	if len(res.Et) == 0 {
   470  		t.Error("ジョブ終了時間がない.")
   471  	}
   472  	if res.Stat != db.WARN {
   473  		t.Error("statが警告終了ではない")
   474  	}
   475  	file, err := os.Open(createJoblogFileName(req, stToLocalTimestamp(res.St), res.NID, res.JID))
   476  	if err != nil {
   477  		t.Error("ジョブログが存在しない.")
   478  	}
   479  	defer file.Close()
   480  }
   481  
   482  func TestDoJobRequest_RCで異常終了するジョブ_閾値と同じ(t *testing.T) {
   483  	req := &message.Request{
   484  		Type:      "request",
   485  		NID:       111,
   486  		JID:       "serviceTask_011",
   487  		Path:      "job.bat",
   488  		Param:     "X 12",
   489  		Env:       "TESTENV1=ENVENVENV",
   490  		Workspace: "C:\\Go",
   491  		WarnRC:    4,
   492  		WarnStr:   "WARN",
   493  		ErrRC:     12,
   494  		ErrStr:    "ERR",
   495  	}
   496  
   497  	stCh := make(chan string, 1)
   498  	res := DoJobRequest(req, conf, stCh)
   499  	close(stCh)
   500  	if res.RC != 12 {
   501  		t.Error("RCは12のはず.")
   502  	}
   503  	if len(res.Detail) == 0 {
   504  		t.Error("異常終了メッセージが存在しない.")
   505  	} else if res.Detail != detailErrRC {
   506  		t.Errorf("想定外のメッセージ - %v", res.Detail)
   507  	}
   508  	if len(res.Var) == 0 {
   509  		t.Error("変数が格納されていない.")
   510  	}
   511  	if len(res.St) == 0 {
   512  		t.Error("ジョブ開始時間がない.")
   513  	}
   514  	if len(res.Et) == 0 {
   515  		t.Error("ジョブ終了時間がない.")
   516  	}
   517  	if res.Stat != db.ABNORMAL {
   518  		t.Error("statが異常終了ではない")
   519  	}
   520  	file, err := os.Open(createJoblogFileName(req, stToLocalTimestamp(res.St), res.NID, res.JID))
   521  	if err != nil {
   522  		t.Error("ジョブログが存在しない.")
   523  	}
   524  	defer file.Close()
   525  }
   526  
   527  func TestDoJobRequest_RCで異常終了するがチェックしないジョブ(t *testing.T) {
   528  	req := &message.Request{
   529  		Type:      "request",
   530  		NID:       112,
   531  		JID:       "serviceTask_012",
   532  		Path:      "job.bat",
   533  		Param:     "A 12",
   534  		Env:       "TESTENV1=ENVENVENV",
   535  		Workspace: "C:\\Go",
   536  		WarnRC:    0,
   537  		WarnStr:   "WARN",
   538  		ErrRC:     0,
   539  		ErrStr:    "ERR",
   540  	}
   541  
   542  	stCh := make(chan string, 1)
   543  	res := DoJobRequest(req, conf, stCh)
   544  	close(stCh)
   545  	if res.RC != 12 {
   546  		t.Error("RCは12のはず.")
   547  	}
   548  	if len(res.Detail) != 0 {
   549  		t.Error("異常終了メッセージが存在しない.")
   550  	}
   551  	if len(res.Var) == 0 {
   552  		t.Error("変数なし.")
   553  	} else if res.Var != "ENVENVENV A" {
   554  		t.Errorf("変数内容が不正.[%s]", res.Var)
   555  	}
   556  	if len(res.St) == 0 {
   557  		t.Error("ジョブ開始時間がない.")
   558  	}
   559  	if len(res.Et) == 0 {
   560  		t.Error("ジョブ終了時間がない.")
   561  	}
   562  	if res.Stat != db.NORMAL {
   563  		t.Error("statが正常終了ではない")
   564  	}
   565  	file, err := os.Open(createJoblogFileName(req, stToLocalTimestamp(res.St), res.NID, res.JID))
   566  	if err != nil {
   567  		t.Error("ジョブログが存在しない.")
   568  	}
   569  	defer file.Close()
   570  }
   571  
   572  func TestDoJobRequest_RCで異常終了して標準出力で警告終了するジョブ(t *testing.T) {
   573  	req := &message.Request{
   574  		Type:      "request",
   575  		NID:       113,
   576  		JID:       "serviceTask_013",
   577  		Path:      "job.bat",
   578  		Param:     "X 12",
   579  		Env:       "TESTENV1=WARNING",
   580  		Workspace: "C:\\Go",
   581  		WarnRC:    4,
   582  		WarnStr:   "WARN",
   583  		ErrRC:     12,
   584  		ErrStr:    "ERR",
   585  	}
   586  
   587  	stCh := make(chan string, 1)
   588  	res := DoJobRequest(req, conf, stCh)
   589  	close(stCh)
   590  	if res.RC != 12 {
   591  		t.Error("RCは12のはず.")
   592  	}
   593  	if len(res.Detail) == 0 {
   594  		t.Error("異常終了メッセージが存在しない.")
   595  	} else if res.Detail != detailErrRC {
   596  		t.Errorf("想定外のメッセージ - %v", res.Detail)
   597  	}
   598  	if len(res.Var) == 0 {
   599  		t.Error("変数が格納されていない.")
   600  	}
   601  	if len(res.St) == 0 {
   602  		t.Error("ジョブ開始時間がない.")
   603  	}
   604  	if len(res.Et) == 0 {
   605  		t.Error("ジョブ終了時間がない.")
   606  	}
   607  	if res.Stat != db.ABNORMAL {
   608  		t.Error("statが異常終了ではない")
   609  	}
   610  	file, err := os.Open(createJoblogFileName(req, stToLocalTimestamp(res.St), res.NID, res.JID))
   611  	if err != nil {
   612  		t.Error("ジョブログが存在しない.")
   613  	}
   614  	defer file.Close()
   615  }
   616  
   617  func TestDoJobRequest_RCで警告終了して標準出力で異常終了するジョブ(t *testing.T) {
   618  	req := &message.Request{
   619  		Type:      "request",
   620  		NID:       114,
   621  		JID:       "serviceTask_014",
   622  		Path:      "job.bat",
   623  		Param:     "X 11",
   624  		Env:       "TESTENV1=!!!ERROR!!!",
   625  		Workspace: "C:\\Go",
   626  		WarnRC:    4,
   627  		WarnStr:   "WARN",
   628  		ErrRC:     12,
   629  		ErrStr:    "ERROR",
   630  	}
   631  
   632  	stCh := make(chan string, 1)
   633  	res := DoJobRequest(req, conf, stCh)
   634  	close(stCh)
   635  	if res.RC != 11 {
   636  		t.Error("RCは11のはず.")
   637  	}
   638  	if len(res.Detail) == 0 {
   639  		t.Error("異常終了メッセージが存在する.")
   640  	} else if res.Detail != detailErrPtn {
   641  		t.Errorf("想定外のメッセージ - %v", res.Detail)
   642  	}
   643  	if len(res.Var) == 0 {
   644  		t.Error("変数が格納されていない.")
   645  	}
   646  	if len(res.St) == 0 {
   647  		t.Error("ジョブ開始時間がない.")
   648  	}
   649  	if len(res.Et) == 0 {
   650  		t.Error("ジョブ終了時間がない.")
   651  	}
   652  	if res.Stat != db.ABNORMAL {
   653  		t.Error("statが異常終了ではない")
   654  	}
   655  	file, err := os.Open(createJoblogFileName(req, stToLocalTimestamp(res.St), res.NID, res.JID))
   656  	if err != nil {
   657  		t.Error("ジョブログが存在しない.")
   658  	}
   659  	defer file.Close()
   660  }
   661  
   662  func TestDoJobRequest_日本語ジョブ(t *testing.T) {
   663  	req := &message.Request{
   664  		Type:      "request",
   665  		NID:       115,
   666  		JID:       "serviceTask_015",
   667  		Path:      "あ.bat",
   668  		Param:     "OOO 100",
   669  		Env:       "TESTENV1=!!!ERROR!!!",
   670  		Workspace: "C:\\Go",
   671  		WarnRC:    0,
   672  		WarnStr:   "",
   673  		ErrRC:     0,
   674  		ErrStr:    "",
   675  	}
   676  
   677  	stCh := make(chan string, 1)
   678  	res := DoJobRequest(req, conf, stCh)
   679  	close(stCh)
   680  	if res.RC != 100 {
   681  		t.Error("RCは100のはず.なのに", res.RC)
   682  	}
   683  	if len(res.Detail) != 0 {
   684  		t.Error("異常終了メッセージが存在する.")
   685  	}
   686  	if len(res.Var) == 0 {
   687  		t.Error("変数なし.")
   688  	} else if res.Var != "!!!ERROR!!! OOO" {
   689  		t.Errorf("変数内容が不正.[%s]", res.Var)
   690  	}
   691  	if len(res.St) == 0 {
   692  		t.Error("ジョブ開始時間がない.")
   693  	}
   694  	if len(res.Et) == 0 {
   695  		t.Error("ジョブ終了時間がない.")
   696  	}
   697  	if res.Stat != db.NORMAL {
   698  		t.Error("statが異常終了")
   699  	}
   700  	file, err := os.Open(createJoblogFileName(req, stToLocalTimestamp(res.St), res.NID, res.JID))
   701  	if err != nil {
   702  		t.Error("ジョブログが存在しない.")
   703  	}
   704  	defer file.Close()
   705  }
   706  
   707  func TestDoJobRequest_powershellジョブを実行(t *testing.T) {
   708  	req := &message.Request{
   709  		Type:      "request",
   710  		NID:       116,
   711  		JID:       "serviceTask_016",
   712  		Path:      "job.ps1",
   713  		Param:     "-a あいうえお -b 123 -z",
   714  		Env:       "TESTENV1=ENVENV",
   715  		Workspace: "C:\\Go",
   716  		WarnRC:    4,
   717  		WarnStr:   "WARN",
   718  		ErrRC:     12,
   719  		ErrStr:    "ERR",
   720  	}
   721  
   722  	stCh := make(chan string, 1)
   723  	res := DoJobRequest(req, conf, stCh)
   724  	close(stCh)
   725  	if req.NID != res.NID {
   726  		t.Error("NIDがリクエストとレスポンスで異なる.")
   727  	}
   728  	if req.JID != res.JID {
   729  		t.Error("IDがリクエストとレスポンスで異なる.")
   730  	}
   731  	if res.RC != 0 {
   732  		t.Errorf("ジョブが正常終了するはずなのに異常終了した. - %v", res.RC)
   733  	}
   734  	if len(res.Detail) > 0 {
   735  		t.Error("ジョブが正常終了するはずなのに、エラーメッセージがある.", res.Detail)
   736  	}
   737  	if len(res.Var) == 0 {
   738  		t.Error("変数なし.")
   739  	} else if res.Var != "$z is True" {
   740  		t.Errorf("変数内容が不正.[%s]", res.Var)
   741  	}
   742  	if len(res.St) == 0 {
   743  		t.Error("ジョブ開始時間が無い.")
   744  	}
   745  	if len(res.Et) == 0 {
   746  		t.Error("ジョブ終了時間が無い.")
   747  	}
   748  
   749  	file, err := os.Open(createJoblogFileName(req, stToLocalTimestamp(res.St), res.NID, res.JID))
   750  	if err != nil {
   751  		t.Error("ジョブログがない。", err.Error())
   752  	}
   753  	defer file.Close()
   754  }
   755  
   756  func TestDoJobRequest_タイムアウト時間を超えたら異常終了する(t *testing.T) {
   757  	req := &message.Request{
   758  		Type:      "request",
   759  		NID:       117,
   760  		JID:       "serviceTask_017",
   761  		Path:      "twosec.bat",
   762  		Param:     "",
   763  		Env:       "",
   764  		Workspace: "C:\\Go",
   765  		WarnRC:    0,
   766  		WarnStr:   "",
   767  		ErrRC:     0,
   768  		ErrStr:    "",
   769  		Timeout:   1,
   770  	}
   771  
   772  	stCh := make(chan string, 1)
   773  	res := DoJobRequest(req, conf, stCh)
   774  	close(stCh)
   775  	if res.Stat != db.ABNORMAL {
   776  		t.Error("異常終了するはずが、正常終了している。")
   777  	}
   778  	if len(res.Detail) == 0 {
   779  		t.Error("異常メッセージがセットされていない。")
   780  	}
   781  }