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

     1  package job
     2  
     3  import (
     4  	"fmt"
     5  	"os"
     6  	"path/filepath"
     7  	"strings"
     8  	"testing"
     9  	"time"
    10  
    11  	"github.com/unirita/cuto/message"
    12  	"github.com/unirita/cuto/servant/config"
    13  	"github.com/unirita/cuto/testutil"
    14  )
    15  
    16  var conf *config.ServantConfig
    17  var testJobPath string
    18  
    19  // ジョブログなどの掃除
    20  func init() {
    21  	time.Local = time.FixedZone("JST", 9*60*60)
    22  
    23  	testJobPath = filepath.Join(testutil.GetBaseDir(), "servant", "job", "_testdata")
    24  	err := os.Chdir(testJobPath)
    25  	config.RootPath = testJobPath
    26  	if err != nil {
    27  		panic(err.Error())
    28  	}
    29  	configPath := filepath.Join(testJobPath, testServantIni)
    30  	conf = config.ReadConfig(configPath)
    31  	os.RemoveAll(conf.Dir.JoblogDir)
    32  	err = os.Mkdir(conf.Dir.JoblogDir, 0755)
    33  	if err != nil {
    34  		panic(err.Error())
    35  	}
    36  }
    37  
    38  // メッセージ・DB向けの時刻フォーマットをジョブログファイル名向けのフォーマットに変換する。
    39  func stToLocalTimestamp(st string) string {
    40  	t, err := time.ParseInLocation("2006-01-02 15:04:05.000", st, time.UTC)
    41  	if err != nil {
    42  		panic("Unexpected time format: " + err.Error())
    43  	}
    44  	return t.Local().Format("20060102150405.000")
    45  }
    46  
    47  // ジョブログファイル名をフルパスで作成する。
    48  // ”開始日(YYYYMMDD)\インスタンスID.ジョブ名(拡張子なし).開始日時(yyyyMMddHHmmss.sss).log
    49  func createJoblogFileName(req *message.Request, st string, nID int, jID string) string {
    50  	job := filepath.Base(req.Path)
    51  	if extpos := strings.LastIndex(job, "."); extpos != -1 {
    52  		job = job[:extpos]
    53  	}
    54  	joblogFile := fmt.Sprintf("%v.%v.%v.%v.log", nID, job, jID, st)
    55  	return filepath.Join(conf.Dir.JoblogDir, st[:8], joblogFile)
    56  }
    57  
    58  func createTestJobInstance() *jobInstance {
    59  	j := new(jobInstance)
    60  	j.config = config.DefaultServantConfig()
    61  	j.nID = 1234
    62  	j.jID = "JID"
    63  	j.path = "test.sh"
    64  	j.param = "param1 param2"
    65  	j.env = "env1 env2"
    66  	j.workDir = ""
    67  	j.wrnRC = 5
    68  	j.wrnPtn = "warn"
    69  	j.errRC = 10
    70  	j.errPtn = "error"
    71  	j.timeout = 100
    72  	return j
    73  }
    74  
    75  func TestJobCreateShell_Normal(t *testing.T) {
    76  	j := createTestJobInstance()
    77  	cmd := j.createShell()
    78  	expectedPath := filepath.Join(j.config.Dir.JobDir, "test.sh")
    79  	if cmd.Path != expectedPath {
    80  		t.Errorf("cmd.Path => %s, wants %s", cmd.Path, expectedPath)
    81  	}
    82  	if len(cmd.Args) != 3 {
    83  		t.Fatalf("len(cmd.Args) => %d, wants %d", len(cmd.Args), 3)
    84  	}
    85  	if cmd.Args[1] != "param1" {
    86  		t.Errorf("cmd.Args[1] => %s, wants %s", cmd.Args[1], "param1")
    87  	}
    88  	if cmd.Args[2] != "param2" {
    89  		t.Errorf("cmd.Args[2] => %s, wants %s", cmd.Args[2], "param2")
    90  	}
    91  }
    92  
    93  func TestJobCreateShell_Docker_CommandPathIsSet(t *testing.T) {
    94  	j := createTestJobInstance()
    95  	j.config.Job.DockerCommandPath = "/usr/bin/docker"
    96  	j.path = message.DockerTag
    97  	j.param = "exec containerName command param1 param2"
    98  	cmd := j.createShell()
    99  	if cmd.Path != "/usr/bin/docker" {
   100  		t.Errorf("cmd.Path => %s, wants %s", cmd.Path, "/usr/bin/docker")
   101  	}
   102  	if len(cmd.Args) != 6 {
   103  		t.Fatalf("len(cmd.Args) => %d, wants %d", len(cmd.Args), 6)
   104  	}
   105  	if cmd.Args[1] != "exec" {
   106  		t.Errorf("cmd.Args[1] => %s, wants %s", cmd.Args[1], "exec")
   107  	}
   108  	if cmd.Args[2] != "containerName" {
   109  		t.Errorf("cmd.Args[2] => %s, wants %s", cmd.Args[2], "containerName")
   110  	}
   111  	if cmd.Args[3] != "command" {
   112  		t.Errorf("cmd.Args[3] => %s, wants %s", cmd.Args[3], "command")
   113  	}
   114  	if cmd.Args[4] != "param1" {
   115  		t.Errorf("cmd.Args[4] => %s, wants %s", cmd.Args[4], "param1")
   116  	}
   117  	if cmd.Args[5] != "param2" {
   118  		t.Errorf("cmd.Args[5] => %s, wants %s", cmd.Args[5], "param2")
   119  	}
   120  	if j.path != "command" {
   121  		t.Errorf("j.path => %s, wants %s", j.path, "command")
   122  	}
   123  }
   124  
   125  func TestJobCreateShell_Docker_CommandPathIsNotSet(t *testing.T) {
   126  	j := createTestJobInstance()
   127  	j.config.Job.DockerCommandPath = ""
   128  	j.path = message.DockerTag
   129  	cmd := j.createShell()
   130  	if cmd.Path != "" {
   131  		t.Errorf("cmd.Path => %s, wants %s", cmd.Path, "")
   132  	}
   133  }
   134  
   135  func TestJobCreateShell_VBScript(t *testing.T) {
   136  	j := createTestJobInstance()
   137  	j.path = "test.vbs"
   138  	cmd := j.createShell()
   139  	if !strings.Contains(cmd.Path, "cscript") {
   140  		t.Errorf("cmd.Path must contains '%s', but it did not.", "cscript")
   141  		t.Logf("cmd.Path => %s", cmd.Path)
   142  	}
   143  	if len(cmd.Args) != 5 {
   144  		t.Fatalf("len(cmd.Args) => %d, wants %d", len(cmd.Args), 5)
   145  	}
   146  	if cmd.Args[1] != "/nologo" {
   147  		t.Errorf("cmd.Args[1] => %s, wants %s", cmd.Args[1], "/nologo")
   148  	}
   149  	expectedPath := filepath.Join(j.config.Dir.JobDir, "test.vbs")
   150  	if cmd.Args[2] != expectedPath {
   151  		t.Errorf("cmd.Args[2] => %s, wants %s", cmd.Args[2], expectedPath)
   152  	}
   153  	if cmd.Args[3] != "param1" {
   154  		t.Errorf("cmd.Args[3] => %s, wants %s", cmd.Args[3], "param1")
   155  	}
   156  	if cmd.Args[4] != "param2" {
   157  		t.Errorf("cmd.Args[4] => %s, wants %s", cmd.Args[4], "param2")
   158  	}
   159  }
   160  
   161  func TestJobCreateShell_JScript(t *testing.T) {
   162  	j := createTestJobInstance()
   163  	j.path = "test.js"
   164  	cmd := j.createShell()
   165  	if !strings.Contains(cmd.Path, "cscript") {
   166  		t.Errorf("cmd.Path must contains '%s', but it did not.", "cscript")
   167  		t.Logf("cmd.Path => %s", cmd.Path)
   168  	}
   169  	if len(cmd.Args) != 5 {
   170  		t.Fatalf("len(cmd.Args) => %d, wants %d", len(cmd.Args), 5)
   171  	}
   172  	if cmd.Args[1] != "/nologo" {
   173  		t.Errorf("cmd.Args[1] => %s, wants %s", cmd.Args[1], "/nologo")
   174  	}
   175  	expectedPath := filepath.Join(j.config.Dir.JobDir, "test.js")
   176  	if cmd.Args[2] != expectedPath {
   177  		t.Errorf("cmd.Args[2] => %s, wants %s", cmd.Args[2], expectedPath)
   178  	}
   179  	if cmd.Args[3] != "param1" {
   180  		t.Errorf("cmd.Args[3] => %s, wants %s", cmd.Args[3], "param1")
   181  	}
   182  	if cmd.Args[4] != "param2" {
   183  		t.Errorf("cmd.Args[4] => %s, wants %s", cmd.Args[4], "param2")
   184  	}
   185  }
   186  
   187  func TestJobCreateShell_JAR(t *testing.T) {
   188  	j := createTestJobInstance()
   189  	j.path = "test.jar"
   190  	cmd := j.createShell()
   191  	if !strings.Contains(cmd.Path, "java") {
   192  		t.Errorf("cmd.Path must contains '%s', but it did not.", "java")
   193  		t.Logf("cmd.Path => %s", cmd.Path)
   194  	}
   195  	if len(cmd.Args) != 5 {
   196  		t.Fatalf("len(cmd.Args) => %d, wants %d", len(cmd.Args), 5)
   197  	}
   198  	if cmd.Args[1] != "-jar" {
   199  		t.Errorf("cmd.Args[1] => %s, wants %s", cmd.Args[1], "-jar")
   200  	}
   201  	expectedPath := filepath.Join(j.config.Dir.JobDir, "test.jar")
   202  	if cmd.Args[2] != expectedPath {
   203  		t.Errorf("cmd.Args[2] => %s, wants %s", cmd.Args[2], expectedPath)
   204  	}
   205  	if cmd.Args[3] != "param1" {
   206  		t.Errorf("cmd.Args[3] => %s, wants %s", cmd.Args[3], "param1")
   207  	}
   208  	if cmd.Args[4] != "param2" {
   209  		t.Errorf("cmd.Args[4] => %s, wants %s", cmd.Args[4], "param2")
   210  	}
   211  }
   212  
   213  func TestJobCreateShell_PowerShell(t *testing.T) {
   214  	j := createTestJobInstance()
   215  	j.path = "test.ps1"
   216  	cmd := j.createShell()
   217  	if !strings.Contains(cmd.Path, "powershell") {
   218  		t.Errorf("cmd.Path must contains '%s', but it did not.", "powershell")
   219  		t.Logf("cmd.Path => %s", cmd.Path)
   220  	}
   221  	if len(cmd.Args) != 4 {
   222  		t.Fatalf("len(cmd.Args) => %d, wants %d", len(cmd.Args), 5)
   223  	}
   224  	expectedPath := filepath.Join(j.config.Dir.JobDir, "test.ps1")
   225  	if cmd.Args[1] != expectedPath {
   226  		t.Errorf("cmd.Args[1] => %s, wants %s", cmd.Args[1], expectedPath)
   227  	}
   228  	if cmd.Args[2] != "param1" {
   229  		t.Errorf("cmd.Args[2] => %s, wants %s", cmd.Args[2], "param1")
   230  	}
   231  	if cmd.Args[3] != "param2" {
   232  		t.Errorf("cmd.Args[3] => %s, wants %s", cmd.Args[3], "param2")
   233  	}
   234  }