unit.go 5.2 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 13
	fileUtils "github.com/easysoft/zentaoatf/pkg/lib/file"

aaronchen2k2k's avatar
aaronchen2k2k 已提交
14 15 16 17
	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 已提交
18
	serverDomain "github.com/easysoft/zentaoatf/internal/server/modules/v1/domain"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
19 20 21 22 23
	commonUtils "github.com/easysoft/zentaoatf/pkg/lib/common"
	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,
aaronchen2k2k's avatar
aaronchen2k2k 已提交
30
	req serverDomain.TestSet, wsMsg *websocket.Message) (resultDir string, err error) {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
31

aaronchen2k2k's avatar
aaronchen2k2k 已提交
32 33
	key := stringUtils.Md5(req.WorkspacePath)

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

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

aaronchen2k2k's avatar
aaronchen2k2k 已提交
53
	// run
aaronchen2k2k's avatar
aaronchen2k2k 已提交
54
	RunUnitTest(ch, req.Cmd, req.WorkspacePath, wsMsg)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
55

aaronchen2k2k's avatar
aaronchen2k2k 已提交
56
	// end msg
aaronchen2k2k's avatar
aaronchen2k2k 已提交
57 58
	entTime := time.Now()
	endMsg := i118Utils.Sprintf("end_execution", req.Cmd, dateUtils.DateTimeStr(entTime))
aaronchen2k2k's avatar
aaronchen2k2k 已提交
59 60
	logUtils.ExecConsolef(-1, endMsg)
	logUtils.ExecFilef(endMsg)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
61
	if commConsts.ExecFrom != commConsts.FromCmd {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
62 63
		websocketHelper.SendExecMsg(endMsg, "", commConsts.Run,
			iris.Map{"key": key, "status": "end"}, wsMsg)
m0_58228130's avatar
ztfTest  
m0_58228130 已提交
64 65
	}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
66
	// gen report
aaronchen2k2k's avatar
aaronchen2k2k 已提交
67
	report := GenUnitTestReport(req, startTime.Unix(), entTime.Unix(), ch, wsMsg)
68

aaronchen2k2k's avatar
aaronchen2k2k 已提交
69
	// submit result
aaronchen2k2k's avatar
aaronchen2k2k 已提交
70
	if req.SubmitResult && (report.FuncResult != nil || report.UnitResult != nil) {
71 72 73 74 75
		configDir := req.WorkspacePath
		if commConsts.ExecFrom == commConsts.FromCmd {
			configDir = commConsts.ZtfDir
		}

76 77
		//logUtils.Info("configDir=" + configDir)

78
		config := configHelper.LoadByWorkspacePath(configDir)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
79 80
		//text, _ := json.Marshal(report)
		//logUtils.Info(string(text))
aaronchen2k2k's avatar
aaronchen2k2k 已提交
81 82 83 84
		err = zentaoHelper.CommitResult(report, req.ProductId, 0, config, wsMsg)
	}

	if commConsts.ExecFrom != commConsts.FromCmd {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
85
		websocketHelper.SendExecMsg("", "false", commConsts.Run, nil, wsMsg)
86
	}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
87 88 89 90

	return
}

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

aaronchen2k2k's avatar
aaronchen2k2k 已提交
94 95
	var cmd *exec.Cmd
	if commonUtils.IsWin() {
雨爱无痕 已提交
96
		cmd = exec.Command("cmd", "/C", cmdStr)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
97
	} else {
雨爱无痕 已提交
98
		cmd = exec.Command("/bin/bash", "-c", cmdStr)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
99
	}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
100

aaronchen2k2k's avatar
aaronchen2k2k 已提交
101
	cmd.Dir = workspacePath
aaronchen2k2k's avatar
aaronchen2k2k 已提交
102 103 104

	if cmd == nil {
		msgStr := i118Utils.Sprintf("cmd_empty")
aaronchen2k2k's avatar
aaronchen2k2k 已提交
105
		if commConsts.ExecFrom != commConsts.FromCmd {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
106
			websocketHelper.SendOutputMsg(msgStr, "", iris.Map{"key": key}, wsMsg)
m0_58228130's avatar
m0_58228130 已提交
107
		}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
108

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

		err = errors.New(msgStr)
		return
	}

	stdout, err1 := cmd.StdoutPipe()
	stderr, err2 := cmd.StderrPipe()

	if err1 != nil {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
120
		if commConsts.ExecFrom != commConsts.FromCmd {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
121
			websocketHelper.SendOutputMsg(err1.Error(), "", iris.Map{"key": key}, wsMsg)
m0_58228130's avatar
m0_58228130 已提交
122
		}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
123 124 125 126 127
		logUtils.ExecConsolef(color.FgRed, err1.Error())
		logUtils.ExecFilef(err1.Error())

		return
	} else if err2 != nil {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
128
		if commConsts.ExecFrom != commConsts.FromCmd {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
129
			websocketHelper.SendOutputMsg(err2.Error(), "", iris.Map{"key": key}, wsMsg)
m0_58228130's avatar
m0_58228130 已提交
130
		}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
131 132 133 134 135 136 137 138 139 140 141
		logUtils.ExecConsolef(color.FgRed, err2.Error())
		logUtils.ExecFilef(err2.Error())

		return
	}

	cmd.Start()

	isTerminal := false
	reader1 := bufio.NewReader(stdout)
	for {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
142
		line, err3 := reader1.ReadString('\n')
aaronchen2k2k's avatar
aaronchen2k2k 已提交
143
		if line != "" {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
144
			if commConsts.ExecFrom != commConsts.FromCmd {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
145
				websocketHelper.SendOutputMsg(line, "", iris.Map{"key": key}, wsMsg)
m0_58228130's avatar
m0_58228130 已提交
146
			}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
147 148 149 150 151 152
			logUtils.ExecConsole(1, line)
			logUtils.ExecFile(line)

			isTerminal = true
		}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
153
		if err3 != nil || io.EOF == err3 {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
154 155 156 157 158
			break
		}

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

aaronchen2k2k's avatar
aaronchen2k2k 已提交
162
			if commConsts.ExecFrom != commConsts.FromCmd {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
163
				websocketHelper.SendExecMsg(msg, "", commConsts.Run, nil, wsMsg)
m0_58228130's avatar
ztfTest  
m0_58228130 已提交
164 165
			}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190
			logUtils.ExecConsolef(color.FgCyan, msg)
			logUtils.ExecFilef(msg)

			goto ExitUnitTest
		default:
		}
	}

ExitUnitTest:
	errOutputArr := make([]string, 0)
	if !isTerminal {
		reader2 := bufio.NewReader(stderr)

		for {
			line, err2 := reader2.ReadString('\n')
			if err2 != nil || io.EOF == err2 {
				break
			}
			errOutputArr = append(errOutputArr, line)
		}
	}

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

	if errOutput != "" {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
191
		if commConsts.ExecFrom != commConsts.FromCmd {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
192
			websocketHelper.SendOutputMsg(errOutput, "", iris.Map{"key": key}, wsMsg)
m0_58228130's avatar
m0_58228130 已提交
193
		}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
194 195 196 197
		logUtils.ExecConsolef(-1, errOutput)
		logUtils.ExecFilef(errOutput)
	}

Z
zhaoke 已提交
198 199
	cmd.Wait()

aaronchen2k2k's avatar
aaronchen2k2k 已提交
200 201
	return
}