!str #15271 make transform() take a factory instead of Transformer

+ Makes reusing flows safe
+ Adds timerTransform for ops which need TimerTransformer
+ Adds TransformerLike in order to keep transform/timerTransform
  typesafe in respect to the passed in type og Transformer

Resolves #15271
This commit is contained in:
Konrad 'ktoso' Malawski 2014-08-22 11:42:05 +02:00
parent 24254c6b48
commit 5b1c05f3fe
26 changed files with 368 additions and 281 deletions

View file

@ -3,28 +3,22 @@
*/
package akka.stream
import scala.concurrent.duration._
import akka.stream.testkit.StreamTestKit
import akka.stream.testkit.AkkaSpec
import akka.testkit.EventFilter
import com.typesafe.config.ConfigFactory
import akka.stream.scaladsl.Flow
import akka.testkit.TestProbe
import akka.stream.testkit.{ AkkaSpec, StreamTestKit }
import scala.concurrent.duration._
import scala.util.control.NoStackTrace
import scala.collection.immutable
@org.junit.runner.RunWith(classOf[org.scalatest.junit.JUnitRunner])
class FlowTimerTransformerSpec extends AkkaSpec {
import system.dispatcher
implicit val materializer = FlowMaterializer(MaterializerSettings(dispatcher = "akka.test.stream-dispatcher"))
"A Flow with TimerTransformer operations" must {
"produce scheduled ticks as expected" in {
val p = StreamTestKit.PublisherProbe[Int]()
val p2 = Flow(p).
transform(new TimerTransformer[Int, Int] {
timerTransform("timer", () new TimerTransformer[Int, Int] {
schedulePeriodically("tick", 100.millis)
var tickCount = 0
override def onNext(elem: Int) = List(elem)
@ -49,7 +43,7 @@ class FlowTimerTransformerSpec extends AkkaSpec {
"schedule ticks when last transformation step (consume)" in {
val p = StreamTestKit.PublisherProbe[Int]()
val p2 = Flow(p).
transform(new TimerTransformer[Int, Int] {
timerTransform("timer", () new TimerTransformer[Int, Int] {
schedulePeriodically("tick", 100.millis)
var tickCount = 0
override def onNext(elem: Int) = List(elem)
@ -62,7 +56,7 @@ class FlowTimerTransformerSpec extends AkkaSpec {
override def isComplete: Boolean = !isTimerActive("tick")
}).
consume()
val pSub = p.expectSubscription
val pSub = p.expectSubscription()
expectMsg("tick-1")
expectMsg("tick-2")
expectMsg("tick-3")
@ -73,7 +67,7 @@ class FlowTimerTransformerSpec extends AkkaSpec {
val exception = new Exception("Expected exception to the rule") with NoStackTrace
val p = StreamTestKit.PublisherProbe[Int]()
val p2 = Flow(p).
transform(new TimerTransformer[Int, Int] {
timerTransform("timer", () new TimerTransformer[Int, Int] {
scheduleOnce("tick", 100.millis)
def onNext(element: Int) = Nil