nodes_test.go 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. package channeldb
  2. import (
  3. "bytes"
  4. "net"
  5. "testing"
  6. "time"
  7. "github.com/btcsuite/btcd/btcec/v2"
  8. "github.com/btcsuite/btcd/wire"
  9. "github.com/stretchr/testify/require"
  10. )
  11. func TestLinkNodeEncodeDecode(t *testing.T) {
  12. t.Parallel()
  13. fullDB, err := MakeTestDB(t)
  14. require.NoError(t, err, "unable to make test database")
  15. cdb := fullDB.ChannelStateDB()
  16. // First we'll create some initial data to use for populating our test
  17. // LinkNode instances.
  18. _, pub1 := btcec.PrivKeyFromBytes(key[:])
  19. _, pub2 := btcec.PrivKeyFromBytes(rev[:])
  20. addr1, err := net.ResolveTCPAddr("tcp", "10.0.0.1:9000")
  21. require.NoError(t, err, "unable to create test addr")
  22. addr2, err := net.ResolveTCPAddr("tcp", "10.0.0.2:9000")
  23. require.NoError(t, err, "unable to create test addr")
  24. // Create two fresh link node instances with the above dummy data, then
  25. // fully sync both instances to disk.
  26. node1 := NewLinkNode(cdb.linkNodeDB, wire.MainNet, pub1, addr1)
  27. node2 := NewLinkNode(cdb.linkNodeDB, wire.TestNet3, pub2, addr2)
  28. if err := node1.Sync(); err != nil {
  29. t.Fatalf("unable to sync node: %v", err)
  30. }
  31. if err := node2.Sync(); err != nil {
  32. t.Fatalf("unable to sync node: %v", err)
  33. }
  34. // Fetch all current link nodes from the database, they should exactly
  35. // match the two created above.
  36. originalNodes := []*LinkNode{node2, node1}
  37. linkNodes, err := cdb.linkNodeDB.FetchAllLinkNodes()
  38. require.NoError(t, err, "unable to fetch nodes")
  39. for i, node := range linkNodes {
  40. if originalNodes[i].Network != node.Network {
  41. t.Fatalf("node networks don't match: expected %v, got %v",
  42. originalNodes[i].Network, node.Network)
  43. }
  44. originalPubkey := originalNodes[i].IdentityPub.SerializeCompressed()
  45. dbPubkey := node.IdentityPub.SerializeCompressed()
  46. if !bytes.Equal(originalPubkey, dbPubkey) {
  47. t.Fatalf("node pubkeys don't match: expected %x, got %x",
  48. originalPubkey, dbPubkey)
  49. }
  50. if originalNodes[i].LastSeen.Unix() != node.LastSeen.Unix() {
  51. t.Fatalf("last seen timestamps don't match: expected %v got %v",
  52. originalNodes[i].LastSeen.Unix(), node.LastSeen.Unix())
  53. }
  54. if originalNodes[i].Addresses[0].String() != node.Addresses[0].String() {
  55. t.Fatalf("addresses don't match: expected %v, got %v",
  56. originalNodes[i].Addresses, node.Addresses)
  57. }
  58. }
  59. // Next, we'll exercise the methods to append additional IP
  60. // addresses, and also to update the last seen time.
  61. if err := node1.UpdateLastSeen(time.Now()); err != nil {
  62. t.Fatalf("unable to update last seen: %v", err)
  63. }
  64. if err := node1.AddAddress(addr2); err != nil {
  65. t.Fatalf("unable to update addr: %v", err)
  66. }
  67. // Fetch the same node from the database according to its public key.
  68. node1DB, err := cdb.linkNodeDB.FetchLinkNode(pub1)
  69. require.NoError(t, err, "unable to find node")
  70. // Both the last seen timestamp and the list of reachable addresses for
  71. // the node should be updated.
  72. if node1DB.LastSeen.Unix() != node1.LastSeen.Unix() {
  73. t.Fatalf("last seen timestamps don't match: expected %v got %v",
  74. node1.LastSeen.Unix(), node1DB.LastSeen.Unix())
  75. }
  76. if len(node1DB.Addresses) != 2 {
  77. t.Fatalf("wrong length for node1 addresses: expected %v, got %v",
  78. 2, len(node1DB.Addresses))
  79. }
  80. if node1DB.Addresses[0].String() != addr1.String() {
  81. t.Fatalf("wrong address for node: expected %v, got %v",
  82. addr1.String(), node1DB.Addresses[0].String())
  83. }
  84. if node1DB.Addresses[1].String() != addr2.String() {
  85. t.Fatalf("wrong address for node: expected %v, got %v",
  86. addr2.String(), node1DB.Addresses[1].String())
  87. }
  88. }
  89. func TestDeleteLinkNode(t *testing.T) {
  90. t.Parallel()
  91. fullDB, err := MakeTestDB(t)
  92. require.NoError(t, err, "unable to make test database")
  93. cdb := fullDB.ChannelStateDB()
  94. _, pubKey := btcec.PrivKeyFromBytes(key[:])
  95. addr := &net.TCPAddr{
  96. IP: net.ParseIP("127.0.0.1"),
  97. Port: 1337,
  98. }
  99. linkNode := NewLinkNode(cdb.linkNodeDB, wire.TestNet3, pubKey, addr)
  100. if err := linkNode.Sync(); err != nil {
  101. t.Fatalf("unable to write link node to db: %v", err)
  102. }
  103. if _, err := cdb.linkNodeDB.FetchLinkNode(pubKey); err != nil {
  104. t.Fatalf("unable to find link node: %v", err)
  105. }
  106. if err := cdb.linkNodeDB.DeleteLinkNode(pubKey); err != nil {
  107. t.Fatalf("unable to delete link node from db: %v", err)
  108. }
  109. if _, err := cdb.linkNodeDB.FetchLinkNode(pubKey); err == nil {
  110. t.Fatal("should not have found link node in db, but did")
  111. }
  112. }