[1.5] Lagom Test Cassandra & sbt-jacoco

Hi,

My team is running Lagom 1.5.5 for Java, and we’re attempting to build code coverage into a CI pipeline with SonarQube, using sbt-jacoco.

We’re running into some difficulty getting sbt-jacoco to run service-level tests. Our services depend on cassandra, so use ServiceTest.Setup.withCassandra(). When trying to run the test normally, everything is fine, but when we attempt to run with jacoco it seems to interfere with starting the test cassandra.

The test suite logs contain these entries:

08/17 11:30:11 ERROR[main] o.a.c.s.StartupChecks - cassandra.jmx.local.port missing from cassandra-env.sh, unable to start local JMX service.
2021-08-17 11:30:15,172 DEBUG com.lightbend.lagom.internal.testkit.CassandraTestServer - Cassandra started in 5152 ms
...
11:30:25.945 [warn] akka.stream.scaladsl.RestartWithBackoffSource [sourceThread=ServiceTest_210817113009542-akka.actor.default-dispatcher-17, akkaSource=RestartWithBackoffSource(akka://ServiceTest_210817113009542), sourceActorSystem=ServiceTest_210817113009542, akkaTimestamp=15:30:25.934UTC] - Restarting graph due to failure. stack_trace: 
java.util.concurrent.ExecutionException: com.datastax.driver.core.exceptions.NoHostAvailableException: All host(s) tried for query failed (tried: /127.0.0.1:53970 (com.datastax.driver.core.exceptions.TransportException: [/127.0.0.1:53970] Connection has been closed))
	at com.google.common.util.concurrent.AbstractFuture.getDoneValue(AbstractFuture.java:552)
	at com.google.common.util.concurrent.AbstractFuture.get(AbstractFuture.java:513)
	at akka.persistence.cassandra.package$$anon$1.$anonfun$run$1(package.scala:18)
	at scala.util.Try$.apply(Try.scala:213)
	at akka.persistence.cassandra.package$$anon$1.run(package.scala:18)
	at akka.dispatch.TaskInvocation.run(AbstractDispatcher.scala:41)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at java.lang.Thread.run(Thread.java:748)
Caused by: com.datastax.driver.core.exceptions.NoHostAvailableException: All host(s) tried for query failed (tried: /127.0.0.1:53970 (com.datastax.driver.core.exceptions.TransportException: [/127.0.0.1:53970] Connection has been closed))
	at com.datastax.driver.core.RequestHandler.reportNoMoreHosts(RequestHandler.java:265)
	at com.datastax.driver.core.RequestHandler.access$1200(RequestHandler.java:62)
	at com.datastax.driver.core.RequestHandler$SpeculativeExecution.findNextHostAndQuery(RequestHandler.java:357)
	at com.datastax.driver.core.RequestHandler$SpeculativeExecution.retry(RequestHandler.java:539)
	at com.datastax.driver.core.RequestHandler$SpeculativeExecution.processRetryDecision(RequestHandler.java:521)
	at com.datastax.driver.core.RequestHandler$SpeculativeExecution.onException(RequestHandler.java:922)
	at com.datastax.driver.core.Connection$Dispatcher.errorOutAllHandler(Connection.java:1311)
	at com.datastax.driver.core.Connection$ConnectionCloseFuture.force(Connection.java:1397)
	at com.datastax.driver.core.Connection$ConnectionCloseFuture.force(Connection.java:1378)
	at com.datastax.driver.core.CloseFuture$Forwarding.force(CloseFuture.java:88)
	at com.datastax.driver.core.SessionManager.onDown(SessionManager.java:526)
	at com.datastax.driver.core.Cluster$Manager.onDown(Cluster.java:2004)
	at com.datastax.driver.core.Cluster$Manager.access$1200(Cluster.java:1390)
	at com.datastax.driver.core.Cluster$Manager$5.runMayThrow(Cluster.java:1959)
	at com.datastax.driver.core.ExceptionCatchingRunnable.run(ExceptionCatchingRunnable.java:32)
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
	at com.google.common.util.concurrent.TrustedListenableFutureTask$TrustedFutureInterruptibleTask.runInterruptibly(TrustedListenableFutureTask.java:125)
	at com.google.common.util.concurrent.InterruptibleTask.run(InterruptibleTask.java:69)
	at com.google.common.util.concurrent.TrustedListenableFutureTask.run(TrustedListenableFutureTask.java:78)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
	... 1 more

We’re particularly looking for advice on:

  • how to get the test cassandra to run under sbt-jacoco
  • other SonarQube compatible alternatives to sbt-jacoco that might work better
  • options for using an external cassandra as the test server
  • approaches for mocking out the cassandra interface without the test server

I’m certainly open to other advice or suggestions as well, these are just the paths that I imagine might be available from where I’m standing today.

Any assistance is appreciated,
Thank you.