From f10b4bd8b3ea23bc9786f877854ebd55ce0de36c Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet <juan@benet.ai> Date: Thu, 16 Oct 2014 03:26:33 -0700 Subject: [PATCH] fixed old swarm test --- net/swarm/swarm_test.go | 177 +++++++++++++++++++++------------------- 1 file changed, 92 insertions(+), 85 deletions(-) diff --git a/net/swarm/swarm_test.go b/net/swarm/swarm_test.go index 88de9198d..7683cba01 100644 --- a/net/swarm/swarm_test.go +++ b/net/swarm/swarm_test.go @@ -1,147 +1,154 @@ package swarm import ( + "bytes" "fmt" "testing" + "time" + ci "github.com/jbenet/go-ipfs/crypto" msg "github.com/jbenet/go-ipfs/net/message" peer "github.com/jbenet/go-ipfs/peer" u "github.com/jbenet/go-ipfs/util" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" - msgio "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-msgio" ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" - manet "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr/net" mh "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" ) -func pingListen(t *testing.T, listener manet.Listener, peer *peer.Peer) { +func pong(ctx context.Context, swarm *Swarm) { for { - c, err := listener.Accept() - if err == nil { - go pong(t, c, peer) - } - } -} - -func pong(t *testing.T, c manet.Conn, peer *peer.Peer) { - mrw := msgio.NewReadWriter(c) - for { - data := make([]byte, 1024) - n, err := mrw.ReadMsg(data) - if err != nil { - fmt.Printf("error %v\n", err) - return - } - d := string(data[:n]) - if d != "ping" { - t.Errorf("error: didn't receive ping: '%v'\n", d) - return - } - err = mrw.WriteMsg([]byte("pong")) - if err != nil { - fmt.Printf("error %v\n", err) + select { + case <-ctx.Done(): return + case m1 := <-swarm.Incoming: + if bytes.Equal(m1.Data(), []byte("ping")) { + m2 := msg.New(m1.Peer(), []byte("pong")) + swarm.Outgoing <- m2 + } } } } -func setupPeer(id string, addr string) (*peer.Peer, error) { +func setupPeer(t *testing.T, id string, addr string) *peer.Peer { tcp, err := ma.NewMultiaddr(addr) if err != nil { - return nil, err + t.Fatal(err) } mh, err := mh.FromHexString(id) if err != nil { - return nil, err + t.Fatal(err) } p := &peer.Peer{ID: peer.ID(mh)} + + sk, pk, err := ci.GenerateKeyPair(ci.RSA, 512) + if err != nil { + t.Fatal(err) + } + p.PrivKey = sk + p.PubKey = pk + p.AddAddress(tcp) - return p, nil + return p } -func TestSwarm(t *testing.T) { - t.Skip("TODO FIXME nil pointer") +func makeSwarms(ctx context.Context, t *testing.T, peers map[string]string) []*Swarm { + swarms := []*Swarm{} - local, err := setupPeer("11140beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a30", - "/ip4/127.0.0.1/tcp/1234") - if err != nil { - t.Fatal("error setting up peer", err) + for key, addr := range peers { + local := setupPeer(t, key, addr) + peerstore := peer.NewPeerstore() + swarm, err := NewSwarm(ctx, local, peerstore) + if err != nil { + t.Fatal(err) + } + swarms = append(swarms, swarm) } - peerstore := peer.NewPeerstore() + return swarms +} - swarm, err := NewSwarm(context.Background(), local, peerstore) - if err != nil { - t.Error(err) - } - var peers []*peer.Peer - var listeners []manet.Listener - peerNames := map[string]string{ +func TestSwarm(t *testing.T) { + peers := map[string]string{ + "11140beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a30": "/ip4/127.0.0.1/tcp/1234", "11140beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a31": "/ip4/127.0.0.1/tcp/2345", "11140beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a32": "/ip4/127.0.0.1/tcp/3456", "11140beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33": "/ip4/127.0.0.1/tcp/4567", "11140beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a34": "/ip4/127.0.0.1/tcp/5678", } - for k, n := range peerNames { - peer, err := setupPeer(k, n) + ctx := context.Background() + swarms := makeSwarms(ctx, t, peers) + + // connect everyone + for _, s := range swarms { + peers, err := s.peers.All() if err != nil { - t.Fatal("error setting up peer", err) + t.Fatal(err) } - a := peer.NetAddress("tcp") - if a == nil { - t.Fatal("error setting up peer (addr is nil)", peer) + + for _, p := range *peers { + fmt.Println("dialing") + if _, err := s.Dial(p); err != nil { + t.Fatal("error swarm dialing to peer", err) + } + fmt.Println("dialed") } - listener, err := manet.Listen(a) - if err != nil { - t.Fatal("error setting up listener", err) + } + + // ping/pong + for _, s1 := range swarms { + ctx, cancel := context.WithCancel(ctx) + + // setup all others to pong + for _, s2 := range swarms { + if s1 == s2 { + continue + } + + go pong(ctx, s2) } - go pingListen(t, listener, peer) - _, err = swarm.Dial(peer) + peers, err := s1.peers.All() if err != nil { - t.Fatal("error swarm dialing to peer", err) + t.Fatal(err) } - // ok done, add it. - peers = append(peers, peer) - listeners = append(listeners, listener) - } - - MsgNum := 1000 - for k := 0; k < MsgNum; k++ { - for _, p := range peers { - swarm.Outgoing <- msg.New(p, []byte("ping")) + MsgNum := 1000 + for k := 0; k < MsgNum; k++ { + for _, p := range *peers { + s1.Outgoing <- msg.New(p, []byte("ping")) + } } - } - got := map[u.Key]int{} + got := map[u.Key]int{} + for k := 0; k < (MsgNum * len(*peers)); k++ { + msg := <-s1.Incoming + if string(msg.Data()) != "pong" { + t.Error("unexpected conn output", msg.Data) + } - for k := 0; k < (MsgNum * len(peers)); k++ { - msg := <-swarm.Incoming - if string(msg.Data()) != "pong" { - t.Error("unexpected conn output", msg.Data) + n, _ := got[msg.Peer().Key()] + got[msg.Peer().Key()] = n + 1 } - n, _ := got[msg.Peer().Key()] - got[msg.Peer().Key()] = n + 1 - } - - if len(peers) != len(got) { - t.Error("got less messages than sent") - } + if len(*peers) != len(got) { + t.Error("got less messages than sent") + } - for p, n := range got { - if n != MsgNum { - t.Error("peer did not get all msgs", p, n, "/", MsgNum) + for p, n := range got { + if n != MsgNum { + t.Error("peer did not get all msgs", p, n, "/", MsgNum) + } } + + cancel() + <-time.After(50 * time.Millisecond) } - swarm.Close() - for _, listener := range listeners { - listener.Close() + for _, s := range swarms { + s.Close() } } -- GitLab