unit.go 5.5 KB
Newer Older
aaronchen2k2k's avatar
aaronchen2k2k 已提交
1
package execHelper
aaronchen2k2k's avatar
aaronchen2k2k 已提交
2 3 4 5

import (
	"bufio"
	"errors"
Z
zhaoke 已提交
6 7
	"io"
	"os/exec"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
8
	"path/filepath"
Z
zhaoke 已提交
9 10 11
	"strings"
	"time"

雨爱无痕 已提交
12
	fileUtils "github.com/easysoft/zentaoatf/pkg/lib/file"
Z
zhaoke 已提交
13
	shellUtils "github.com/easysoft/zentaoatf/pkg/lib/shell"
雨爱无痕 已提交
14

aaronchen2k2k's avatar
aaronchen2k2k 已提交
15 16 17 18
	commConsts "github.com/easysoft/zentaoatf/internal/pkg/consts"
	configHelper "github.com/easysoft/zentaoatf/internal/pkg/helper/config"
	websocketHelper "github.com/easysoft/zentaoatf/internal/pkg/helper/websocket"
	zentaoHelper "github.com/easysoft/zentaoatf/internal/pkg/helper/zentao"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
19
	serverDomain "github.com/easysoft/zentaoatf/internal/server/modules/v1/domain"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
20 21 22 23
	dateUtils "github.com/easysoft/zentaoatf/pkg/lib/date"
	i118Utils "github.com/easysoft/zentaoatf/pkg/lib/i118"
	logUtils "github.com/easysoft/zentaoatf/pkg/lib/log"
	stringUtils "github.com/easysoft/zentaoatf/pkg/lib/string"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
24
	"github.com/fatih/color"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
25
	"github.com/kataras/iris/v12"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
26 27 28
	"github.com/kataras/iris/v12/websocket"
)

aaronchen2k2k's avatar
aaronchen2k2k 已提交
29
func ExecUnit(ch chan int, req serverDomain.TestSet, wsMsg *websocket.Message) (err error) {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
30 31
	key := stringUtils.Md5(req.WorkspacePath)

aaronchen2k2k's avatar
aaronchen2k2k 已提交
32
	// start msg
aaronchen2k2k's avatar
aaronchen2k2k 已提交
33 34
	startTime := time.Now()
	startMsg := i118Utils.Sprintf("start_execution", req.Cmd, dateUtils.DateTimeStr(startTime))
aaronchen2k2k's avatar
aaronchen2k2k 已提交
35 36
	logUtils.ExecConsolef(-1, startMsg)
	logUtils.ExecFilef(startMsg)
37
	if commConsts.ExecFrom == commConsts.FromClient {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
38 39
		websocketHelper.SendExecMsg(startMsg, "", commConsts.Run,
			iris.Map{"key": key, "status": "start"}, wsMsg)
m0_58228130's avatar
ztfTest  
m0_58228130 已提交
40 41
	}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
42
	//deal with -allureReportDir param
aaronchen2k2k's avatar
aaronchen2k2k 已提交
43 44 45
	arr := strings.Split(req.Cmd, " ")
	if len(arr) > 1 && strings.TrimSpace(arr[0]) == "-allureReportDir" {
		commConsts.AllureReportDir = arr[1]
aaronchen2k2k's avatar
aaronchen2k2k 已提交
46 47
		pth := filepath.Join(req.WorkspacePath, commConsts.AllureReportDir)
		fileUtils.RmDir(pth)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
48 49 50
		req.Cmd = strings.Join(arr[2:], " ")
	}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
51
	getResultDirForDifferentTool(&req)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
52

aaronchen2k2k's avatar
aaronchen2k2k 已提交
53
	// run
aaronchen2k2k's avatar
aaronchen2k2k 已提交
54
	entTime := time.Now()
aaronchen2k2k's avatar
aaronchen2k2k 已提交
55 56 57
	if strings.TrimSpace(req.Cmd) != "" {
		// remove old results
		fileUtils.RmDir(req.ResultDir)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
58 59 60
		if fileUtils.GetExtName(req.ResultDir) == "" { // not file
			fileUtils.MkDirIfNeeded(req.ResultDir)
		}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
61 62 63 64 65

		RunUnitTest(ch, req.Cmd, req.WorkspacePath, wsMsg)

		// end msg
		endMsg := i118Utils.Sprintf("end_execution", req.Cmd, dateUtils.DateTimeStr(entTime))
Z
zhaoke 已提交
66
		logUtils.ExecConsolef(-1, endMsg+"\n")
aaronchen2k2k's avatar
aaronchen2k2k 已提交
67
		logUtils.ExecFilef(endMsg)
68
		if commConsts.ExecFrom == commConsts.FromClient {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
69 70 71
			websocketHelper.SendExecMsg(endMsg, "", commConsts.Run,
				iris.Map{"key": key, "status": "end"}, wsMsg)
		}
m0_58228130's avatar
ztfTest  
m0_58228130 已提交
72 73
	}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
74
	// gen report
aaronchen2k2k's avatar
aaronchen2k2k 已提交
75
	report := GenUnitTestReport(req, startTime.Unix(), entTime.Unix(), ch, wsMsg)
76

aaronchen2k2k's avatar
aaronchen2k2k 已提交
77 78
	// dealwith jacoco report
	if commConsts.JacocoReport != "" {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
79
		report.JacocoResult = GenJacocoCovReport()
aaronchen2k2k's avatar
aaronchen2k2k 已提交
80 81
	}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
82
	// submit result
aaronchen2k2k's avatar
aaronchen2k2k 已提交
83
	if req.SubmitResult && (report.FuncResult != nil || report.UnitResult != nil) {
84
		workspaceDir := req.WorkspacePath
85
		if commConsts.ExecFrom == commConsts.FromCmd {
86
			workspaceDir = commConsts.ZtfDir
87 88
		}

89
		config := configHelper.LoadByWorkspacePath(workspaceDir)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
90

aaronchen2k2k's avatar
aaronchen2k2k 已提交
91
		err = zentaoHelper.CommitResult(report, req.ProductId, req.TaskId, config, wsMsg)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
92 93
	}

94
	if commConsts.ExecFrom == commConsts.FromClient {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
95
		websocketHelper.SendExecMsg("", "false", commConsts.Run, nil, wsMsg)
96
	}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
97 98 99 100

	return
}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
101
func RunUnitTest(ch chan int, cmdStr, workspacePath string, wsMsg *websocket.Message) (err error) {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
102 103
	key := stringUtils.Md5(workspacePath)

Z
zhaoke 已提交
104
	cmd := shellUtils.GetCmd(cmdStr)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
105 106 107

	if cmd == nil {
		msgStr := i118Utils.Sprintf("cmd_empty")
Z
zhaoke 已提交
108
		websocketHelper.SendOutputMsgIfNeed(msgStr, "", iris.Map{"key": key}, wsMsg)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
109

aaronchen2k2k's avatar
aaronchen2k2k 已提交
110 111 112 113 114 115 116
		logUtils.ExecConsolef(color.FgRed, msgStr)
		logUtils.ExecFilef(msgStr)

		err = errors.New(msgStr)
		return
	}

Z
zhaoke 已提交
117
	cmd.Dir = workspacePath
aaronchen2k2k's avatar
aaronchen2k2k 已提交
118 119 120 121
	stdout, err1 := cmd.StdoutPipe()
	stderr, err2 := cmd.StderrPipe()

	if err1 != nil {
Z
zhaoke 已提交
122
		websocketHelper.SendOutputMsgIfNeed(err1.Error(), "", iris.Map{"key": key}, wsMsg)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
123 124 125 126 127
		logUtils.ExecConsolef(color.FgRed, err1.Error())
		logUtils.ExecFilef(err1.Error())

		return
	} else if err2 != nil {
Z
zhaoke 已提交
128
		websocketHelper.SendOutputMsgIfNeed(err2.Error(), "", iris.Map{"key": key}, wsMsg)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
129 130 131 132 133 134 135 136
		logUtils.ExecConsolef(color.FgRed, err2.Error())
		logUtils.ExecFilef(err2.Error())

		return
	}

	cmd.Start()

Z
zhaoke 已提交
137 138 139 140 141 142 143 144 145 146 147
	isTerminal := printStdout(stdout, ch, cmd, key, wsMsg)

	printStderr(isTerminal, stderr, key, wsMsg)

	cmd.Wait()

	return
}

func printStdout(stdout io.ReadCloser, ch chan int, cmd *exec.Cmd, key string, wsMsg *websocket.Message) (isTerminal bool) {
	isTerminal = false
aaronchen2k2k's avatar
aaronchen2k2k 已提交
148
	reader1 := bufio.NewReader(stdout)
Z
zhaoke 已提交
149

aaronchen2k2k's avatar
aaronchen2k2k 已提交
150
	for {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
151
		line, err3 := reader1.ReadString('\n')
aaronchen2k2k's avatar
aaronchen2k2k 已提交
152
		if line != "" {
Z
zhaoke 已提交
153
			line = stringUtils.Convert2Utf8IfNeeded(line)
Z
zhaoke 已提交
154
			websocketHelper.SendOutputMsgIfNeed(line, "", iris.Map{"key": key}, wsMsg)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
155 156 157 158 159 160
			logUtils.ExecConsole(1, line)
			logUtils.ExecFile(line)

			isTerminal = true
		}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
161
		if err3 != nil || io.EOF == err3 {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
162 163 164 165 166
			break
		}

		select {
		case <-ch:
雨爱无痕 已提交
167
			cmd.Process.Kill()
aaronchen2k2k's avatar
aaronchen2k2k 已提交
168
			msg := i118Utils.Sprintf("exit_exec_curr")
m0_58228130's avatar
ztfTest  
m0_58228130 已提交
169

Z
zhaoke 已提交
170
			websocketHelper.SendExecMsgIfNeed(msg, "", commConsts.Run, nil, wsMsg)
m0_58228130's avatar
ztfTest  
m0_58228130 已提交
171

aaronchen2k2k's avatar
aaronchen2k2k 已提交
172 173 174
			logUtils.ExecConsolef(color.FgCyan, msg)
			logUtils.ExecFilef(msg)

Z
zhaoke 已提交
175
			return
aaronchen2k2k's avatar
aaronchen2k2k 已提交
176 177 178 179
		default:
		}
	}

Z
zhaoke 已提交
180 181 182 183
	return
}

func printStderr(isTerminal bool, stderr io.ReadCloser, key string, wsMsg *websocket.Message) {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
184 185 186 187 188 189 190 191 192
	errOutputArr := make([]string, 0)
	if !isTerminal {
		reader2 := bufio.NewReader(stderr)

		for {
			line, err2 := reader2.ReadString('\n')
			if err2 != nil || io.EOF == err2 {
				break
			}
Z
zhaoke 已提交
193
			line = stringUtils.Convert2Utf8IfNeeded(line)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
194 195 196 197 198 199 200
			errOutputArr = append(errOutputArr, line)
		}
	}

	errOutput := strings.Join(errOutputArr, "")

	if errOutput != "" {
Z
zhaoke 已提交
201
		websocketHelper.SendOutputMsgIfNeed(errOutput, "", iris.Map{"key": key}, wsMsg)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
202 203 204 205
		logUtils.ExecConsolef(-1, errOutput)
		logUtils.ExecFilef(errOutput)
	}
}