@cryptotaxi247 / kubo / commits / f10b4bd8b

fixed old swarm test

Juan Batiz-Benet committed Oct 16, 2014 at 03:26 UTC f10b4bd8b3ea23bc9786f877854ebd55ce0de36c
1 file changed +92 -85
net/swarm/swarm_test.go
+92 -85
@@ -1,147 +1,154 @@
1 package swarm
2
3 import (
4 + "bytes"
5 "fmt"
6 "testing"
7 + "time"
8
9 + ci "github.com/jbenet/go-ipfs/crypto"
10 msg "github.com/jbenet/go-ipfs/net/message"
11 peer "github.com/jbenet/go-ipfs/peer"
12 u "github.com/jbenet/go-ipfs/util"
13
14 context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context"
12 - msgio "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-msgio"
15 ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr"
14 - manet "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr/net"
16 mh "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash"
17 )
18
18 -func pingListen(t *testing.T, listener manet.Listener, peer *peer.Peer) {
19 +func pong(ctx context.Context, swarm *Swarm) {
20 for {
20 - c, err := listener.Accept()
21 - if err == nil {
22 - go pong(t, c, peer)
23 - }
24 - }
25 -}
26 -
27 -func pong(t *testing.T, c manet.Conn, peer *peer.Peer) {
28 - mrw := msgio.NewReadWriter(c)
29 - for {
30 - data := make([]byte, 1024)
31 - n, err := mrw.ReadMsg(data)
32 - if err != nil {
33 - fmt.Printf("error %v\n", err)
34 - return
35 - }
36 - d := string(data[:n])
37 - if d != "ping" {
38 - t.Errorf("error: didn't receive ping: '%v'\n", d)
39 - return
40 - }
41 - err = mrw.WriteMsg([]byte("pong"))
42 - if err != nil {
43 - fmt.Printf("error %v\n", err)
21 + select {
22 + case <-ctx.Done():
23 return
24 + case m1 := <-swarm.Incoming:
25 + if bytes.Equal(m1.Data(), []byte("ping")) {
26 + m2 := msg.New(m1.Peer(), []byte("pong"))
27 + swarm.Outgoing <- m2
28 + }
29 }
30 }
31 }
32
49 -func setupPeer(id string, addr string) (*peer.Peer, error) {
33 +func setupPeer(t *testing.T, id string, addr string) *peer.Peer {
34 tcp, err := ma.NewMultiaddr(addr)
35 if err != nil {
52 - return nil, err
36 + t.Fatal(err)
37 }
38
39 mh, err := mh.FromHexString(id)
40 if err != nil {
57 - return nil, err
41 + t.Fatal(err)
42 }
43
44 p := &peer.Peer{ID: peer.ID(mh)}
45 +
46 + sk, pk, err := ci.GenerateKeyPair(ci.RSA, 512)
47 + if err != nil {
48 + t.Fatal(err)
49 + }
50 + p.PrivKey = sk
51 + p.PubKey = pk
52 +
53 p.AddAddress(tcp)
62 - return p, nil
54 + return p
55 }
56
65 -func TestSwarm(t *testing.T) {
66 - t.Skip("TODO FIXME nil pointer")
57 +func makeSwarms(ctx context.Context, t *testing.T, peers map[string]string) []*Swarm {
58 + swarms := []*Swarm{}
59
68 - local, err := setupPeer("11140beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a30",
69 - "/ip4/127.0.0.1/tcp/1234")
70 - if err != nil {
71 - t.Fatal("error setting up peer", err)
60 + for key, addr := range peers {
61 + local := setupPeer(t, key, addr)
62 + peerstore := peer.NewPeerstore()
63 + swarm, err := NewSwarm(ctx, local, peerstore)
64 + if err != nil {
65 + t.Fatal(err)
66 + }
67 + swarms = append(swarms, swarm)
68 }
69
74 - peerstore := peer.NewPeerstore()
70 + return swarms
71 +}
72
76 - swarm, err := NewSwarm(context.Background(), local, peerstore)
77 - if err != nil {
78 - t.Error(err)
79 - }
80 - var peers []*peer.Peer
81 - var listeners []manet.Listener
82 - peerNames := map[string]string{
73 +func TestSwarm(t *testing.T) {
74 + peers := map[string]string{
75 + "11140beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a30": "/ip4/127.0.0.1/tcp/1234",
76 "11140beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a31": "/ip4/127.0.0.1/tcp/2345",
77 "11140beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a32": "/ip4/127.0.0.1/tcp/3456",
78 "11140beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33": "/ip4/127.0.0.1/tcp/4567",
79 "11140beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a34": "/ip4/127.0.0.1/tcp/5678",
80 }
81
89 - for k, n := range peerNames {
90 - peer, err := setupPeer(k, n)
82 + ctx := context.Background()
83 + swarms := makeSwarms(ctx, t, peers)
84 +
85 + // connect everyone
86 + for _, s := range swarms {
87 + peers, err := s.peers.All()
88 if err != nil {
92 - t.Fatal("error setting up peer", err)
89 + t.Fatal(err)
90 }
94 - a := peer.NetAddress("tcp")
95 - if a == nil {
96 - t.Fatal("error setting up peer (addr is nil)", peer)
91 +
92 + for _, p := range *peers {
93 + fmt.Println("dialing")
94 + if _, err := s.Dial(p); err != nil {
95 + t.Fatal("error swarm dialing to peer", err)
96 + }
97 + fmt.Println("dialed")
98 }
98 - listener, err := manet.Listen(a)
99 - if err != nil {
100 - t.Fatal("error setting up listener", err)
99 + }
100 +
101 + // ping/pong
102 + for _, s1 := range swarms {
103 + ctx, cancel := context.WithCancel(ctx)
104 +
105 + // setup all others to pong
106 + for _, s2 := range swarms {
107 + if s1 == s2 {
108 + continue
109 + }
110 +
111 + go pong(ctx, s2)
112 }
102 - go pingListen(t, listener, peer)
113
104 - _, err = swarm.Dial(peer)
114 + peers, err := s1.peers.All()
115 if err != nil {
106 - t.Fatal("error swarm dialing to peer", err)
116 + t.Fatal(err)
117 }
118
109 - // ok done, add it.
110 - peers = append(peers, peer)
111 - listeners = append(listeners, listener)
112 - }
113 -
114 - MsgNum := 1000
115 - for k := 0; k < MsgNum; k++ {
116 - for _, p := range peers {
117 - swarm.Outgoing <- msg.New(p, []byte("ping"))
119 + MsgNum := 1000
120 + for k := 0; k < MsgNum; k++ {
121 + for _, p := range *peers {
122 + s1.Outgoing <- msg.New(p, []byte("ping"))
123 + }
124 }
119 - }
125
121 - got := map[u.Key]int{}
126 + got := map[u.Key]int{}
127 + for k := 0; k < (MsgNum * len(*peers)); k++ {
128 + msg := <-s1.Incoming
129 + if string(msg.Data()) != "pong" {
130 + t.Error("unexpected conn output", msg.Data)
131 + }
132
123 - for k := 0; k < (MsgNum * len(peers)); k++ {
124 - msg := <-swarm.Incoming
125 - if string(msg.Data()) != "pong" {
126 - t.Error("unexpected conn output", msg.Data)
133 + n, _ := got[msg.Peer().Key()]
134 + got[msg.Peer().Key()] = n + 1
135 }
136
129 - n, _ := got[msg.Peer().Key()]
130 - got[msg.Peer().Key()] = n + 1
131 - }
132 -
133 - if len(peers) != len(got) {
134 - t.Error("got less messages than sent")
135 - }
137 + if len(*peers) != len(got) {
138 + t.Error("got less messages than sent")
139 + }
140
137 - for p, n := range got {
138 - if n != MsgNum {
139 - t.Error("peer did not get all msgs", p, n, "/", MsgNum)
141 + for p, n := range got {
142 + if n != MsgNum {
143 + t.Error("peer did not get all msgs", p, n, "/", MsgNum)
144 + }
145 }
146 +
147 + cancel()
148 + <-time.After(50 * time.Millisecond)
149 }
150
143 - swarm.Close()
144 - for _, listener := range listeners {
145 - listener.Close()
151 + for _, s := range swarms {
152 + s.Close()
153 }
154 }