Skip to content

Commit 0e2ce69

Browse files
committed
update feedback
1 parent 4e18fe0 commit 0e2ce69

File tree

2 files changed

+22
-41
lines changed

2 files changed

+22
-41
lines changed

scalalib/src/mill/scalalib/TestModuleUtil.scala

+3-8
Original file line numberDiff line numberDiff line change
@@ -272,7 +272,8 @@ private final class TestModuleUtil(
272272
Right((startingTestClass, testClassQueueFolder, claimFolder))
273273
)
274274
workerStatusMap.remove(claimLog)
275-
// We don't remove workerStatsSet entry, as we still need them for calculation
275+
// We don't remove workerStatsSet entry, as we still need them
276+
// for calculation of total success/failure counts
276277
Some(result)
277278
} else {
278279
None
@@ -407,13 +408,7 @@ private final class TestModuleUtil(
407408
}) Thread.sleep(1)
408409
}
409410
subprocessFutures.flatMap(_.value).map(_.get)
410-
} finally {
411-
executor.shutdown()
412-
// help gc
413-
workerStatusMap.clear()
414-
workerStatsSet.clear()
415-
testClassTimeMap.clear()
416-
}
411+
} finally executor.shutdown()
417412

418413
val subprocessResult = {
419414
val failMap = mutable.Map.empty[String, String]

testrunner/src/mill/testrunner/TestRunnerUtils.scala

+19-33
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ import java.util.zip.ZipInputStream
1313
import scala.collection.mutable
1414
import scala.jdk.CollectionConverters.IteratorHasAsScala
1515
import java.io.PrintStream
16-
import java.util.concurrent.atomic.LongAdder
1716
import java.util.concurrent.atomic.AtomicBoolean
1817

1918
@internal object TestRunnerUtils {
@@ -138,18 +137,21 @@ import java.util.concurrent.atomic.AtomicBoolean
138137
tasks: Seq[Task],
139138
testReporter: TestReporter,
140139
events: ConcurrentLinkedQueue[Event],
141-
systemOut: PrintStream,
142-
claimStatsFileOpt: Option[os.Path]
143-
): Unit = {
144-
val testEventSummary = new TestEventSummary(claimStatsFileOpt)
140+
systemOut: PrintStream
141+
): Boolean = {
142+
val taskStatus = new AtomicBoolean(true)
145143
val taskQueue = tasks.to(mutable.Queue)
146144
while (taskQueue.nonEmpty) {
147145
val next = taskQueue.dequeue().execute(
148146
new EventHandler {
149147
def handle(event: Event) = {
150148
testReporter.logStart(event)
151149
events.add(event)
152-
testEventSummary.record(event)
150+
event.status match {
151+
case Status.Error => taskStatus.set(false)
152+
case Status.Failure => taskStatus.set(false)
153+
case _ => taskStatus.compareAndSet(true, true) // consider success as a default
154+
}
153155
testReporter.logFinish(event)
154156
}
155157
},
@@ -165,8 +167,7 @@ import java.util.concurrent.atomic.AtomicBoolean
165167

166168
taskQueue.enqueueAll(next)
167169
}
168-
testEventSummary.summary()
169-
()
170+
taskStatus.get()
170171
}
171172

172173
def parseRunTaskResults(events: Iterator[Event]): Iterator[TestResult] = {
@@ -217,7 +218,7 @@ import java.util.concurrent.atomic.AtomicBoolean
217218
// isn't affected by a test framework's stream redirects
218219
val systemOut = System.out
219220
val events = new ConcurrentLinkedQueue[Event]()
220-
executeTasks(tasks, testReporter, events, systemOut, None)
221+
executeTasks(tasks, testReporter, events, systemOut)
221222
handleRunnerDone(runner, events)
222223
}
223224

@@ -254,7 +255,9 @@ import java.util.concurrent.atomic.AtomicBoolean
254255
val globSelectorCache = testClasses.view
255256
.map { case (cls, fingerprint) => cls.getName.stripSuffix("$") -> (cls, fingerprint) }
256257
.toMap
257-
258+
var successCounter = 0L
259+
var failureCounter = 0L
260+
258261
def runClaimedTestClass(testClassName: String) = {
259262

260263
System.err.println(s"Running Test Class $testClassName")
@@ -266,7 +269,9 @@ import java.util.concurrent.atomic.AtomicBoolean
266269
}
267270

268271
val tasks = runner.tasks(taskDefs.toArray)
269-
executeTasks(tasks, testReporter, events, systemOut, Some(claimFolder / os.up / s"${claimFolder.last}.stats"))
272+
val taskStatus = executeTasks(tasks, testReporter, events, systemOut)
273+
if taskStatus then successCounter += 1 else failureCounter += 1
274+
os.write.over(claimFolder / os.up / s"${claimFolder.last}.stats", upickle.default.write((successCounter, failureCounter)))
270275
}
271276

272277
startingTestClass.foreach { testClass =>
@@ -277,6 +282,7 @@ import java.util.concurrent.atomic.AtomicBoolean
277282
for (file <- os.list(testClassQueueFolder)) {
278283
for (claimedTestClass <- claimFile(file, claimFolder)) runClaimedTestClass(claimedTestClass)
279284
}
285+
280286
handleRunnerDone(runner, events)
281287
}
282288

@@ -287,8 +293,8 @@ import java.util.concurrent.atomic.AtomicBoolean
287293
) {
288294
// append only log, used to communicate with parent about what test is being claimed
289295
// so that the parent can log the claimed test's name to its logger
290-
val queueLog = claimFolder / os.up / s"${claimFolder.last}.log"
291-
os.write.append(queueLog, s"${file.last}\n")
296+
val claimLog = claimFolder / os.up / s"${claimFolder.last}.log"
297+
os.write.append(claimLog, s"${file.last}\n")
292298
file.last
293299
}
294300
}
@@ -356,24 +362,4 @@ import java.util.concurrent.atomic.AtomicBoolean
356362
filters.exists(f => f(name))
357363
}
358364
}
359-
360-
@internal private[TestRunnerUtils] final class TestEventSummary(outputFileOpt: Option[os.Path]) extends AtomicBoolean(true) {
361-
def record(event: Event): Unit = {
362-
event.status() match {
363-
case Status.Error => set(false)
364-
case Status.Failure => set(false)
365-
case _ => val _ = compareAndSet(true, true) // consider success as a default
366-
}
367-
}
368-
369-
def summary(): Boolean = {
370-
val isSuccess = get()
371-
outputFileOpt.foreach { outputFile =>
372-
val (success, failure) = upickle.default.read[(Long, Long)](os.read.stream(outputFile))
373-
val (newSuccess, newFailure) = if (isSuccess) (success + 1, failure) else (success, failure + 1)
374-
os.write.over(outputFile, upickle.default.write((newSuccess, newFailure)))
375-
}
376-
isSuccess
377-
}
378-
}
379365
}

0 commit comments

Comments
 (0)