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  }