pekko/akka-http-testkit/src/main/scala/akka/http/javadsl/testkit/JUnitRouteTest.scala

74 lines
2.6 KiB
Scala

/*
* Copyright (C) 2009-2014 Typesafe Inc. <http://www.typesafe.com>
*/
package akka.http.javadsl.testkit
import akka.actor.ActorSystem
import akka.http.javadsl.server._
import akka.http.scaladsl.model.HttpResponse
import akka.stream.{ Materializer, ActorMaterializer }
import org.junit.rules.ExternalResource
import org.junit.{ Assert, Rule }
import scala.concurrent.duration._
/**
* A RouteTest that uses JUnit assertions. ActorSystem and Materializer are provided as an [[ExternalResource]]
* and their lifetime is automatically managed.
*/
abstract class JUnitRouteTestBase extends RouteTest {
protected def systemResource: ActorSystemResource
implicit def system: ActorSystem = systemResource.system
implicit def materializer: Materializer = systemResource.materializer
protected def createTestResponse(response: HttpResponse): TestResponse =
new TestResponse(response, awaitDuration)(system.dispatcher, materializer) {
protected def assertEquals(expected: AnyRef, actual: AnyRef, message: String): Unit =
Assert.assertEquals(message, expected, actual)
protected def assertEquals(expected: Int, actual: Int, message: String): Unit =
Assert.assertEquals(message, expected, actual)
protected def assertTrue(predicate: Boolean, message: String): Unit =
Assert.assertTrue(message, predicate)
protected def fail(message: String): Unit = {
Assert.fail(message)
throw new IllegalStateException("Assertion should have failed")
}
}
protected def completeWithValueToString[T](value: RequestVal[T]): Route =
handleWith1(value, new Handler1[T] {
def apply(ctx: RequestContext, t: T): RouteResult = ctx.complete(t.toString)
})
}
abstract class JUnitRouteTest extends JUnitRouteTestBase {
private[this] val _systemResource = new ActorSystemResource
@Rule
protected def systemResource: ActorSystemResource = _systemResource
}
class ActorSystemResource extends ExternalResource {
protected def createSystem(): ActorSystem = ActorSystem()
protected def createMaterializer(system: ActorSystem): ActorMaterializer = ActorMaterializer()(system)
implicit def system: ActorSystem = _system
implicit def materializer: ActorMaterializer = _materializer
private[this] var _system: ActorSystem = null
private[this] var _materializer: ActorMaterializer = null
override def before(): Unit = {
require((_system eq null) && (_materializer eq null))
_system = createSystem()
_materializer = createMaterializer(_system)
}
override def after(): Unit = {
_system.shutdown()
_system.awaitTermination(5.seconds)
_system = null
_materializer = null
}
}