Skip to content

Commit 1c3db3e

Browse files
Reinstate "InvokerConcurrencyTest"
1 parent 2acb521 commit 1c3db3e

File tree

1 file changed

+53
-0
lines changed

1 file changed

+53
-0
lines changed
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package scoverage
2+
3+
import org.scalatest.FunSuite
4+
import org.scalatest.BeforeAndAfter
5+
import java.io.File
6+
import scala.concurrent._
7+
import scala.concurrent.duration._
8+
import ExecutionContext.Implicits.global
9+
import scala.collection.breakOut
10+
11+
/**
12+
* Verify that [[Invoker.invoked()]] is thread-safe
13+
*/
14+
class InvokerConcurrencyTest extends FunSuite with BeforeAndAfter {
15+
16+
val measurementDir = new File("invoker-test.measurement")
17+
18+
before {
19+
deleteMeasurementFiles()
20+
measurementDir.mkdirs()
21+
}
22+
23+
test("calling Invoker.invoked on multiple threads does not corrupt the measurement file") {
24+
25+
val testIds: Set[Int] = (1 to 1000).toSet
26+
27+
// Create 1k "invoked" calls on the common thread pool, to stress test
28+
// the method
29+
val futures: List[Future[Unit]] = testIds.map { i: Int =>
30+
future {
31+
Invoker.invoked(i, measurementDir.toString)
32+
}
33+
}(breakOut)
34+
35+
futures.foreach(Await.result(_, 1.second))
36+
37+
// Now verify that the measurement file is not corrupted by loading it
38+
val measurementFiles = IOUtils.findMeasurementFiles(measurementDir)
39+
val idsFromFile = IOUtils.invoked(measurementFiles).toSet
40+
41+
idsFromFile === testIds
42+
}
43+
44+
after {
45+
deleteMeasurementFiles()
46+
measurementDir.delete()
47+
}
48+
49+
private def deleteMeasurementFiles(): Unit = {
50+
if (measurementDir.isDirectory)
51+
measurementDir.listFiles().foreach(_.delete())
52+
}
53+
}

0 commit comments

Comments
 (0)