contractcourt: update TestChannelArbitratorLocalForceClosePendingHtlc to assert resolution msg delivery

This commit is contained in:
Olaoluwa Osuntokun 2019-05-16 17:45:26 -07:00
parent ea7bae8492
commit b4a116fd07
No known key found for this signature in database
GPG Key ID: CE58F7F8E20FD9A2

View File

@ -108,16 +108,6 @@ func (b *mockArbitratorLog) FetchContractResolutions() (*ContractResolutions, er
return b.resolutions, nil return b.resolutions, nil
} }
func (b *mockArbitratorLog) LogChainActions(actions ChainActionMap) error {
b.chainActions = actions
return nil
}
func (b *mockArbitratorLog) FetchChainActions() (ChainActionMap, error) {
actionsMap := b.chainActions
return actionsMap, nil
}
func (b *mockArbitratorLog) WipeHistory() error { func (b *mockArbitratorLog) WipeHistory() error {
return nil return nil
} }
@ -144,8 +134,11 @@ func (*mockChainIO) GetBlock(blockHash *chainhash.Hash) (*wire.MsgBlock, error)
} }
func createTestChannelArbitrator(log ArbitratorLog) (*ChannelArbitrator, func createTestChannelArbitrator(log ArbitratorLog) (*ChannelArbitrator,
chan struct{}, error) { chan struct{}, chan []ResolutionMsg, chan *chainntnfs.BlockEpoch, error) {
blockEpochs := make(chan *chainntnfs.BlockEpoch)
blockEpoch := &chainntnfs.BlockEpochEvent{ blockEpoch := &chainntnfs.BlockEpochEvent{
Epochs: blockEpochs,
Cancel: func() {}, Cancel: func() {},
} }
@ -158,13 +151,16 @@ func createTestChannelArbitrator(log ArbitratorLog) (*ChannelArbitrator,
ContractBreach: make(chan *lnwallet.BreachRetribution, 1), ContractBreach: make(chan *lnwallet.BreachRetribution, 1),
} }
resolutionChan := make(chan []ResolutionMsg, 1)
chainIO := &mockChainIO{} chainIO := &mockChainIO{}
chainArbCfg := ChainArbitratorConfig{ chainArbCfg := ChainArbitratorConfig{
ChainIO: chainIO, ChainIO: chainIO,
PublishTx: func(*wire.MsgTx) error { PublishTx: func(*wire.MsgTx) error {
return nil return nil
}, },
DeliverResolutionMsg: func(...ResolutionMsg) error { DeliverResolutionMsg: func(msgs ...ResolutionMsg) error {
resolutionChan <- msgs
return nil return nil
}, },
OutgoingBroadcastDelta: 5, OutgoingBroadcastDelta: 5,
@ -213,7 +209,9 @@ func createTestChannelArbitrator(log ArbitratorLog) (*ChannelArbitrator,
ChainEvents: chanEvents, ChainEvents: chanEvents,
} }
return NewChannelArbitrator(arbCfg, nil, log), resolvedChan, nil htlcSets := make(map[HtlcSetKey]htlcSet)
return NewChannelArbitrator(arbCfg, htlcSets, log), resolvedChan,
resolutionChan, blockEpochs, nil
} }
// assertState checks that the ChannelArbitrator is in the state we expect it // assertState checks that the ChannelArbitrator is in the state we expect it
@ -233,7 +231,7 @@ func TestChannelArbitratorCooperativeClose(t *testing.T) {
newStates: make(chan ArbitratorState, 5), newStates: make(chan ArbitratorState, 5),
} }
chanArb, resolved, err := createTestChannelArbitrator(log) chanArb, resolved, _, _, err := createTestChannelArbitrator(log)
if err != nil { if err != nil {
t.Fatalf("unable to create ChannelArbitrator: %v", err) t.Fatalf("unable to create ChannelArbitrator: %v", err)
} }
@ -306,7 +304,7 @@ func TestChannelArbitratorRemoteForceClose(t *testing.T) {
newStates: make(chan ArbitratorState, 5), newStates: make(chan ArbitratorState, 5),
} }
chanArb, resolved, err := createTestChannelArbitrator(log) chanArb, resolved, _, _, err := createTestChannelArbitrator(log)
if err != nil { if err != nil {
t.Fatalf("unable to create ChannelArbitrator: %v", err) t.Fatalf("unable to create ChannelArbitrator: %v", err)
} }
@ -360,7 +358,7 @@ func TestChannelArbitratorLocalForceClose(t *testing.T) {
newStates: make(chan ArbitratorState, 5), newStates: make(chan ArbitratorState, 5),
} }
chanArb, resolved, err := createTestChannelArbitrator(log) chanArb, resolved, _, _, err := createTestChannelArbitrator(log)
if err != nil { if err != nil {
t.Fatalf("unable to create ChannelArbitrator: %v", err) t.Fatalf("unable to create ChannelArbitrator: %v", err)
} }
@ -467,7 +465,9 @@ func TestChannelArbitratorLocalForceClosePendingHtlc(t *testing.T) {
resolvers: make(map[ContractResolver]struct{}), resolvers: make(map[ContractResolver]struct{}),
} }
chanArb, resolved, err := createTestChannelArbitrator(arbLog) chanArb, resolved, resolutions, _, err := createTestChannelArbitrator(
arbLog,
)
if err != nil { if err != nil {
t.Fatalf("unable to create ChannelArbitrator: %v", err) t.Fatalf("unable to create ChannelArbitrator: %v", err)
} }
@ -627,6 +627,22 @@ func TestChannelArbitratorLocalForceClosePendingHtlc(t *testing.T) {
// spent. // spent.
notifier.spendChan <- &chainntnfs.SpendDetail{SpendingTx: closeTx} notifier.spendChan <- &chainntnfs.SpendDetail{SpendingTx: closeTx}
// Finally, we should also receive a resolution message instructing the
// switch to cancel back the HTLC.
select {
case msgs := <-resolutions:
if len(msgs) != 1 {
t.Fatalf("expected 1 message, instead got %v", len(msgs))
}
if msgs[0].HtlcIndex != htlcIndex {
t.Fatalf("wrong htlc index: expected %v, got %v",
htlcIndex, msgs[0].HtlcIndex)
}
case <-time.After(5 * time.Second):
t.Fatalf("resolution msgs not sent")
}
// As this is our own commitment transaction, the HTLC will go through // As this is our own commitment transaction, the HTLC will go through
// to the second level. Channel arbitrator should still not be marked // to the second level. Channel arbitrator should still not be marked
// as resolved. // as resolved.
@ -657,7 +673,7 @@ func TestChannelArbitratorLocalForceCloseRemoteConfirmed(t *testing.T) {
newStates: make(chan ArbitratorState, 5), newStates: make(chan ArbitratorState, 5),
} }
chanArb, resolved, err := createTestChannelArbitrator(log) chanArb, resolved, _, _, err := createTestChannelArbitrator(log)
if err != nil { if err != nil {
t.Fatalf("unable to create ChannelArbitrator: %v", err) t.Fatalf("unable to create ChannelArbitrator: %v", err)
} }
@ -766,7 +782,7 @@ func TestChannelArbitratorLocalForceDoubleSpend(t *testing.T) {
newStates: make(chan ArbitratorState, 5), newStates: make(chan ArbitratorState, 5),
} }
chanArb, resolved, err := createTestChannelArbitrator(log) chanArb, resolved, _, _, err := createTestChannelArbitrator(log)
if err != nil { if err != nil {
t.Fatalf("unable to create ChannelArbitrator: %v", err) t.Fatalf("unable to create ChannelArbitrator: %v", err)
} }
@ -874,7 +890,7 @@ func TestChannelArbitratorPersistence(t *testing.T) {
failLog: true, failLog: true,
} }
chanArb, resolved, err := createTestChannelArbitrator(log) chanArb, resolved, _, _, err := createTestChannelArbitrator(log)
if err != nil { if err != nil {
t.Fatalf("unable to create ChannelArbitrator: %v", err) t.Fatalf("unable to create ChannelArbitrator: %v", err)
} }
@ -908,7 +924,7 @@ func TestChannelArbitratorPersistence(t *testing.T) {
chanArb.Stop() chanArb.Stop()
// Create a new arbitrator with the same log. // Create a new arbitrator with the same log.
chanArb, resolved, err = createTestChannelArbitrator(log) chanArb, resolved, _, _, err = createTestChannelArbitrator(log)
if err != nil { if err != nil {
t.Fatalf("unable to create ChannelArbitrator: %v", err) t.Fatalf("unable to create ChannelArbitrator: %v", err)
} }
@ -941,7 +957,7 @@ func TestChannelArbitratorPersistence(t *testing.T) {
chanArb.Stop() chanArb.Stop()
// Create yet another arbitrator with the same log. // Create yet another arbitrator with the same log.
chanArb, resolved, err = createTestChannelArbitrator(log) chanArb, resolved, _, _, err = createTestChannelArbitrator(log)
if err != nil { if err != nil {
t.Fatalf("unable to create ChannelArbitrator: %v", err) t.Fatalf("unable to create ChannelArbitrator: %v", err)
} }
@ -975,7 +991,7 @@ func TestChannelArbitratorPersistence(t *testing.T) {
// Create a new arbitrator, and now make fetching resolutions succeed. // Create a new arbitrator, and now make fetching resolutions succeed.
log.failFetch = nil log.failFetch = nil
chanArb, resolved, err = createTestChannelArbitrator(log) chanArb, resolved, _, _, err = createTestChannelArbitrator(log)
if err != nil { if err != nil {
t.Fatalf("unable to create ChannelArbitrator: %v", err) t.Fatalf("unable to create ChannelArbitrator: %v", err)
} }
@ -1071,7 +1087,7 @@ func TestChannelArbitratorCommitFailure(t *testing.T) {
failCommitState: test.expectedStates[0], failCommitState: test.expectedStates[0],
} }
chanArb, resolved, err := createTestChannelArbitrator(log) chanArb, resolved, _, _, err := createTestChannelArbitrator(log)
if err != nil { if err != nil {
t.Fatalf("unable to create ChannelArbitrator: %v", err) t.Fatalf("unable to create ChannelArbitrator: %v", err)
} }
@ -1111,7 +1127,7 @@ func TestChannelArbitratorCommitFailure(t *testing.T) {
// Start the arbitrator again, with IsPendingClose reporting // Start the arbitrator again, with IsPendingClose reporting
// the channel closed in the database. // the channel closed in the database.
chanArb, resolved, err = createTestChannelArbitrator(log) chanArb, resolved, _, _, err = createTestChannelArbitrator(log)
if err != nil { if err != nil {
t.Fatalf("unable to create ChannelArbitrator: %v", err) t.Fatalf("unable to create ChannelArbitrator: %v", err)
} }
@ -1157,7 +1173,7 @@ func TestChannelArbitratorEmptyResolutions(t *testing.T) {
failFetch: errNoResolutions, failFetch: errNoResolutions,
} }
chanArb, _, err := createTestChannelArbitrator(log) chanArb, _, _, _, err := createTestChannelArbitrator(log)
if err != nil { if err != nil {
t.Fatalf("unable to create ChannelArbitrator: %v", err) t.Fatalf("unable to create ChannelArbitrator: %v", err)
} }
@ -1195,7 +1211,7 @@ func TestChannelArbitratorAlreadyForceClosed(t *testing.T) {
log := &mockArbitratorLog{ log := &mockArbitratorLog{
state: StateCommitmentBroadcasted, state: StateCommitmentBroadcasted,
} }
chanArb, _, err := createTestChannelArbitrator(log) chanArb, _, _, _, err := createTestChannelArbitrator(log)
if err != nil { if err != nil {
t.Fatalf("unable to create ChannelArbitrator: %v", err) t.Fatalf("unable to create ChannelArbitrator: %v", err)
} }