Skip to content

Commit

Permalink
Make all commands extend Has*ReplyToCommand (#1543)
Browse files Browse the repository at this point in the history
This way we can maintain replies in tests.
  • Loading branch information
pm47 committed Sep 30, 2020
1 parent 0ab7ec6 commit 1274168
Show file tree
Hide file tree
Showing 30 changed files with 570 additions and 572 deletions.
10 changes: 5 additions & 5 deletions eclair-core/src/main/scala/fr/acinq/eclair/Eclair.scala
Expand Up @@ -89,7 +89,7 @@ trait Eclair {

def close(channels: List[ApiTypes.ChannelIdentifier], scriptPubKey_opt: Option[ByteVector])(implicit timeout: Timeout): Future[Map[ApiTypes.ChannelIdentifier, Either[Throwable, CommandResponse[CMD_CLOSE]]]]

def forceClose(channels: List[ApiTypes.ChannelIdentifier])(implicit timeout: Timeout): Future[Map[ApiTypes.ChannelIdentifier, Either[Throwable, CommandResponse[CMD_FORCECLOSE.type]]]]
def forceClose(channels: List[ApiTypes.ChannelIdentifier])(implicit timeout: Timeout): Future[Map[ApiTypes.ChannelIdentifier, Either[Throwable, CommandResponse[CMD_FORCECLOSE]]]]

def updateRelayFee(channels: List[ApiTypes.ChannelIdentifier], feeBase: MilliSatoshi, feeProportionalMillionths: Long)(implicit timeout: Timeout): Future[Map[ApiTypes.ChannelIdentifier, Either[Throwable, CommandResponse[CMD_UPDATE_RELAY_FEE]]]]

Expand Down Expand Up @@ -179,15 +179,15 @@ class EclairImpl(appKit: Kit) extends Eclair {
}

override def close(channels: List[ApiTypes.ChannelIdentifier], scriptPubKey_opt: Option[ByteVector])(implicit timeout: Timeout): Future[Map[ApiTypes.ChannelIdentifier, Either[Throwable, CommandResponse[CMD_CLOSE]]]] = {
sendToChannels[CommandResponse[CMD_CLOSE]](channels, CMD_CLOSE(scriptPubKey_opt))
sendToChannels[CommandResponse[CMD_CLOSE]](channels, CMD_CLOSE(ActorRef.noSender, scriptPubKey_opt))
}

override def forceClose(channels: List[ApiTypes.ChannelIdentifier])(implicit timeout: Timeout): Future[Map[ApiTypes.ChannelIdentifier, Either[Throwable, CommandResponse[CMD_FORCECLOSE.type]]]] = {
sendToChannels[CommandResponse[CMD_FORCECLOSE.type]](channels, CMD_FORCECLOSE)
override def forceClose(channels: List[ApiTypes.ChannelIdentifier])(implicit timeout: Timeout): Future[Map[ApiTypes.ChannelIdentifier, Either[Throwable, CommandResponse[CMD_FORCECLOSE]]]] = {
sendToChannels[CommandResponse[CMD_FORCECLOSE]](channels, CMD_FORCECLOSE)
}

override def updateRelayFee(channels: List[ApiTypes.ChannelIdentifier], feeBaseMsat: MilliSatoshi, feeProportionalMillionths: Long)(implicit timeout: Timeout): Future[Map[ApiTypes.ChannelIdentifier, Either[Throwable, CommandResponse[CMD_UPDATE_RELAY_FEE]]]] = {
sendToChannels[CommandResponse[CMD_UPDATE_RELAY_FEE]](channels, CMD_UPDATE_RELAY_FEE(feeBaseMsat, feeProportionalMillionths))
sendToChannels[CommandResponse[CMD_UPDATE_RELAY_FEE]](channels, CMD_UPDATE_RELAY_FEE(ActorRef.noSender, feeBaseMsat, feeProportionalMillionths))
}

override def peers()(implicit timeout: Timeout): Future[Iterable[PeerInfo]] = for {
Expand Down
82 changes: 40 additions & 42 deletions eclair-core/src/main/scala/fr/acinq/eclair/channel/Channel.scala

Large diffs are not rendered by default.

Expand Up @@ -155,23 +155,25 @@ object Origin {
}
}

/** should not be used directly */
sealed trait Command
sealed trait HasReplyTo { this: Command => def replyTo: ActorRef }
sealed trait NoReplyTo { this: Command => }
final case class CMD_ADD_HTLC(replyTo: ActorRef, amount: MilliSatoshi, paymentHash: ByteVector32, cltvExpiry: CltvExpiry, onion: OnionRoutingPacket, origin: Origin.Hot, commit: Boolean = false) extends Command with HasReplyTo
sealed trait HtlcSettlementCommand extends Command with NoReplyTo { def id: Long }
final case class CMD_FULFILL_HTLC(id: Long, r: ByteVector32, commit: Boolean = false) extends HtlcSettlementCommand
final case class CMD_FAIL_HTLC(id: Long, reason: Either[ByteVector, FailureMessage], commit: Boolean = false) extends HtlcSettlementCommand
final case class CMD_FAIL_MALFORMED_HTLC(id: Long, onionHash: ByteVector32, failureCode: Int, commit: Boolean = false) extends HtlcSettlementCommand
final case class CMD_UPDATE_FEE(feeratePerKw: FeeratePerKw, commit: Boolean = false) extends Command
case object CMD_SIGN extends Command
sealed trait CloseCommand extends Command
final case class CMD_CLOSE(scriptPubKey: Option[ByteVector]) extends CloseCommand
case object CMD_FORCECLOSE extends CloseCommand
final case class CMD_UPDATE_RELAY_FEE(feeBase: MilliSatoshi, feeProportionalMillionths: Long) extends Command
case object CMD_GETSTATE extends Command
case object CMD_GETSTATEDATA extends Command
case object CMD_GETINFO extends Command
sealed trait HasReplyToCommand extends Command { def replyTo: ActorRef }
sealed trait HasOptionalReplyToCommand extends Command { def replyTo_opt: Option[ActorRef] }

final case class CMD_ADD_HTLC(replyTo: ActorRef, amount: MilliSatoshi, paymentHash: ByteVector32, cltvExpiry: CltvExpiry, onion: OnionRoutingPacket, origin: Origin.Hot, commit: Boolean = false) extends HasReplyToCommand
sealed trait HtlcSettlementCommand extends HasOptionalReplyToCommand { def id: Long }
final case class CMD_FULFILL_HTLC(id: Long, r: ByteVector32, commit: Boolean = false, replyTo_opt: Option[ActorRef] = None) extends HtlcSettlementCommand
final case class CMD_FAIL_HTLC(id: Long, reason: Either[ByteVector, FailureMessage], commit: Boolean = false, replyTo_opt: Option[ActorRef] = None) extends HtlcSettlementCommand
final case class CMD_FAIL_MALFORMED_HTLC(id: Long, onionHash: ByteVector32, failureCode: Int, commit: Boolean = false, replyTo_opt: Option[ActorRef] = None) extends HtlcSettlementCommand
final case class CMD_UPDATE_FEE(feeratePerKw: FeeratePerKw, commit: Boolean = false, replyTo_opt: Option[ActorRef] = None) extends HasOptionalReplyToCommand
final case class CMD_SIGN(replyTo_opt: Option[ActorRef] = None) extends HasOptionalReplyToCommand
sealed trait CloseCommand extends HasReplyToCommand
final case class CMD_CLOSE(replyTo: ActorRef, scriptPubKey: Option[ByteVector]) extends CloseCommand
final case class CMD_FORCECLOSE(replyTo: ActorRef) extends CloseCommand
final case class CMD_UPDATE_RELAY_FEE(replyTo: ActorRef, feeBase: MilliSatoshi, feeProportionalMillionths: Long) extends HasReplyToCommand
final case class CMD_GETSTATE(replyTo: ActorRef) extends HasReplyToCommand
final case class CMD_GETSTATEDATA(replyTo: ActorRef) extends HasReplyToCommand
final case class CMD_GETINFO(replyTo: ActorRef)extends HasReplyToCommand

/*
88888888b. 8888888888 .d8888b. 88888888b. ,ad8888ba, 888b 88 .d8888b. 8888888888 .d8888b.
Expand Down Expand Up @@ -214,9 +216,9 @@ object HtlcResult {
final case class RES_ADD_SETTLED[+O <: Origin, +R <: HtlcResult](origin: O, htlc: UpdateAddHtlc, result: R) extends CommandSuccess[CMD_ADD_HTLC]

/** other specific responses */
final case class RES_GETSTATE[+S <: State](state: S) extends CommandSuccess[CMD_GETSTATE.type]
final case class RES_GETSTATEDATA[+D <: Data](data: D) extends CommandSuccess[CMD_GETSTATEDATA.type]
final case class RES_GETINFO(nodeId: PublicKey, channelId: ByteVector32, state: State, data: Data) extends CommandSuccess[CMD_GETINFO.type]
final case class RES_GETSTATE[+S <: State](state: S) extends CommandSuccess[CMD_GETSTATE]
final case class RES_GETSTATEDATA[+D <: Data](data: D) extends CommandSuccess[CMD_GETSTATEDATA]
final case class RES_GETINFO(nodeId: PublicKey, channelId: ByteVector32, state: State, data: Data) extends CommandSuccess[CMD_GETINFO]
final case class RES_CLOSE(channelId: ByteVector32) extends CommandSuccess[CMD_CLOSE]

/**
Expand Down
2 changes: 1 addition & 1 deletion eclair-core/src/main/scala/fr/acinq/eclair/io/Server.scala
Expand Up @@ -38,7 +38,7 @@ class Server(nodeParams: NodeParams, switchboard: ActorRef, router: ActorRef, ad

IO(Tcp) ! Bind(self, address, options = KeepAlive(true) :: Nil, pullMode = true)

def receive() = {
override def receive: Receive = {
case Bound(localAddress) =>
bound.map(_.success(Done))
log.info(s"bound on $localAddress")
Expand Down
Expand Up @@ -16,6 +16,7 @@

package fr.acinq.eclair.wire

import akka.actor.ActorRef
import fr.acinq.eclair.channel._
import fr.acinq.eclair.wire.CommonCodecs._
import fr.acinq.eclair.wire.FailureMessageCodecs.failureMessageCodec
Expand All @@ -27,18 +28,21 @@ object CommandCodecs {
val cmdFulfillCodec: Codec[CMD_FULFILL_HTLC] =
(("id" | int64) ::
("r" | bytes32) ::
("commit" | provide(false))).as[CMD_FULFILL_HTLC]
("commit" | provide(false)) ::
("replyTo_opt" | provide(Option.empty[ActorRef]))).as[CMD_FULFILL_HTLC]

val cmdFailCodec: Codec[CMD_FAIL_HTLC] =
(("id" | int64) ::
("reason" | either(bool, varsizebinarydata, failureMessageCodec)) ::
("commit" | provide(false))).as[CMD_FAIL_HTLC]
("commit" | provide(false)) ::
("replyTo_opt" | provide(Option.empty[ActorRef]))).as[CMD_FAIL_HTLC]

val cmdFailMalformedCodec: Codec[CMD_FAIL_MALFORMED_HTLC] =
(("id" | int64) ::
("onionHash" | bytes32) ::
("failureCode" | uint16) ::
("commit" | provide(false))).as[CMD_FAIL_MALFORMED_HTLC]
("commit" | provide(false)) ::
("replyTo_opt" | provide(Option.empty[ActorRef]))).as[CMD_FAIL_MALFORMED_HTLC]

val cmdCodec: Codec[HtlcSettlementCommand] = discriminated[HtlcSettlementCommand].by(uint16)
.typecase(0, cmdFulfillCodec)
Expand Down
Expand Up @@ -350,9 +350,6 @@ object LightningMessageCodecs {
.typecase(265, gossipTimestampFilterCodec)
// NB: blank lines to minimize merge conflicts

val lightningMessageCodecWithFallback: Codec[LightningMessage] =
discriminatorWithDefault(lightningMessageCodec, unknownMessageCodec.upcast)

//

//
Expand All @@ -369,6 +366,9 @@ object LightningMessageCodecs {

//

val lightningMessageCodecWithFallback: Codec[LightningMessage] =
discriminatorWithDefault(lightningMessageCodec, unknownMessageCodec.upcast)

val meteredLightningMessageCodec = Codec[LightningMessage](
(msg: LightningMessage) => KamonExt.time(Metrics.EncodeDuration.withTag(Tags.MessageType, msg.getClass.getSimpleName))(lightningMessageCodecWithFallback.encode(msg)),
(bits: BitVector) => {
Expand Down
2 changes: 1 addition & 1 deletion eclair-core/src/test/resources/application.conf
Expand Up @@ -17,7 +17,7 @@ akka {

# Duration to wait for all required logging events in LoggingTestKit.expect.
# Dilated by the timefactor.
filter-leeway = 5s
filter-leeway = 10s
}
}

Expand Down
12 changes: 6 additions & 6 deletions eclair-core/src/test/scala/fr/acinq/eclair/EclairImplSpec.scala
Expand Up @@ -296,19 +296,19 @@ class EclairImplSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with I
)

eclair.close(Left(ByteVector32.Zeroes) :: Nil, None)
register.expectMsg(Register.Forward(ActorRef.noSender, ByteVector32.Zeroes, CMD_CLOSE(None)))
register.expectMsg(Register.Forward(ActorRef.noSender, ByteVector32.Zeroes, CMD_CLOSE(ActorRef.noSender, None)))

eclair.close(Right(ShortChannelId("568749x2597x0")) :: Nil, None)
register.expectMsg(Register.ForwardShortId(ActorRef.noSender, ShortChannelId("568749x2597x0"), CMD_CLOSE(None)))
register.expectMsg(Register.ForwardShortId(ActorRef.noSender, ShortChannelId("568749x2597x0"), CMD_CLOSE(ActorRef.noSender, None)))

eclair.close(Right(ShortChannelId("568749x2597x0")) :: Nil, Some(ByteVector.empty))
register.expectMsg(Register.ForwardShortId(ActorRef.noSender, ShortChannelId("568749x2597x0"), CMD_CLOSE(Some(ByteVector.empty))))
register.expectMsg(Register.ForwardShortId(ActorRef.noSender, ShortChannelId("568749x2597x0"), CMD_CLOSE(ActorRef.noSender, Some(ByteVector.empty))))

eclair.close(Right(ShortChannelId("568749x2597x0")) :: Left(ByteVector32.One) :: Right(ShortChannelId("568749x2597x1")) :: Nil, None)
register.expectMsgAllOf(
Register.ForwardShortId(ActorRef.noSender, ShortChannelId("568749x2597x0"), CMD_CLOSE(None)),
Register.Forward(ActorRef.noSender, ByteVector32.One, CMD_CLOSE(None)),
Register.ForwardShortId(ActorRef.noSender, ShortChannelId("568749x2597x1"), CMD_CLOSE(None))
Register.ForwardShortId(ActorRef.noSender, ShortChannelId("568749x2597x0"), CMD_CLOSE(ActorRef.noSender, None)),
Register.Forward(ActorRef.noSender, ByteVector32.One, CMD_CLOSE(ActorRef.noSender, None)),
Register.ForwardShortId(ActorRef.noSender, ShortChannelId("568749x2597x1"), CMD_CLOSE(ActorRef.noSender, None))
)
}

Expand Down
2 changes: 1 addition & 1 deletion eclair-core/src/test/scala/fr/acinq/eclair/TestUtils.scala
Expand Up @@ -72,7 +72,7 @@ object TestUtils {
peer.setAutoPilot(new testkit.TestActor.AutoPilot {
override def run(sender: ActorRef, msg: Any): TestActor.AutoPilot = msg match {
case Channel.OutgoingMessage(msg: LightningMessage, _: ActorRef) =>
pipe tell (msg, sender)
pipe.tell(msg, sender)
TestActor.KeepRunning
case _ => TestActor.KeepRunning
}
Expand Down
Expand Up @@ -181,8 +181,8 @@ class FuzzySpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with StateT
awaitCond(latch.getCount == 0, interval = 1 second, max = 2 minutes)
val sender = TestProbe()
awaitCond({
val c = CMD_CLOSE(None)
sender.send(alice, c)
val c = CMD_CLOSE(sender.ref, None)
alice ! c
sender.expectMsgType[CommandResponse[CMD_CLOSE]].isInstanceOf[RES_SUCCESS[CMD_CLOSE]]
}, interval = 1 second, max = 30 seconds)
awaitCond(alice.stateName == CLOSING, interval = 1 second, max = 3 minutes)
Expand All @@ -199,8 +199,8 @@ class FuzzySpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with StateT
awaitCond(latch.getCount == 0, interval = 1 second, max = 2 minutes)
val sender = TestProbe()
awaitCond({
val c = CMD_CLOSE(None)
sender.send(alice, c)
val c = CMD_CLOSE(sender.ref, None)
alice ! c
val resa = sender.expectMsgType[CommandResponse[CMD_CLOSE]]
sender.send(bob, c)
val resb = sender.expectMsgType[CommandResponse[CMD_CLOSE]]
Expand Down
Expand Up @@ -46,8 +46,7 @@ class RecoverySpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with Sta
val oldStateData = alice.stateData
// then we add an htlc and sign it
addHtlc(250000000 msat, alice, bob, alice2bob, bob2alice)
sender.send(alice, CMD_SIGN)
sender.expectMsgType[RES_SUCCESS[CMD_SIGN.type]]
sender.send(alice, CMD_SIGN())
alice2bob.expectMsgType[CommitSig]
alice2bob.forward(bob)
// alice will receive neither the revocation nor the commit sig
Expand Down
Expand Up @@ -54,7 +54,7 @@ class ThroughputSpec extends AnyFunSuite {
tgt ! CMD_ADD_HTLC(self, 1 msat, h, CltvExpiry(1), TestConstants.emptyOnionPacket, Origin.LocalHot(self, UUID.randomUUID()))
context.become(run(h2r + (h -> r)))

case ('sig, tgt: ActorRef) => tgt ! CMD_SIGN
case ('sig, tgt: ActorRef) => tgt ! CMD_SIGN()

case htlc: UpdateAddHtlc if h2r.contains(htlc.paymentHash) =>
val r = h2r(htlc.paymentHash)
Expand Down
Expand Up @@ -130,32 +130,30 @@ trait StateTestsHelperMethods extends TestKitBase with FixtureTestSuite with Par

def localOrigin(replyTo: ActorRef): Origin.LocalHot = Origin.LocalHot(replyTo, UUID.randomUUID)

def makeCmdAdd(amount: MilliSatoshi, destination: PublicKey, currentBlockHeight: Long, paymentPreimage: ByteVector32 = randomBytes32, upstream: Upstream = Upstream.Local(UUID.randomUUID), replyTo: ActorRef = ActorRef.noSender): (ByteVector32, CMD_ADD_HTLC) = {
def makeCmdAdd(amount: MilliSatoshi, destination: PublicKey, currentBlockHeight: Long, paymentPreimage: ByteVector32 = randomBytes32, upstream: Upstream = Upstream.Local(UUID.randomUUID), replyTo: ActorRef = TestProbe().ref): (ByteVector32, CMD_ADD_HTLC) = {
val paymentHash: ByteVector32 = Crypto.sha256(paymentPreimage)
val expiry = CltvExpiryDelta(144).toCltvExpiry(currentBlockHeight)
val cmd = OutgoingPacket.buildCommand(replyTo, upstream, paymentHash, ChannelHop(null, destination, null) :: Nil, FinalLegacyPayload(amount, expiry))._1.copy(commit = false)
(paymentPreimage, cmd)
}

def addHtlc(amount: MilliSatoshi, s: TestFSMRef[State, Data, Channel], r: TestFSMRef[State, Data, Channel], s2r: TestProbe, r2s: TestProbe, replyTo: ActorRef = ActorRef.noSender): (ByteVector32, UpdateAddHtlc) = {
def addHtlc(amount: MilliSatoshi, s: TestFSMRef[State, Data, Channel], r: TestFSMRef[State, Data, Channel], s2r: TestProbe, r2s: TestProbe, replyTo: ActorRef = TestProbe().ref): (ByteVector32, UpdateAddHtlc) = {
val currentBlockHeight = s.underlyingActor.nodeParams.currentBlockHeight
val (payment_preimage, cmd) = makeCmdAdd(amount, r.underlyingActor.nodeParams.nodeId, currentBlockHeight, replyTo = replyTo)
val htlc = addHtlc(cmd, s, r, s2r, r2s)
(payment_preimage, htlc)
}

def addHtlc(cmdAdd: CMD_ADD_HTLC, s: TestFSMRef[State, Data, Channel], r: TestFSMRef[State, Data, Channel], s2r: TestProbe, r2s: TestProbe): UpdateAddHtlc = {
val sender = TestProbe()
sender.send(s, cmdAdd)
s ! cmdAdd
val htlc = s2r.expectMsgType[UpdateAddHtlc]
s2r.forward(r)
awaitCond(r.stateData.asInstanceOf[HasCommitments].commitments.remoteChanges.proposed.contains(htlc))
htlc
}

def fulfillHtlc(id: Long, R: ByteVector32, s: TestFSMRef[State, Data, Channel], r: TestFSMRef[State, Data, Channel], s2r: TestProbe, r2s: TestProbe): Unit = {
val sender = TestProbe()
sender.send(s, CMD_FULFILL_HTLC(id, R))
s ! CMD_FULFILL_HTLC(id, R)
val fulfill = s2r.expectMsgType[UpdateFulfillHtlc]
s2r.forward(r)
awaitCond(r.stateData.asInstanceOf[HasCommitments].commitments.remoteChanges.proposed.contains(fulfill))
Expand All @@ -166,8 +164,8 @@ trait StateTestsHelperMethods extends TestKitBase with FixtureTestSuite with Par
val sCommitIndex = s.stateData.asInstanceOf[HasCommitments].commitments.localCommit.index
val rCommitIndex = r.stateData.asInstanceOf[HasCommitments].commitments.localCommit.index
val rHasChanges = Commitments.localHasChanges(r.stateData.asInstanceOf[HasCommitments].commitments)
sender.send(s, CMD_SIGN)
sender.expectMsgType[RES_SUCCESS[CMD_SIGN.type]]
s ! CMD_SIGN(Some(sender.ref))
sender.expectMsgType[RES_SUCCESS[CMD_SIGN]]
s2r.expectMsgType[CommitSig]
s2r.forward(r)
r2s.expectMsgType[RevokeAndAck]
Expand Down Expand Up @@ -196,7 +194,7 @@ trait StateTestsHelperMethods extends TestKitBase with FixtureTestSuite with Par
def mutualClose(s: TestFSMRef[State, Data, Channel], r: TestFSMRef[State, Data, Channel], s2r: TestProbe, r2s: TestProbe, s2blockchain: TestProbe, r2blockchain: TestProbe): Unit = {
val sender = TestProbe()
// s initiates a closing
sender.send(s, CMD_CLOSE(None))
s ! CMD_CLOSE(sender.ref, None)
s2r.expectMsgType[Shutdown]
s2r.forward(r)
r2s.expectMsgType[Shutdown]
Expand Down
Expand Up @@ -177,7 +177,10 @@ class WaitForAcceptChannelStateSpec extends TestKitBaseClass with FixtureAnyFunS

test("recv CMD_CLOSE") { f =>
import f._
alice ! CMD_CLOSE(None)
val sender = TestProbe()
val c = CMD_CLOSE(sender.ref, None)
alice ! c
sender.expectMsg(RES_SUCCESS(c, ByteVector32.Zeroes))
awaitCond(alice.stateName == CLOSED)
}

Expand Down
Expand Up @@ -216,7 +216,10 @@ class WaitForOpenChannelStateSpec extends TestKitBaseClass with FixtureAnyFunSui

test("recv CMD_CLOSE") { f =>
import f._
bob ! CMD_CLOSE(None)
val sender = TestProbe()
val c = CMD_CLOSE(sender.ref, None)
bob ! c
sender.expectMsg(RES_SUCCESS(c, ByteVector32.Zeroes))
awaitCond(bob.stateName == CLOSED)
}

Expand Down
Expand Up @@ -68,7 +68,10 @@ class WaitForFundingCreatedInternalStateSpec extends TestKitBaseClass with Fixtu

test("recv CMD_CLOSE") { f =>
import f._
alice ! CMD_CLOSE(None)
val sender = TestProbe()
val c = CMD_CLOSE(sender.ref, None)
alice ! c
sender.expectMsg(RES_SUCCESS(c, ByteVector32.Zeroes))
awaitCond(alice.stateName == CLOSED)
}

Expand Down
Expand Up @@ -16,6 +16,7 @@

package fr.acinq.eclair.channel.states.b

import akka.actor.ActorRef
import akka.testkit.{TestFSMRef, TestProbe}
import fr.acinq.bitcoin.ByteVector32
import fr.acinq.eclair.TestConstants.{Alice, Bob}
Expand Down Expand Up @@ -90,7 +91,21 @@ class WaitForFundingCreatedStateSpec extends TestKitBaseClass with FixtureAnyFun

test("recv CMD_CLOSE") { f =>
import f._
bob ! CMD_CLOSE(None)
val sender = TestProbe()
val c = CMD_CLOSE(sender.ref, None)
bob ! c
sender.expectMsg(RES_SUCCESS(c, ByteVector32.Zeroes))
awaitCond(bob.stateName == CLOSED)
}

test("recv CMD_CLOSE (with noSender)") { f =>
import f._
val sender = TestProbe()
// this makes sure that our backward-compatibility hack for the ask pattern (which uses context.sender as reply-to)
// works before we fully transition to akka typed
val c = CMD_CLOSE(ActorRef.noSender, None)
sender.send(bob, c)
sender.expectMsg(RES_SUCCESS(c, ByteVector32.Zeroes))
awaitCond(bob.stateName == CLOSED)
}

Expand Down

0 comments on commit 1274168

Please sign in to comment.