Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Reinstate "InvokerConcurrencyTest"
  • Loading branch information
RichardBradley committed May 15, 2014
commit 1c3db3e04bee79c3c8c8252bab270f396dda307e
53 changes: 53 additions & 0 deletions src/test/scala/scoverage/InvokerConcurrencyTest.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package scoverage

import org.scalatest.FunSuite
import org.scalatest.BeforeAndAfter
import java.io.File
import scala.concurrent._
import scala.concurrent.duration._
import ExecutionContext.Implicits.global
import scala.collection.breakOut

/**
* Verify that [[Invoker.invoked()]] is thread-safe
*/
class InvokerConcurrencyTest extends FunSuite with BeforeAndAfter {

val measurementDir = new File("invoker-test.measurement")

before {
deleteMeasurementFiles()
measurementDir.mkdirs()
}

test("calling Invoker.invoked on multiple threads does not corrupt the measurement file") {

val testIds: Set[Int] = (1 to 1000).toSet

// Create 1k "invoked" calls on the common thread pool, to stress test
// the method
val futures: List[Future[Unit]] = testIds.map { i: Int =>
future {
Invoker.invoked(i, measurementDir.toString)
}
}(breakOut)

futures.foreach(Await.result(_, 1.second))

// Now verify that the measurement file is not corrupted by loading it
val measurementFiles = IOUtils.findMeasurementFiles(measurementDir)
val idsFromFile = IOUtils.invoked(measurementFiles).toSet

idsFromFile === testIds
}

after {
deleteMeasurementFiles()
measurementDir.delete()
}

private def deleteMeasurementFiles(): Unit = {
if (measurementDir.isDirectory)
measurementDir.listFiles().foreach(_.delete())
}
}