Skip to content

Commit 53323c8

Browse files
authored
Split failing and passing tests in the summary. (CP of #7835) (#7764)
1 parent 3e81626 commit 53323c8

3 files changed

Lines changed: 24 additions & 17 deletions

File tree

toolkit/tools/scheduler/schedulerutils/buildworker.go

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ type BuildResult struct {
5151
Err error // Error encountered during the build.
5252
LogFile string // Path to the log file from the build.
5353
Node *pkggraph.PkgNode // The main node being analyzed for the build.
54+
CheckFailed bool // Indicator if the package test failed but the build itself was correct.
5455
Ignored bool // Indicator if the build was ignored by user request.
5556
UsedCache bool // Indicator if we used the cached artifacts (external or earlier local build) instead of building the node.
5657
WasDelta bool // Indicator if we used a pre-built component from an external repository instead of building the node.
@@ -120,7 +121,7 @@ func BuildNodeWorker(channels *BuildChannels, agent buildagents.BuildAgent, grap
120121
}
121122

122123
case pkggraph.TypeTest:
123-
res.Ignored, res.LogFile, res.Err = testNode(req, graphMutex, agent, checkAttempts, ignoredTests)
124+
res.CheckFailed, res.Ignored, res.LogFile, res.Err = testNode(req, graphMutex, agent, checkAttempts, ignoredTests)
124125
if res.Err == nil {
125126
setAncillaryBuildNodesStatus(req, graphMutex, pkggraph.StateUpToDate)
126127
} else {
@@ -175,7 +176,7 @@ func buildNode(request *BuildRequest, graphMutex *sync.RWMutex, agent buildagent
175176
}
176177

177178
// testNode tests a TypeTest node.
178-
func testNode(request *BuildRequest, graphMutex *sync.RWMutex, agent buildagents.BuildAgent, checkAttempts int, ignoredTests []*pkgjson.PackageVer) (ignored bool, logFile string, err error) {
179+
func testNode(request *BuildRequest, graphMutex *sync.RWMutex, agent buildagents.BuildAgent, checkAttempts int, ignoredTests []*pkgjson.PackageVer) (checkFailed, ignored bool, logFile string, err error) {
179180
node := request.Node
180181
baseSrpmName := node.SRPMFileName()
181182

@@ -200,7 +201,7 @@ func testNode(request *BuildRequest, graphMutex *sync.RWMutex, agent buildagents
200201
dependencies := getBuildDependencies(node, request.PkgGraph, graphMutex)
201202

202203
logger.Log.Infof("Testing: %s", baseSrpmName)
203-
logFile, err = testSRPMFile(agent, checkAttempts, basePackageName, node.SrpmPath, node.Architecture, dependencies)
204+
logFile, checkFailed, err = testSRPMFile(agent, checkAttempts, basePackageName, node.SrpmPath, node.Architecture, dependencies)
204205
return
205206
}
206207

@@ -239,7 +240,7 @@ func getBuildDependencies(node *pkggraph.PkgNode, pkgGraph *pkggraph.PkgGraph, g
239240
}
240241

241242
// parseCheckSection reads the package build log file to determine if the %check section passed or not
242-
func parseCheckSection(logFile string) (err error) {
243+
func parseCheckSection(logFile string) (checkFailed bool, err error) {
243244
logFileObject, err := os.Open(logFile)
244245
// If we can't open the log file, that's a build error.
245246
if err != nil {
@@ -261,7 +262,7 @@ func parseCheckSection(logFile string) (err error) {
261262
logger.Log.Errorf("Log file copy failed. Error: %v", err)
262263
return
263264
}
264-
err = fmt.Errorf("package test failed. Test status line: %s", currLine)
265+
checkFailed = true
265266
return
266267
}
267268
}
@@ -285,14 +286,14 @@ func buildSRPMFile(agent buildagents.BuildAgent, buildAttempts int, basePackageN
285286
}
286287

287288
// testSRPMFile sends an SRPM to a build agent to test.
288-
func testSRPMFile(agent buildagents.BuildAgent, checkAttempts int, basePackageName string, srpmFile string, outArch string, dependencies []string) (logFile string, err error) {
289+
// The 'checkFailed' flag says if the package test failed as opposed
290+
// to the build failing for another reason, which is reflected by a non-nil 'err'.
291+
func testSRPMFile(agent buildagents.BuildAgent, checkAttempts int, basePackageName string, srpmFile string, outArch string, dependencies []string) (logFile string, checkFailed bool, err error) {
289292
const (
290293
retryDuration = time.Second
291294
runCheck = true
292295
)
293296

294-
// checkFailed is a flag to see if a non-null buildErr is from the %check section
295-
checkFailed := false
296297
logBaseName := filepath.Base(srpmFile) + ".test.log"
297298
err = retry.Run(func() (buildErr error) {
298299
checkFailed = false
@@ -303,13 +304,16 @@ func testSRPMFile(agent buildagents.BuildAgent, checkAttempts int, basePackageNa
303304
return
304305
}
305306

306-
buildErr = parseCheckSection(logFile)
307-
checkFailed = (buildErr != nil)
307+
checkFailed, buildErr = parseCheckSection(logFile)
308+
// If the build succeeded but tests failed, we still want to retry.
309+
if buildErr == nil && checkFailed {
310+
buildErr = fmt.Errorf("package test for '%s' failed", basePackageName)
311+
}
308312
return
309313
}, checkAttempts, retryDuration)
310314

311-
if err != nil && checkFailed {
312-
logger.Log.Warnf("Tests failed for '%s'. Error: %s", srpmFile, err)
315+
if checkFailed {
316+
logger.Log.Debugf("Tests failed for '%s' after %d retries.", basePackageName, checkAttempts)
313317
err = nil
314318
}
315319
return

toolkit/tools/scheduler/schedulerutils/graphbuildstate.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,8 @@ func (g *GraphBuildState) RecordBuildResult(res *BuildResult, allowToolchainRebu
194194

195195
delete(g.activeBuilds, res.Node.ID())
196196

197-
if res.Err != nil {
197+
failure := (res.Err != nil) || res.CheckFailed
198+
if failure {
198199
g.failures = append(g.failures, res)
199200
}
200201

@@ -208,7 +209,7 @@ func (g *GraphBuildState) RecordBuildResult(res *BuildResult, allowToolchainRebu
208209
}
209210

210211
state := &nodeState{
211-
available: res.Err == nil,
212+
available: !failure,
212213
cached: res.UsedCache,
213214
usedDelta: res.WasDelta,
214215
freshness: freshness,

toolkit/tools/scheduler/schedulerutils/printresults.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ func PrintBuildResult(res *BuildResult) {
4141
logger.Log.Warnf("Ignored test for '%s' per user request.", baseSRPMName)
4242
} else if res.UsedCache {
4343
logger.Log.Infof("Skipped test: %s", baseSRPMName)
44+
} else if res.CheckFailed {
45+
logger.Log.Warnf("Failed test: %s", baseSRPMName)
4446
} else {
4547
logger.Log.Infof("Tested: %s", baseSRPMName)
4648
}
@@ -145,7 +147,7 @@ func PrintBuildSummary(pkgGraph *pkggraph.PkgGraph, graphMutex *sync.RWMutex, bu
145147
}
146148

147149
if len(testedSRPMs) != 0 {
148-
logger.Log.Info(color.GreenString("Tested SRPMs:"))
150+
logger.Log.Info(color.GreenString("Passed SRPMs tests:"))
149151
keys := mapToSortedSlice(testedSRPMs)
150152
for _, testedSRPM := range keys {
151153
logger.Log.Infof("--> %s", filepath.Base(testedSRPM))
@@ -206,7 +208,7 @@ func PrintBuildSummary(pkgGraph *pkggraph.PkgGraph, graphMutex *sync.RWMutex, bu
206208
keys := mapToSortedSlice(failedSRPMsTests)
207209
for _, key := range keys {
208210
failure := failedSRPMsTests[key]
209-
logger.Log.Infof("--> %s , error: %s, for details see: %s", failure.Node.SRPMFileName(), failure.Err, failure.LogFile)
211+
logger.Log.Infof("--> %s , for details see: %s", failure.Node.SRPMFileName(), failure.LogFile)
210212
}
211213
}
212214

@@ -344,7 +346,7 @@ func printSummary(failedSRPMs, failedSRPMsTests map[string]*BuildResult, prebuil
344346
logger.Log.Infof(color.GreenString(summaryLine("Number of prebuilt delta SRPMs:", len(prebuiltDeltaSRPMs))))
345347
logger.Log.Infof(color.GreenString(summaryLine("Number of skipped SRPMs tests:", len(skippedSRPMsTests))))
346348
logger.Log.Infof(color.GreenString(summaryLine("Number of built SRPMs:", len(builtSRPMs))))
347-
logger.Log.Infof(color.GreenString(summaryLine("Number of tested SRPMs:", len(testedSRPMs))))
349+
logger.Log.Infof(color.GreenString(summaryLine("Number of passed SRPMs tests:", len(testedSRPMs))))
348350
printErrorInfoByCondition(len(unresolvedDependencies) > 0, summaryLine("Number of unresolved dependencies:", len(unresolvedDependencies)))
349351
printErrorInfoByCondition(len(blockedSRPMs) > 0, summaryLine("Number of blocked SRPMs:", len(blockedSRPMs)))
350352
printErrorInfoByCondition(len(blockedSRPMsTests) > 0, summaryLine("Number of blocked SRPMs tests:", len(blockedSRPMsTests)))

0 commit comments

Comments
 (0)