1
0
Fork 0
mirror of https://github.com/ACINQ/eclair.git synced 2025-02-22 22:25:26 +01:00

Add json serializers for NodeAddress and Direction (#570)

* Enable and fix failing test (#565)

* Add json serializers for `NodeAddress` type (#565)

* Add json serializers for `Direction` type (#565)
This commit is contained in:
Gustavo Fernandes 2018-04-23 21:53:04 +01:00 committed by Pierre-Marie Padiou
parent 410e005703
commit 64afc38709
3 changed files with 47 additions and 10 deletions

View file

@ -24,8 +24,9 @@ import fr.acinq.bitcoin.{BinaryData, OutPoint, Transaction}
import fr.acinq.eclair.channel.State
import fr.acinq.eclair.crypto.ShaChain
import fr.acinq.eclair.router.RouteResponse
import fr.acinq.eclair.transactions.Direction
import fr.acinq.eclair.transactions.Transactions.{InputInfo, TransactionWithInputInfo}
import fr.acinq.eclair.wire.{Color, FailureMessage}
import fr.acinq.eclair.wire._
import fr.acinq.eclair.{ShortChannelId, UInt64}
import org.json4s.JsonAST._
import org.json4s.{CustomKeySerializer, CustomSerializer}
@ -115,3 +116,15 @@ class ThrowableSerializer extends CustomSerializer[Throwable](format => ({ null
class FailureMessageSerializer extends CustomSerializer[FailureMessage](format => ({ null }, {
case m: FailureMessage => JString(m.message)
}))
class NodeAddressSerializer extends CustomSerializer[NodeAddress](format => ({ null},{
case IPv4(a, p) => JString(HostAndPort.fromParts(a.getHostAddress, p).toString)
case IPv6(a, p) => JString(HostAndPort.fromParts(a.getHostAddress, p).toString)
case Tor2(b, p) => JString(s"${b.toString}:$p")
case Tor3(b, p) => JString(s"${b.toString}:$p")
}))
class DirectionSerializer extends CustomSerializer[Direction](format => ({ null },{
case d: Direction => JString(d.toString)
}))

View file

@ -70,7 +70,7 @@ trait Service extends Logging {
def scheduler: Scheduler
implicit val serialization = jackson.Serialization
implicit val formats = org.json4s.DefaultFormats + new BinaryDataSerializer + new UInt64Serializer + new ShortChannelIdSerializer + new StateSerializer + new ShaChainSerializer + new PublicKeySerializer + new PrivateKeySerializer + new ScalarSerializer + new PointSerializer + new TransactionSerializer + new TransactionWithInputInfoSerializer + new InetSocketAddressSerializer + new OutPointSerializer + new OutPointKeySerializer + new InputInfoSerializer + new ColorSerializer + new RouteResponseSerializer + new ThrowableSerializer + new FailureMessageSerializer
implicit val formats = org.json4s.DefaultFormats + new BinaryDataSerializer + new UInt64Serializer + new ShortChannelIdSerializer + new StateSerializer + new ShaChainSerializer + new PublicKeySerializer + new PrivateKeySerializer + new ScalarSerializer + new PointSerializer + new TransactionSerializer + new TransactionWithInputInfoSerializer + new InetSocketAddressSerializer + new OutPointSerializer + new OutPointKeySerializer + new InputInfoSerializer + new ColorSerializer + new RouteResponseSerializer + new ThrowableSerializer + new FailureMessageSerializer + new NodeAddressSerializer + new DirectionSerializer
implicit val timeout = Timeout(60 seconds)
implicit val shouldWritePretty: ShouldWritePretty = ShouldWritePretty.True

View file

@ -16,17 +16,27 @@
package fr.acinq.eclair.api
import fr.acinq.bitcoin.{BinaryData, OutPoint}
import org.json4s.Formats
import org.json4s.jackson.Serialization
import org.scalatest.FunSuite
import java.net.{InetAddress, InetSocketAddress}
class JsonSerializersSpec extends FunSuite {
import fr.acinq.bitcoin.{BinaryData, OutPoint}
import fr.acinq.eclair.transactions.{IN, OUT}
import fr.acinq.eclair.wire.NodeAddress
import org.json4s.jackson.Serialization
import org.junit.runner.RunWith
import org.scalatest.junit.JUnitRunner
import org.scalatest.{FunSuite, Matchers}
@RunWith(classOf[JUnitRunner])
class JsonSerializersSpec extends FunSuite with Matchers {
test("deserialize Map[OutPoint, BinaryData]") {
val output1 = OutPoint("11418a2d282a40461966e4f578e1fdf633ad15c1b7fb3e771d14361127233be1", 0)
val output2 = OutPoint("3d62bd4f71dc63798418e59efbc7532380c900b5e79db3a5521374b161dd0e33", 1)
val map = Map(
OutPoint("11418a2d282a40461966e4f578e1fdf633ad15c1b7fb3e771d14361127233be1", 0) -> BinaryData("dead"),
OutPoint("3d62bd4f71dc63798418e59efbc7532380c900b5e79db3a5521374b161dd0e33", 1) -> BinaryData("beef")
output1 -> BinaryData("dead"),
output2 -> BinaryData("beef")
)
// it won't work with the default key serializer
@ -37,6 +47,20 @@ class JsonSerializersSpec extends FunSuite {
// but it works with our custom key serializer
val json = Serialization.write(map)(org.json4s.DefaultFormats + new BinaryDataSerializer + new OutPointKeySerializer)
assert(json === """{"11418a2d282a40461966e4f578e1fdf633ad15c1b7fb3e771d14361127233be1:0":"dead","3d62bd4f71dc63798418e59efbc7532380c900b5e79db3a5521374b161dd0e33:1":"beef"}""")
assert(json === s"""{"${output1.txid}:0":"dead","${output2.txid}:1":"beef"}""")
}
test("NodeAddress serialization") {
val ipv4 = NodeAddress(new InetSocketAddress(InetAddress.getByAddress(Array(10, 0, 0, 1)), 8888))
val ipv6LocalHost = NodeAddress(new InetSocketAddress(InetAddress.getByAddress(Array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1)), 9735))
Serialization.write(ipv4)(org.json4s.DefaultFormats + new NodeAddressSerializer) shouldBe s""""10.0.0.1:8888""""
Serialization.write(ipv6LocalHost)(org.json4s.DefaultFormats + new NodeAddressSerializer) shouldBe s""""[0:0:0:0:0:0:0:1]:9735""""
}
test("Direction serialization") {
Serialization.write(IN)(org.json4s.DefaultFormats + new DirectionSerializer) shouldBe s""""IN""""
Serialization.write(OUT)(org.json4s.DefaultFormats + new DirectionSerializer) shouldBe s""""OUT""""
}
}