ztf.go 6.8 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"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
16 17 18 19 20
	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 已提交
21 22 23 24 25
	"github.com/fatih/color"
	"github.com/kataras/iris/v12/websocket"
	"github.com/mattn/go-runewidth"
)

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

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

34
	cases, err := zentaoHelper.GetCasesByModuleInDir(testSet.ProductId, testSet.ModuleId,
aaronchen2k2k's avatar
aaronchen2k2k 已提交
35
		testSet.WorkspacePath, testSet.ScriptDirParamFromCmdLine)
36 37 38
	if err != nil {
		return
	}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
39

aaronchen2k2k's avatar
aaronchen2k2k 已提交
40
	if testSet.Seq != "" {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
41
		cases = analysisHelper.FilterCaseByResult(cases, testSet)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
42 43
	}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
44
	return RunZtf(ch, testSet.WorkspacePath, testSet.ProductId, testSet.ModuleId, commConsts.Module, cases, msg)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
45 46
}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
47
func ExecSuite(ch chan int, testSet serverDomain.TestSet, msg *websocket.Message) (
aaronchen2k2k's avatar
aaronchen2k2k 已提交
48
	report commDomain.ZtfReport, pathMaxWidth int, err error) {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
49
	cases, err := zentaoHelper.GetCasesBySuiteInDir(testSet.ProductId, testSet.SuiteId,
aaronchen2k2k's avatar
aaronchen2k2k 已提交
50
		testSet.WorkspacePath, testSet.ScriptDirParamFromCmdLine)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
51

aaronchen2k2k's avatar
aaronchen2k2k 已提交
52
	if testSet.Seq != "" {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
53
		cases = analysisHelper.FilterCaseByResult(cases, testSet)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
54 55
	}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
56
	return RunZtf(ch, testSet.WorkspacePath,
aaronchen2k2k's avatar
aaronchen2k2k 已提交
57
		testSet.ProductId, testSet.SuiteId, commConsts.Suite, cases, msg)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
58 59
}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
60
func ExecTask(ch chan int, testSet serverDomain.TestSet, msg *websocket.Message) (
aaronchen2k2k's avatar
aaronchen2k2k 已提交
61
	report commDomain.ZtfReport, pathMaxWidth int, err error) {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
62
	cases, err := zentaoHelper.GetCasesByTaskInDir(testSet.ProductId, testSet.TaskId,
aaronchen2k2k's avatar
aaronchen2k2k 已提交
63
		testSet.WorkspacePath, testSet.ScriptDirParamFromCmdLine)
64 65 66
	if err != nil {
		return
	}
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.TaskId, commConsts.Task, cases, msg)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
74 75
}

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

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

m0_58228130's avatar
m0_58228130 已提交
82
	casesToRun, casesToIgnore := FilterCases(cases, conf)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
83 84 85 86 87

	numbMaxWidth := 0
	numbMaxWidth, pathMaxWidth = getNumbMaxWidth(casesToRun)
	report = genReport(productId, id, by)

aaronchen2k2k's avatar
aaronchen2k2k 已提交
88
	// run
aaronchen2k2k's avatar
aaronchen2k2k 已提交
89
	ExeScripts(casesToRun, casesToIgnore, workspacePath, conf, &report, pathMaxWidth, numbMaxWidth, ch, wsMsg)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
90

Z
zhaoke 已提交
91 92
	if len(casesToRun) > 0 {
		// gen report
雨爱无痕 已提交
93
		GenZTFTestReport(report, pathMaxWidth, workspacePath, ch, wsMsg)
Z
zhaoke 已提交
94
	}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
95

aaronchen2k2k's avatar
aaronchen2k2k 已提交
96
	if commConsts.ExecFrom != commConsts.FromCmd {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
97
		websocketHelper.SendExecMsg("", "false", commConsts.Run, nil, wsMsg)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
98
	}
雨爱无痕 已提交
99 100 101
	if ch != nil {
		close(ch)
	}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
102 103 104 105

	return
}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
106
func ExeScripts(casesToRun []string, casesToIgnore []string, workspacePath string, conf commDomain.WorkspaceConf,
aaronchen2k2k's avatar
aaronchen2k2k 已提交
107
	report *commDomain.ZtfReport, pathMaxWidth int, numbMaxWidth int,
aaronchen2k2k's avatar
aaronchen2k2k 已提交
108
	ch chan int, wsMsg *websocket.Message) {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
109 110 111 112 113

	now := time.Now()
	startTime := now.Unix()
	report.StartTime = startTime

aaronchen2k2k's avatar
aaronchen2k2k 已提交
114 115 116 117 118
	workDir := commConsts.WorkDir
	if commConsts.ExecFrom != commConsts.FromCmd {
		workDir = workspacePath
	}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
119
	msg := i118Utils.Sprintf("found_scripts", len(casesToRun), workDir, commConsts.ZtfDir)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
120

aaronchen2k2k's avatar
aaronchen2k2k 已提交
121
	if commConsts.ExecFrom != commConsts.FromCmd {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
122
		msg = i118Utils.Sprintf("found_scripts_no_ztf_dir", len(casesToRun), workDir)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
123
		websocketHelper.SendExecMsg(msg, "", commConsts.Run, nil, wsMsg)
m0_58228130's avatar
ztfTest  
m0_58228130 已提交
124
	}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
125 126
	logUtils.ExecConsolef(color.FgCyan, msg)
	logUtils.ExecResult(msg)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
127 128

	if len(casesToIgnore) > 0 {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
129
		temp := i118Utils.Sprintf("ignore_scripts", strconv.Itoa(len(casesToIgnore)))
aaronchen2k2k's avatar
aaronchen2k2k 已提交
130
		if commConsts.ExecFrom != commConsts.FromCmd {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
131
			websocketHelper.SendExecMsg(temp, "", commConsts.Run, nil, wsMsg)
m0_58228130's avatar
ztfTest  
m0_58228130 已提交
132 133
		}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
134 135 136 137 138
		logUtils.ExecConsolef(color.FgCyan, temp)
		logUtils.ExecResult(temp)
	}

	for idx, file := range casesToRun {
139 140 141 142
		if fileUtils.IsDir(file) {
			continue
		}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
143
		ExecScript(file, workspacePath, conf, report, idx, len(casesToRun), pathMaxWidth, numbMaxWidth, ch, wsMsg)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
144 145 146 147

		select {
		case <-ch:
			msg := i118Utils.Sprintf("exit_exec_all")
aaronchen2k2k's avatar
aaronchen2k2k 已提交
148
			if commConsts.ExecFrom != commConsts.FromCmd {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
149
				websocketHelper.SendExecMsg(msg, "", commConsts.Run, nil, wsMsg)
m0_58228130's avatar
ztfTest  
m0_58228130 已提交
150
			}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
151

aaronchen2k2k's avatar
aaronchen2k2k 已提交
152 153 154 155 156 157 158 159 160 161 162 163 164 165
			logUtils.ExecConsolef(color.FgCyan, msg)
			logUtils.ExecFilef(msg)

			goto ExitAllCase
		default:
		}
	}

ExitAllCase:
	endTime := time.Now().Unix()
	report.EndTime = endTime
	report.Duration = endTime - startTime
}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
166
func FilterCases(cases []string, conf commDomain.WorkspaceConf) (casesToRun, casesToIgnore []string) {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
167
	for _, cs := range cases {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
168 169 170 171 172 173 174 175 176
		ext := path.Ext(cs)
		if ext != "" {
			ext = ext[1:]
		}
		lang := commConsts.ScriptExtToNameMap[ext]
		if lang == "" {
			continue
		}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
177 178 179 180 181
		if commonUtils.IsWin() {
			if path.Ext(cs) == ".sh" { // filter by os
				continue
			}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
182
			interpreter := configHelper.GetFieldVal(conf, stringUtils.UcFirst(lang))
aaronchen2k2k's avatar
aaronchen2k2k 已提交
183 184
			if interpreter == "-" || interpreter == "" {
				interpreter = ""
Z
zhaoke 已提交
185 186 187
				if lang != "bat" {
					casesToIgnore = append(casesToIgnore, cs)
				}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
188 189 190 191 192
			}
			if lang != "bat" && interpreter == "" { // ignore the ones with no interpreter set
				continue
			}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
193
		} else { // filter by os
aaronchen2k2k's avatar
aaronchen2k2k 已提交
194 195 196 197 198
			if path.Ext(cs) == ".bat" {
				continue
			}
		}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
199 200
		//pass := scriptHelper.CheckFileIsScript(cs)
		//if pass {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
201
		casesToRun = append(casesToRun, cs)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
202
		//}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
203 204 205 206 207 208 209 210 211 212 213
	}

	return
}

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
214
	report.TestTool = commConsts.AppServer
aaronchen2k2k's avatar
aaronchen2k2k 已提交
215 216 217 218 219 220 221 222 223 224 225 226

	return
}

func getNumbMaxWidth(casesToRun []string) (numbMaxWidth, pathMaxWidth int) {
	for _, cs := range casesToRun {
		lent := runewidth.StringWidth(cs)
		if lent > pathMaxWidth {
			pathMaxWidth = lent
		}

		content := fileUtils.ReadFile(cs)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
227
		caseId := scriptHelper.ReadCaseId(content)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
228 229 230 231 232 233 234
		if len(caseId) > numbMaxWidth {
			numbMaxWidth = len(caseId)
		}
	}

	return
}