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
}