9 cfg "github.com/vapor/config"
10 "github.com/vapor/consensus"
11 conn "github.com/vapor/p2p/connection"
12 "github.com/vapor/p2p/signlib"
13 "github.com/vapor/version"
18 func TestPeerBasic(t *testing.T) {
19 privKey, err := signlib.NewPrivKey()
24 // simulate remote peer
25 rp := &remotePeer{PrivKey: privKey, Config: testCfg}
29 p, err := createOutboundPeerAndPerformHandshake(rp.Addr(), cfg.DefaultP2PConfig())
40 func TestPeerSend(t *testing.T) {
42 privKey, err := signlib.NewPrivKey()
46 // simulate remote peer
47 rp := &remotePeer{PrivKey: privKey, Config: config}
51 p, err := createOutboundPeerAndPerformHandshake(rp.Addr(), config.P2P)
62 if ok := p.CanSend(testCh); !ok {
63 t.Fatal("TestPeerSend send err")
66 if ok := p.TrySend(testCh, []byte("test date")); !ok {
67 t.Fatal("TestPeerSend try send err")
71 func createOutboundPeerAndPerformHandshake(
73 config *cfg.P2PConfig,
75 chDescs := []*conn.ChannelDescriptor{
76 {ID: testCh, Priority: 1},
78 reactorsByCh := map[byte]Reactor{testCh: NewTestReactor(chDescs, true)}
79 privKey, err := signlib.NewPrivKey()
83 peerConfig := DefaultPeerConfig(config)
84 pc, err := newOutboundPeerConn(addr, privKey, peerConfig)
88 nodeInfo, err := pc.HandshakeTimeout(&NodeInfo{
91 Version: "123.123.123",
97 p := newPeer(pc, nodeInfo, reactorsByCh, chDescs, nil, false)
101 type remotePeer struct {
102 PrivKey signlib.PrivKey
109 func (rp *remotePeer) Addr() *NetAddress {
113 func (rp *remotePeer) Start() {
114 if rp.listenAddr == "" {
115 rp.listenAddr = "127.0.0.1:0"
118 l, e := net.Listen("tcp", rp.listenAddr) // any available address
120 fmt.Println("net.Listen tcp :0:", e)
122 rp.addr = NewNetAddress(l.Addr())
123 rp.quit = make(chan struct{})
127 func (rp *remotePeer) Stop() {
131 func (rp *remotePeer) accept(l net.Listener) {
132 conns := []net.Conn{}
135 conn, err := l.Accept()
137 fmt.Println("Failed to accept conn:", err)
140 pc, err := newInboundPeerConn(conn, rp.PrivKey, rp.Config.P2P)
142 fmt.Println("Failed to create a peer:", err)
145 _, err = pc.HandshakeTimeout(&NodeInfo{
146 PubKey: rp.PrivKey.XPub().String(),
147 Moniker: "remote_peer",
148 Network: rp.Config.ChainID,
149 Version: version.Version,
150 ListenAddr: l.Addr().String(),
151 ServiceFlag: consensus.DefaultServices,
154 fmt.Println("Failed to perform handshake:", err)
156 conns = append(conns, conn)
159 for _, conn := range conns {
160 if err := conn.Close(); err != nil {
170 type inboundPeer struct {
171 PrivKey signlib.PrivKey
175 func (ip *inboundPeer) dial(addr *NetAddress) {
176 pc, err := newOutboundPeerConn(addr, ip.PrivKey, DefaultPeerConfig(ip.config.P2P))
178 fmt.Println("newOutboundPeerConn:", err)
182 _, err = pc.HandshakeTimeout(&NodeInfo{
183 PubKey: ip.PrivKey.XPub().String(),
184 Moniker: "remote_peer",
185 Network: ip.config.ChainID,
186 Version: version.Version,
187 ListenAddr: addr.String(),
190 fmt.Println("Failed to perform handshake:", err)
193 time.AfterFunc(10*time.Second, pc.CloseConn)