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:
Johan T. Halseth 2019-06-07 16:42:26 +02:00
parent f556b375ff
commit dd3abbc4ef
No known key found for this signature in database
GPG Key ID: 15BAADA29DA20D26

@ -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")
}
}
}