ztf.go 8.1 KB
Newer Older
aaronchen2k2k's avatar
aaronchen2k2k 已提交
1
package execHelper
aaronchen2k2k's avatar
aaronchen2k2k 已提交
2 3

import (
Z
zhaoke 已提交
4 5 6 7
	"path"
	"strconv"
	"time"

aaronchen2k2k's avatar
aaronchen2k2k 已提交
8 9 10 11 12 13 14
	commConsts "github.com/easysoft/zentaoatf/internal/pkg/consts"
	commDomain "github.com/easysoft/zentaoatf/internal/pkg/domain"
	analysisHelper "github.com/easysoft/zentaoatf/internal/pkg/helper/analysis"
	configHelper "github.com/easysoft/zentaoatf/internal/pkg/helper/config"
	scriptHelper "github.com/easysoft/zentaoatf/internal/pkg/helper/script"
	websocketHelper "github.com/easysoft/zentaoatf/internal/pkg/helper/websocket"
	zentaoHelper "github.com/easysoft/zentaoatf/internal/pkg/helper/zentao"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
15
	serverDomain "github.com/easysoft/zentaoatf/internal/server/modules/v1/domain"
16
	channelUtils "github.com/easysoft/zentaoatf/pkg/lib/channel"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
17 18 19 20 21
	commonUtils "github.com/easysoft/zentaoatf/pkg/lib/common"
	fileUtils "github.com/easysoft/zentaoatf/pkg/lib/file"
	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 已提交
22 23 24 25 26
	"github.com/fatih/color"
	"github.com/kataras/iris/v12/websocket"
	"github.com/mattn/go-runewidth"
)

aaronchen2k2k's avatar
aaronchen2k2k 已提交
27
func ExecCases(ch chan int, testSet serverDomain.TestSet, msg *websocket.Message) (report commDomain.ZtfReport, pathMaxWidth int, err error) {
28 29 30
	return RunZtf(ch, testSet.WorkspacePath, 0, 0, commConsts.Case, testSet.Cases, msg)
}

31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
//func execCmd(cmd string, workspacePath string) (err error) {
//	pth := filepath.Join(workspacePath, ".cmd.tmp")
//	fileUtils.WriteFile(pth, cmd)
//
//	conf := configHelper.LoadByWorkspacePath(workspacePath)
//
//	stdOutput, errOutput := RunFile(pth, workspacePath, conf, nil, nil)
//	if errOutput != "" {
//		logUtils.Infof("failed to exec command '%s' without output %s, err %v.", pth, stdOutput, errOutput)
//	} else {
//		logUtils.Infof("exec command '%s' with output %v.", pth, stdOutput)
//	}
//
//	return
//}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
46

aaronchen2k2k's avatar
aaronchen2k2k 已提交
47
func ExecModule(ch chan int, testSet serverDomain.TestSet, msg *websocket.Message) (
aaronchen2k2k's avatar
aaronchen2k2k 已提交
48 49
	report commDomain.ZtfReport, pathMaxWidth int, err error) {

50
	cases, err := zentaoHelper.GetCasesByModuleInDir(testSet.ProductId, testSet.ModuleId,
aaronchen2k2k's avatar
aaronchen2k2k 已提交
51
		testSet.WorkspacePath, testSet.ScriptDirParamFromCmdLine)
52 53 54
	if err != nil {
		return
	}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
55

aaronchen2k2k's avatar
aaronchen2k2k 已提交
56
	if testSet.Seq != "" {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
57
		cases = analysisHelper.FilterCaseByResult(cases, testSet)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
58 59
	}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
60
	return RunZtf(ch, testSet.WorkspacePath, testSet.ProductId, testSet.ModuleId, commConsts.Module, cases, msg)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
61 62
}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
63
func ExecSuite(ch chan int, testSet serverDomain.TestSet, msg *websocket.Message) (
aaronchen2k2k's avatar
aaronchen2k2k 已提交
64
	report commDomain.ZtfReport, pathMaxWidth int, err error) {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
65
	cases, err := zentaoHelper.GetCasesBySuiteInDir(testSet.ProductId, testSet.SuiteId,
aaronchen2k2k's avatar
aaronchen2k2k 已提交
66
		testSet.WorkspacePath, testSet.ScriptDirParamFromCmdLine)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
67

aaronchen2k2k's avatar
aaronchen2k2k 已提交
68
	if testSet.Seq != "" {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
69
		cases = analysisHelper.FilterCaseByResult(cases, testSet)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
70 71
	}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
72
	return RunZtf(ch, testSet.WorkspacePath,
aaronchen2k2k's avatar
aaronchen2k2k 已提交
73
		testSet.ProductId, testSet.SuiteId, commConsts.Suite, cases, msg)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
74 75
}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
76
func ExecTask(ch chan int, testSet serverDomain.TestSet, msg *websocket.Message) (
aaronchen2k2k's avatar
aaronchen2k2k 已提交
77
	report commDomain.ZtfReport, pathMaxWidth int, err error) {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
78
	cases, err := zentaoHelper.GetCasesByTaskInDir(testSet.ProductId, testSet.TaskId,
aaronchen2k2k's avatar
aaronchen2k2k 已提交
79
		testSet.WorkspacePath, testSet.ScriptDirParamFromCmdLine)
80 81 82
	if err != nil {
		return
	}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
83

aaronchen2k2k's avatar
aaronchen2k2k 已提交
84
	if testSet.Seq != "" {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
85
		cases = analysisHelper.FilterCaseByResult(cases, testSet)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
86 87
	}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
88
	return RunZtf(ch, testSet.WorkspacePath,
aaronchen2k2k's avatar
aaronchen2k2k 已提交
89
		testSet.ProductId, testSet.TaskId, commConsts.Task, cases, msg)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
90 91
}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
92
func RunZtf(ch chan int,
aaronchen2k2k's avatar
aaronchen2k2k 已提交
93
	workspacePath string, productId, id int, by commConsts.ExecBy, cases []string, wsMsg *websocket.Message) (
aaronchen2k2k's avatar
aaronchen2k2k 已提交
94 95
	report commDomain.ZtfReport, pathMaxWidth int, err error) {

aaronchen2k2k's avatar
aaronchen2k2k 已提交
96
	conf := configHelper.LoadByWorkspacePath(workspacePath)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
97

雨爱无痕 已提交
98
	casesToRun, casesToIgnore := FilterCases(cases, &conf)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
99 100

	numbMaxWidth := 0
Z
zhaoke 已提交
101
	numbMaxWidth, pathMaxWidth, titleMaxWidth := getNumbMaxWidth(casesToRun)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
102 103
	report = genReport(productId, id, by)

Z
zhaoke 已提交
104 105 106 107 108 109 110 111 112 113 114
	params := commDomain.ExecParams{
		CasesToRun:    casesToRun,
		CasesToIgnore: casesToIgnore,
		WorkspacePath: workspacePath,
		Conf:          conf,
		NumbMaxWidth:  numbMaxWidth,
		PathMaxWidth:  pathMaxWidth,
		TitleMaxWidth: titleMaxWidth,
		Report:        &report,
	}

115
	// exec scripts
Z
zhaoke 已提交
116
	ExeScripts(params, ch, wsMsg)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
117

118
	// gen report
Z
zhaoke 已提交
119
	if len(casesToRun) > 0 {
雨爱无痕 已提交
120
		GenZTFTestReport(report, pathMaxWidth, workspacePath, ch, wsMsg)
Z
zhaoke 已提交
121
	}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
122

123
	if commConsts.ExecFrom == commConsts.FromClient {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
124
		websocketHelper.SendExecMsg("", "false", commConsts.Run, nil, wsMsg)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
125
	}
雨爱无痕 已提交
126
	if ch != nil {
127 128 129
		if !channelUtils.IsChanClose(ch) {
			close(ch)
		}
雨爱无痕 已提交
130
	}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
131 132 133 134

	return
}

Z
zhaoke 已提交
135
func ExeScripts(execParams commDomain.ExecParams, ch chan int, wsMsg *websocket.Message) {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
136 137 138

	now := time.Now()
	startTime := now.Unix()
Z
zhaoke 已提交
139
	execParams.Report.StartTime = startTime
aaronchen2k2k's avatar
aaronchen2k2k 已提交
140

aaronchen2k2k's avatar
aaronchen2k2k 已提交
141
	workDir := commConsts.WorkDir
142
	if commConsts.ExecFrom == commConsts.FromClient {
Z
zhaoke 已提交
143
		workDir = execParams.WorkspacePath
aaronchen2k2k's avatar
aaronchen2k2k 已提交
144 145
	}

Z
zhaoke 已提交
146 147
	msg := ""
	if commConsts.Language == commConsts.LanguageZh {
Z
zhaoke 已提交
148
		msg = i118Utils.Sprintf("found_scripts", workDir, len(execParams.CasesToRun), commConsts.ZtfDir)
Z
zhaoke 已提交
149 150

	} else {
Z
zhaoke 已提交
151
		msg = i118Utils.Sprintf("found_scripts", len(execParams.CasesToRun), workDir, commConsts.ZtfDir)
Z
zhaoke 已提交
152
	}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
153

154
	if commConsts.ExecFrom == commConsts.FromClient {
Z
zhaoke 已提交
155
		msg = i118Utils.Sprintf("found_scripts_no_ztf_dir", len(execParams.CasesToRun), workDir)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
156
		websocketHelper.SendExecMsg(msg, "", commConsts.Run, nil, wsMsg)
m0_58228130's avatar
ztfTest  
m0_58228130 已提交
157
	}
Z
zhaoke 已提交
158
	logUtils.ExecConsolef(-1, msg)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
159
	logUtils.ExecResult(msg)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
160

Z
zhaoke 已提交
161 162
	if len(execParams.CasesToIgnore) > 0 {
		temp := i118Utils.Sprintf("ignore_scripts", strconv.Itoa(len(execParams.CasesToIgnore)))
163
		if commConsts.ExecFrom == commConsts.FromClient {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
164
			websocketHelper.SendExecMsg(temp, "", commConsts.Run, nil, wsMsg)
m0_58228130's avatar
ztfTest  
m0_58228130 已提交
165 166
		}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
167 168 169 170
		logUtils.ExecConsolef(color.FgCyan, temp)
		logUtils.ExecResult(temp)
	}

Z
zhaoke 已提交
171
	for idx, file := range execParams.CasesToRun {
172 173 174 175
		if fileUtils.IsDir(file) {
			continue
		}

Z
zhaoke 已提交
176 177 178
		execParams.ScriptIdx = idx
		execParams.ScriptFile = file
		ExecScript(execParams, ch, wsMsg)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
179 180 181 182

		select {
		case <-ch:
			msg := i118Utils.Sprintf("exit_exec_all")
183
			if commConsts.ExecFrom == commConsts.FromClient {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
184
				websocketHelper.SendExecMsg(msg, "", commConsts.Run, nil, wsMsg)
m0_58228130's avatar
ztfTest  
m0_58228130 已提交
185
			}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
186

aaronchen2k2k's avatar
aaronchen2k2k 已提交
187 188 189 190 191 192 193 194 195 196
			logUtils.ExecConsolef(color.FgCyan, msg)
			logUtils.ExecFilef(msg)

			goto ExitAllCase
		default:
		}
	}

ExitAllCase:
	endTime := time.Now().Unix()
Z
zhaoke 已提交
197 198
	execParams.Report.EndTime = endTime
	execParams.Report.Duration = endTime - startTime
aaronchen2k2k's avatar
aaronchen2k2k 已提交
199 200
}

雨爱无痕 已提交
201
func FilterCases(cases []string, conf *commDomain.WorkspaceConf) (casesToRun, casesToIgnore []string) {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
202
	for _, cs := range cases {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
203 204 205 206 207 208 209 210 211
		ext := path.Ext(cs)
		if ext != "" {
			ext = ext[1:]
		}
		lang := commConsts.ScriptExtToNameMap[ext]
		if lang == "" {
			continue
		}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
212
		if commonUtils.IsWin() {
Z
zhaoke 已提交
213 214 215
			filterWinCases(cs, lang, conf, &casesToIgnore, &casesToRun)
			continue
		}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
216

Z
zhaoke 已提交
217 218 219 220 221 222 223 224 225 226 227 228 229
		if path.Ext(cs) == ".bat" {
			continue
		}
		casesToRun = append(casesToRun, cs)
	}

	return
}

func filterWinCases(cs, lang string, conf *commDomain.WorkspaceConf, casesToIgnore, casesToRun *[]string) {
	if path.Ext(cs) == ".sh" { // filter by os
		return
	}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
230

Z
zhaoke 已提交
231 232 233 234 235 236 237 238 239 240
	interpreter := configHelper.GetFieldVal(*conf, stringUtils.UcFirst(lang))

	if interpreter == "-" || interpreter == "" {
		interpreter = ""
		if lang != "bat" {
			ok := AddInterpreterIfExist(conf, lang)
			if !ok {
				*casesToIgnore = append(*casesToIgnore, cs)
			} else {
				interpreter = configHelper.GetFieldVal(*conf, stringUtils.UcFirst(lang))
aaronchen2k2k's avatar
aaronchen2k2k 已提交
241 242
			}
		}
Z
zhaoke 已提交
243
	}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
244

Z
zhaoke 已提交
245 246
	if lang != "bat" && interpreter == "" { // ignore the ones with no interpreter set
		return
aaronchen2k2k's avatar
aaronchen2k2k 已提交
247 248
	}

Z
zhaoke 已提交
249
	*casesToRun = append(*casesToRun, cs)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
250 251 252 253 254 255 256 257
}

func genReport(productId, id int, by commConsts.ExecBy) (report commDomain.ZtfReport) {
	report = commDomain.ZtfReport{
		TestEnv: commonUtils.GetOs(), ExecBy: by, ExecById: id, ProductId: productId,
		Pass: 0, Fail: 0, Total: 0, FuncResult: make([]commDomain.FuncResult, 0)}

	report.TestType = commConsts.TestFunc
258
	report.TestTool = commConsts.AppServer
aaronchen2k2k's avatar
aaronchen2k2k 已提交
259 260 261 262

	return
}

Z
zhaoke 已提交
263
func getNumbMaxWidth(casesToRun []string) (numbMaxWidth, pathMaxWidth, titleMaxWidth int) {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
264 265 266 267 268 269 270
	for _, cs := range casesToRun {
		lent := runewidth.StringWidth(cs)
		if lent > pathMaxWidth {
			pathMaxWidth = lent
		}

		content := fileUtils.ReadFile(cs)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
271
		caseId := scriptHelper.ReadCaseId(content)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
272 273 274
		if len(caseId) > numbMaxWidth {
			numbMaxWidth = len(caseId)
		}
Z
zhaoke 已提交
275 276 277 278 279 280

		_, _, _, title, _ := scriptHelper.GetCaseInfo(cs)
		titleLength := runewidth.StringWidth(title)
		if titleLength > titleMaxWidth {
			titleMaxWidth = titleLength
		}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
281 282 283 284
	}

	return
}