htlcswitch/payment_result_test: add TestNetworkResultStore
TestNetworkResultStore tests that the networkResult store behaves as expected, and that we can store, get and subscribe to results.
This commit is contained in:
parent
f556b375ff
commit
dd3abbc4ef
@ -2,11 +2,14 @@ package htlcswitch
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
"io/ioutil"
|
||||||
"math/rand"
|
"math/rand"
|
||||||
"reflect"
|
"reflect"
|
||||||
"testing"
|
"testing"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/davecgh/go-spew/spew"
|
"github.com/davecgh/go-spew/spew"
|
||||||
|
"github.com/lightningnetwork/lnd/channeldb"
|
||||||
"github.com/lightningnetwork/lnd/lntypes"
|
"github.com/lightningnetwork/lnd/lntypes"
|
||||||
"github.com/lightningnetwork/lnd/lnwire"
|
"github.com/lightningnetwork/lnd/lnwire"
|
||||||
)
|
)
|
||||||
@ -88,3 +91,102 @@ func TestNetworkResultSerialization(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TestNetworkResultStore tests that the networkResult store behaves as
|
||||||
|
// expected, and that we can store, get and subscribe to results.
|
||||||
|
func TestNetworkResultStore(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
const numResults = 4
|
||||||
|
|
||||||
|
tempDir, err := ioutil.TempDir("", "testdb")
|
||||||
|
db, err := channeldb.Open(tempDir)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
store := newNetworkResultStore(db)
|
||||||
|
|
||||||
|
var results []*networkResult
|
||||||
|
for i := 0; i < numResults; i++ {
|
||||||
|
n := &networkResult{
|
||||||
|
msg: &lnwire.UpdateAddHTLC{},
|
||||||
|
unencrypted: true,
|
||||||
|
isResolution: true,
|
||||||
|
}
|
||||||
|
results = append(results, n)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Subscribe to 2 of them.
|
||||||
|
var subs []<-chan *networkResult
|
||||||
|
for i := uint64(0); i < 2; i++ {
|
||||||
|
sub, err := store.subscribeResult(i)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("unable to subscribe: %v", err)
|
||||||
|
}
|
||||||
|
subs = append(subs, sub)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Store three of them.
|
||||||
|
for i := uint64(0); i < 3; i++ {
|
||||||
|
err := store.storeResult(i, results[i])
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("unable to store result: %v", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// The two subscribers should be notified.
|
||||||
|
for _, sub := range subs {
|
||||||
|
select {
|
||||||
|
case <-sub:
|
||||||
|
case <-time.After(1 * time.Second):
|
||||||
|
t.Fatalf("no result received")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Let the third one subscribe now. THe result should be received
|
||||||
|
// immediately.
|
||||||
|
sub, err := store.subscribeResult(2)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("unable to subscribe: %v", err)
|
||||||
|
}
|
||||||
|
select {
|
||||||
|
case <-sub:
|
||||||
|
case <-time.After(1 * time.Second):
|
||||||
|
t.Fatalf("no result received")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Try fetching the result directly for the non-stored one. This should
|
||||||
|
// fail.
|
||||||
|
_, err = store.getResult(3)
|
||||||
|
if err != ErrPaymentIDNotFound {
|
||||||
|
t.Fatalf("expected ErrPaymentIDNotFound, got %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add the result and try again.
|
||||||
|
err = store.storeResult(3, results[3])
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("unable to store result: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err = store.getResult(3)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("unable to get result: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Since we don't delete results from the store (yet), make sure we
|
||||||
|
// will get subscriptions for all of them.
|
||||||
|
// TODO(halseth): check deletion when we have reliable handoff.
|
||||||
|
for i := uint64(0); i < numResults; i++ {
|
||||||
|
sub, err := store.subscribeResult(i)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("unable to subscribe: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
select {
|
||||||
|
case <-sub:
|
||||||
|
case <-time.After(1 * time.Second):
|
||||||
|
t.Fatalf("no result received")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user