store_test.go 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. package sweep
  2. import (
  3. "bytes"
  4. "testing"
  5. "github.com/btcsuite/btcd/chaincfg/chainhash"
  6. "github.com/btcsuite/btcd/wire"
  7. "github.com/lightningnetwork/lnd/channeldb"
  8. "github.com/lightningnetwork/lnd/kvdb"
  9. "github.com/stretchr/testify/require"
  10. )
  11. // TestStore asserts that the store persists the presented data to disk and is
  12. // able to retrieve it again.
  13. func TestStore(t *testing.T) {
  14. // Create new store.
  15. cdb, err := channeldb.MakeTestDB(t)
  16. require.NoError(t, err)
  17. var chain chainhash.Hash
  18. store, err := NewSweeperStore(cdb, &chain)
  19. require.NoError(t, err)
  20. // Notify publication of tx1
  21. tx1 := wire.MsgTx{}
  22. tx1.AddTxIn(&wire.TxIn{
  23. PreviousOutPoint: wire.OutPoint{
  24. Index: 1,
  25. },
  26. })
  27. tr1 := &TxRecord{
  28. Txid: tx1.TxHash(),
  29. }
  30. err = store.StoreTx(tr1)
  31. require.NoError(t, err)
  32. // Notify publication of tx2
  33. tx2 := wire.MsgTx{}
  34. tx2.AddTxIn(&wire.TxIn{
  35. PreviousOutPoint: wire.OutPoint{
  36. Index: 2,
  37. },
  38. })
  39. tr2 := &TxRecord{
  40. Txid: tx2.TxHash(),
  41. }
  42. err = store.StoreTx(tr2)
  43. require.NoError(t, err)
  44. // Recreate the sweeper store
  45. store, err = NewSweeperStore(cdb, &chain)
  46. require.NoError(t, err)
  47. // Assert that both txes are recognized as our own.
  48. ours, err := store.IsOurTx(tx1.TxHash())
  49. require.NoError(t, err)
  50. require.True(t, ours, "expected tx to be ours")
  51. ours, err = store.IsOurTx(tx2.TxHash())
  52. require.NoError(t, err)
  53. require.True(t, ours, "expected tx to be ours")
  54. // An different hash should be reported as not being ours.
  55. var unknownHash chainhash.Hash
  56. ours, err = store.IsOurTx(unknownHash)
  57. require.NoError(t, err)
  58. require.False(t, ours, "expected tx to not be ours")
  59. txns, err := store.ListSweeps()
  60. require.NoError(t, err, "unexpected error")
  61. // Create a map containing the sweeps we expect to be returned by list
  62. // sweeps.
  63. expected := map[chainhash.Hash]bool{
  64. tx1.TxHash(): true,
  65. tx2.TxHash(): true,
  66. }
  67. require.Len(t, txns, len(expected))
  68. for _, tx := range txns {
  69. _, ok := expected[tx]
  70. require.Truef(t, ok, "unexpected txid returned: %v", tx)
  71. }
  72. }
  73. // TestTxRecord asserts that the serializeTxRecord and deserializeTxRecord
  74. // behave as expected.
  75. func TestTxRecord(t *testing.T) {
  76. t.Parallel()
  77. // Create a testing record.
  78. //
  79. // NOTE: Txid is omitted because it is not serialized.
  80. tr := &TxRecord{
  81. FeeRate: 1000,
  82. Fee: 10000,
  83. Published: true,
  84. }
  85. var b bytes.Buffer
  86. // Assert we can serialize the record.
  87. err := serializeTxRecord(&b, tr)
  88. require.NoError(t, err)
  89. // Assert we can deserialize the record.
  90. result, err := deserializeTxRecord(&b)
  91. require.NoError(t, err)
  92. // Assert the deserialized record is equal to the original.
  93. require.Equal(t, tr, result)
  94. }
  95. // TestGetTx asserts that the GetTx method behaves as expected.
  96. func TestGetTx(t *testing.T) {
  97. t.Parallel()
  98. cdb, err := channeldb.MakeTestDB(t)
  99. require.NoError(t, err)
  100. // Create a testing store.
  101. chain := chainhash.Hash{}
  102. store, err := NewSweeperStore(cdb, &chain)
  103. require.NoError(t, err)
  104. // Create a testing record.
  105. txid := chainhash.Hash{1, 2, 3}
  106. tr := &TxRecord{
  107. Txid: txid,
  108. FeeRate: 1000,
  109. Fee: 10000,
  110. Published: true,
  111. }
  112. // Assert we can store this tx record.
  113. err = store.StoreTx(tr)
  114. require.NoError(t, err)
  115. // Assert we can query the tx record.
  116. result, err := store.GetTx(txid)
  117. require.NoError(t, err)
  118. require.Equal(t, tr, result)
  119. // Assert we get an error when querying a non-existing tx.
  120. _, err = store.GetTx(chainhash.Hash{4, 5, 6})
  121. require.ErrorIs(t, ErrTxNotFound, err)
  122. }
  123. // TestGetTxCompatible asserts that when there's old tx record data in the
  124. // database it can be successfully queried.
  125. func TestGetTxCompatible(t *testing.T) {
  126. t.Parallel()
  127. cdb, err := channeldb.MakeTestDB(t)
  128. require.NoError(t, err)
  129. // Create a testing store.
  130. chain := chainhash.Hash{}
  131. store, err := NewSweeperStore(cdb, &chain)
  132. require.NoError(t, err)
  133. // Create a testing txid.
  134. txid := chainhash.Hash{0, 1, 2, 3}
  135. // Create a record using the old format "hash -> empty byte slice".
  136. err = kvdb.Update(cdb, func(tx kvdb.RwTx) error {
  137. txHashesBucket := tx.ReadWriteBucket(txHashesBucketKey)
  138. return txHashesBucket.Put(txid[:], []byte{})
  139. }, func() {})
  140. require.NoError(t, err)
  141. // Assert we can query the tx record.
  142. result, err := store.GetTx(txid)
  143. require.NoError(t, err)
  144. require.Equal(t, txid, result.Txid)
  145. // Assert the Published field is true.
  146. require.True(t, result.Published)
  147. }
  148. // TestDeleteTx asserts that the DeleteTx method behaves as expected.
  149. func TestDeleteTx(t *testing.T) {
  150. t.Parallel()
  151. cdb, err := channeldb.MakeTestDB(t)
  152. require.NoError(t, err)
  153. // Create a testing store.
  154. chain := chainhash.Hash{}
  155. store, err := NewSweeperStore(cdb, &chain)
  156. require.NoError(t, err)
  157. // Create a testing record.
  158. txid := chainhash.Hash{1, 2, 3}
  159. tr := &TxRecord{
  160. Txid: txid,
  161. FeeRate: 1000,
  162. Fee: 10000,
  163. Published: true,
  164. }
  165. // Assert we can store this tx record.
  166. err = store.StoreTx(tr)
  167. require.NoError(t, err)
  168. // Assert we can delete the tx record.
  169. err = store.DeleteTx(txid)
  170. require.NoError(t, err)
  171. // Query it again should give us an error.
  172. _, err = store.GetTx(txid)
  173. require.ErrorIs(t, ErrTxNotFound, err)
  174. // Assert deleting a non-existing tx doesn't return an error.
  175. err = store.DeleteTx(chainhash.Hash{4, 5, 6})
  176. require.NoError(t, err)
  177. }