/**
* vips Inc.
* Copyright (c) 2016 All Rights Reserved.
*/
package com.vip.saturn.it.impl;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.fail;
import java.io.File;
import java.util.Collection;
import org.apache.commons.exec.OS;
import org.junit.*;
import com.vip.saturn.it.AbstractSaturnIT;
import com.vip.saturn.it.JobType;
import com.vip.saturn.it.job.LongtimeJavaJob;
import com.vip.saturn.job.executor.Main;
import com.vip.saturn.job.internal.config.JobConfiguration;
import com.vip.saturn.job.internal.execution.ExecutionNode;
import com.vip.saturn.job.internal.storage.JobNodePath;
import com.vip.saturn.job.utils.ScriptPidUtils;
import org.junit.runners.MethodSorters;
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class TimeoutJobIT extends AbstractSaturnIT {
public static String LONG_TIME_SH_PATH;
@BeforeClass
public static void setUp() throws Exception {
startNamespaceShardingManagerList(1);
startExecutorList(3);
File file1 = new File("src/test/resources/script/normal/longtime.sh");
LONG_TIME_SH_PATH = file1.getAbsolutePath();
}
@AfterClass
public static void tearDown() throws Exception {
stopExecutorList();
stopNamespaceShardingManagerList();
}
@Before
public void before() {
LongtimeJavaJob.statusMap.clear();
}
@After
public void after() {
LongtimeJavaJob.statusMap.clear();
}
@Test
public void test_A_JavaJob() throws InterruptedException{
final int shardCount = 3;
final String jobName = "timeoutITJobJava";
for(int i=0;i<shardCount;i++){
String key = jobName+"_"+i;
LongtimeJavaJob.JobStatus status = new LongtimeJavaJob.JobStatus();
status.runningCount = 0;
status.sleepSeconds = 30;
status.finished = false;
status.timeout = false;
status.beforetimeout = false;
LongtimeJavaJob.statusMap.put(key, status);
}
JobConfiguration jobConfiguration = new JobConfiguration(jobName);
jobConfiguration.setCron("0 0 1 * * ?");
jobConfiguration.setJobType(JobType.JAVA_JOB.toString());
jobConfiguration.setJobClass(LongtimeJavaJob.class.getCanonicalName());
jobConfiguration.setTimeoutSeconds(3);
jobConfiguration.setShardingTotalCount(shardCount);
jobConfiguration.setShardingItemParameters("0=0,1=1,2=2");
addJob(jobConfiguration);
Thread.sleep(1000);
enableJob(jobConfiguration.getJobName());
Thread.sleep(1000);
runAtOnce(jobName);
try {
waitForFinish(new FinishCheck(){
@Override
public boolean docheck() {
Collection<LongtimeJavaJob.JobStatus> values = LongtimeJavaJob.statusMap.values();
for(LongtimeJavaJob.JobStatus status:values){
if(!status.finished || !status.timeout || !status.beforetimeout){
return false;
}
}
return true;
}
},30);
} catch (Exception e) {
e.printStackTrace();
fail(e.getMessage());
}
try {
waitForFinish(new FinishCheck(){
@Override
public boolean docheck() {
for(int j=0;j<shardCount;j++){
if(!regCenter.isExisted(JobNodePath.getNodeFullPath(jobName, ExecutionNode.getTimeoutNode(j)))){
return false;
}
}
return true;
}
},10);
} catch (Exception e) {
e.printStackTrace();
fail(e.getMessage());
}
Thread.sleep(1000);
for(int j=0;j<shardCount;j++){
String key = jobName+"_"+j;
LongtimeJavaJob.JobStatus status = LongtimeJavaJob.statusMap.get(key);
assertThat(status.runningCount).isEqualTo(0);
assertThat(regCenter.isExisted(JobNodePath.getNodeFullPath(jobName, ExecutionNode.getTimeoutNode(j)))).isEqualTo(true);
assertThat(regCenter.isExisted(JobNodePath.getNodeFullPath(jobName, ExecutionNode.getCompletedNode(j)))).isEqualTo(true);
}
removeJob(jobConfiguration.getJobName());
LongtimeJavaJob.statusMap.clear();
}
@Test
public void test_B_shJob() throws InterruptedException{
if (!OS.isFamilyUnix()) {
return;
}
final int shardCount = 3;
final String jobName = "timeoutITJobsh";
JobConfiguration jobConfiguration = new JobConfiguration(jobName);
jobConfiguration.setCron("* * 1 * * ?");
jobConfiguration.setJobType(JobType.SHELL_JOB.toString());
jobConfiguration.setJobClass(LongtimeJavaJob.class.getCanonicalName());
jobConfiguration.setTimeoutSeconds(3);
jobConfiguration.setShardingTotalCount(shardCount);
jobConfiguration.setShardingItemParameters("0=sh "+LONG_TIME_SH_PATH+",1=sh "+LONG_TIME_SH_PATH+",2=sh "+LONG_TIME_SH_PATH);
addJob(jobConfiguration);
Thread.sleep(1000);
enableJob(jobConfiguration.getJobName());
Thread.sleep(1000);
runAtOnce(jobName);
try {
waitForFinish(new FinishCheck(){
@Override
public boolean docheck() {
for(int i=0; i<saturnExecutorList.size(); i++) {
Main saturnContainer = saturnExecutorList.get(i);
for(int j=0;j<shardCount;j++){
long pid = ScriptPidUtils.getFirstPidFromFile(saturnContainer.getExecutorName(), jobName,""+ j);
if(pid > 0 && ScriptPidUtils.isPidRunning(pid)){
return false;
}
}
}
return true;
}
},10);
} catch (Exception e) {
e.printStackTrace();
fail(e.getMessage());
}
try {
waitForFinish(new FinishCheck(){
@Override
public boolean docheck() {
for(int j=0;j<3;j++){
if(!regCenter.isExisted(JobNodePath.getNodeFullPath(jobName, ExecutionNode.getCompletedNode(j)))){
return false;
}
}
return true;
}
},10);
} catch (Exception e) {
e.printStackTrace();
fail(e.getMessage());
}
removeJob(jobConfiguration.getJobName());
LongtimeJavaJob.statusMap.clear();
}
}