From 55ac8735b649d85387d1035d2337970f50c5b9a5 Mon Sep 17 00:00:00 2001 From: "Johan T. Halseth" Date: Thu, 19 Apr 2018 11:09:25 +0200 Subject: [PATCH] breacharbiter_test: use ContractBreaches channel --- breacharbiter_test.go | 90 ++++++++++++++++++++++--------------------- 1 file changed, 47 insertions(+), 43 deletions(-) diff --git a/breacharbiter_test.go b/breacharbiter_test.go index a4e7ba0f..d94a8b72 100644 --- a/breacharbiter_test.go +++ b/breacharbiter_test.go @@ -21,7 +21,6 @@ import ( "github.com/btcsuite/btclog" "github.com/go-errors/errors" "github.com/lightningnetwork/lnd/channeldb" - "github.com/lightningnetwork/lnd/contractcourt" "github.com/lightningnetwork/lnd/htlcswitch" "github.com/lightningnetwork/lnd/keychain" "github.com/lightningnetwork/lnd/lnwallet" @@ -949,19 +948,10 @@ func TestBreachHandoffSuccess(t *testing.T) { defer cleanUpChans() // Instantiate a breach arbiter to handle the breach of alice's channel. - alicePoint := alice.ChannelPoint() - spendEvents := contractcourt.ChainEventSubscription{ - RemoteUnilateralClosure: make(chan *lnwallet.UnilateralCloseSummary, 1), - LocalUnilateralClosure: make(chan *contractcourt.LocalUnilateralCloseInfo, 1), - CooperativeClosure: make(chan struct{}, 1), - ContractBreach: make(chan *lnwallet.BreachRetribution, 1), - ProcessACK: make(chan error, 1), - ChanPoint: *alicePoint, - Cancel: func() { - }, - } + contractBreaches := make(chan *ContractBreachEvent) + brar, cleanUpArb, err := createTestArbiter( - t, &spendEvents, alice.State().Db, + t, contractBreaches, alice.State().Db, ) if err != nil { t.Fatalf("unable to initialize test breach arbiter: %v", err) @@ -1005,13 +995,21 @@ func TestBreachHandoffSuccess(t *testing.T) { // Signal a spend of the funding transaction and wait for the close // observer to exit. - spendEvents.ContractBreach <- &lnwallet.BreachRetribution{ - BreachTransaction: bobClose.CloseTx, + breach := &ContractBreachEvent{ + ChanPoint: *chanPoint, + ProcessACK: make(chan error, 1), + BreachRetribution: &lnwallet.BreachRetribution{ + BreachTransaction: bobClose.CloseTx, + }, } + contractBreaches <- breach // We'll also wait to consume the ACK back from the breach arbiter. select { - case <-spendEvents.ProcessACK: + case err := <-breach.ProcessACK: + if err != nil { + t.Fatalf("handoff failed: %v", err) + } case <-time.After(time.Second * 15): t.Fatalf("breach arbiter didn't send ack back") } @@ -1038,19 +1036,10 @@ func TestBreachHandoffFail(t *testing.T) { defer cleanUpChans() // Instantiate a breach arbiter to handle the breach of alice's channel. - alicePoint := alice.ChannelPoint() - spendEvents := contractcourt.ChainEventSubscription{ - RemoteUnilateralClosure: make(chan *lnwallet.UnilateralCloseSummary, 1), - LocalUnilateralClosure: make(chan *contractcourt.LocalUnilateralCloseInfo, 1), - CooperativeClosure: make(chan struct{}, 1), - ContractBreach: make(chan *lnwallet.BreachRetribution, 1), - ProcessACK: make(chan error, 1), - ChanPoint: *alicePoint, - Cancel: func() { - }, - } + contractBreaches := make(chan *ContractBreachEvent) + brar, cleanUpArb, err := createTestArbiter( - t, &spendEvents, alice.State().Db, + t, contractBreaches, alice.State().Db, ) if err != nil { t.Fatalf("unable to initialize test breach arbiter: %v", err) @@ -1099,11 +1088,18 @@ func TestBreachHandoffFail(t *testing.T) { // Signal the notifier to dispatch spend notifications of the funding // transaction using the transaction from bob's closing summary. chanPoint := alice.ChanPoint - spendEvents.ContractBreach <- &lnwallet.BreachRetribution{ - BreachTransaction: bobClose.CloseTx, + breach := &ContractBreachEvent{ + ChanPoint: *chanPoint, + ProcessACK: make(chan error, 1), + BreachRetribution: &lnwallet.BreachRetribution{ + BreachTransaction: bobClose.CloseTx, + }, } + contractBreaches <- breach + + // We'll also wait to consume the ACK back from the breach arbiter. select { - case err := <-spendEvents.ProcessACK: + case err := <-breach.ProcessACK: if err == nil { t.Fatalf("breach write should have failed") } @@ -1118,7 +1114,7 @@ func TestBreachHandoffFail(t *testing.T) { assertNotPendingClosed(t, alice) brar, cleanUpArb, err = createTestArbiter( - t, &spendEvents, alice.State().Db, + t, contractBreaches, alice.State().Db, ) if err != nil { t.Fatalf("unable to initialize test breach arbiter: %v", err) @@ -1139,11 +1135,21 @@ func TestBreachHandoffFail(t *testing.T) { // Signal a spend of the funding transaction and wait for the close // observer to exit. This time we are allowing the handoff to succeed. - spendEvents.ContractBreach <- &lnwallet.BreachRetribution{ - BreachTransaction: bobClose.CloseTx, + breach = &ContractBreachEvent{ + ChanPoint: *chanPoint, + ProcessACK: make(chan error, 1), + BreachRetribution: &lnwallet.BreachRetribution{ + BreachTransaction: bobClose.CloseTx, + }, } + + contractBreaches <- breach + select { - case <-spendEvents.ProcessACK: + case err := <-breach.ProcessACK: + if err != nil { + t.Fatalf("handoff failed: %v", err) + } case <-time.After(time.Second * 15): t.Fatalf("breach arbiter didn't send ack back") } @@ -1207,7 +1213,7 @@ func assertNotPendingClosed(t *testing.T, c *lnwallet.LightningChannel) { // createTestArbiter instantiates a breach arbiter with a failing retribution // store, so that controlled failures can be tested. -func createTestArbiter(t *testing.T, chainEvents *contractcourt.ChainEventSubscription, +func createTestArbiter(t *testing.T, contractBreaches chan *ContractBreachEvent, db *channeldb.DB) (*breachArbiter, func(), error) { // Create a failing retribution store, that wraps a normal one. @@ -1222,13 +1228,11 @@ func createTestArbiter(t *testing.T, chainEvents *contractcourt.ChainEventSubscr // Assemble our test arbiter. notifier := makeMockSpendNotifier() ba := newBreachArbiter(&BreachConfig{ - CloseLink: func(_ *wire.OutPoint, _ htlcswitch.ChannelCloseType) {}, - DB: db, - Estimator: &lnwallet.StaticFeeEstimator{FeeRate: 50}, - GenSweepScript: func() ([]byte, error) { return nil, nil }, - SubscribeChannelEvents: func(_ wire.OutPoint) (*contractcourt.ChainEventSubscription, error) { - return chainEvents, nil - }, + CloseLink: func(_ *wire.OutPoint, _ htlcswitch.ChannelCloseType) {}, + DB: db, + Estimator: &lnwallet.StaticFeeEstimator{FeeRate: 50}, + GenSweepScript: func() ([]byte, error) { return nil, nil }, + ContractBreaches: contractBreaches, Signer: signer, Notifier: notifier, PublishTransaction: func(_ *wire.MsgTx) error { return nil },