payment_result_test.go 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. package htlcswitch
  2. import (
  3. "bytes"
  4. "math/rand"
  5. "reflect"
  6. "testing"
  7. "time"
  8. "github.com/davecgh/go-spew/spew"
  9. "github.com/lightningnetwork/lnd/channeldb"
  10. "github.com/lightningnetwork/lnd/lntypes"
  11. "github.com/lightningnetwork/lnd/lnwire"
  12. "github.com/stretchr/testify/require"
  13. )
  14. // TestNetworkResultSerialization checks that NetworkResults are properly
  15. // (de)serialized.
  16. func TestNetworkResultSerialization(t *testing.T) {
  17. t.Parallel()
  18. var preimage lntypes.Preimage
  19. if _, err := rand.Read(preimage[:]); err != nil {
  20. t.Fatalf("unable gen rand preimag: %v", err)
  21. }
  22. var chanID lnwire.ChannelID
  23. if _, err := rand.Read(chanID[:]); err != nil {
  24. t.Fatalf("unable gen rand chanid: %v", err)
  25. }
  26. var reason [256]byte
  27. if _, err := rand.Read(reason[:]); err != nil {
  28. t.Fatalf("unable gen rand reason: %v", err)
  29. }
  30. settle := &lnwire.UpdateFulfillHTLC{
  31. ChanID: chanID,
  32. ID: 2,
  33. PaymentPreimage: preimage,
  34. ExtraData: make([]byte, 0),
  35. }
  36. fail := &lnwire.UpdateFailHTLC{
  37. ChanID: chanID,
  38. ID: 1,
  39. Reason: []byte{},
  40. ExtraData: make([]byte, 0),
  41. }
  42. fail2 := &lnwire.UpdateFailHTLC{
  43. ChanID: chanID,
  44. ID: 1,
  45. Reason: reason[:],
  46. ExtraData: make([]byte, 0),
  47. }
  48. testCases := []*networkResult{
  49. {
  50. msg: settle,
  51. },
  52. {
  53. msg: fail,
  54. unencrypted: false,
  55. isResolution: false,
  56. },
  57. {
  58. msg: fail,
  59. unencrypted: false,
  60. isResolution: true,
  61. },
  62. {
  63. msg: fail2,
  64. unencrypted: true,
  65. isResolution: false,
  66. },
  67. }
  68. for _, p := range testCases {
  69. var buf bytes.Buffer
  70. if err := serializeNetworkResult(&buf, p); err != nil {
  71. t.Fatalf("serialize failed: %v", err)
  72. }
  73. r := bytes.NewReader(buf.Bytes())
  74. p1, err := deserializeNetworkResult(r)
  75. if err != nil {
  76. t.Fatalf("unable to deserizlize: %v", err)
  77. }
  78. if !reflect.DeepEqual(p, p1) {
  79. t.Fatalf("not equal. %v vs %v", spew.Sdump(p),
  80. spew.Sdump(p1))
  81. }
  82. }
  83. }
  84. // TestNetworkResultStore tests that the networkResult store behaves as
  85. // expected, and that we can store, get and subscribe to results.
  86. func TestNetworkResultStore(t *testing.T) {
  87. t.Parallel()
  88. const numResults = 4
  89. db, err := channeldb.Open(t.TempDir())
  90. if err != nil {
  91. t.Fatal(err)
  92. }
  93. t.Cleanup(func() { db.Close() })
  94. store := newNetworkResultStore(db)
  95. var results []*networkResult
  96. for i := 0; i < numResults; i++ {
  97. n := &networkResult{
  98. msg: &lnwire.UpdateAddHTLC{},
  99. unencrypted: true,
  100. isResolution: true,
  101. }
  102. results = append(results, n)
  103. }
  104. // Subscribe to 2 of them.
  105. var subs []<-chan *networkResult
  106. for i := uint64(0); i < 2; i++ {
  107. sub, err := store.subscribeResult(i)
  108. if err != nil {
  109. t.Fatalf("unable to subscribe: %v", err)
  110. }
  111. subs = append(subs, sub)
  112. }
  113. // Store three of them.
  114. for i := uint64(0); i < 3; i++ {
  115. err := store.storeResult(i, results[i])
  116. if err != nil {
  117. t.Fatalf("unable to store result: %v", err)
  118. }
  119. }
  120. // The two subscribers should be notified.
  121. for _, sub := range subs {
  122. select {
  123. case <-sub:
  124. case <-time.After(1 * time.Second):
  125. t.Fatalf("no result received")
  126. }
  127. }
  128. // Let the third one subscribe now. THe result should be received
  129. // immediately.
  130. sub, err := store.subscribeResult(2)
  131. require.NoError(t, err, "unable to subscribe")
  132. select {
  133. case <-sub:
  134. case <-time.After(1 * time.Second):
  135. t.Fatalf("no result received")
  136. }
  137. // Try fetching the result directly for the non-stored one. This should
  138. // fail.
  139. _, err = store.getResult(3)
  140. if err != ErrPaymentIDNotFound {
  141. t.Fatalf("expected ErrPaymentIDNotFound, got %v", err)
  142. }
  143. // Add the result and try again.
  144. err = store.storeResult(3, results[3])
  145. require.NoError(t, err, "unable to store result")
  146. _, err = store.getResult(3)
  147. require.NoError(t, err, "unable to get result")
  148. // Since we don't delete results from the store (yet), make sure we
  149. // will get subscriptions for all of them.
  150. for i := uint64(0); i < numResults; i++ {
  151. sub, err := store.subscribeResult(i)
  152. if err != nil {
  153. t.Fatalf("unable to subscribe: %v", err)
  154. }
  155. select {
  156. case <-sub:
  157. case <-time.After(1 * time.Second):
  158. t.Fatalf("no result received")
  159. }
  160. }
  161. // Clean the store keeping the first two results.
  162. toKeep := map[uint64]struct{}{
  163. 0: {},
  164. 1: {},
  165. }
  166. // Finally, delete the result.
  167. err = store.cleanStore(toKeep)
  168. require.NoError(t, err)
  169. // Payment IDs 0 and 1 should be found, 2 and 3 should be deleted.
  170. for i := uint64(0); i < numResults; i++ {
  171. _, err = store.getResult(i)
  172. if i <= 1 {
  173. require.NoError(t, err, "unable to get result")
  174. }
  175. if i >= 2 && err != ErrPaymentIDNotFound {
  176. t.Fatalf("expected ErrPaymentIDNotFound, got %v", err)
  177. }
  178. }
  179. }