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 }