mirror of https://github.com/sbt/sbt.git
Merge pull request #3997 from eed3si9n/wip/test-status-thread-safety
Fix race condition in non-forked, parallel tests.
This commit is contained in:
commit
92c95ce290
|
|
@ -214,6 +214,11 @@ lazy val testingProj = (project in file("testing"))
|
||||||
sourceManaged in (Compile, generateContrabands) := baseDirectory.value / "src" / "main" / "contraband-scala",
|
sourceManaged in (Compile, generateContrabands) := baseDirectory.value / "src" / "main" / "contraband-scala",
|
||||||
contrabandFormatsForType in generateContrabands in Compile := ContrabandConfig.getFormats,
|
contrabandFormatsForType in generateContrabands in Compile := ContrabandConfig.getFormats,
|
||||||
mimaSettings,
|
mimaSettings,
|
||||||
|
mimaBinaryIssueFilters ++= Seq(
|
||||||
|
// private[sbt]
|
||||||
|
ProblemFilters.exclude[IncompatibleMethTypeProblem]("sbt.TestStatus.write"),
|
||||||
|
ProblemFilters.exclude[IncompatibleResultTypeProblem]("sbt.TestStatus.read"),
|
||||||
|
),
|
||||||
)
|
)
|
||||||
.configure(addSbtIO, addSbtCompilerClasspath, addSbtUtilLogging)
|
.configure(addSbtIO, addSbtCompilerClasspath, addSbtUtilLogging)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -63,7 +63,8 @@ private[sbt] object Server {
|
||||||
val maxSocketLength = new UnixDomainSocketLibrary.SockaddrUn().sunPath.length - 1
|
val maxSocketLength = new UnixDomainSocketLibrary.SockaddrUn().sunPath.length - 1
|
||||||
val path = socketfile.getAbsolutePath
|
val path = socketfile.getAbsolutePath
|
||||||
if (path.length > maxSocketLength)
|
if (path.length > maxSocketLength)
|
||||||
sys.error("socket file absolute path too long; " +
|
sys.error(
|
||||||
|
"socket file absolute path too long; " +
|
||||||
"either switch to another connection type " +
|
"either switch to another connection type " +
|
||||||
"or define a short \"SBT_GLOBAL_SERVER_DIR\" value. " +
|
"or define a short \"SBT_GLOBAL_SERVER_DIR\" value. " +
|
||||||
s"Current path: ${path}")
|
s"Current path: ${path}")
|
||||||
|
|
|
||||||
|
|
@ -8,14 +8,16 @@
|
||||||
package sbt
|
package sbt
|
||||||
|
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import sbt.io.IO
|
|
||||||
|
|
||||||
import scala.collection.mutable.Map
|
import sbt.io.IO
|
||||||
import sbt.protocol.testing.TestResult
|
import sbt.protocol.testing.TestResult
|
||||||
|
import java.util.concurrent.ConcurrentHashMap
|
||||||
|
|
||||||
|
import scala.collection.concurrent
|
||||||
|
|
||||||
// Assumes exclusive ownership of the file.
|
// Assumes exclusive ownership of the file.
|
||||||
private[sbt] class TestStatusReporter(f: File) extends TestsListener {
|
private[sbt] class TestStatusReporter(f: File) extends TestsListener {
|
||||||
private lazy val succeeded = TestStatus.read(f)
|
private lazy val succeeded: concurrent.Map[String, Long] = TestStatus.read(f)
|
||||||
|
|
||||||
def doInit = ()
|
def doInit = ()
|
||||||
def startGroup(name: String): Unit = { succeeded remove name; () }
|
def startGroup(name: String): Unit = { succeeded remove name; () }
|
||||||
|
|
@ -32,13 +34,16 @@ private[sbt] class TestStatusReporter(f: File) extends TestsListener {
|
||||||
|
|
||||||
private[sbt] object TestStatus {
|
private[sbt] object TestStatus {
|
||||||
import java.util.Properties
|
import java.util.Properties
|
||||||
def read(f: File): Map[String, Long] = {
|
def read(f: File): concurrent.Map[String, Long] = {
|
||||||
import scala.collection.JavaConverters._
|
import scala.collection.JavaConverters._
|
||||||
val properties = new Properties
|
val properties = new Properties
|
||||||
IO.load(properties, f)
|
IO.load(properties, f)
|
||||||
properties.asScala map { case (k, v) => (k, v.toLong) }
|
val result = new ConcurrentHashMap[String, Long]()
|
||||||
|
properties.asScala.iterator.foreach { case (k, v) => result.put(k, v.toLong) }
|
||||||
|
result.asScala
|
||||||
}
|
}
|
||||||
def write(map: Map[String, Long], label: String, f: File): Unit = {
|
|
||||||
|
def write(map: collection.Map[String, Long], label: String, f: File): Unit = {
|
||||||
val properties = new Properties
|
val properties = new Properties
|
||||||
for ((test, lastSuccessTime) <- map)
|
for ((test, lastSuccessTime) <- map)
|
||||||
properties.setProperty(test, lastSuccessTime.toString)
|
properties.setProperty(test, lastSuccessTime.toString)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue