209 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			209 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package p2p
 | 
						|
 | 
						|
import (
 | 
						|
	"bytes"
 | 
						|
	"fmt"
 | 
						|
	"net"
 | 
						|
	"testing"
 | 
						|
	"time"
 | 
						|
)
 | 
						|
 | 
						|
type TestNetwork struct {
 | 
						|
	connections map[string]*TestNetworkConnection
 | 
						|
	dialer      Dialer
 | 
						|
	maxinbound  int
 | 
						|
}
 | 
						|
 | 
						|
func NewTestNetwork(maxinbound int) *TestNetwork {
 | 
						|
	connections := make(map[string]*TestNetworkConnection)
 | 
						|
	return &TestNetwork{
 | 
						|
		connections: connections,
 | 
						|
		dialer:      &TestDialer{connections},
 | 
						|
		maxinbound:  maxinbound,
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func (self *TestNetwork) Dialer(addr net.Addr) (Dialer, error) {
 | 
						|
	return self.dialer, nil
 | 
						|
}
 | 
						|
 | 
						|
func (self *TestNetwork) Listener(addr net.Addr) (net.Listener, error) {
 | 
						|
	return &TestListener{
 | 
						|
		connections: self.connections,
 | 
						|
		addr:        addr,
 | 
						|
		max:         self.maxinbound,
 | 
						|
	}, nil
 | 
						|
}
 | 
						|
 | 
						|
func (self *TestNetwork) Start() error {
 | 
						|
	return nil
 | 
						|
}
 | 
						|
 | 
						|
func (self *TestNetwork) NewAddr(string, int) (addr net.Addr, err error) {
 | 
						|
	return
 | 
						|
}
 | 
						|
 | 
						|
func (self *TestNetwork) ParseAddr(string) (addr net.Addr, err error) {
 | 
						|
	return
 | 
						|
}
 | 
						|
 | 
						|
type TestAddr struct {
 | 
						|
	name string
 | 
						|
}
 | 
						|
 | 
						|
func (self *TestAddr) String() string {
 | 
						|
	return self.name
 | 
						|
}
 | 
						|
 | 
						|
func (*TestAddr) Network() string {
 | 
						|
	return "test"
 | 
						|
}
 | 
						|
 | 
						|
type TestDialer struct {
 | 
						|
	connections map[string]*TestNetworkConnection
 | 
						|
}
 | 
						|
 | 
						|
func (self *TestDialer) Dial(network string, addr string) (conn net.Conn, err error) {
 | 
						|
	address := &TestAddr{addr}
 | 
						|
	tconn := NewTestNetworkConnection(address)
 | 
						|
	self.connections[addr] = tconn
 | 
						|
	conn = net.Conn(tconn)
 | 
						|
	return
 | 
						|
}
 | 
						|
 | 
						|
type TestListener struct {
 | 
						|
	connections map[string]*TestNetworkConnection
 | 
						|
	addr        net.Addr
 | 
						|
	max         int
 | 
						|
	i           int
 | 
						|
}
 | 
						|
 | 
						|
func (self *TestListener) Accept() (conn net.Conn, err error) {
 | 
						|
	self.i++
 | 
						|
	if self.i > self.max {
 | 
						|
		err = fmt.Errorf("no more")
 | 
						|
	} else {
 | 
						|
		addr := &TestAddr{fmt.Sprintf("inboundpeer-%d", self.i)}
 | 
						|
		tconn := NewTestNetworkConnection(addr)
 | 
						|
		key := tconn.RemoteAddr().String()
 | 
						|
		self.connections[key] = tconn
 | 
						|
		conn = net.Conn(tconn)
 | 
						|
		fmt.Printf("accepted connection from: %v \n", addr)
 | 
						|
	}
 | 
						|
	return
 | 
						|
}
 | 
						|
 | 
						|
func (self *TestListener) Close() error {
 | 
						|
	return nil
 | 
						|
}
 | 
						|
 | 
						|
func (self *TestListener) Addr() net.Addr {
 | 
						|
	return self.addr
 | 
						|
}
 | 
						|
 | 
						|
func SetupTestServer(handlers Handlers) (network *TestNetwork, server *Server) {
 | 
						|
	network = NewTestNetwork(1)
 | 
						|
	addr := &TestAddr{"test:30303"}
 | 
						|
	identity := NewSimpleClientIdentity("clientIdentifier", "version", "customIdentifier", "pubkey")
 | 
						|
	maxPeers := 2
 | 
						|
	if handlers == nil {
 | 
						|
		handlers = make(Handlers)
 | 
						|
	}
 | 
						|
	blackist := NewBlacklist()
 | 
						|
	server = New(network, addr, identity, handlers, maxPeers, blackist)
 | 
						|
	fmt.Println(server.identity.Pubkey())
 | 
						|
	return
 | 
						|
}
 | 
						|
 | 
						|
func TestServerListener(t *testing.T) {
 | 
						|
	network, server := SetupTestServer(nil)
 | 
						|
	server.Start(true, false)
 | 
						|
	time.Sleep(10 * time.Millisecond)
 | 
						|
	server.Stop()
 | 
						|
	peer1, ok := network.connections["inboundpeer-1"]
 | 
						|
	if !ok {
 | 
						|
		t.Error("not found inbound peer 1")
 | 
						|
	} else {
 | 
						|
		fmt.Printf("out: %v\n", peer1.Out)
 | 
						|
		if len(peer1.Out) != 2 {
 | 
						|
			t.Errorf("not enough messages sent to peer 1: %v ", len(peer1.Out))
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
func TestServerDialer(t *testing.T) {
 | 
						|
	network, server := SetupTestServer(nil)
 | 
						|
	server.Start(false, true)
 | 
						|
	server.peerConnect <- &TestAddr{"outboundpeer-1"}
 | 
						|
	time.Sleep(10 * time.Millisecond)
 | 
						|
	server.Stop()
 | 
						|
	peer1, ok := network.connections["outboundpeer-1"]
 | 
						|
	if !ok {
 | 
						|
		t.Error("not found outbound peer 1")
 | 
						|
	} else {
 | 
						|
		fmt.Printf("out: %v\n", peer1.Out)
 | 
						|
		if len(peer1.Out) != 2 {
 | 
						|
			t.Errorf("not enough messages sent to peer 1: %v ", len(peer1.Out))
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func TestServerBroadcast(t *testing.T) {
 | 
						|
	handlers := make(Handlers)
 | 
						|
	testProtocol := &TestProtocol{Msgs: []*Msg{}}
 | 
						|
	handlers["aaa"] = func(p *Peer) Protocol { return testProtocol }
 | 
						|
	network, server := SetupTestServer(handlers)
 | 
						|
	server.Start(true, true)
 | 
						|
	server.peerConnect <- &TestAddr{"outboundpeer-1"}
 | 
						|
	time.Sleep(10 * time.Millisecond)
 | 
						|
	msg, _ := NewMsg(0)
 | 
						|
	server.Broadcast("", msg)
 | 
						|
	packet := Packet(0, 0)
 | 
						|
	time.Sleep(10 * time.Millisecond)
 | 
						|
	server.Stop()
 | 
						|
	peer1, ok := network.connections["outboundpeer-1"]
 | 
						|
	if !ok {
 | 
						|
		t.Error("not found outbound peer 1")
 | 
						|
	} else {
 | 
						|
		fmt.Printf("out: %v\n", peer1.Out)
 | 
						|
		if len(peer1.Out) != 3 {
 | 
						|
			t.Errorf("not enough messages sent to peer 1: %v ", len(peer1.Out))
 | 
						|
		} else {
 | 
						|
			if bytes.Compare(peer1.Out[1], packet) != 0 {
 | 
						|
				t.Errorf("incorrect broadcast packet %v != %v", peer1.Out[1], packet)
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}
 | 
						|
	peer2, ok := network.connections["inboundpeer-1"]
 | 
						|
	if !ok {
 | 
						|
		t.Error("not found inbound peer 2")
 | 
						|
	} else {
 | 
						|
		fmt.Printf("out: %v\n", peer2.Out)
 | 
						|
		if len(peer1.Out) != 3 {
 | 
						|
			t.Errorf("not enough messages sent to peer 2: %v ", len(peer2.Out))
 | 
						|
		} else {
 | 
						|
			if bytes.Compare(peer2.Out[1], packet) != 0 {
 | 
						|
				t.Errorf("incorrect broadcast packet %v != %v", peer2.Out[1], packet)
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func TestServerPeersMessage(t *testing.T) {
 | 
						|
	handlers := make(Handlers)
 | 
						|
	_, server := SetupTestServer(handlers)
 | 
						|
	server.Start(true, true)
 | 
						|
	defer server.Stop()
 | 
						|
	server.peerConnect <- &TestAddr{"outboundpeer-1"}
 | 
						|
	time.Sleep(10 * time.Millisecond)
 | 
						|
	peersMsg, err := server.PeersMessage()
 | 
						|
	fmt.Println(peersMsg)
 | 
						|
	if err != nil {
 | 
						|
		t.Errorf("expect no error, got %v", err)
 | 
						|
	}
 | 
						|
	if c := server.PeerCount(); c != 2 {
 | 
						|
		t.Errorf("expect 2 peers, got %v", c)
 | 
						|
	}
 | 
						|
}
 |