pekko/akka-persistence-shared/src/test/scala/akka/persistence/journal/leveldb/PersistencePluginProxySpec.scala
2019-03-11 16:58:55 +01:00

138 lines
4.2 KiB
Scala

/*
* Copyright (C) 2009-2019 Lightbend Inc. <https://www.lightbend.com>
*/
package akka.persistence.journal.leveldb
import akka.actor._
import akka.persistence._
import akka.persistence.journal.PersistencePluginProxy
import akka.testkit.{ AkkaSpec, TestProbe }
import com.typesafe.config.ConfigFactory
object PersistencePluginProxySpec {
lazy val config =
ConfigFactory.parseString("""
akka {
actor {
provider = remote
}
persistence {
journal {
plugin = "akka.persistence.journal.proxy"
proxy.target-journal-plugin = "akka.persistence.journal.inmem"
}
snapshot-store {
plugin = "akka.persistence.snapshot-store.proxy"
proxy.target-snapshot-store-plugin = "akka.persistence.snapshot-store.local"
local.dir = target/snapshots-PersistencePluginProxySpec
}
}
remote {
enabled-transports = ["akka.remote.netty.tcp"]
netty.tcp {
hostname = "127.0.0.1"
port = 0
}
}
loglevel = ERROR
log-dead-letters = 0
log-dead-letters-during-shutdown = off
test.single-expect-default = 10s
}
""")
lazy val startTargetConfig =
ConfigFactory.parseString("""
|akka.extensions = ["akka.persistence.journal.PersistencePluginProxyExtension"]
|akka.persistence {
| journal.proxy.start-target-journal = on
| snapshot-store.proxy.start-target-snapshot-store = on
|}
""".stripMargin)
def targetAddressConfig(system: ActorSystem) =
ConfigFactory.parseString(s"""
|akka.extensions = ["akka.persistence.Persistence"]
|akka.persistence.journal.auto-start-journals = [""]
|akka.persistence.journal.proxy.target-journal-address = "${system
.asInstanceOf[ExtendedActorSystem]
.provider
.getDefaultAddress}"
|akka.persistence.snapshot-store.proxy.target-snapshot-store-address = "${system
.asInstanceOf[ExtendedActorSystem]
.provider
.getDefaultAddress}"
""".stripMargin)
class ExamplePersistentActor(probe: ActorRef, name: String) extends NamedPersistentActor(name) {
override def receiveRecover = {
case RecoveryCompleted => // ignore
case payload =>
probe ! payload
}
override def receiveCommand = {
case payload =>
persist(payload) { _ =>
probe ! payload
}
}
}
class ExampleApp(probe: ActorRef) extends Actor {
val p = context.actorOf(Props(classOf[ExamplePersistentActor], probe, context.system.name))
def receive = {
case m => p.forward(m)
}
}
}
class PersistencePluginProxySpec
extends AkkaSpec(PersistencePluginProxySpec.startTargetConfig.withFallback(PersistencePluginProxySpec.config))
with Cleanup {
import PersistencePluginProxySpec._
val systemA = ActorSystem("SysA", config)
val systemB = ActorSystem("SysB", targetAddressConfig(system).withFallback(PersistencePluginProxySpec.config))
override protected def afterTermination(): Unit = {
shutdown(systemA)
shutdown(systemB)
super.afterTermination()
}
"A persistence proxy".can {
"be shared by multiple actor systems" in {
val address = system.asInstanceOf[ExtendedActorSystem].provider.getDefaultAddress
val probeA = new TestProbe(systemA)
val probeB = new TestProbe(systemB)
PersistencePluginProxy.setTargetLocation(systemA, address)
val appA = systemA.actorOf(Props(classOf[ExampleApp], probeA.ref))
val appB = systemB.actorOf(Props(classOf[ExampleApp], probeB.ref))
appA ! "a1"
appB ! "b1"
probeA.expectMsg("a1")
probeB.expectMsg("b1")
val recoveredAppA = systemA.actorOf(Props(classOf[ExampleApp], probeA.ref))
val recoveredAppB = systemB.actorOf(Props(classOf[ExampleApp], probeB.ref))
recoveredAppA ! "a2"
recoveredAppB ! "b2"
probeA.expectMsg("a1")
probeA.expectMsg("a2")
probeB.expectMsg("b1")
probeB.expectMsg("b2")
}
}
}