testng和mock用例


   package com.newland.paas.paasservicenj.cd.service.impl;

import com.newland.paas.advice.request.RequestContext;
import com.newland.paas.advice.request.SessionInfo;
import com.newland.paas.common.util.dataset.ftp.JschSftpClient;
import com.newland.paas.paasdatamodulenj.cd.dao.CdLogTaskAutotestMapper;
import com.newland.paas.paasdatamodulenj.cd.dao.CdLogTaskMapper;
import com.newland.paas.paasdatamodulenj.cd.dao.CdLogTaskSqlMapper;
import com.newland.paas.paasdatamodulenj.cd.model.CdLogTask;
import com.newland.paas.paasdatamodulenj.cd.model.CdLogTaskAutotest;
import com.newland.paas.paasdatamodulenj.cd.model.CdLogTaskSql;
import com.newland.paas.paasservice.controllerapi.sysmgr.vo.SysTenantRespVo;
import com.newland.paas.paasservicenj.cd.controller.vo.CdLogTaskVo;
import com.newland.paas.paasservicenj.cd.controller.vo.LogTaskSqlStatusVo;
import com.newland.paas.paasservicenj.cd.enums.CdTaskLogSqlStatusEnum;
import com.newland.paas.sbcommon.common.ApplicationException;
import com.newland.paas.sbcommon.properties.MicroservicesProperties;
import com.newland.paas.sbcommon.utils.RestTemplateUtils;
import com.newland.paas.sbcommon.vo.BasicResponseContentVo;
import com.newland.paas.taskflow.core.enums.TaskStatusEnum;
import mockit.Expectations;
import mockit.Injectable;
import mockit.Mock;
import mockit.MockUp;
import mockit.Tested;
import org.springframework.core.ParameterizedTypeReference;
import org.testng.Assert;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;


public class TaskLoggerServiceImplTest {
// 装饰器来声明某个类可被注入实例化
    @Injectable
    private CdLogTaskSqlMapper cdLogTaskSqlMapper;
    // 装饰器来声明某个类可被注入实例化
    @Injectable
    private CdLogTaskAutotestMapper cdLogTaskAutotestMapper;
    // 装饰器来声明某个类可被注入实例化
    @Injectable
    private CdLogTaskMapper cdLogTaskMapper;
    // 装饰器来声明某个类可被注入实例化
    @Injectable
    private MicroservicesProperties microservicesProperties;
    // 装饰器来声明某个类可被注入实例化
    @Injectable
    private RestTemplateUtils restTemplateUtils;
//调度的测试类
    @Tested
    TaskLoggerServiceImpl taskLoggerService;

	//执行前实例化
    @BeforeClass
    public void set() {
    	//RequestContext给这个类赋值
        SessionInfo sessionInfo = new SessionInfo();
        sessionInfo.setTenantId(100220L);
        sessionInfo.setUserId(100100L);
        RequestContext.set(sessionInfo);
        //JschSftpClient这个类mock值
        new MockUp<JschSftpClient>() {
            @Mock
            public void reConnect() throws IOException {
            }

            @Mock
            public InputStream getInputStream(String file) throws IOException {
                InputStream inputStream = new InputStream() {
                    @Override
                    public int read() throws IOException {
                        return -2;
                    }

                    byte[] buffer = new byte[1024];
					//对应调用的方法赋值
                    @Override
                    public int read(byte[] buffer) throws IOException {
                        return -2;
                    }
                };
                return inputStream;
            }

            @Mock
            public void release() throws IOException {

            }
        };

    }

    @Test
    public void getLogTaskStatus() {
        CdLogTask cdLogTask = new CdLogTask();
        cdLogTask.setLogId(111L);
        cdLogTask.setStatus(TaskStatusEnum.EXECUTE_SUCCESS.getCode());
        cdLogTask.setCreateDate(new Date());
        List<CdLogTaskAutotest> autotestList = new ArrayList<>();
        CdLogTaskAutotest autotest = new CdLogTaskAutotest();
        autotest.setLogId(1L);
        autotest.setReportPath("/3333");
        autotest.setTaskLogId(11l);
        autotest.setCreateDate(new Date());
        autotestList.add(autotest);


        try {
            Thread.sleep(10);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        cdLogTask.setChangeDate(new Date());
        new Expectations() {
            {
            	//相当于mock对象
            	//这种情况下,Mockito提供了一系列的 any 方法,来表示任何的参数都行
                cdLogTaskMapper.lastExecuteLogByLogId(anyLong, anyLong);
                //调用上面的方法mock返回设置的值
                result = cdLogTask;
                cdLogTaskAutotestMapper.selectBySelective(withAny(autotest));
                result = autotestList;

            }

        };
        Long logId = 1L;
        CdLogTaskVo cdLogTaskVo = taskLoggerService.getLogTaskStatus(logId, 2l);
        Assert.assertNotNull(cdLogTaskVo);
    }

    @Test
    public void getLogTaskSqlFileQuery() {
        List<CdLogTaskSql> cdLogTaskSqls = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            CdLogTaskSql cdLogTaskSql = new CdLogTaskSql();
            cdLogTaskSql.setTaskLogId(111l);
            cdLogTaskSql.setLogId((long) i);
            cdLogTaskSql.setActionId(1l);
            cdLogTaskSql.setFileName("1111");
            cdLogTaskSql.setFilePath("/ssss");
            cdLogTaskSql.setCreateDate(new Date());
            cdLogTaskSql.setStatus(CdTaskLogSqlStatusEnum.EXEC_SUC.getCode());
            cdLogTaskSqls.add(cdLogTaskSql);
        }
        CdLogTask cdLogTask = new CdLogTask();
        cdLogTask.setLogId(111L);
        cdLogTask.setStatus(TaskStatusEnum.EXECUTE_SUCCESS.getCode());
        cdLogTask.setCreateDate(new Date());
        new Expectations() {
            {
                cdLogTaskMapper.lastExecuteLogByLogId(anyLong, anyLong);
                result = cdLogTask;
                cdLogTaskSqlMapper.selectBySelective((CdLogTaskSql) any);
                result = cdLogTaskSqls;
            }

        };
        Long id = 1L;

        LogTaskSqlStatusVo logTaskSqlStatusVo = taskLoggerService.getLogTaskSqlFileQuery(id, 2l);
        Assert.assertNotNull(logTaskSqlStatusVo);

    }

    @Test
    public void downloadReport() throws ApplicationException, IOException {
        ParameterizedTypeReference<BasicResponseContentVo<SysTenantRespVo>> responseType =
                new ParameterizedTypeReference<BasicResponseContentVo<SysTenantRespVo>>() {
                };
        BasicResponseContentVo<SysTenantRespVo> response = new BasicResponseContentVo<>();
        SysTenantRespVo sysTenantRespVo = new SysTenantRespVo();
        sysTenantRespVo.setTenantId(111l);
        sysTenantRespVo.setAstAddress("11111");
        response.setContent(sysTenantRespVo);

        new Expectations() {
            {
//这种情况下,Mockito提供了一系列的 any 方法,来表示任何的参数都行
                restTemplateUtils.getForEntity(
                        microservicesProperties.getSysmgr(), anyString, new HashMap<>(), responseType);
                result = response;
                new JschSftpClient(anyString, anyInt, anyString, anyString);
                result = new JschSftpClient(anyString, anyInt, anyString, anyString);

            }


        };
        //new HttpServletResponse() 实例化对象
        taskLoggerService.downloadReport(new HttpServletResponse() {
            @Override
            public String getCharacterEncoding() {
                return null;
            }

            @Override
            public String getContentType() {
                return null;
            }

            @Override
            public ServletOutputStream getOutputStream() throws IOException {
                return null;
            }

            @Override
            public PrintWriter getWriter() throws IOException {
                return null;
            }

            @Override
            public void setCharacterEncoding(String s) {

            }

            @Override
            public void setContentLength(int i) {

            }

            @Override
            public void setContentLengthLong(long l) {

            }

            @Override
            public void setContentType(String s) {

            }

            @Override
            public void setBufferSize(int i) {

            }

            @Override
            public int getBufferSize() {
                return 0;
            }

            @Override
            public void flushBuffer() throws IOException {

            }

            @Override
            public void resetBuffer() {

            }

            @Override
            public boolean isCommitted() {
                return false;
            }

            @Override
            public void reset() {

            }

            @Override
            public void setLocale(Locale locale) {

            }

            @Override
            public Locale getLocale() {
                return null;
            }

            @Override
            public void addCookie(Cookie cookie) {

            }

            @Override
            public boolean containsHeader(String s) {
                return false;
            }

            @Override
            public String encodeURL(String s) {
                return null;
            }

            @Override
            public String encodeRedirectURL(String s) {
                return null;
            }

            @Override
            public String encodeUrl(String s) {
                return null;
            }

            @Override
            public String encodeRedirectUrl(String s) {
                return null;
            }

            @Override
            public void sendError(int i, String s) throws IOException {

            }

            @Override
            public void sendError(int i) throws IOException {

            }

            @Override
            public void sendRedirect(String s) throws IOException {

            }

            @Override
            public void setDateHeader(String s, long l) {

            }

            @Override
            public void addDateHeader(String s, long l) {

            }

            @Override
            public void setHeader(String s, String s1) {

            }

            @Override
            public void addHeader(String s, String s1) {

            }

            @Override
            public void setIntHeader(String s, int i) {

            }

            @Override
            public void addIntHeader(String s, int i) {

            }

            @Override
            public void setStatus(int i) {

            }

            @Override
            public void setStatus(int i, String s) {

            }

            @Override
            public int getStatus() {
                return 0;
            }

            @Override
            public String getHeader(String s) {
                return null;
            }

            @Override
            public Collection<String> getHeaders(String s) {
                return null;
            }

            @Override
            public Collection<String> getHeaderNames() {
                return null;
            }
        }, "1111");
    }

}

package com.newland.paas.paasservicenj.cd.service.impl;

import com.newland.paas.advice.request.RequestContext;
import com.newland.paas.common.util.dataset.ftp.JschSftpClient;
import com.newland.paas.log.Log;
import com.newland.paas.log.LogFactory;
import com.newland.paas.log.LogProperty;
import com.newland.paas.paasdatamodulenj.cd.dao.CdLogTaskAutotestMapper;
import com.newland.paas.paasdatamodulenj.cd.dao.CdLogTaskMapper;
import com.newland.paas.paasdatamodulenj.cd.dao.CdLogTaskSqlMapper;
import com.newland.paas.paasdatamodulenj.cd.model.CdLogTask;
import com.newland.paas.paasdatamodulenj.cd.model.CdLogTaskAutotest;
import com.newland.paas.paasdatamodulenj.cd.model.CdLogTaskSql;
import com.newland.paas.paasservice.controllerapi.sysmgr.vo.SysTenantRespVo;
import com.newland.paas.paasservicenj.cd.constant.CdConstant;
import com.newland.paas.paasservicenj.cd.controller.vo.CdLogTaskVo;
import com.newland.paas.paasservicenj.cd.controller.vo.LogTaskSqlStatusCountVo;
import com.newland.paas.paasservicenj.cd.controller.vo.LogTaskSqlStatusVo;
import com.newland.paas.paasservicenj.cd.controller.vo.LogTaskSqlVo;
import com.newland.paas.paasservicenj.cd.enums.CdTaskLogSqlStatusEnum;
import com.newland.paas.paasservicenj.cd.service.TaskLoggerService;
import com.newland.paas.sbcommon.common.ApplicationException;
import com.newland.paas.sbcommon.properties.MicroservicesProperties;
import com.newland.paas.sbcommon.utils.RestTemplateUtils;
import com.newland.paas.sbcommon.vo.BasicResponseContentVo;
import com.newland.paas.sbcommon.vo.PaasError;
import com.newland.paas.taskflow.core.enums.TaskStatusEnum;
import org.mortbay.util.ajax.JSON;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import javax.servlet.http.HttpServletResponse;
import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;

/**
 * 任务日志管理
 *
 * @author
 * @since 2020/5/26
 */
@Service
public class TaskLoggerServiceImpl implements TaskLoggerService {
    private static final Log LOG = LogFactory.getLogger(TaskLoggerServiceImpl.class);

    @Autowired
    private CdLogTaskSqlMapper cdLogTaskSqlMapper;
    @Autowired
    private CdLogTaskAutotestMapper cdLogTaskAutotestMapper;
    @Autowired
    private CdLogTaskMapper cdLogTaskMapper;
    @Autowired
    private MicroservicesProperties microservicesProperties;
    @Autowired
    private RestTemplateUtils restTemplateUtils;
    @Override
    public CdLogTaskVo getLogTaskStatus(Long logId, Long planTaskId) {
        CdLogTask cdLogTask = cdLogTaskMapper.lastExecuteLogByLogId(logId, planTaskId);
        if (cdLogTask == null) {
            return null;
        }
        CdLogTaskVo cdLogTaskVo = new CdLogTaskVo();
        BeanUtils.copyProperties(cdLogTask, cdLogTaskVo);
        if (TaskStatusEnum.EXECUTING.getCode().equals(cdLogTask.getStatus())) {
            long time = (long) Math.floor((System.currentTimeMillis() - cdLogTaskVo.getCreateDate().getTime()) / 1000f);
            cdLogTaskVo.setDurationTime(time);

        } else if (cdLogTaskVo.getChangeDate() != null) {
            long time = (long) Math.floor((cdLogTaskVo.getChangeDate().getTime() - cdLogTaskVo.getCreateDate().getTime()) / 1000f);
            cdLogTaskVo.setDurationTime(time);
        } else {
            cdLogTaskVo.setDurationTime(0L);
        }
        if (TaskStatusEnum.EXECUTE_SUCCESS.getCode().equals(cdLogTask.getStatus())) {
            CdLogTaskAutotest autotest = new CdLogTaskAutotest();
            autotest.setTaskLogId(logId);
            List<CdLogTaskAutotest> autotestList = cdLogTaskAutotestMapper.selectBySelective(autotest);
            if (!CollectionUtils.isEmpty(autotestList)) {
                cdLogTaskVo.setReport(autotestList.get(0).getReportPath());
            }
        }
        return cdLogTaskVo;
    }

    @Override
    public LogTaskSqlStatusVo getLogTaskSqlFileQuery(Long tasklogIdParam, Long planTaskId) {
        CdLogTask cdLogTask = cdLogTaskMapper.lastExecuteLogByLogId(tasklogIdParam, planTaskId);
        if (cdLogTask == null) {
            LOG.info(LogProperty.LOGTYPE_DETAIL, "sql执行文件根据任务日志id:" + tasklogIdParam + "计划任务id" + planTaskId + "查询任务日志当前最早信息成功为空");
            return null;
        }
        CdLogTaskSql cdLogTaskSql = new CdLogTaskSql();
        Long tasklogId = cdLogTask.getLogId();
        cdLogTaskSql.setTaskLogId(tasklogId);
        List<CdLogTaskSql> cdLogTaskSqlList = cdLogTaskSqlMapper.selectBySelective(cdLogTaskSql);
        if (CollectionUtils.isEmpty(cdLogTaskSqlList)) {
            LOG.info(LogProperty.LOGTYPE_DETAIL, "sql执行文件根据任务id:" + tasklogId + "查询信息为空");
            return null;
        }
        LOG.info(LogProperty.LOGTYPE_DETAIL, "sql执行文件根据任务id:" + tasklogId + "查询信息" + JSON.toString(cdLogTaskSqlList));
        LogTaskSqlStatusVo logTaskSqlStatusVo = new LogTaskSqlStatusVo();
        //遍历信息组装个个目录分组信息
        List<LogTaskSqlVo> taskSqlVos = new ArrayList<>();

        for (CdLogTaskSql logTaskSql : cdLogTaskSqlList) {
            LogTaskSqlVo logTaskSqlVo = new LogTaskSqlVo();
            BeanUtils.copyProperties(logTaskSql, logTaskSqlVo);
            taskSqlVos.add(logTaskSqlVo);
        }
        logTaskSqlStatusVo.setLogTaskSqlVoList(taskSqlVos);
        //按状态分组计算状态数量
        Map<String, List<LogTaskSqlVo>> groupByStatus = taskSqlVos.stream().collect(Collectors.groupingBy(LogTaskSqlVo::getStatus));
        List<LogTaskSqlStatusCountVo> logTaskSqlStatus = new ArrayList<>();
        Long total = 0L;
        Long complete = 0L;


        for (Map.Entry<String, List<LogTaskSqlVo>> entryStatus : groupByStatus.entrySet()) {
            LogTaskSqlStatusCountVo logTaskSqlStatusCountVo = new LogTaskSqlStatusCountVo();
            logTaskSqlStatusCountVo.setStatus(entryStatus.getKey());
            logTaskSqlStatusCountVo.setCount((long) entryStatus.getValue().size());
            //计算总数和完成数量
            total += entryStatus.getValue().size();
            if (Objects.equals(CdTaskLogSqlStatusEnum.EXEC_FAIL.getCode(), entryStatus.getKey()) || Objects.equals(CdTaskLogSqlStatusEnum.EXEC_SUC.getCode(), entryStatus.getKey())) {
                complete += entryStatus.getValue().size();
            }
            logTaskSqlStatus.add(logTaskSqlStatusCountVo);
        }

        //排序状态顺序
        //获取总数
        sortStatus(logTaskSqlStatusVo, logTaskSqlStatus, total, complete);
        return logTaskSqlStatusVo;
    }

    /**
     * @param logTaskSqlStatusVo
     * @param logTaskSqlStatus
     * @param total
     * @param complete
     */
    public void sortStatus(LogTaskSqlStatusVo logTaskSqlStatusVo, List<LogTaskSqlStatusCountVo> logTaskSqlStatus, Long total, Long complete) {
        Map<String, Long> mapStatus = new LinkedHashMap<>();
        mapStatus.put(CdTaskLogSqlStatusEnum.COUNT.getCode(), total == null ? Long.valueOf(0) : total);
        mapStatus.put(CdTaskLogSqlStatusEnum.COMPLETED.getCode(), complete == null ? Long.valueOf(0) : complete);
        Map<String, Long> success = mapStatus(logTaskSqlStatus, CdTaskLogSqlStatusEnum.EXEC_SUC.getCode());
        Long successCount = success.get(CdTaskLogSqlStatusEnum.EXEC_SUC.getCode());
        mapStatus.put(CdTaskLogSqlStatusEnum.EXEC_SUC.getCode(), successCount == null ? Long.valueOf(0) : successCount);
        Map<String, Long> fail = mapStatus(logTaskSqlStatus, CdTaskLogSqlStatusEnum.EXEC_FAIL.getCode());
        Long failCount = fail.get(CdTaskLogSqlStatusEnum.EXEC_FAIL.getCode());
        mapStatus.put(CdTaskLogSqlStatusEnum.EXEC_FAIL.getCode(), failCount == null ? Long.valueOf(0) : failCount);
        Map<String, Long> waitForExecute = mapStatus(logTaskSqlStatus, CdTaskLogSqlStatusEnum.WAIT_EXEC.getCode());
        Long waitForExecuteCount = waitForExecute.get(CdTaskLogSqlStatusEnum.WAIT_EXEC.getCode());
        if (waitForExecuteCount != null)
            mapStatus.put(CdTaskLogSqlStatusEnum.WAIT_EXEC.getCode(), waitForExecuteCount);

        Map<String, Long> execute = mapStatus(logTaskSqlStatus, CdTaskLogSqlStatusEnum.EXECING.getCode());
        Long executeExecuteCount = execute.get(CdTaskLogSqlStatusEnum.EXECING.getCode());
        if (executeExecuteCount != null)
            mapStatus.put(CdTaskLogSqlStatusEnum.EXECING.getCode(), executeExecuteCount);

        Map<String, Long> rollBackFail = mapStatus(logTaskSqlStatus, CdTaskLogSqlStatusEnum.ROLLBACK_FAIL.getCode());

        Long rollBackFailCount = rollBackFail.get(CdTaskLogSqlStatusEnum.ROLLBACK_FAIL.getCode());
        if (rollBackFailCount != null)
            mapStatus.put(CdTaskLogSqlStatusEnum.ROLLBACK_FAIL.getCode(), rollBackFailCount);

        Map<String, Long> rollBackSuc = mapStatus(logTaskSqlStatus, CdTaskLogSqlStatusEnum.ROLLBACK_SUC.getCode());

        Long rollBackSucCount = rollBackSuc.get(CdTaskLogSqlStatusEnum.ROLLBACK_SUC.getCode());
        if (rollBackSucCount != null)
            mapStatus.put(CdTaskLogSqlStatusEnum.ROLLBACK_SUC.getCode(), rollBackSucCount);
        Map<String, Long> rollBackBegin = mapStatus(logTaskSqlStatus, CdTaskLogSqlStatusEnum.ROLLBACK_BEGIN.getCode());

        Long rollBackBeginCount = rollBackBegin.get(CdTaskLogSqlStatusEnum.ROLLBACK_BEGIN.getCode());
        if (rollBackBeginCount != null)
            mapStatus.put(CdTaskLogSqlStatusEnum.ROLLBACK_BEGIN.getCode(), rollBackBeginCount);

        Map<String, Long> rollBackRuning = mapStatus(logTaskSqlStatus, CdTaskLogSqlStatusEnum.ROLLBACK_RUING.getCode());

        Long rollBackRuningCount = rollBackRuning.get(CdTaskLogSqlStatusEnum.ROLLBACK_RUING.getCode());
        if (rollBackRuningCount != null)
            mapStatus.put(CdTaskLogSqlStatusEnum.ROLLBACK_RUING.getCode(), rollBackRuningCount);

        logTaskSqlStatusVo.setLogTaskSqlStatus(mapStatus);
    }

    /**
     * 遍历集合获取状态
     *
     * @param logTaskSqlStatus
     * @param code
     * @return
     */
    public Map<String, Long> mapStatus(List<LogTaskSqlStatusCountVo> logTaskSqlStatus, String code) {
        return logTaskSqlStatus.stream().filter(v -> v.getStatus().equals(code)).collect(Collectors.toMap(LogTaskSqlStatusCountVo::getStatus,
                LogTaskSqlStatusCountVo::getCount));
    }

    @Override
    public void downloadReport(HttpServletResponse response, String filePath) throws ApplicationException {
        InputStream inputStream = null;
        String[] names = filePath.split(CdConstant.DPM_STRING_DIAGONAL);
        try {
            inputStream = getInputStream(filePath);
        } catch (Exception e) {
            throw new ApplicationException(new PaasError("downloadReport", "下载测试报告失败-读取流失败"), e);
        }
        response.setContentType("application/force-download");
        response.setHeader("Content-Disposition", "attachment;fileName=" + names[names.length - 1]);

        byte[] buffer = new byte[CdConstant.BYTE_LENGTH];
        //FileInputStream fis = null; //文件输入流
        BufferedInputStream bis = null;

        OutputStream os = null; //输出流
        try {
            os = response.getOutputStream();
            bis = new BufferedInputStream(inputStream);
            int i = bis.read(buffer);
            while (i != CdConstant.DISABLED_NUM) {
                os.write(buffer);
                i = bis.read(buffer);
            }

        } catch (Exception e) {
            LOG.error(LogProperty.LOGTYPE_DETAIL, e.getMessage(), e, e.getMessage());
            throw new ApplicationException(new PaasError("downloadReport", "下载测试报告失败"), e);
        }
        try {
            bis.close();
            inputStream.close();
        } catch (IOException e) {
            LOG.error(LogProperty.LOGTYPE_DETAIL, e.getMessage(), e, e.getMessage());
            throw new ApplicationException(new PaasError("downloadReport", "下载测试报告失败-关闭流失败"), e);
        }
    }

    private InputStream getInputStream(String filePath) throws Exception {
        JschSftpClient ftpClient = null;
        InputStream inputStream = null;
        try {
            Long tenantId =RequestContext.getTenantId();
            ParameterizedTypeReference<BasicResponseContentVo<SysTenantRespVo>> responseType =
                    new ParameterizedTypeReference<BasicResponseContentVo<SysTenantRespVo>>() {
                    };
            BasicResponseContentVo<SysTenantRespVo> response = restTemplateUtils
                    .getForEntity(microservicesProperties.getSysmgr(), "/v1/tenantMgr/" + tenantId,
                            new HashMap<>(), responseType);
            SysTenantRespVo sysTenantRespVo = response.getContent();
            String[] astAddressSplit = sysTenantRespVo.getAstAddress().split(CdConstant.COLON );
            String astSftpIp = astAddressSplit[0];
            int astSftpPort = 22;
            String astSftpUser = sysTenantRespVo.getAstUsername();
            String astSftpPassword = sysTenantRespVo.getAstPassword();
            ftpClient = new JschSftpClient(astSftpIp, astSftpPort, astSftpUser, astSftpPassword);
            ftpClient.reConnect();
            inputStream = ftpClient.getInputStream(filePath);
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            byte[] buffer = new byte[1024];
            int len;
            while ((len = inputStream.read(buffer)) > -1) {
                baos.write(buffer, 0, len);
            }
            baos.flush();
            inputStream = new ByteArrayInputStream(baos.toByteArray());
            LOG.info(MessageFormat.format("download file [{0}]", filePath), new String[0]);
        } catch (Exception var13) {
            LOG.error(LogProperty.LOGTYPE_DETAIL, var13.getMessage(), var13, var13.getMessage());
            throw new ApplicationException(new PaasError("TaskLoggerServiceImpl.getInputStream", "stfp错误"), var13);
        } finally {
            try {
                if (null != ftpClient) {
                    ftpClient.release();
                }
            } catch (IOException var12) {
                LOG.error(LogProperty.LOGTYPE_DETAIL, var12.getMessage(), var12, var12.getMessage());
                throw new ApplicationException(new PaasError("TaskLoggerServiceImpl.getInputStream", "stfp关闭错误"), var12);
            }

        }
        return inputStream;
    }

}

package com.newland.paas.paasservicenj.cd.taskflow.task;

import com.newland.paas.paasdatamodulenj.cd.dao.CdPlanMapper;
import com.newland.paas.paasdatamodulenj.cd.dao.CdPlanPipelineMapper;
import com.newland.paas.paasdatamodulenj.cd.dao.CdPlanReleaseFileMapper;
import com.newland.paas.paasdatamodulenj.cd.dao.CdPlanReleaseMapper;
import com.newland.paas.paasdatamodulenj.cd.dao.CdPlanTaskMapper;
import com.newland.paas.paasdatamodulenj.cd.dao.CdPlanTaskPropertiesMapper;
import com.newland.paas.paasdatamodulenj.cd.model.CdPlan;
import com.newland.paas.paasdatamodulenj.cd.model.CdPlanPipeline;
import com.newland.paas.paasdatamodulenj.cd.model.CdPlanRelease;
import com.newland.paas.paasdatamodulenj.cd.model.CdPlanReleaseFile;
import com.newland.paas.paasdatamodulenj.cd.model.CdPlanTask;
import com.newland.paas.paasdatamodulenj.cd.model.CdPlanTaskProperties;
import com.newland.paas.paasservice.controllerapi.cd.vo.TransportResponseVo;
import com.newland.paas.paasservice.controllerapi.sysmgr.vo.SysTenantOutputVo;
import com.newland.paas.paasservicenj.cd.taskflow.model.BossFlowSwitchResponseContentVo;
import com.newland.paas.paasservicenj.cd.taskflow.model.CdContextKey;
import com.newland.paas.paasservicenj.cd.taskflow.model.FlowSwitchDTO;
import com.newland.paas.sbcommon.common.SystemException;
import com.newland.paas.sbcommon.properties.MicroservicesItemProperties;
import com.newland.paas.sbcommon.properties.MicroservicesProperties;
import com.newland.paas.sbcommon.utils.ExtRestTemplateUtils;
import com.newland.paas.sbcommon.utils.RestTemplateUtils;
import com.newland.paas.sbcommon.utils.SpringContextUtil;
import com.newland.paas.sbcommon.vo.BasicResponseContentVo;
import com.newland.paas.sbcommon.vo.PaasError;
import com.newland.paas.taskflow.core.exception.TaskInterruptedException;
import com.newland.paas.taskflow.core.logger.ITaskLogger;
import com.newland.paas.taskflow.core.model.TaskContextWrapper;
import com.newland.paas.taskflow.core.model.TaskFlowContextWrapper;
import mockit.Deencapsulation;
import mockit.Expectations;
import mockit.Injectable;
import mockit.Mock;
import mockit.MockUp;
import org.springframework.core.ParameterizedTypeReference;
import org.testng.Assert;
import org.testng.annotations.Test;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class CdShakeHandsTaskTest {


    @Injectable
    private CdPlanTaskPropertiesMapper cdPlanTaskPropertiesMapper;
    @Injectable
    private ITaskLogger taskLogger;
    @Injectable
    private ExtRestTemplateUtils extRestTemplateUtils;
    @Injectable
    private CdPlanMapper cdPlanMapper;
    @Injectable
    private CdPlanReleaseMapper cdPlanReleaseMapper;
    @Injectable
    private CdPlanPipelineMapper cdPlanPipelineMapper;
    @Injectable
    private MicroservicesProperties microservicesProperties;
    @Injectable
    private RestTemplateUtils restTemplateUtils;
    @Injectable
    private CdPlanReleaseFileMapper cdPlanReleaseFileMapper;

    @Injectable
    private TaskFlowContextWrapper taskFlowContextWrapper;

    @Injectable
    private TaskContextWrapper taskContextWrapper;

    @Injectable
    private String CD_PLAN_RELEASE_FILE_ISSAVE;
    @Injectable
    private CdPlanTaskPropertiesAnalyze taskPropertiesAnalyze;
    @Injectable
    SpringContextUtil springContextUtil;
    @Injectable
    CdPlanTaskMapper cdPlanTaskMapper;

    @Test
    public void stop() {
        List<CdPlanTaskProperties> properties = new ArrayList<>();
        properties.add(new CdPlanTaskProperties());
        new MockUp<SpringContextUtil>() {
            @Mock
            public <T> T getBean(Class<T> requiredType) throws IllegalAccessException, InstantiationException {
                if (requiredType.isInstance(cdPlanTaskPropertiesMapper))
                    return (T) cdPlanTaskPropertiesMapper;
                if (requiredType.isInstance(taskLogger))
                    return (T) taskLogger;
                if (requiredType.isInstance(extRestTemplateUtils))
                    return (T) extRestTemplateUtils;
                if (requiredType.isInstance(restTemplateUtils))
                    return (T) restTemplateUtils;
                if (requiredType.isInstance(cdPlanMapper))
                    return (T) cdPlanMapper;
                if (requiredType.isInstance(cdPlanReleaseMapper))
                    return (T) cdPlanReleaseMapper;
                if (requiredType.isInstance(cdPlanPipelineMapper))
                    return (T) cdPlanPipelineMapper;
                if (requiredType.isInstance(microservicesProperties))
                    return (T) microservicesProperties;
                if (requiredType.isInstance(cdPlanReleaseFileMapper))
                    return (T) cdPlanReleaseFileMapper;
                if (requiredType.isInstance(cdPlanTaskMapper))
                    return (T) cdPlanTaskMapper;

                return null;
            }

            ;

            @Mock
            String getVaue(String key) {
                return "true";
            }

            ;
        };
        CdShakeHandsTask flowSwitchTask = new CdShakeHandsTask();
        Map<String, Object> context = new HashMap<>();
        flowSwitchTask.stop(context);

    }


    private void setUp() {
        new MockUp<SpringContextUtil>() {
            @Mock
            public <T> T getBean(Class<T> requiredType) throws IllegalAccessException, InstantiationException {
                if (requiredType.isInstance(cdPlanTaskPropertiesMapper))
                    return (T) cdPlanTaskPropertiesMapper;
                if (requiredType.isInstance(taskLogger))
                    return (T) taskLogger;
                if (requiredType.isInstance(extRestTemplateUtils))
                    return (T) extRestTemplateUtils;
                if (requiredType.isInstance(cdPlanMapper))
                    return (T) cdPlanMapper;
                if (requiredType.isInstance(cdPlanReleaseMapper))
                    return (T) cdPlanReleaseMapper;
                if (requiredType.isInstance(cdPlanPipelineMapper))
                    return (T) cdPlanPipelineMapper;
                if (requiredType.isInstance(microservicesProperties))
                    return (T) microservicesProperties;
                if (requiredType.isInstance(cdPlanReleaseFileMapper))
                    return (T) cdPlanReleaseFileMapper;
                if (requiredType.isInstance(restTemplateUtils))
                    return (T) restTemplateUtils;
                if (requiredType.isInstance(taskPropertiesAnalyze))
                    return (T) taskPropertiesAnalyze;
                if (requiredType.isInstance(CD_PLAN_RELEASE_FILE_ISSAVE))
                    return (T) CD_PLAN_RELEASE_FILE_ISSAVE;
                if (requiredType.isInstance(cdPlanTaskMapper))
                    return (T) cdPlanTaskMapper;
                return null;
            }

            ;

            @Mock
            String getVaue(String key) {
                return "true";
            }

            ;
        };
        new MockUp<TaskFlowContextWrapper>() {
            @Mock
            Map<String, Object> getTaskContext(String taskId) {
                Map<String, Object> value = new HashMap<>();
                value.put("logId", 1000L);
                value.put("", 1);
                return value;
            }

            @Mock
            Object get(String param) {
                if (CdContextKey.AST_SFTP_RELEASE_PATH.equals(param))
                    return "/home/2222/";
                return null;
            }
        };
        new MockUp<CdShakeHandsTask>() {
            @Mock
            public Long getId() {
                return 1000L;
            }
        };

        new MockUp<TaskContextWrapper>() {
            @Mock
            public <T> T getValue(String key, Class<T> clazz) {
                if (clazz.isInstance(Long.valueOf(1000L)))
                    return (T) Long.valueOf(1000L);
                if (clazz.isInstance(new String()))
                    return (T) new String("taskId");
                return null;
            }
        };
    }


    @Test
    public void testPropertiesIsNull() {
        setUp();
        cdPlanTaskPropertiesMapper = new MockUp<CdPlanTaskPropertiesMapper>() {
            @Mock
            List<CdPlanTaskProperties> selectBySelectiveWithBLOBs(CdPlanTaskProperties record) {
                return null;
            }
        }.getMockInstance();
        cdPlanReleaseFileMapper = new MockUp<CdPlanReleaseFileMapper>() {
            @Mock
            public CdPlanReleaseFile selectByPlanReleaseId(Long planReleaseId) {
                CdPlanReleaseFile cdPlanReleaseFile = new CdPlanReleaseFile();
                cdPlanReleaseFile.setFileSize(111L);
                cdPlanReleaseFile.setCreateDate(new Date());
                cdPlanReleaseFile.setPlanReleaseId(111L);
                cdPlanReleaseFile.setTenantId(111L);
                cdPlanReleaseFile.setChangeDate(new Date());
                cdPlanReleaseFile.setCreateorId(111L);
                return cdPlanReleaseFile;
            }

            @Mock
            public void insert(CdPlanReleaseFile cdPlanReleaseFile) {

            }
        }.getMockInstance();

        cdPlanPipelineMapper = new MockUp<CdPlanPipelineMapper>() {
            @Mock
            public CdPlanPipeline selectByPrimaryKey(Long taskFlowId) {
                CdPlanPipeline cdPlanPipeline = new CdPlanPipeline();
                cdPlanPipeline.setPipelineCode("111");
                cdPlanPipeline.setCreateDate(new Date());
                cdPlanPipeline.setPlanReleaseId(111L);
                cdPlanPipeline.setTenantId(111L);
                cdPlanPipeline.setChangeDate(new Date());
                cdPlanPipeline.setPlanPipelineId(111l);
                return cdPlanPipeline;
            }
        }.getMockInstance();

        cdPlanReleaseMapper = new MockUp<CdPlanReleaseMapper>() {
            @Mock
            public CdPlanRelease selectByPrimaryKey(Long taskFlowId) {
                CdPlanRelease cdPlanReleaseFile = new CdPlanRelease();
                cdPlanReleaseFile.setPlanReleaseId(111l);
                cdPlanReleaseFile.setCreateDate(new Date());
                cdPlanReleaseFile.setPlanReleaseId(111L);
                cdPlanReleaseFile.setReleaseCode("111");
                cdPlanReleaseFile.setChangeDate(new Date());
                cdPlanReleaseFile.setReleaseStatus("11");
                return cdPlanReleaseFile;
            }
        }.getMockInstance();
        cdPlanMapper = new MockUp<CdPlanMapper>() {
            @Mock
            public CdPlan selectByPrimaryKey(Long taskFlowId) {
                CdPlan cdPlan = new CdPlan();
                cdPlan.setPlanId(111l);
                cdPlan.setCreateDate(new Date());
                cdPlan.setTenanatId(111l);
                cdPlan.setPlanName("111");
                cdPlan.setChangeDate(new Date());
                cdPlan.setPlanVersion("1111");
                return cdPlan;
            }
        }.getMockInstance();
        microservicesProperties = new MockUp<MicroservicesProperties>() {
            @Mock
            public MicroservicesItemProperties getSysmgr() {
                MicroservicesItemProperties sysmgr = new MicroservicesItemProperties();
                sysmgr.setContentPath("xx.xxx.xx.x");
                sysmgr.setServiceId("serviceName");
                return sysmgr;
            }
        }.getMockInstance();

        restTemplateUtils = new MockUp<RestTemplateUtils>() {
            @Mock
            public Object postForEntity(MicroservicesItemProperties microservicesItemProperties, String interfaceUrl,
                                        Object params, ParameterizedTypeReference responseType) {
                BasicResponseContentVo<List<SysTenantOutputVo>> basicResponseContentVo = new BasicResponseContentVo<>();
                List<SysTenantOutputVo> list = new ArrayList<>();
                SysTenantOutputVo sysTenantOutputVo = new SysTenantOutputVo();
                sysTenantOutputVo.setTenantCode("1111");
                sysTenantOutputVo.setId(1l);
                list.add(sysTenantOutputVo);
                basicResponseContentVo.setContent(list);
                return basicResponseContentVo;
            }
        }.getMockInstance();

        CdShakeHandsTask flowSwitchTask = new CdShakeHandsTask();
        Map<String, Object> context = new HashMap<>();
        try {
            flowSwitchTask.execute(context);
        } catch (TaskInterruptedException e) {
            Assert.assertEquals(e.getLocalizedMessage(), "Cd握手任务[1000],缺失配置");

        }

    }


    @Test
    public void testURlConfigError() {
        setUp();
        cdPlanTaskPropertiesMapper = new MockUp<CdPlanTaskPropertiesMapper>() {
            @Mock
            public List<CdPlanTaskProperties> selectBySelectiveWithBLOBs(CdPlanTaskProperties record) {
                List<CdPlanTaskProperties> planTaskProperties = new ArrayList<>();
                CdPlanTaskProperties properties = new CdPlanTaskProperties();
                properties.setPropKey("CDShakeHandsTaskTargetStatus");
                properties.setPropValue("3,5");
                planTaskProperties.add(properties);
                return planTaskProperties;
            }

            ;

        }.getMockInstance();
        cdPlanReleaseFileMapper = new MockUp<CdPlanReleaseFileMapper>() {
            @Mock
            public CdPlanReleaseFile selectByPlanReleaseId(Long planReleaseId) {
                CdPlanReleaseFile cdPlanReleaseFile = new CdPlanReleaseFile();
                cdPlanReleaseFile.setFileSize(111L);
                cdPlanReleaseFile.setCreateDate(new Date());
                cdPlanReleaseFile.setPlanReleaseId(111L);
                cdPlanReleaseFile.setTenantId(111L);
                cdPlanReleaseFile.setChangeDate(new Date());
                cdPlanReleaseFile.setCreateorId(111L);
                return cdPlanReleaseFile;
            }

            @Mock
            public void insert(CdPlanReleaseFile cdPlanReleaseFile) {

            }
        }.getMockInstance();

        cdPlanPipelineMapper = new MockUp<CdPlanPipelineMapper>() {
            @Mock
            public CdPlanPipeline selectByPrimaryKey(Long taskFlowId) {
                CdPlanPipeline cdPlanPipeline = new CdPlanPipeline();
                cdPlanPipeline.setPipelineCode("111");
                cdPlanPipeline.setCreateDate(new Date());
                cdPlanPipeline.setPlanReleaseId(111L);
                cdPlanPipeline.setTenantId(111L);
                cdPlanPipeline.setChangeDate(new Date());
                cdPlanPipeline.setPlanPipelineId(111l);
                return cdPlanPipeline;
            }
        }.getMockInstance();

        cdPlanReleaseMapper = new MockUp<CdPlanReleaseMapper>() {
            @Mock
            public CdPlanRelease selectByPrimaryKey(Long taskFlowId) {
                CdPlanRelease cdPlanReleaseFile = new CdPlanRelease();
                cdPlanReleaseFile.setPlanReleaseId(111l);
                cdPlanReleaseFile.setCreateDate(new Date());
                cdPlanReleaseFile.setPlanReleaseId(111L);
                cdPlanReleaseFile.setReleaseCode("111");
                cdPlanReleaseFile.setChangeDate(new Date());
                cdPlanReleaseFile.setReleaseStatus("11");
                return cdPlanReleaseFile;
            }
        }.getMockInstance();
        cdPlanMapper = new MockUp<CdPlanMapper>() {
            @Mock
            public CdPlan selectByPrimaryKey(Long taskFlowId) {
                CdPlan cdPlan = new CdPlan();
                cdPlan.setPlanId(111l);
                cdPlan.setCreateDate(new Date());
                cdPlan.setTenanatId(111l);
                cdPlan.setPlanName("111");
                cdPlan.setChangeDate(new Date());
                cdPlan.setPlanVersion("1111");
                return cdPlan;
            }
        }.getMockInstance();
        restTemplateUtils = new MockUp<RestTemplateUtils>() {
            @Mock
            public Object postForEntity(MicroservicesItemProperties microservicesItemProperties, String interfaceUrl,
                                        Object params, ParameterizedTypeReference responseType) {
                BasicResponseContentVo<List<SysTenantOutputVo>> basicResponseContentVo = new BasicResponseContentVo<>();
                List<SysTenantOutputVo> list = new ArrayList<>();
                SysTenantOutputVo sysTenantOutputVo = new SysTenantOutputVo();
                sysTenantOutputVo.setTenantCode("1111");
                sysTenantOutputVo.setId(1l);
                list.add(sysTenantOutputVo);
                basicResponseContentVo.setContent(list);
                return basicResponseContentVo;
            }
        }.getMockInstance();
        CdShakeHandsTask cdShakeHandsTask = new CdShakeHandsTask();
        Map<String, Object> context = new HashMap<>();
        try {
            cdShakeHandsTask.execute(context);
        } catch (TaskInterruptedException e) {
            Assert.assertEquals(e.getMessage(), "任务[null]异常:配置key=[cdPorterProddownloadPreProdFileUrl] 未进行配置");

        }
    }


    @Test
    public void testRetryNumConfigError() {
        setUp();
        cdPlanTaskPropertiesMapper = new MockUp<CdPlanTaskPropertiesMapper>() {
            @Mock
            public List<CdPlanTaskProperties> selectBySelectiveWithBLOBs(CdPlanTaskProperties record) {
                List<CdPlanTaskProperties> planTaskProperties = new ArrayList<>();
                CdPlanTaskProperties properties = new CdPlanTaskProperties();
                properties.setPropKey("cdPo" +
                        "rterIsUploadUrl");
                properties.setPropValue("http://10.1.8.20:32080/v1/prod/isUpload/");

                CdPlanTaskProperties urlProp = new CdPlanTaskProperties();
                urlProp.setPropKey("cdPorterProddownloadPreProdFileUrl");
                urlProp.setPropValue("http://10.1.8.20:32080/v1/prod/downloadPreProdFile");

                CdPlanTaskProperties retryNumberProp = new CdPlanTaskProperties();
                retryNumberProp.setPropKey("cdShakeHandsTaskRetryNumber");
                retryNumberProp.setPropValue("2");


                CdPlanTaskProperties retryIntervalProp = new CdPlanTaskProperties();
                retryIntervalProp.setPropKey("cdShakeHandsTaskRetryInterval");
                retryIntervalProp.setPropValue("2");


                planTaskProperties.add(properties);
                planTaskProperties.add(urlProp);
                planTaskProperties.add(retryIntervalProp);
                planTaskProperties.add(retryNumberProp);
                return planTaskProperties;
            }
        }.getMockInstance();
        cdPlanReleaseFileMapper = new MockUp<CdPlanReleaseFileMapper>() {
            @Mock
            public CdPlanReleaseFile selectByPlanReleaseId(Long planReleaseId) {
                CdPlanReleaseFile cdPlanReleaseFile = new CdPlanReleaseFile();
                cdPlanReleaseFile.setFileSize(111L);
                cdPlanReleaseFile.setCreateDate(new Date());
                cdPlanReleaseFile.setPlanReleaseId(111L);
                cdPlanReleaseFile.setTenantId(111L);
                cdPlanReleaseFile.setChangeDate(new Date());
                cdPlanReleaseFile.setCreateorId(111L);
                return cdPlanReleaseFile;
            }

            @Mock
            public void insert(CdPlanReleaseFile cdPlanReleaseFile) {

            }
        }.getMockInstance();

        cdPlanPipelineMapper = new MockUp<CdPlanPipelineMapper>() {
            @Mock
            public CdPlanPipeline selectByPrimaryKey(Long taskFlowId) {
                CdPlanPipeline cdPlanPipeline = new CdPlanPipeline();
                cdPlanPipeline.setPipelineCode("111");
                cdPlanPipeline.setCreateDate(new Date());
                cdPlanPipeline.setPlanReleaseId(111L);
                cdPlanPipeline.setTenantId(111L);
                cdPlanPipeline.setChangeDate(new Date());
                cdPlanPipeline.setPlanPipelineId(111l);
                return cdPlanPipeline;
            }
        }.getMockInstance();

        cdPlanReleaseMapper = new MockUp<CdPlanReleaseMapper>() {
            @Mock
            public CdPlanRelease selectByPrimaryKey(Long taskFlowId) {
                CdPlanRelease cdPlanReleaseFile = new CdPlanRelease();
                cdPlanReleaseFile.setPlanReleaseId(111l);
                cdPlanReleaseFile.setCreateDate(new Date());
                cdPlanReleaseFile.setPlanReleaseId(111L);
                cdPlanReleaseFile.setReleaseCode("111");
                cdPlanReleaseFile.setChangeDate(new Date());
                cdPlanReleaseFile.setReleaseStatus("11");
                return cdPlanReleaseFile;
            }
        }.getMockInstance();
        cdPlanMapper = new MockUp<CdPlanMapper>() {
            @Mock
            public CdPlan selectByPrimaryKey(Long taskFlowId) {
                CdPlan cdPlan = new CdPlan();
                cdPlan.setPlanId(111l);
                cdPlan.setCreateDate(new Date());
                cdPlan.setTenanatId(111l);
                cdPlan.setPlanName("111");
                cdPlan.setChangeDate(new Date());
                cdPlan.setPlanVersion("1111");
                return cdPlan;
            }
        }.getMockInstance();
        cdPlanTaskMapper = new MockUp<CdPlanTaskMapper>() {
            @Mock
            public List<CdPlanTask> selectBySelective(CdPlanTask taskQuery) {
                List<CdPlanTask> ptList = new ArrayList<>();
                CdPlanTask cdPlanTask = new CdPlanTask();
                cdPlanTask.setPlanPipelineId(111l);
                cdPlanTask.setPlanTaskId(111l);
                cdPlanTask.setPlanTaskGroupId(111l);
                cdPlanTask.setPipelineId(111l);
                cdPlanTask.setTaskGroupId(111l);
                cdPlanTask.setTaskCode("111");
                cdPlanTask.setChangeDate(new Date());
                cdPlanTask.setChangeDate(new Date());
                ptList.add(cdPlanTask);
                return ptList;
            }
        }.getMockInstance();


        extRestTemplateUtils = new MockUp<ExtRestTemplateUtils>() {
            @Mock
            public Object postForExtEntity(String uri, String token,
                                           Object params, ParameterizedTypeReference responseType) {
                if (uri.contains("/v1/prod/downloadPreProdFile")) {
                    BasicResponseContentVo<TransportResponseVo> basicResponseContentVo = new BasicResponseContentVo<>();
                    TransportResponseVo transportResponseVo = new TransportResponseVo();
                    transportResponseVo.setCode("success");
                    transportResponseVo.setUploadCode("uploadCode");
                    basicResponseContentVo.setContent(transportResponseVo);
                    return basicResponseContentVo;
                }
                return null;
            }

            @Mock
            public Object getForExtEntity(String uri, String token,
                                          Map<String, Object> params, ParameterizedTypeReference responseType) {
                if (uri.contains("/v1/prod/isUpload")) {
                    PaasError REQUEST_ERROR = new PaasError("12201001", "请求错误!");

                    throw new SystemException(REQUEST_ERROR);
                }
                return null;

            }
        }.getMockInstance();
        microservicesProperties = new MockUp<MicroservicesProperties>() {
            @Mock
            public MicroservicesItemProperties getSysmgr() {
                MicroservicesItemProperties sysmgr = new MicroservicesItemProperties();
                sysmgr.setContentPath("xx.xxx.xx.x");
                sysmgr.setServiceId("serviceName");
                return sysmgr;
            }
        }.getMockInstance();

        restTemplateUtils = new MockUp<RestTemplateUtils>() {
            @Mock
            public Object postForEntity(MicroservicesItemProperties microservicesItemProperties, String interfaceUrl,
                                        Object params, ParameterizedTypeReference responseType) {
                BasicResponseContentVo<List<SysTenantOutputVo>> basicResponseContentVo = new BasicResponseContentVo<>();
                List<SysTenantOutputVo> list = new ArrayList<>();
                SysTenantOutputVo sysTenantOutputVo = new SysTenantOutputVo();
                sysTenantOutputVo.setTenantCode("1111");
                sysTenantOutputVo.setId(1l);
                list.add(sysTenantOutputVo);
                basicResponseContentVo.setContent(list);
                return basicResponseContentVo;
            }
        }.getMockInstance();


        CdShakeHandsTask cdShakeHandsTask = new CdShakeHandsTask();
        Map<String, Object> context = new HashMap<>();
        try {
            cdShakeHandsTask.execute(context);
        } catch (TaskInterruptedException e) {
            Assert.assertEquals(e.getMessage(), "Cd握手任务[1000]已经完成[2]重试,任务执行失败");
        }
    }

    @Test
    public void testRetryIntervalConfigError() {
        setUp();
        cdPlanTaskPropertiesMapper = new MockUp<CdPlanTaskPropertiesMapper>() {
            @Mock
            public List<CdPlanTaskProperties> selectBySelectiveWithBLOBs(CdPlanTaskProperties record) {
                List<CdPlanTaskProperties> planTaskProperties = new ArrayList<>();
                CdPlanTaskProperties properties = new CdPlanTaskProperties();
                properties.setPropKey("cdPorterIsUploadUrl");
                properties.setPropValue("http://10.1.8.20:32080/v1/prod/isUpload/");
                properties.setPlanTaskId(111L);
                CdPlanTaskProperties urlProp = new CdPlanTaskProperties();
                urlProp.setPropKey("cdPorterProddownloadPreProdFileUrl");
                urlProp.setPropValue("http://10.1.8.20:32080/v1/prod/downloadPreProdFile");
                urlProp.setPlanTaskId(111L);
                CdPlanTaskProperties retryNumberProp = new CdPlanTaskProperties();
                retryNumberProp.setPropKey("cdShakeHandsTaskRetryNumber");
                retryNumberProp.setPropValue("2");
                retryNumberProp.setPlanTaskId(111L);

                CdPlanTaskProperties retryIntervalProp = new CdPlanTaskProperties();
                retryIntervalProp.setPropKey("cdShakeHandsTaskRetryInterval");
                retryIntervalProp.setPropValue("2eee");
                retryIntervalProp.setPlanTaskId(111L);


                planTaskProperties.add(properties);
                planTaskProperties.add(urlProp);
                planTaskProperties.add(retryIntervalProp);
                planTaskProperties.add(retryNumberProp);
                return planTaskProperties;
            }

            @Mock
            public List<CdPlanTaskProperties> getPlanTaskProperties(Long planTaskId) {
                List<CdPlanTaskProperties> list = new ArrayList<>();
                CdPlanTaskProperties cdPlanTaskProperties = new CdPlanTaskProperties();
                cdPlanTaskProperties.setPlanTaskId(111l);
                cdPlanTaskProperties.setTaskId(111l);
                cdPlanTaskProperties.setPlanTaskPropertiesId(111L);
                cdPlanTaskProperties.setChangeDate(new Date());
                cdPlanTaskProperties.setCreateDate(new Date());
                cdPlanTaskProperties.setTenantId(111l);
                cdPlanTaskProperties.setPropValue("111");

                list.add(cdPlanTaskProperties);
                return list;
            }
        }.getMockInstance();
        cdPlanReleaseFileMapper = new MockUp<CdPlanReleaseFileMapper>() {
            @Mock
            public CdPlanReleaseFile selectByPlanReleaseId(Long planReleaseId) {
                CdPlanReleaseFile cdPlanReleaseFile = new CdPlanReleaseFile();
                cdPlanReleaseFile.setFileSize(111L);
                cdPlanReleaseFile.setCreateDate(new Date());
                cdPlanReleaseFile.setPlanReleaseId(111L);
                cdPlanReleaseFile.setTenantId(111L);
                cdPlanReleaseFile.setChangeDate(new Date());
                cdPlanReleaseFile.setCreateorId(111L);
                return cdPlanReleaseFile;
            }

            @Mock
            public void insert(CdPlanReleaseFile cdPlanReleaseFile) {

            }
        }.getMockInstance();

        cdPlanPipelineMapper = new MockUp<CdPlanPipelineMapper>() {
            @Mock
            public CdPlanPipeline selectByPrimaryKey(Long taskFlowId) {
                CdPlanPipeline cdPlanPipeline = new CdPlanPipeline();
                cdPlanPipeline.setPipelineCode("111");
                cdPlanPipeline.setCreateDate(new Date());
                cdPlanPipeline.setPlanReleaseId(111L);
                cdPlanPipeline.setTenantId(111L);
                cdPlanPipeline.setChangeDate(new Date());
                cdPlanPipeline.setPlanPipelineId(111l);
                return cdPlanPipeline;
            }
        }.getMockInstance();

        cdPlanReleaseMapper = new MockUp<CdPlanReleaseMapper>() {
            @Mock
            public CdPlanRelease selectByPrimaryKey(Long taskFlowId) {
                CdPlanRelease cdPlanReleaseFile = new CdPlanRelease();
                cdPlanReleaseFile.setPlanReleaseId(111l);
                cdPlanReleaseFile.setCreateDate(new Date());
                cdPlanReleaseFile.setPlanReleaseId(111L);
                cdPlanReleaseFile.setReleaseCode("111");
                cdPlanReleaseFile.setChangeDate(new Date());
                cdPlanReleaseFile.setReleaseStatus("11");
                return cdPlanReleaseFile;
            }
        }.getMockInstance();
        cdPlanMapper = new MockUp<CdPlanMapper>() {
            @Mock
            public CdPlan selectByPrimaryKey(Long taskFlowId) {
                CdPlan cdPlan = new CdPlan();
                cdPlan.setPlanId(111l);
                cdPlan.setCreateDate(new Date());
                cdPlan.setTenanatId(111l);
                cdPlan.setPlanName("111");
                cdPlan.setChangeDate(new Date());
                cdPlan.setPlanVersion("1111");
                return cdPlan;
            }
        }.getMockInstance();
        extRestTemplateUtils = new MockUp<ExtRestTemplateUtils>() {
            @Mock
            public Object postForExtEntity(String uri, String token,
                                           Object params, ParameterizedTypeReference responseType) {
                if (uri.contains("/v1/prod/downloadPreProdFile")) {
                    BasicResponseContentVo<TransportResponseVo> basicResponseContentVo = new BasicResponseContentVo<>();
                    TransportResponseVo transportResponseVo = new TransportResponseVo();
                    transportResponseVo.setCode("success");
                    transportResponseVo.setUploadCode("uploadCode");
                    basicResponseContentVo.setContent(transportResponseVo);
                    return basicResponseContentVo;
                }
                return null;
            }

        }.getMockInstance();
        microservicesProperties = new MockUp<MicroservicesProperties>() {
            @Mock
            public MicroservicesItemProperties getSysmgr() {
                MicroservicesItemProperties sysmgr = new MicroservicesItemProperties();
                sysmgr.setContentPath("xx.xxx.xx.x");
                sysmgr.setServiceId("serviceName");
                return sysmgr;
            }
        }.getMockInstance();

        restTemplateUtils = new MockUp<RestTemplateUtils>() {
            @Mock
            public Object postForEntity(MicroservicesItemProperties microservicesItemProperties, String interfaceUrl,
                                        Object params, ParameterizedTypeReference responseType) {
                BasicResponseContentVo<List<SysTenantOutputVo>> basicResponseContentVo = new BasicResponseContentVo<>();
                List<SysTenantOutputVo> list = new ArrayList<>();
                SysTenantOutputVo sysTenantOutputVo = new SysTenantOutputVo();
                sysTenantOutputVo.setTenantCode("1111");
                sysTenantOutputVo.setId(1l);
                list.add(sysTenantOutputVo);
                basicResponseContentVo.setContent(list);
                return basicResponseContentVo;
            }
        }.getMockInstance();


        CdShakeHandsTask cdShakeHandsTask = new CdShakeHandsTask();
        Map<String, Object> context = new HashMap<>();
        try {
            cdShakeHandsTask.execute(context);
        } catch (TaskInterruptedException e) {
            Assert.assertEquals(e.getMessage(), "任务[111]异常:配置key=[cdShakeHandsTaskRetryInterval] value=[2eee], value必须为数字");

        }
    }

    @Test
    public void testSuccess() {
        setUp();
        cdPlanTaskPropertiesMapper = new MockUp<CdPlanTaskPropertiesMapper>() {
            @Mock
            public List<CdPlanTaskProperties> selectBySelectiveWithBLOBs(CdPlanTaskProperties record) {
                List<CdPlanTaskProperties> planTaskProperties = new ArrayList<>();
                CdPlanTaskProperties properties = new CdPlanTaskProperties();
                properties.setPropKey("cdPorterIsUploadUrl");
                properties.setPropValue("http://10.1.8.20:32080/v1/prod/isUpload/");

                CdPlanTaskProperties urlProp = new CdPlanTaskProperties();
                urlProp.setPropKey("cdPorterProddownloadPreProdFileUrl");
                urlProp.setPropValue("http://10.1.8.20:32080/v1/prod/downloadPreProdFile");

                CdPlanTaskProperties retryNumberProp = new CdPlanTaskProperties();
                retryNumberProp.setPropKey("cdShakeHandsTaskRetryNumber");
                retryNumberProp.setPropValue("2");


                CdPlanTaskProperties retryIntervalProp = new CdPlanTaskProperties();
                retryIntervalProp.setPropKey("cdShakeHandsTaskRetryInterval");
                retryIntervalProp.setPropValue("2");


                planTaskProperties.add(properties);
                planTaskProperties.add(urlProp);
                planTaskProperties.add(retryIntervalProp);
                planTaskProperties.add(retryNumberProp);
                return planTaskProperties;
            }

            @Mock
            int updateByPrimaryKeyWithBLOBs(CdPlanTaskProperties record) {
                return 1;
            }

            @Mock
            public List<CdPlanTaskProperties> getPlanTaskProperties(Long planTaskId) {
                List<CdPlanTaskProperties> list = new ArrayList<>();
                CdPlanTaskProperties cdPlanTaskProperties = new CdPlanTaskProperties();
                cdPlanTaskProperties.setPlanTaskId(111l);
                cdPlanTaskProperties.setTaskId(111l);
                cdPlanTaskProperties.setPlanTaskPropertiesId(111L);
                cdPlanTaskProperties.setChangeDate(new Date());
                cdPlanTaskProperties.setCreateDate(new Date());
                cdPlanTaskProperties.setTenantId(111l);
                //cdPlanTaskProperties.setPropValue("111");
                cdPlanTaskProperties.setDefaultValue("111");
                list.add(cdPlanTaskProperties);
                return list;
            }
        }.getMockInstance();
        cdPlanReleaseFileMapper = new MockUp<CdPlanReleaseFileMapper>() {
            @Mock
            public CdPlanReleaseFile selectByPlanReleaseId(Long planReleaseId) {
                CdPlanReleaseFile cdPlanReleaseFile = new CdPlanReleaseFile();
                cdPlanReleaseFile.setFileSize(111L);
                cdPlanReleaseFile.setCreateDate(new Date());
                cdPlanReleaseFile.setPlanReleaseId(111L);
                cdPlanReleaseFile.setTenantId(111L);
                cdPlanReleaseFile.setChangeDate(new Date());
                cdPlanReleaseFile.setCreateorId(111L);
                return cdPlanReleaseFile;
            }

            @Mock
            public void insert(CdPlanReleaseFile cdPlanReleaseFile) {

            }
        }.getMockInstance();

        cdPlanPipelineMapper = new MockUp<CdPlanPipelineMapper>() {
            @Mock
            public CdPlanPipeline selectByPrimaryKey(Long taskFlowId) {
                CdPlanPipeline cdPlanPipeline = new CdPlanPipeline();
                cdPlanPipeline.setPipelineCode("111");
                cdPlanPipeline.setCreateDate(new Date());
                cdPlanPipeline.setPlanReleaseId(111L);
                cdPlanPipeline.setTenantId(111L);
                cdPlanPipeline.setChangeDate(new Date());
                cdPlanPipeline.setPlanPipelineId(111l);
                return cdPlanPipeline;
            }

            @Mock
            public List<CdPlanPipeline> selectBySelective(CdPlanPipeline record) {
                List<CdPlanPipeline> list = new ArrayList<>();
                CdPlanPipeline cdPlanPipeline = new CdPlanPipeline();
                cdPlanPipeline.setPlanPipelineId(111l);
                cdPlanPipeline.setPipelineCode("111");
                cdPlanPipeline.setPlanReleaseId(111l);
                cdPlanPipeline.setCreatorId(111l);
                cdPlanPipeline.setTenantId(111l);
                list.add(cdPlanPipeline);
                return list;
            }
        }.getMockInstance();

        cdPlanReleaseMapper = new MockUp<CdPlanReleaseMapper>() {
            @Mock
            public CdPlanRelease selectByPrimaryKey(Long taskFlowId) {
                CdPlanRelease cdPlanReleaseFile = new CdPlanRelease();
                cdPlanReleaseFile.setPlanReleaseId(111l);
                cdPlanReleaseFile.setCreateDate(new Date());
                cdPlanReleaseFile.setPlanReleaseId(111L);
                cdPlanReleaseFile.setReleaseCode("111");
                cdPlanReleaseFile.setChangeDate(new Date());
                cdPlanReleaseFile.setReleaseStatus("11");
                return cdPlanReleaseFile;
            }
        }.getMockInstance();
        cdPlanMapper = new MockUp<CdPlanMapper>() {
            @Mock
            public CdPlan selectByPrimaryKey(Long taskFlowId) {
                CdPlan cdPlan = new CdPlan();
                cdPlan.setPlanId(111l);
                cdPlan.setCreateDate(new Date());
                cdPlan.setTenanatId(111l);
                cdPlan.setPlanName("111");
                cdPlan.setChangeDate(new Date());
                cdPlan.setPlanVersion("1111");
                return cdPlan;
            }
        }.getMockInstance();
        cdPlanTaskMapper = new MockUp<CdPlanTaskMapper>() {
            @Mock
            public List<CdPlanTask> selectBySelective(CdPlanTask taskQuery) {
                List<CdPlanTask> ptList = new ArrayList<>();
                CdPlanTask cdPlanTask = new CdPlanTask();
                cdPlanTask.setPlanPipelineId(111l);
                cdPlanTask.setPlanTaskId(111l);
                cdPlanTask.setPlanTaskGroupId(111l);
                cdPlanTask.setPipelineId(111l);
                cdPlanTask.setTaskGroupId(111l);
                cdPlanTask.setTaskCode("111");
                cdPlanTask.setChangeDate(new Date());
                cdPlanTask.setChangeDate(new Date());
                ptList.add(cdPlanTask);
                return ptList;
            }
        }.getMockInstance();

        extRestTemplateUtils = new MockUp<ExtRestTemplateUtils>() {
            @Mock
            public Object postForExtEntity(String uri, String token,
                                           Object params, ParameterizedTypeReference responseType) {
                if (uri.contains("/v1/prod/downloadPreProdFile")) {
                    BasicResponseContentVo<TransportResponseVo> basicResponseContentVo = new BasicResponseContentVo<>();
                    TransportResponseVo transportResponseVo = new TransportResponseVo();
                    transportResponseVo.setCode("success");
                    transportResponseVo.setUploadCode("uploadCode");
                    basicResponseContentVo.setContent(transportResponseVo);
                    return basicResponseContentVo;
                }
                return null;
            }

            @Mock
            public Object getForExtEntity(String uri, String token,
                                          Map<String, Object> params, ParameterizedTypeReference responseType) {
                if (uri.contains("/v1/prod/isUpload")) {
                    BasicResponseContentVo<TransportResponseVo> basicResponseContentVo = new BasicResponseContentVo<>();
                    TransportResponseVo transportResponseVo = new TransportResponseVo();
                    transportResponseVo.setCode("uploaded");
                    transportResponseVo.setUploadCode("uploadCode");
                    transportResponseVo.setFileSize(11f);
                    basicResponseContentVo.setContent(transportResponseVo);
                    return basicResponseContentVo;
                }
                return null;
            }
        }.getMockInstance();
        microservicesProperties = new MockUp<MicroservicesProperties>() {
            @Mock
            public MicroservicesItemProperties getSysmgr() {
                MicroservicesItemProperties sysmgr = new MicroservicesItemProperties();
                sysmgr.setContentPath("xx.xxx.xx.x");
                sysmgr.setServiceId("serviceName");
                return sysmgr;
            }
        }.getMockInstance();

        restTemplateUtils = new MockUp<RestTemplateUtils>() {
            @Mock
            public Object postForEntity(MicroservicesItemProperties microservicesItemProperties, String interfaceUrl,
                                        Object params, ParameterizedTypeReference responseType) {
                BasicResponseContentVo<List<SysTenantOutputVo>> basicResponseContentVo = new BasicResponseContentVo<>();
                List<SysTenantOutputVo> list = new ArrayList<>();
                SysTenantOutputVo sysTenantOutputVo = new SysTenantOutputVo();
                sysTenantOutputVo.setTenantCode("1111");
                sysTenantOutputVo.setId(1l);
                list.add(sysTenantOutputVo);
                basicResponseContentVo.setContent(list);
                return basicResponseContentVo;
            }
        }.getMockInstance();


        CdShakeHandsTask cdShakeHandsTask = new CdShakeHandsTask();
        Map<String, Object> context = new HashMap<>();
        cdShakeHandsTask.execute(context);
    }

    @Test
    public void testHttp505() {
        setUp();
        cdPlanTaskPropertiesMapper = new MockUp<CdPlanTaskPropertiesMapper>() {
            @Mock
            public List<CdPlanTaskProperties> selectBySelectiveWithBLOBs(CdPlanTaskProperties record) {
                List<CdPlanTaskProperties> planTaskProperties = new ArrayList<>();
                CdPlanTaskProperties properties = new CdPlanTaskProperties();
                properties.setPropKey("cdPorterIsUploadUrl");
                properties.setPropValue("http://10.1.8.20:32080/v1/prod/isUpload/");

                CdPlanTaskProperties urlProp = new CdPlanTaskProperties();
                urlProp.setPropKey("cdPorterProddownloadPreProdFileUrl");
                urlProp.setPropValue("http://10.1.8.20:32080/v1/prod/downloadPreProdFile");

                CdPlanTaskProperties retryNumberProp = new CdPlanTaskProperties();
                retryNumberProp.setPropKey("cdShakeHandsTaskRetryNumber");
                retryNumberProp.setPropValue("2");


                CdPlanTaskProperties retryIntervalProp = new CdPlanTaskProperties();
                retryIntervalProp.setPropKey("cdShakeHandsTaskRetryInterval");
                retryIntervalProp.setPropValue("2");


                planTaskProperties.add(properties);
                planTaskProperties.add(urlProp);
                planTaskProperties.add(retryIntervalProp);
                planTaskProperties.add(retryNumberProp);
                return planTaskProperties;
            }
        }.getMockInstance();
        cdPlanReleaseFileMapper = new MockUp<CdPlanReleaseFileMapper>() {
            @Mock
            public CdPlanReleaseFile selectByPlanReleaseId(Long planReleaseId) {
                CdPlanReleaseFile cdPlanReleaseFile = new CdPlanReleaseFile();
                cdPlanReleaseFile.setFileSize(111L);
                cdPlanReleaseFile.setCreateDate(new Date());
                cdPlanReleaseFile.setPlanReleaseId(111L);
                cdPlanReleaseFile.setTenantId(111L);
                cdPlanReleaseFile.setChangeDate(new Date());
                cdPlanReleaseFile.setCreateorId(111L);
                return cdPlanReleaseFile;
            }

            @Mock
            public void insert(CdPlanReleaseFile cdPlanReleaseFile) {

            }
        }.getMockInstance();

        cdPlanPipelineMapper = new MockUp<CdPlanPipelineMapper>() {
            @Mock
            public CdPlanPipeline selectByPrimaryKey(Long taskFlowId) {
                CdPlanPipeline cdPlanPipeline = new CdPlanPipeline();
                cdPlanPipeline.setPipelineCode("111");
                cdPlanPipeline.setCreateDate(new Date());
                cdPlanPipeline.setPlanReleaseId(111L);
                cdPlanPipeline.setTenantId(111L);
                cdPlanPipeline.setChangeDate(new Date());
                cdPlanPipeline.setPlanPipelineId(111l);
                return cdPlanPipeline;
            }

            @Mock
            public List<CdPlanPipeline> selectBySelective(CdPlanPipeline record) {
                List<CdPlanPipeline> list = new ArrayList<>();
                CdPlanPipeline cdPlanPipeline = new CdPlanPipeline();
                cdPlanPipeline.setPlanPipelineId(111l);
                cdPlanPipeline.setPipelineCode("111");
                cdPlanPipeline.setPlanReleaseId(111l);
                cdPlanPipeline.setCreatorId(111l);
                cdPlanPipeline.setTenantId(111l);
                list.add(cdPlanPipeline);
                return list;
            }
        }.getMockInstance();

        cdPlanReleaseMapper = new MockUp<CdPlanReleaseMapper>() {
            @Mock
            public CdPlanRelease selectByPrimaryKey(Long taskFlowId) {
                CdPlanRelease cdPlanReleaseFile = new CdPlanRelease();
                cdPlanReleaseFile.setPlanReleaseId(111l);
                cdPlanReleaseFile.setCreateDate(new Date());
                cdPlanReleaseFile.setPlanReleaseId(111L);
                cdPlanReleaseFile.setReleaseCode("111");
                cdPlanReleaseFile.setChangeDate(new Date());
                cdPlanReleaseFile.setReleaseStatus("11");
                return cdPlanReleaseFile;
            }
        }.getMockInstance();
        cdPlanMapper = new MockUp<CdPlanMapper>() {
            @Mock
            public CdPlan selectByPrimaryKey(Long taskFlowId) {
                CdPlan cdPlan = new CdPlan();
                cdPlan.setPlanId(111l);
                cdPlan.setCreateDate(new Date());
                cdPlan.setTenanatId(111l);
                cdPlan.setPlanName("111");
                cdPlan.setChangeDate(new Date());
                cdPlan.setPlanVersion("1111");
                return cdPlan;
            }
        }.getMockInstance();

        new MockUp<CdShakeHandsTask>() {
            @Mock
            private FlowSwitchDTO createHttpParams(Long taskLogId, List<CdPlanTaskProperties> configProperties, String propKey) {
                FlowSwitchDTO dto = new FlowSwitchDTO();
                List<Integer> statusArry = new ArrayList<>();
                statusArry.add(3);
                statusArry.add(5);
                dto.setAction_id(1000L);
                dto.setTarget_status(statusArry);
                return dto;
            }
        };

        extRestTemplateUtils = new MockUp<ExtRestTemplateUtils>() {
            @Mock
            public Object postForExtEntity(String uri, String token,
                                           Object params, ParameterizedTypeReference responseType) {
                if (uri.contains("/v1/prod/downloadPreProdFile")) {
                    BasicResponseContentVo<TransportResponseVo> basicResponseContentVo = new BasicResponseContentVo<>();
                    TransportResponseVo transportResponseVo = new TransportResponseVo();
                    transportResponseVo.setCode("success");
                    transportResponseVo.setUploadCode("uploadCode");
                    basicResponseContentVo.setContent(transportResponseVo);
                    return basicResponseContentVo;
                }
                return null;
            }

            @Mock
            public Object getForExtEntity(String uri, String token,
                                          Map<String, Object> params, ParameterizedTypeReference responseType) {
                if (uri.contains("/v1/prod/isUpload")) {
                    PaasError REQUEST_ERROR = new PaasError("12201002", "请求错误!");

                    throw new SystemException(REQUEST_ERROR);
                }
                return null;
            }
        }.getMockInstance();
        microservicesProperties = new MockUp<MicroservicesProperties>() {
            @Mock
            public MicroservicesItemProperties getSysmgr() {
                MicroservicesItemProperties sysmgr = new MicroservicesItemProperties();
                sysmgr.setContentPath("xx.xxx.xx.x");
                sysmgr.setServiceId("serviceName");
                return sysmgr;
            }
        }.getMockInstance();

        restTemplateUtils = new MockUp<RestTemplateUtils>() {
            @Mock
            public Object postForEntity(MicroservicesItemProperties microservicesItemProperties, String interfaceUrl,
                                        Object params, ParameterizedTypeReference responseType) {
                BasicResponseContentVo<List<SysTenantOutputVo>> basicResponseContentVo = new BasicResponseContentVo<>();
                List<SysTenantOutputVo> list = new ArrayList<>();
                SysTenantOutputVo sysTenantOutputVo = new SysTenantOutputVo();
                sysTenantOutputVo.setTenantCode("1111");
                sysTenantOutputVo.setId(1l);
                list.add(sysTenantOutputVo);
                basicResponseContentVo.setContent(list);
                return basicResponseContentVo;
            }
        }.getMockInstance();

        CdShakeHandsTask cdShakeHandsTask = new CdShakeHandsTask();
        Map<String, Object> context = new HashMap<>();
        try {
            cdShakeHandsTask.execute(context);
        } catch (TaskInterruptedException e) {
            Assert.assertEquals(e.getMessage(), "com.newland.paas.sbcommon.common.SystemException: 请求错误!");

        }
    }

    @Test
    public void testHttp404DefaultRetryNumber() {
        setUp();
        cdPlanTaskPropertiesMapper = new MockUp<CdPlanTaskPropertiesMapper>() {
            @Mock
            public List<CdPlanTaskProperties> selectBySelectiveWithBLOBs(CdPlanTaskProperties record) {
                List<CdPlanTaskProperties> planTaskProperties = new ArrayList<>();
                CdPlanTaskProperties properties = new CdPlanTaskProperties();
                properties.setPropKey("cdPo" +
                        "rterIsUploadUrl");
                properties.setPropValue("http://10.1.8.20:32080/v1/prod/isUpload/");

                CdPlanTaskProperties urlProp = new CdPlanTaskProperties();
                urlProp.setPropKey("cdPorterProddownloadPreProdFileUrl");
                urlProp.setPropValue("http://10.1.8.20:32080/v1/prod/downloadPreProdFile");

                CdPlanTaskProperties retryNumberProp = new CdPlanTaskProperties();
                retryNumberProp.setPropKey("cdShakeHandsTaskRetryNumber");
                retryNumberProp.setPropValue("2");


                CdPlanTaskProperties retryIntervalProp = new CdPlanTaskProperties();
                retryIntervalProp.setPropKey("cdShakeHandsTaskRetryInterval");
                retryIntervalProp.setPropValue("2");


                planTaskProperties.add(properties);
                planTaskProperties.add(urlProp);
          /*      planTaskProperties.add(retryIntervalProp);
                planTaskProperties.add(retryNumberProp);*/
                return planTaskProperties;
            }
        }.getMockInstance();
        cdPlanReleaseFileMapper = new MockUp<CdPlanReleaseFileMapper>() {
            @Mock
            public CdPlanReleaseFile selectByPlanReleaseId(Long planReleaseId) {
                CdPlanReleaseFile cdPlanReleaseFile = new CdPlanReleaseFile();
                cdPlanReleaseFile.setFileSize(111L);
                cdPlanReleaseFile.setCreateDate(new Date());
                cdPlanReleaseFile.setPlanReleaseId(111L);
                cdPlanReleaseFile.setTenantId(111L);
                cdPlanReleaseFile.setChangeDate(new Date());
                cdPlanReleaseFile.setCreateorId(111L);
                return cdPlanReleaseFile;
            }

            @Mock
            public void insert(CdPlanReleaseFile cdPlanReleaseFile) {

            }
        }.getMockInstance();

        cdPlanPipelineMapper = new MockUp<CdPlanPipelineMapper>() {
            @Mock
            public CdPlanPipeline selectByPrimaryKey(Long taskFlowId) {
                CdPlanPipeline cdPlanPipeline = new CdPlanPipeline();
                cdPlanPipeline.setPipelineCode("111");
                cdPlanPipeline.setCreateDate(new Date());
                cdPlanPipeline.setPlanReleaseId(111L);
                cdPlanPipeline.setTenantId(111L);
                cdPlanPipeline.setChangeDate(new Date());
                cdPlanPipeline.setPlanPipelineId(111l);
                return cdPlanPipeline;
            }
        }.getMockInstance();

        cdPlanReleaseMapper = new MockUp<CdPlanReleaseMapper>() {
            @Mock
            public CdPlanRelease selectByPrimaryKey(Long taskFlowId) {
                CdPlanRelease cdPlanReleaseFile = new CdPlanRelease();
                cdPlanReleaseFile.setPlanReleaseId(111l);
                cdPlanReleaseFile.setCreateDate(new Date());
                cdPlanReleaseFile.setPlanReleaseId(111L);
                cdPlanReleaseFile.setReleaseCode("111");
                cdPlanReleaseFile.setChangeDate(new Date());
                cdPlanReleaseFile.setReleaseStatus("11");
                return cdPlanReleaseFile;
            }
        }.getMockInstance();
        cdPlanMapper = new MockUp<CdPlanMapper>() {
            @Mock
            public CdPlan selectByPrimaryKey(Long taskFlowId) {
                CdPlan cdPlan = new CdPlan();
                cdPlan.setPlanId(111l);
                cdPlan.setCreateDate(new Date());
                cdPlan.setTenanatId(111l);
                cdPlan.setPlanName("111");
                cdPlan.setChangeDate(new Date());
                cdPlan.setPlanVersion("1111");
                return cdPlan;
            }
        }.getMockInstance();
        cdPlanTaskMapper = new MockUp<CdPlanTaskMapper>() {
            @Mock
            public List<CdPlanTask> selectBySelective(CdPlanTask taskQuery) {
                List<CdPlanTask> ptList = new ArrayList<>();
                CdPlanTask cdPlanTask = new CdPlanTask();
                cdPlanTask.setPlanPipelineId(111l);
                cdPlanTask.setPlanTaskId(111l);
                cdPlanTask.setPlanTaskGroupId(111l);
                cdPlanTask.setPipelineId(111l);
                cdPlanTask.setTaskGroupId(111l);
                cdPlanTask.setTaskCode("111");
                cdPlanTask.setChangeDate(new Date());
                cdPlanTask.setChangeDate(new Date());
                ptList.add(cdPlanTask);
                return ptList;
            }
        }.getMockInstance();


        extRestTemplateUtils = new MockUp<ExtRestTemplateUtils>() {
            @Mock
            public Object postForExtEntity(String uri, String token,
                                           Object params, ParameterizedTypeReference responseType) {
                if (uri.contains("/v1/prod/downloadPreProdFile")) {
                    BasicResponseContentVo<TransportResponseVo> basicResponseContentVo = new BasicResponseContentVo<>();
                    TransportResponseVo transportResponseVo = new TransportResponseVo();
                    transportResponseVo.setCode("success");
                    transportResponseVo.setUploadCode("uploadCode");
                    basicResponseContentVo.setContent(transportResponseVo);
                    return basicResponseContentVo;
                }
                return null;
            }

            @Mock
            public Object getForExtEntity(String uri, String token,
                                          Map<String, Object> params, ParameterizedTypeReference responseType) {
                if (uri.contains("/v1/prod/isUpload")) {
                    PaasError REQUEST_ERROR = new PaasError("12201001", "请求错误!");

                    throw new SystemException(REQUEST_ERROR);
                }
                return null;

            }
        }.getMockInstance();
        microservicesProperties = new MockUp<MicroservicesProperties>() {
            @Mock
            public MicroservicesItemProperties getSysmgr() {
                MicroservicesItemProperties sysmgr = new MicroservicesItemProperties();
                sysmgr.setContentPath("xx.xxx.xx.x");
                sysmgr.setServiceId("serviceName");
                return sysmgr;
            }
        }.getMockInstance();

        restTemplateUtils = new MockUp<RestTemplateUtils>() {
            @Mock
            public Object postForEntity(MicroservicesItemProperties microservicesItemProperties, String interfaceUrl,
                                        Object params, ParameterizedTypeReference responseType) {
                BasicResponseContentVo<List<SysTenantOutputVo>> basicResponseContentVo = new BasicResponseContentVo<>();
                List<SysTenantOutputVo> list = new ArrayList<>();
                SysTenantOutputVo sysTenantOutputVo = new SysTenantOutputVo();
                sysTenantOutputVo.setTenantCode("1111");
                sysTenantOutputVo.setId(1l);
                list.add(sysTenantOutputVo);
                basicResponseContentVo.setContent(list);
                return basicResponseContentVo;
            }
        }.getMockInstance();


        CdShakeHandsTask cdShakeHandsTask = new CdShakeHandsTask();
        Map<String, Object> context = new HashMap<>();
        try {
            cdShakeHandsTask.execute(context);
        } catch (TaskInterruptedException e) {
            Assert.assertEquals(e.getMessage(), "Cd握手任务[1000]已经完成[0]重试,任务执行失败");
        }
    }
}


package com.newland.paas.paasservicenj.cd.taskflow.task;

import com.alibaba.fastjson.JSON;
import com.newland.paas.log.Log;
import com.newland.paas.log.LogFactory;
import com.newland.paas.log.LogProperty;
import com.newland.paas.paasdatamodulenj.cd.dao.CdPlanMapper;
import com.newland.paas.paasdatamodulenj.cd.dao.CdPlanPipelineMapper;
import com.newland.paas.paasdatamodulenj.cd.dao.CdPlanReleaseFileMapper;
import com.newland.paas.paasdatamodulenj.cd.dao.CdPlanReleaseMapper;
import com.newland.paas.paasdatamodulenj.cd.dao.CdPlanTaskMapper;
import com.newland.paas.paasdatamodulenj.cd.dao.CdPlanTaskPropertiesMapper;
import com.newland.paas.paasdatamodulenj.cd.model.CdPlan;
import com.newland.paas.paasdatamodulenj.cd.model.CdPlanPipeline;
import com.newland.paas.paasdatamodulenj.cd.model.CdPlanRelease;
import com.newland.paas.paasdatamodulenj.cd.model.CdPlanReleaseFile;
import com.newland.paas.paasdatamodulenj.cd.model.CdPlanTask;
import com.newland.paas.paasdatamodulenj.cd.model.CdPlanTaskProperties;
import com.newland.paas.paasservice.controllerapi.cd.vo.TransportRequestVo;
import com.newland.paas.paasservice.controllerapi.cd.vo.TransportResponseVo;
import com.newland.paas.paasservice.controllerapi.sysmgr.vo.SysTenantOutputVo;
import com.newland.paas.paasservice.controllerapi.sysmgr.vo.SysTenantReqVo;
import com.newland.paas.paasservicenj.cd.errorcode.CdErrorCode;
import com.newland.paas.paasservicenj.cd.taskflow.model.CdContextKey;
import com.newland.paas.paasservicenj.cd.taskflow.util.BossSqlUtils;
import com.newland.paas.paasservicenj.cd.utils.ReleaseConfigUtil;
import com.newland.paas.sbcommon.common.ApplicationException;
import com.newland.paas.sbcommon.common.SystemException;
import com.newland.paas.sbcommon.properties.MicroservicesProperties;
import com.newland.paas.sbcommon.utils.ExtRestTemplateUtils;
import com.newland.paas.sbcommon.utils.RestTemplateUtils;
import com.newland.paas.sbcommon.utils.SpringContextUtil;
import com.newland.paas.sbcommon.vo.BasicRequestContentVo;
import com.newland.paas.sbcommon.vo.BasicResponseContentVo;
import com.newland.paas.taskflow.core.exception.TaskExecuteException;
import com.newland.paas.taskflow.core.exception.TaskInterruptedException;
import com.newland.paas.taskflow.core.exception.TaskRollbackException;
import com.newland.paas.taskflow.core.exception.TaskStopException;
import com.newland.paas.taskflow.core.logger.ITaskLogger;
import com.newland.paas.taskflow.core.model.ContextKey;
import com.newland.paas.taskflow.core.model.Task;
import com.newland.paas.taskflow.core.model.TaskContextWrapper;
import com.newland.paas.taskflow.core.model.TaskFlowContextWrapper;
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.util.CollectionUtils;

import java.util.Date;
import java.util.List;
import java.util.Map;


public class CdShakeHandsTask extends Task {
    private static final Log LOG = LogFactory.getLogger(CdShakeHandsTask.class);


    //对应paas 通知接口url
    private static final  String DOWNLOAD_PREPROD_FILE_URL = "cdPorterProddownloadPreProdFileUrl";

    private static final  String FLOW_CD_PORTER_IS_UPLOAD_URL = "cdPorterIsUploadUrl";
    //接口调用异常重试次数
    private static final  String FLOW_SHAKE_HANDS_RETRY_NUMBER = "cdShakeHandsTaskRetryNumber";
    //接口异常重试时间间隔
    private static final  String FLOW_SHAKE_HANDS_RETRY_INTERVAL = "cdShakeHandsTaskRetryInterval";

    private static final  String CD_PLAN_RELEASE_FILE_ISSAVE = "cd.plan.release.file.isSave";
    //判断查询握手状态成功(验证生产包传输完成)
    private static final  String SUCCESS = "uploaded";

    private CdPlanMapper cdPlanMapper;

    private CdPlanReleaseMapper cdPlanReleaseMapper;

    private CdPlanPipelineMapper cdPlanPipelineMapper;


    private CdPlanTaskPropertiesMapper cdPlanTaskPropertiesMapper;

    private MicroservicesProperties microservicesProperties;

    private RestTemplateUtils restTemplateUtils;

    private CdPlanReleaseFileMapper cdPlanReleaseFileMapper;
    private CdPlanTaskMapper cdPlanTaskMapper;
    private ITaskLogger taskLogger;
    private ExtRestTemplateUtils extRestTemplateUtils;
    private String isSave = "false";
    private static String isProd = "true";
    private Boolean requiredToStop = false;
    private CdPlanTaskPropertiesAnalyze taskPropertiesAnalyze;

    private String taskLogFileId = "";

    public CdShakeHandsTask() {
        this.cdPlanMapper = SpringContextUtil.getBean(CdPlanMapper.class);
        this.cdPlanReleaseMapper = SpringContextUtil.getBean(CdPlanReleaseMapper.class);
        this.cdPlanPipelineMapper = SpringContextUtil.getBean(CdPlanPipelineMapper.class);
        this.microservicesProperties = SpringContextUtil.getBean(MicroservicesProperties.class);
        this.restTemplateUtils = SpringContextUtil.getBean(RestTemplateUtils.class);
        this.cdPlanReleaseFileMapper = SpringContextUtil.getBean(CdPlanReleaseFileMapper.class);
        this.cdPlanTaskMapper = SpringContextUtil.getBean(CdPlanTaskMapper.class);
        this.cdPlanTaskPropertiesMapper = SpringContextUtil.getBean(CdPlanTaskPropertiesMapper.class);
        this.extRestTemplateUtils = SpringContextUtil.getBean(ExtRestTemplateUtils.class);
        taskPropertiesAnalyze = new CdPlanTaskPropertiesAnalyze();
        this.isSave = SpringContextUtil.getVaue(CD_PLAN_RELEASE_FILE_ISSAVE);
        this.taskLogger = SpringContextUtil.getBean(ITaskLogger.class);

    }

    @Override
    public void execute(Map<String, Object> context) throws TaskExecuteException, TaskInterruptedException {
        try {
            process(context, DOWNLOAD_PREPROD_FILE_URL, FLOW_CD_PORTER_IS_UPLOAD_URL, FLOW_SHAKE_HANDS_RETRY_NUMBER, FLOW_SHAKE_HANDS_RETRY_INTERVAL);

        } catch (TaskInterruptedException e1) {
            taskLogger.log(taskLogFileId, String.format("[%s] Cd握手任务[%s],出错错误信息:%s", BossSqlUtils.getLogTime(), getId(), e1.getMessage()), false);
            throw e1;
        } catch (Exception e) {
            taskLogger.log(taskLogFileId, String.format("[%s] Cd握手任务[%s],出错错误信息:%s", BossSqlUtils.getLogTime(), getId(), e.getMessage()), false);
            throw new TaskInterruptedException(e);
        } finally {
            taskLogger.log(taskLogFileId, String.format("[%s] Cd握手任务[%s]----- END -----", BossSqlUtils.getLogTime(), getId()), true);
        }

    }

    @Override
    public void rollback(Map<String, Object> context) throws TaskRollbackException, TaskInterruptedException {
        try {
            TaskFlowContextWrapper taskFlowContextWrapper = new TaskFlowContextWrapper(context);
            Map<String, Object> taskContext = taskFlowContextWrapper.getTaskContext(this.getId().toString());
            TaskContextWrapper taskContextWrapper = new TaskContextWrapper(taskContext);
            String taskLogFileId = taskContextWrapper.getValue(ContextKey.TASK_LOG_FILE_ID, String.class);
            this.taskLogFileId = taskLogFileId;
            taskLogger.log(taskLogFileId, String.format("[%s]cd握手任务回滚[%s]----- BEGIN -----", BossSqlUtils.getLogTime(), this.getId()), false);
            //获取任务流id
            Long taskFlowId = (Long) taskFlowContextWrapper.get(ContextKey.TASK_FLOW_ID);
            // 获取流水线信息
            CdPlanPipeline cdPlanPipeline = cdPlanPipelineMapper.selectByPrimaryKey(taskFlowId);
            if (cdPlanPipeline == null) {
                throw new TaskInterruptedException(CdErrorCode.PLAN_PIPE_LINE_INFO_NOT_FOUND.getDescription());
            }
            cdPlanReleaseFileMapper.deleteByPrimaryKey(cdPlanPipeline.getPlanReleaseId());
        } catch (TaskInterruptedException e1) {
            taskLogger.log(taskLogFileId, String.format("[%s] Cd握手任务[%s],出错错误信息:%s", BossSqlUtils.getLogTime(), getId(), e1.getMessage()), false);
            throw e1;
        } catch (Exception e) {
            taskLogger.log(taskLogFileId, String.format("[%s] Cd握手任务[%s],出错错误信息:%s", BossSqlUtils.getLogTime(), getId(), e.getMessage()), false);
            throw new TaskInterruptedException(e);
        } finally {
            taskLogger.log(taskLogFileId, String.format("[%s] Cd握手任务[%s]----- END -----", BossSqlUtils.getLogTime(), getId()), true);
        }
    }


    /**
     * @param context
     * @param downloadPreProdFileUrlKey
     * @param isUploadUrlKey
     * @param retryNumberKey
     * @param retryIntervalKey
     * @throws ApplicationException
     */
    private void process(Map<String, Object> context, String downloadPreProdFileUrlKey, String isUploadUrlKey, String retryNumberKey, String retryIntervalKey) throws ApplicationException {
        TaskFlowContextWrapper taskFlowContextWrapper = new TaskFlowContextWrapper(context);
        Map<String, Object> taskContext = taskFlowContextWrapper.getTaskContext(this.getId().toString());
        TaskContextWrapper taskContextWrapper = new TaskContextWrapper(taskContext);
        String taskLogFileId = taskContextWrapper.getValue(ContextKey.TASK_LOG_FILE_ID, String.class);
        this.taskLogFileId = taskLogFileId;
        taskLogger.log(taskLogFileId, String.format("[%s]cd握手任务[%s]----- BEGIN -----", BossSqlUtils.getLogTime(), this.getId()), false);
        //获取任务流id
        Long taskFlowId = (Long) taskFlowContextWrapper.get(ContextKey.TASK_FLOW_ID);
        // 获取流水线信息
        CdPlanPipeline cdPlanPipeline = cdPlanPipelineMapper.selectByPrimaryKey(taskFlowId);
        if (cdPlanPipeline == null) {
            throw new TaskInterruptedException(CdErrorCode.PLAN_PIPE_LINE_INFO_NOT_FOUND.getDescription());
        }
        // 获取发布信息
        CdPlanRelease cdPlanRelease = cdPlanReleaseMapper.selectByPrimaryKey(cdPlanPipeline.getPlanReleaseId());
        if (cdPlanRelease == null) {
            throw new TaskInterruptedException(CdErrorCode.PLAN_RELEASE_INFO_NOT_FOUND.getDescription());
        }
        // 获取上线计划信息
        CdPlan cdPlan = cdPlanMapper.selectByPrimaryKey(cdPlanRelease.getPlanId());
        if (cdPlan == null) {
            throw new TaskInterruptedException(CdErrorCode.PLAN_INFO_NOT_FOUND.getDescription());
        }
        //本地发布包目录(绝对路径)
        String localRleasePath = (String) taskFlowContextWrapper.get(CdContextKey.LOCAL_RELEASE_PATH);
        // 获取租户信息
        Long tenantId = cdPlan.getTenanatId();
        SysTenantOutputVo sysTenantRespVo = getTenantInfo(tenantId);
        //计划版本
        String planVersion = cdPlan.getPlanVersion();
        //发布标识
        String releaseCode = cdPlanRelease.getReleaseCode();
        //计划发布ID
        Long planReleaseId = cdPlanRelease.getPlanReleaseId();
        //租户标识
        String tenantCode = sysTenantRespVo.getTenantCode();
        //资产仓库发布包目录(绝对路径)
        String dirPath = (String) taskFlowContextWrapper.get(CdContextKey.AST_SFTP_RELEASE_PATH);

        Long taskId = this.getId();
        CdPlanTaskProperties taskProperties = new CdPlanTaskProperties();
        taskProperties.setPlanTaskId(taskId);
        List<CdPlanTaskProperties> configProperties = cdPlanTaskPropertiesMapper.selectBySelectiveWithBLOBs(taskProperties);
        //判断是否进行任务配置
        if (configProperties == null || configProperties.size() == 0) {
            throw new TaskInterruptedException(String.format("Cd握手任务[%s],缺失配置", taskId));
        }
        //根据配置创建请求参数
        String url = taskPropertiesAnalyze.getConfigByPropKey(configProperties, downloadPreProdFileUrlKey, true);
        //调用测试机接口通知下载
        String uploadCode = this.uploadCode(taskLogFileId, dirPath, planVersion, releaseCode, tenantCode, url, taskId);
        //根据配置创建请求参数
        String isUploadUrlKeyUrl = taskPropertiesAnalyze.getConfigByPropKey(configProperties, isUploadUrlKey, true);
        Integer retryNum = taskPropertiesAnalyze.getIntegerPropValue(configProperties, retryNumberKey);
        Long interval = taskPropertiesAnalyze.getLongPropValue(configProperties, retryIntervalKey);
        isUploadUrlKeyUrl = isUploadUrlKeyUrl + uploadCode;
        callBack(interval, retryNum, isUploadUrlKeyUrl, planReleaseId, tenantId, uploadCode, localRleasePath, cdPlanRelease);

    }

    /**
     * 轮询回调
     *
     * @param interval
     * @param retryNum
     * @param isUploadUrlKeyUrl
     * @param planReleaseId
     * @param tenantId
     * @param uploadCode
     * @param localRleasePath
     * @param cdPlanRelease
     */
    public void callBack(Long interval, Integer retryNum, String isUploadUrlKeyUrl, Long planReleaseId, Long tenantId, String uploadCode, String localRleasePath, CdPlanRelease cdPlanRelease) {
        int retryCount = 0;
        int loopCount = 0;
        while (true) {
            loopCount++;
            // 检查是否收到停止任务指令
            if (requiredToStop) {
                taskLogger.log(taskLogFileId, String.format("[%s]Cd握手任务被手动停止,[%s] ----- END -----", BossSqlUtils.getLogTime(), getId()), false);
                throw new TaskInterruptedException("任务被终止执行");
            }
            try {
                TransportResponseVo transportResponseVo1 = isUpload(taskLogFileId, loopCount, isUploadUrlKeyUrl, uploadCode);
                if (transportResponseVo1 == null) {
                    taskLogger.log(taskLogFileId, String.format("[%s]Cd握手任务第[%s]调用[%s]出错错误信息:返回为空", BossSqlUtils.getLogTime(), loopCount, isUploadUrlKeyUrl), false);
                    continue;
                }
                taskLogger(taskLogFileId, false, "[%s]Cd握手任务第[%s]次调用[%s]返回结果[%s]", BossSqlUtils.getLogTime(), loopCount, isUploadUrlKeyUrl, JSON.toJSON(transportResponseVo1));
                //如果boss成功返回信息结束重试
                if (SUCCESS.equals(transportResponseVo1.getCode())) {
                    if (isProd.equals(isSave)) {
                        //添加上线发布文件记录
                        CdPlanReleaseFile cdPlanReleaseFile1 = new CdPlanReleaseFile();
                        cdPlanReleaseFile1.setChangeDate(new Date());
                        cdPlanReleaseFile1.setFileName(transportResponseVo1.getFileName());
                        cdPlanReleaseFile1.setPlanReleaseId(planReleaseId);
                        cdPlanReleaseFile1.setTenantId(tenantId);
                        cdPlanReleaseFile1.setCreateDate(new Date());
                        float fileSize = transportResponseVo1.getFileSize();
                        cdPlanReleaseFile1.setFileSize((long) (fileSize * 1000));
                        cdPlanReleaseFileMapper.insertSelective(cdPlanReleaseFile1);
                    }
                    // 解析并渲染发布包配置
                    CdPlanPipeline pipelineQuery = new CdPlanPipeline();
                    pipelineQuery.setPlanReleaseId(cdPlanRelease.getPlanReleaseId());
                    List<CdPlanPipeline> ppList = cdPlanPipelineMapper.selectBySelective(pipelineQuery);
                    for (CdPlanPipeline pp : ppList) {
                        parseAndRenderReleaseConfig(localRleasePath, pp);
                    }
                    break;
                }

            } catch (SystemException e) {
                retryCount++;
                httpException(taskLogFileId, isUploadUrlKeyUrl, retryCount, retryNum, e);
            }


            try {
                taskLogger.log(taskLogFileId, String.format("[%s]获取结果无效将进入[%s]秒休眠", BossSqlUtils.getLogTime(), interval), false);
                Thread.sleep(interval * 1000);
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }

        }
    }

    /**
     * 添加日志
     *
     * @param logEnd
     * @param msgContent
     * @param objects
     */
    private void taskLogger(String taskLogFileId, Boolean logEnd, String msgContent, Object... objects) {
        StringBuffer logMsg = new StringBuffer();
        if (objects != null) {
            logMsg.append(String.format(msgContent, objects));
            taskLogger.log(taskLogFileId, logMsg.toString(), logEnd);
            LOG.info(LogProperty.LOGTYPE_DETAIL, String.format(msgContent, objects));
        } else {
            logMsg.append(String.format(msgContent));
            taskLogger.log(taskLogFileId, logMsg.toString(), logEnd);
            LOG.info(LogProperty.LOGTYPE_DETAIL, String.format(msgContent));
        }


    }

    /**
     * @param url
     * @param retryCount
     * @param retryNum
     * @param e
     */
    private void httpException(String taskLogFileId, String url, int retryCount, int retryNum, SystemException e) {
        //判断是否500异常如是结束任务
        if ((e.getError().getCode().equals("12201002"))) {
            throw new TaskInterruptedException(e);
        }
        taskLogger(taskLogFileId, false, "第[%s]调用[%s]出错错误信息:%s", retryCount, url, e.getMessage());
        //如果重试重试超过配置重试次数结束重试
        if (retryCount >= retryNum) {
            throw new TaskInterruptedException(String.format("Cd握手任务[%s]已经完成[%s]重试,任务执行失败", getId(), retryNum));
        }

    }

    /**
     * 判断是否上传完成
     *
     * @param taskLogFileId
     * @param loopCount
     * @param isUploadUrlKeyUrl
     * @param uploadCode
     * @return
     */

    public TransportResponseVo isUpload(String taskLogFileId, int loopCount, String isUploadUrlKeyUrl, String uploadCode) {

        taskLogger.log(taskLogFileId, String.format("[%s]查询Cd握手状态第[%s]次向[%s]发送请求,参数[%s]", BossSqlUtils.getLogTime(), loopCount, isUploadUrlKeyUrl, uploadCode), false);
        LOG.info(LogProperty.LOGTYPE_DETAIL, ">>>>>>>>>>>> 发送查询Cd握手状态地址和参数:" + JSON.toJSONString(isUploadUrlKeyUrl));
        BasicResponseContentVo<TransportResponseVo> transportResponseContent = extRestTemplateUtils.getForExtEntity(isUploadUrlKeyUrl, null, null,
                new ParameterizedTypeReference<BasicResponseContentVo<TransportResponseVo>>() {
                });
        return transportResponseContent.getContent();

    }

    /**
     * 获取上传标识码
     *
     * @param taskLogFileId
     * @param dirPath
     * @param planVersion
     * @param releaseCode
     * @param tenantCode
     * @param url
     * @param taskId
     * @return
     */
    public String uploadCode(String taskLogFileId, String dirPath, String planVersion, String releaseCode,
                             String tenantCode, String url, Long taskId) {

        //调用通知生产下载测试机下载包
        BasicRequestContentVo<TransportRequestVo> transportRequestVoBasicRequestContentVo = new BasicRequestContentVo<>();
        TransportRequestVo transportRequestVo = new TransportRequestVo();
        transportRequestVo.setDirPath(dirPath);
        transportRequestVo.setPlanVersion(planVersion);
        transportRequestVo.setReleaseCode(releaseCode);
        transportRequestVo.setTenantCode(tenantCode);
        transportRequestVoBasicRequestContentVo.setParams(transportRequestVo);
        LOG.info(LogProperty.LOGTYPE_DETAIL, ">>>>>>>>>>>> 发送cd通知握手接口参数:" + JSON.toJSONString(transportRequestVoBasicRequestContentVo));
        taskLogger.log(taskLogFileId, String.format("CI握手任务向[%s]发送请求,参数[%s]", url, JSON.toJSONString(transportRequestVoBasicRequestContentVo)), false);
        BasicResponseContentVo<TransportResponseVo> contentVo = extRestTemplateUtils.postForExtEntity(url, null, transportRequestVoBasicRequestContentVo,
                new ParameterizedTypeReference<BasicResponseContentVo<TransportResponseVo>>() {
                });
        if (contentVo.getContent() == null) {
            LOG.error(LogProperty.LOGTYPE_DETAIL, null, null, ">>>>>>>>>>>> " + String.format("Cd握手任务通知握手接口[%s],缺失返回数据", taskId));
            throw new TaskInterruptedException(String.format("CI握手任务通知握手接口[%s],缺失返回数据", taskId));
        }
        taskLogger.log(taskLogFileId, String.format("CI握手任务调用[%s]返回结果[%s]", url, JSON.toJSONString(contentVo)), false);
        LOG.info(LogProperty.LOGTYPE_DETAIL, ">>>>>>>>>>>> 发送cd通知握手接口返回结果:" + JSON.toJSONString(transportRequestVoBasicRequestContentVo));

        TransportResponseVo transportResponseVo = contentVo.getContent();
        //获取上传标识码
        return transportResponseVo.getUploadCode();
    }

    /**
     * 解析配置文件渲染
     *
     * @param localRleasePath
     * @param cdPlanPipeline
     */
    private void parseAndRenderReleaseConfig(String localRleasePath, CdPlanPipeline cdPlanPipeline) {
        // 解析配置文件
        Map<String, String> envConfig;
        Map<String, Map<String, String>> pipelineConfig;
        CdPlanTask taskQuery = new CdPlanTask();
        taskQuery.setPlanPipelineId(cdPlanPipeline.getPlanPipelineId());
        List<CdPlanTask> ptList = cdPlanTaskMapper.selectBySelective(taskQuery);
        try {
            envConfig = ReleaseConfigUtil.parseEnvConfig(localRleasePath, cdPlanPipeline.getPipelineEnv());
            pipelineConfig = ReleaseConfigUtil.parsePipelineConfig(localRleasePath, cdPlanPipeline.getPipelineCode(), envConfig);
            // 渲染阶段.cfg文件
            ReleaseConfigUtil.renderPipelineConfig(localRleasePath, cdPlanPipeline.getPipelineCode(), envConfig);
            for (CdPlanTask cdPlanTask : ptList) {
                String taskDir = localRleasePath + "/" + cdPlanTask.getTaskCode();
                // 渲染app.yaml中的变量
                ReleaseConfigUtil.renderAppYaml(taskDir, envConfig);
            }
        } catch (Exception e) {
            throw new TaskInterruptedException(CdErrorCode.RELEASE_CONFIG_PARSE_ERROR.getDescription() + e.getMessage());
        }
        // 任务属性取值
        for (CdPlanTask cdPlanTask : ptList) {
            // 任务属性读取优先级: 属性已有值 > 上线包配置值 > 默认值
            // 如果以上均读取不到值,则报错
            List<CdPlanTaskProperties> cdPlanTaskPropertiesList = cdPlanTaskPropertiesMapper.getPlanTaskProperties(cdPlanTask.getPlanTaskId());
            if (cdPlanTaskPropertiesList == null) {
                continue;
            }
            Map<String, String> taskConfig = pipelineConfig.get(cdPlanTask.getTaskCode());
            for (CdPlanTaskProperties cdPlanTaskProperties : cdPlanTaskPropertiesList) {
                String value = null;
                if (!com.newland.paas.common.util.StringUtils.isBlank(cdPlanTaskProperties.getPropValue())) {
                    continue;
                } else if (taskConfig != null) {
                    value = taskConfig.get(cdPlanTaskProperties.getPropKey());
                } else if (!com.newland.paas.common.util.StringUtils.isBlank(cdPlanTaskProperties.getDefaultValue())) {
                    value = cdPlanTaskProperties.getDefaultValue();
                }
                if (com.newland.paas.common.util.StringUtils.isBlank(value)) {
                    CdErrorCode.RELEASE_CONFIG_MISSING.setMsgArguments("阶段[" + cdPlanPipeline.getPipelineCode() + "].环节[" + cdPlanTask.getTaskCode() + "]." + cdPlanTaskProperties.getPropKey());
                    throw new TaskInterruptedException(CdErrorCode.RELEASE_CONFIG_MISSING.getDescription() + CdErrorCode.RELEASE_CONFIG_MISSING.getSolution());
                }
                // 写入属性值
                cdPlanTaskProperties.setPropValue(value);
                cdPlanTaskPropertiesMapper.updateByPrimaryKeyWithBLOBs(cdPlanTaskProperties);
            }
        }
    }


    /**
     * 根据租户id获取租户信息
     *
     * @param tenantId
     * @return
     */
    public SysTenantOutputVo getTenantInfo(Long tenantId) {
        ParameterizedTypeReference<BasicResponseContentVo<List<SysTenantOutputVo>>> responseType =
                new ParameterizedTypeReference<BasicResponseContentVo<List<SysTenantOutputVo>>>() {
                };
        BasicRequestContentVo<SysTenantReqVo> sysTenantReqVoBase = new BasicRequestContentVo<>();
        SysTenantReqVo sysTenantReqVo = new SysTenantReqVo();
        sysTenantReqVo.setTenantId(tenantId);
        sysTenantReqVoBase.setParams(sysTenantReqVo);
        BasicResponseContentVo<List<SysTenantOutputVo>> response = restTemplateUtils
                .postForEntity(microservicesProperties.getSysmgr(), "/v1/tenantMgr/getTenantInfo",
                        sysTenantReqVoBase, responseType);
        if (CollectionUtils.isEmpty(response.getContent())) {
            LOG.error(LogProperty.LOGTYPE_DETAIL, null, null, ">>>>>>>>>>>> " + String.format("调用租户id[%s]信息接口,返回数据数据为空", tenantId));
            throw new TaskInterruptedException(CdErrorCode.CD_TENANT_NULL.getDescription());
        }
        return response.getContent().get(0);
    }


    /**
     * @param context
     * @throws TaskStopException
     */
    @Override
    public void stop(Map<String, Object> context) throws TaskStopException {
        this.requiredToStop = true;
    }


}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值