This repository has been archived by the owner on Jun 1, 2021. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 100
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #212 from RBMHTechnology/wip-207-support-string-ma…
…nifest Support custom serializers with string-manifest
- Loading branch information
Showing
16 changed files
with
275 additions
and
189 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -16,14 +16,19 @@ | |
|
||
package com.rbmhtechnology.eventuate.serializer | ||
|
||
import akka.actor.Props | ||
import akka.actor._ | ||
import akka.serialization.Serializer | ||
import akka.serialization.SerializerWithStringManifest | ||
import akka.testkit.TestProbe | ||
|
||
import com.rbmhtechnology.eventuate.ReplicationFilter.AndFilter | ||
import com.rbmhtechnology.eventuate.ReplicationFilter.NoFilter | ||
import com.rbmhtechnology.eventuate.ReplicationFilter.OrFilter | ||
|
||
import com.rbmhtechnology.eventuate._ | ||
import com.rbmhtechnology.eventuate.serializer.SerializerSpecSupport.ReceiverActor | ||
import com.rbmhtechnology.eventuate.serializer.SerializerSpecSupport.SenderActor | ||
|
||
import org.scalatest._ | ||
|
||
|
@@ -36,21 +41,59 @@ object ReplicationFilterSerializerSpec { | |
def apply(event: DurableEvent): Boolean = num == 1 | ||
} | ||
|
||
val serializerConfig = | ||
""" | ||
|akka.actor.serializers { | ||
| eventuate-test = "com.rbmhtechnology.eventuate.serializer.ReplicationFilterSerializerSpec$ExampleFilterSerializer" | ||
|} | ||
|akka.actor.serialization-bindings { | ||
| "com.rbmhtechnology.eventuate.serializer.ReplicationFilterSerializerSpec$ExampleFilter" = eventuate-test | ||
|} | ||
""".stripMargin | ||
|
||
val serializerWithStringManifestConfig = | ||
""" | ||
|akka.actor.serializers { | ||
| eventuate-test = "com.rbmhtechnology.eventuate.serializer.ReplicationFilterSerializerSpec$ExampleFilterSerializerWithStringManifest" | ||
|} | ||
|akka.actor.serialization-bindings { | ||
| "com.rbmhtechnology.eventuate.serializer.ReplicationFilterSerializerSpec$ExampleFilter" = eventuate-test | ||
|} | ||
""".stripMargin | ||
|
||
/** | ||
* Increments `ExampleFilter.num` by 1 during deserialization. | ||
*/ | ||
class ExampleFilterSerializer(system: ExtendedActorSystem) extends Serializer { | ||
trait IncrementingExampleFilterSerializer { | ||
def toBinary(o: AnyRef): Array[Byte] = o match { | ||
case ExampleFilter(num) => num.toString.getBytes("UTF-8") | ||
} | ||
|
||
def _fromBinary(bytes: Array[Byte]): AnyRef = | ||
ExampleFilter(new String(bytes, "UTF-8").toInt + 1) | ||
} | ||
|
||
class ExampleFilterSerializer(system: ExtendedActorSystem) extends Serializer with IncrementingExampleFilterSerializer { | ||
val ExampleFilterClass = classOf[ExampleFilter] | ||
|
||
override def identifier: Int = 44086 | ||
override def includeManifest: Boolean = true | ||
|
||
override def toBinary(o: AnyRef): Array[Byte] = o match { | ||
case ExampleFilter(num) => num.toString.getBytes("UTF-8") | ||
override def fromBinary(bytes: Array[Byte], manifest: Option[Class[_]]): AnyRef = manifest.get match { | ||
case ExampleFilterClass => _fromBinary(bytes) | ||
} | ||
} | ||
|
||
override def fromBinary(bytes: Array[Byte], manifest: Option[Class[_]]): AnyRef = manifest.get match { | ||
case ExampleFilterClass => ExampleFilter(new String(bytes, "UTF-8").toInt + 1) | ||
val StringManifest = "manifest" | ||
|
||
class ExampleFilterSerializerWithStringManifest(system: ExtendedActorSystem) extends SerializerWithStringManifest with IncrementingExampleFilterSerializer { | ||
|
||
override def identifier: Int = 44087 | ||
|
||
override def manifest(o: AnyRef) = StringManifest | ||
|
||
override def fromBinary(bytes: Array[Byte], manifest: String): AnyRef = manifest match { | ||
case StringManifest => _fromBinary(bytes) | ||
} | ||
} | ||
|
||
|
@@ -80,44 +123,39 @@ object ReplicationFilterSerializerSpec { | |
class ReplicationFilterSerializerSpec extends WordSpec with Matchers with BeforeAndAfterAll { | ||
import ReplicationFilterSerializerSpec._ | ||
|
||
val config = | ||
""" | ||
|akka.actor.serializers { | ||
| eventuate-test = "com.rbmhtechnology.eventuate.serializer.ReplicationFilterSerializerSpec$ExampleFilterSerializer" | ||
|} | ||
|akka.actor.serialization-bindings { | ||
| "com.rbmhtechnology.eventuate.serializer.ReplicationFilterSerializerSpec$ExampleFilter" = eventuate-test | ||
|} | ||
""".stripMargin | ||
|
||
val support = new SerializerSpecSupport( | ||
ReplicationConfig.create(2552), | ||
ReplicationConfig.create(2553, config)) | ||
ReplicationConfig.create(2553, serializerConfig), | ||
ReplicationConfig.create(2554, serializerWithStringManifestConfig)) | ||
|
||
override def afterAll(): Unit = | ||
support.shutdown() | ||
|
||
import support._ | ||
|
||
val receiverProbe = new TestProbe(systems(1)) | ||
val receiverActor = systems(1).actorOf(Props(new ReceiverActor(receiverProbe.ref)), "receiver") | ||
val senderActor = systems(0).actorOf(Props(new SenderActor(systems(0).actorSelection("akka.tcp://[email protected]:2553/user/receiver")))) | ||
|
||
"A ReplicationFilterSerializer" must { | ||
"serialize replication filter trees with an and-filter root" in { | ||
serialization1.deserialize(serialization1.serialize(filter1()).get, classOf[AndFilter]).get should be(filter1()) | ||
serializations(0).deserialize(serializations(0).serialize(filter1()).get, classOf[AndFilter]).get should be(filter1()) | ||
} | ||
"serialize replication filter trees with an or-filter root" in { | ||
serialization1.deserialize(serialization1.serialize(filter2()).get, classOf[OrFilter]).get should be(filter2()) | ||
serializations(0).deserialize(serializations(0).serialize(filter2()).get, classOf[OrFilter]).get should be(filter2()) | ||
} | ||
"serialize NoFilter" in { | ||
serialization1.deserialize(serialization1.serialize(NoFilter).get, NoFilter.getClass).get should be(NoFilter) | ||
serializations(0).deserialize(serializations(0).serialize(NoFilter).get, NoFilter.getClass).get should be(NoFilter) | ||
} | ||
"serialize custom filters" in { | ||
serialization1.deserialize(serialization1.serialize(filter3).get, classOf[ProcessIdFilter]).get should be(filter3) | ||
serialization2.deserialize(serialization2.serialize(ExampleFilter(1)).get, classOf[ExampleFilter]).get should be(ExampleFilter(2)) | ||
serializations(0).deserialize(serializations(0).serialize(filter3).get, classOf[ProcessIdFilter]).get should be(filter3) | ||
serializations(1).deserialize(serializations(1).serialize(ExampleFilter(1)).get, classOf[ExampleFilter]).get should be(ExampleFilter(2)) | ||
} | ||
"serialize replication filter trees with an and-filter root and a custom leaf" in { | ||
serialization2.deserialize(serialization2.serialize(filter1(ExampleFilter(1))).get, classOf[AndFilter]).get should be(filter1(ExampleFilter(2))) | ||
"serialize replication filter trees with an and-filter root and a custom filter serialization" in serializations.tail.foreach { serialization => | ||
serialization.deserialize(serialization.serialize(filter1(ExampleFilter(1))).get, classOf[AndFilter]).get should be(filter1(ExampleFilter(2))) | ||
} | ||
"serialize replication filter trees with an or-filter root and a custom leaf" in { | ||
serialization2.deserialize(serialization2.serialize(filter2(ExampleFilter(1))).get, classOf[OrFilter]).get should be(filter2(ExampleFilter(2))) | ||
"serialize replication filter trees with an or-filter root and a custom filter serialization" in serializations.tail.foreach { serialization => | ||
serialization.deserialize(serialization.serialize(filter2(ExampleFilter(1))).get, classOf[OrFilter]).get should be(filter2(ExampleFilter(2))) | ||
} | ||
"support remoting of replication filter trees with an and-filter root" in { | ||
senderActor ! filter1() | ||
|
Oops, something went wrong.