9 cfg "github.com/vapor/config"
10 conn "github.com/vapor/p2p/connection"
11 "github.com/vapor/p2p/signlib"
12 "github.com/vapor/version"
17 func TestPeerBasic(t *testing.T) {
18 privKey, err := signlib.NewPrivKey()
23 // simulate remote peer
24 rp := &remotePeer{PrivKey: privKey, Config: testCfg}
28 p, err := createOutboundPeerAndPerformHandshake(rp.Addr(), cfg.DefaultP2PConfig())
39 func TestPeerSend(t *testing.T) {
41 privKey, err := signlib.NewPrivKey()
45 // simulate remote peer
46 rp := &remotePeer{PrivKey: privKey, Config: config}
50 p, err := createOutboundPeerAndPerformHandshake(rp.Addr(), config.P2P)
61 if ok := p.CanSend(testCh); !ok {
62 t.Fatal("TestPeerSend send err")
65 if ok := p.TrySend(testCh, []byte("test date")); !ok {
66 t.Fatal("TestPeerSend try send err")
70 func createOutboundPeerAndPerformHandshake(
72 config *cfg.P2PConfig,
74 chDescs := []*conn.ChannelDescriptor{
75 {ID: testCh, Priority: 1},
77 reactorsByCh := map[byte]Reactor{testCh: NewTestReactor(chDescs, true)}
78 privKey, err := signlib.NewPrivKey()
82 peerConfig := DefaultPeerConfig(config)
83 pc, err := newOutboundPeerConn(addr, privKey, peerConfig)
87 nodeInfo, err := pc.HandshakeTimeout(&NodeInfo{
90 Version: "123.123.123",
96 p := newPeer(pc, nodeInfo, reactorsByCh, chDescs, nil, false)
100 type remotePeer struct {
101 PrivKey signlib.PrivKey
108 func (rp *remotePeer) Addr() *NetAddress {
112 func (rp *remotePeer) Start() {
113 if rp.listenAddr == "" {
114 rp.listenAddr = "127.0.0.1:0"
117 l, e := net.Listen("tcp", rp.listenAddr) // any available address
119 fmt.Println("net.Listen tcp :0:", e)
121 rp.addr = NewNetAddress(l.Addr())
122 rp.quit = make(chan struct{})
126 func (rp *remotePeer) Stop() {
130 func (rp *remotePeer) accept(l net.Listener) {
131 conns := []net.Conn{}
134 conn, err := l.Accept()
136 fmt.Println("Failed to accept conn:", err)
139 pc, err := newInboundPeerConn(conn, rp.PrivKey, rp.Config.P2P)
141 fmt.Println("Failed to create a peer:", err)
144 _, err = pc.HandshakeTimeout(&NodeInfo{
145 PubKey: rp.PrivKey.XPub().String(),
146 Moniker: "remote_peer",
147 Network: rp.Config.ChainID,
148 Version: version.Version,
149 ListenAddr: l.Addr().String(),
152 fmt.Println("Failed to perform handshake:", err)
154 conns = append(conns, conn)
157 for _, conn := range conns {
158 if err := conn.Close(); err != nil {
168 type inboundPeer struct {
169 PrivKey signlib.PrivKey
173 func (ip *inboundPeer) dial(addr *NetAddress) {
174 pc, err := newOutboundPeerConn(addr, ip.PrivKey, DefaultPeerConfig(ip.config.P2P))
176 fmt.Println("newOutboundPeerConn:", err)
180 _, err = pc.HandshakeTimeout(&NodeInfo{
181 PubKey: ip.PrivKey.XPub().String(),
182 Moniker: "remote_peer",
183 Network: ip.config.ChainID,
184 Version: version.Version,
185 ListenAddr: addr.String(),
188 fmt.Println("Failed to perform handshake:", err)
191 time.AfterFunc(10*time.Second, pc.CloseConn)