protocol_test.go 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. // Copyright 2018 The go-ethereum Authors
  2. // This file is part of the go-ethereum library.
  3. //
  4. // The go-ethereum library is free software: you can redistribute it and/or modify
  5. // it under the terms of the GNU Lesser General Public License as published by
  6. // the Free Software Foundation, either version 3 of the License, or
  7. // (at your option) any later version.
  8. //
  9. // The go-ethereum library is distributed in the hope that it will be useful,
  10. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. // GNU Lesser General Public License for more details.
  13. //
  14. // You should have received a copy of the GNU Lesser General Public License
  15. // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
  16. package pss
  17. import (
  18. "bytes"
  19. "context"
  20. "fmt"
  21. "strconv"
  22. "strings"
  23. "testing"
  24. "time"
  25. "github.com/ethereum/go-ethereum/common"
  26. "github.com/ethereum/go-ethereum/p2p"
  27. "github.com/ethereum/go-ethereum/p2p/enode"
  28. "github.com/ethereum/go-ethereum/swarm/log"
  29. )
  30. type protoCtrl struct {
  31. C chan bool
  32. protocol *Protocol
  33. run func(*p2p.Peer, p2p.MsgReadWriter) error
  34. }
  35. // simple ping pong protocol test for the pss devp2p emulation
  36. func TestProtocol(t *testing.T) {
  37. t.Run("32", testProtocol)
  38. t.Run("8", testProtocol)
  39. t.Run("0", testProtocol)
  40. }
  41. func testProtocol(t *testing.T) {
  42. // address hint size
  43. var addrsize int64
  44. paramstring := strings.Split(t.Name(), "/")
  45. addrsize, _ = strconv.ParseInt(paramstring[1], 10, 0)
  46. log.Info("protocol test", "addrsize", addrsize)
  47. topic := PingTopic.String()
  48. clients, err := setupNetwork(2, false)
  49. if err != nil {
  50. t.Fatal(err)
  51. }
  52. var loaddrhex string
  53. err = clients[0].Call(&loaddrhex, "pss_baseAddr")
  54. if err != nil {
  55. t.Fatalf("rpc get node 1 baseaddr fail: %v", err)
  56. }
  57. loaddrhex = loaddrhex[:2+(addrsize*2)]
  58. var roaddrhex string
  59. err = clients[1].Call(&roaddrhex, "pss_baseAddr")
  60. if err != nil {
  61. t.Fatalf("rpc get node 2 baseaddr fail: %v", err)
  62. }
  63. roaddrhex = roaddrhex[:2+(addrsize*2)]
  64. lnodeinfo := &p2p.NodeInfo{}
  65. err = clients[0].Call(&lnodeinfo, "admin_nodeInfo")
  66. if err != nil {
  67. t.Fatalf("rpc nodeinfo node 11 fail: %v", err)
  68. }
  69. var lpubkey string
  70. err = clients[0].Call(&lpubkey, "pss_getPublicKey")
  71. if err != nil {
  72. t.Fatalf("rpc get node 1 pubkey fail: %v", err)
  73. }
  74. var rpubkey string
  75. err = clients[1].Call(&rpubkey, "pss_getPublicKey")
  76. if err != nil {
  77. t.Fatalf("rpc get node 2 pubkey fail: %v", err)
  78. }
  79. time.Sleep(time.Millisecond * 1000) // replace with hive healthy code
  80. lmsgC := make(chan APIMsg)
  81. lctx, cancel := context.WithTimeout(context.Background(), time.Second*10)
  82. defer cancel()
  83. lsub, err := clients[0].Subscribe(lctx, "pss", lmsgC, "receive", topic)
  84. if err != nil {
  85. t.Fatal(err)
  86. }
  87. defer lsub.Unsubscribe()
  88. rmsgC := make(chan APIMsg)
  89. rctx, cancel := context.WithTimeout(context.Background(), time.Second*10)
  90. defer cancel()
  91. rsub, err := clients[1].Subscribe(rctx, "pss", rmsgC, "receive", topic)
  92. if err != nil {
  93. t.Fatal(err)
  94. }
  95. defer rsub.Unsubscribe()
  96. // set reciprocal public keys
  97. err = clients[0].Call(nil, "pss_setPeerPublicKey", rpubkey, topic, roaddrhex)
  98. if err != nil {
  99. t.Fatal(err)
  100. }
  101. err = clients[1].Call(nil, "pss_setPeerPublicKey", lpubkey, topic, loaddrhex)
  102. if err != nil {
  103. t.Fatal(err)
  104. }
  105. // add right peer's public key as protocol peer on left
  106. p := p2p.NewPeer(enode.ID{}, fmt.Sprintf("%x", common.FromHex(loaddrhex)), []p2p.Cap{})
  107. _, err = pssprotocols[lnodeinfo.ID].protocol.AddPeer(p, PingTopic, true, rpubkey)
  108. if err != nil {
  109. t.Fatal(err)
  110. }
  111. // sends ping asym, checks delivery
  112. pssprotocols[lnodeinfo.ID].C <- false
  113. select {
  114. case <-lmsgC:
  115. log.Debug("lnode ok")
  116. case cerr := <-lctx.Done():
  117. t.Fatalf("test message timed out: %v", cerr)
  118. }
  119. select {
  120. case <-rmsgC:
  121. log.Debug("rnode ok")
  122. case cerr := <-lctx.Done():
  123. t.Fatalf("test message timed out: %v", cerr)
  124. }
  125. // sends ping asym, checks delivery
  126. pssprotocols[lnodeinfo.ID].C <- false
  127. select {
  128. case <-lmsgC:
  129. log.Debug("lnode ok")
  130. case cerr := <-lctx.Done():
  131. t.Fatalf("test message timed out: %v", cerr)
  132. }
  133. select {
  134. case <-rmsgC:
  135. log.Debug("rnode ok")
  136. case cerr := <-lctx.Done():
  137. t.Fatalf("test message timed out: %v", cerr)
  138. }
  139. rw := pssprotocols[lnodeinfo.ID].protocol.pubKeyRWPool[rpubkey]
  140. pssprotocols[lnodeinfo.ID].protocol.RemovePeer(true, rpubkey)
  141. if err := rw.WriteMsg(p2p.Msg{
  142. Size: 3,
  143. Payload: bytes.NewReader([]byte("foo")),
  144. }); err == nil {
  145. t.Fatalf("expected error on write")
  146. }
  147. }