mirror of
https://github.com/lightningnetwork/lnd.git
synced 2025-02-23 22:46:40 +01:00
This commit introduces a new invoice htlc interceptor service that intercepts invoice HTLCs during their settlement phase. It forwards HTLCs to a subscribed client to determine their settlement outcomes. This commit also introduces an interface to facilitate integrating the interceptor with other packages.
116 lines
3 KiB
Go
116 lines
3 KiB
Go
package invoices
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/lightningnetwork/lnd/lntypes"
|
|
"github.com/stretchr/testify/mock"
|
|
)
|
|
|
|
type MockInvoiceDB struct {
|
|
mock.Mock
|
|
}
|
|
|
|
func NewInvoicesDBMock() *MockInvoiceDB {
|
|
return &MockInvoiceDB{}
|
|
}
|
|
|
|
func (m *MockInvoiceDB) AddInvoice(invoice *Invoice,
|
|
paymentHash lntypes.Hash) (uint64, error) {
|
|
|
|
args := m.Called(invoice, paymentHash)
|
|
|
|
addIndex, _ := args.Get(0).(uint64)
|
|
|
|
// NOTE: this is a side effect of the AddInvoice method.
|
|
invoice.AddIndex = addIndex
|
|
|
|
return addIndex, args.Error(1)
|
|
}
|
|
|
|
func (m *MockInvoiceDB) InvoicesAddedSince(idx uint64) ([]Invoice, error) {
|
|
args := m.Called(idx)
|
|
invoices, _ := args.Get(0).([]Invoice)
|
|
|
|
return invoices, args.Error(1)
|
|
}
|
|
|
|
func (m *MockInvoiceDB) InvoicesSettledSince(idx uint64) ([]Invoice, error) {
|
|
args := m.Called(idx)
|
|
invoices, _ := args.Get(0).([]Invoice)
|
|
|
|
return invoices, args.Error(1)
|
|
}
|
|
|
|
func (m *MockInvoiceDB) LookupInvoice(ref InvoiceRef) (Invoice, error) {
|
|
args := m.Called(ref)
|
|
invoice, _ := args.Get(0).(Invoice)
|
|
|
|
return invoice, args.Error(1)
|
|
}
|
|
|
|
func (m *MockInvoiceDB) FetchPendingInvoices(ctx context.Context) (
|
|
map[lntypes.Hash]Invoice, error) {
|
|
|
|
args := m.Called(ctx)
|
|
return args.Get(0).(map[lntypes.Hash]Invoice), args.Error(1)
|
|
}
|
|
|
|
func (m *MockInvoiceDB) QueryInvoices(q InvoiceQuery) (InvoiceSlice, error) {
|
|
args := m.Called(q)
|
|
invoiceSlice, _ := args.Get(0).(InvoiceSlice)
|
|
|
|
return invoiceSlice, args.Error(1)
|
|
}
|
|
|
|
func (m *MockInvoiceDB) UpdateInvoice(ref InvoiceRef, setIDHint *SetID,
|
|
callback InvoiceUpdateCallback) (*Invoice, error) {
|
|
|
|
args := m.Called(ref, setIDHint, callback)
|
|
invoice, _ := args.Get(0).(*Invoice)
|
|
|
|
return invoice, args.Error(1)
|
|
}
|
|
|
|
func (m *MockInvoiceDB) DeleteInvoice(invoices []InvoiceDeleteRef) error {
|
|
args := m.Called(invoices)
|
|
|
|
return args.Error(0)
|
|
}
|
|
|
|
func (m *MockInvoiceDB) DeleteCanceledInvoices(ctx context.Context) error {
|
|
args := m.Called(ctx)
|
|
|
|
return args.Error(0)
|
|
}
|
|
|
|
// MockHtlcModifier is a mock implementation of the HtlcModifier interface.
|
|
type MockHtlcModifier struct {
|
|
}
|
|
|
|
// Intercept generates a new intercept session for the given invoice.
|
|
// The call blocks until the client has responded to the request or an
|
|
// error occurs. The response callback is only called if a session was
|
|
// created in the first place, which is only the case if a client is
|
|
// registered.
|
|
func (m *MockHtlcModifier) Intercept(
|
|
_ HtlcModifyRequest, _ func(HtlcModifyResponse)) error {
|
|
|
|
return nil
|
|
}
|
|
|
|
// RegisterInterceptor sets the client callback function that will be
|
|
// called when an invoice is intercepted. If a callback is already set,
|
|
// an error is returned. The returned function must be used to reset the
|
|
// callback to nil once the client is done or disconnects. The read-only channel
|
|
// closes when the server stops.
|
|
func (m *MockHtlcModifier) RegisterInterceptor(HtlcModifyCallback) (func(),
|
|
<-chan struct{}, error) {
|
|
|
|
return func() {}, make(chan struct{}), nil
|
|
}
|
|
|
|
// Ensure that MockHtlcModifier implements the HtlcInterceptor and HtlcModifier
|
|
// interfaces.
|
|
var _ HtlcInterceptor = (*MockHtlcModifier)(nil)
|
|
var _ HtlcModifier = (*MockHtlcModifier)(nil)
|