in plugins/reporters/targetsuccess/targetsuccess.go [76:125]
func (ts *TargetSuccessReporter) RunReport(ctx xcontext.Context, parameters interface{}, runStatus *job.RunStatus, ev testevent.Fetcher) (bool, interface{}, error) {
var (
success, fail uint64
testReports []string
)
runSuccess := true
reportParameters, ok := parameters.(RunParameters)
if !ok {
return false, nil, fmt.Errorf("report parameters should be of type TargetSuccessParameters")
}
// Flag the run as successful only if all Tests within the Run where successful
for _, t := range runStatus.TestStatuses {
fail = 0
success = 0
for _, t := range t.TargetStatuses {
if t.Error != "" {
fail++
} else {
success++
}
}
if success+fail == 0 {
return false, nil, fmt.Errorf("overall count of success and failures is zero for test %s", t.TestCoordinates.TestName)
}
cmpExpr, err := comparison.ParseExpression(reportParameters.SuccessExpression)
if err != nil {
return false, nil, fmt.Errorf("error while calculating run report for test %s: %v", t.TestCoordinates.TestName, err)
}
res, err := cmpExpr.EvaluateSuccess(success, success+fail)
if err != nil {
return false, nil, fmt.Errorf("error while calculating run report for test %s: %v", t.TestCoordinates.TestName, err)
}
if !res.Pass {
testReports = append(testReports, fmt.Sprintf("Test %s does not pass success criteria: %s", t.TestCoordinates.TestName, res.Expr))
runSuccess = false
} else {
testReports = append(testReports, fmt.Sprintf("Test %s passes success criteria: %s", t.TestCoordinates.TestName, res.Expr))
}
}
return runSuccess, testReports, nil
}