func()

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
}