github.com/zignig/go-ipfs@v0.0.0-20141111235910-c9e5fdf55a52/net/conn/dial_test.go (about) 1 package conn 2 3 import ( 4 "testing" 5 6 ci "github.com/jbenet/go-ipfs/crypto" 7 peer "github.com/jbenet/go-ipfs/peer" 8 9 context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" 10 ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" 11 ) 12 13 func setupPeer(addr string) (peer.Peer, error) { 14 tcp, err := ma.NewMultiaddr(addr) 15 if err != nil { 16 return nil, err 17 } 18 19 sk, pk, err := ci.GenerateKeyPair(ci.RSA, 512) 20 if err != nil { 21 return nil, err 22 } 23 24 p, err := peer.WithKeyPair(sk, pk) 25 if err != nil { 26 return nil, err 27 } 28 p.AddAddress(tcp) 29 return p, nil 30 } 31 32 func echoListen(ctx context.Context, listener Listener) { 33 for { 34 select { 35 case <-ctx.Done(): 36 return 37 case c := <-listener.Accept(): 38 go echo(ctx, c) 39 } 40 } 41 } 42 43 func echo(ctx context.Context, c Conn) { 44 for { 45 select { 46 case <-ctx.Done(): 47 return 48 case m := <-c.In(): 49 c.Out() <- m 50 } 51 } 52 } 53 54 func setupConn(t *testing.T, ctx context.Context, a1, a2 string) (a, b Conn) { 55 56 p1, err := setupPeer(a1) 57 if err != nil { 58 t.Fatal("error setting up peer", err) 59 } 60 61 p2, err := setupPeer(a2) 62 if err != nil { 63 t.Fatal("error setting up peer", err) 64 } 65 66 laddr := p1.NetAddress("tcp") 67 if laddr == nil { 68 t.Fatal("Listen address is nil.") 69 } 70 71 ps1 := peer.NewPeerstore() 72 ps2 := peer.NewPeerstore() 73 ps1.Add(p1) 74 ps2.Add(p2) 75 76 l1, err := Listen(ctx, laddr, p1, ps1) 77 if err != nil { 78 t.Fatal(err) 79 } 80 81 d2 := &Dialer{ 82 Peerstore: ps2, 83 LocalPeer: p2, 84 } 85 86 c2, err := d2.Dial(ctx, "tcp", p1) 87 if err != nil { 88 t.Fatal("error dialing peer", err) 89 } 90 91 c1 := <-l1.Accept() 92 93 return c1, c2 94 } 95 96 func TestDialer(t *testing.T) { 97 // t.Skip("Skipping in favor of another test") 98 99 p1, err := setupPeer("/ip4/127.0.0.1/tcp/4234") 100 if err != nil { 101 t.Fatal("error setting up peer", err) 102 } 103 104 p2, err := setupPeer("/ip4/127.0.0.1/tcp/4235") 105 if err != nil { 106 t.Fatal("error setting up peer", err) 107 } 108 109 ctx, cancel := context.WithCancel(context.Background()) 110 111 laddr := p1.NetAddress("tcp") 112 if laddr == nil { 113 t.Fatal("Listen address is nil.") 114 } 115 116 ps1 := peer.NewPeerstore() 117 ps2 := peer.NewPeerstore() 118 ps1.Add(p1) 119 ps2.Add(p2) 120 121 l, err := Listen(ctx, laddr, p1, ps1) 122 if err != nil { 123 t.Fatal(err) 124 } 125 126 go echoListen(ctx, l) 127 128 d := &Dialer{ 129 Peerstore: ps2, 130 LocalPeer: p2, 131 } 132 133 c, err := d.Dial(ctx, "tcp", p1) 134 if err != nil { 135 t.Fatal("error dialing peer", err) 136 } 137 138 // fmt.Println("sending") 139 c.Out() <- []byte("beep") 140 c.Out() <- []byte("boop") 141 142 out := <-c.In() 143 // fmt.Println("recving", string(out)) 144 data := string(out) 145 if data != "beep" { 146 t.Error("unexpected conn output", data) 147 } 148 149 out = <-c.In() 150 data = string(out) 151 if string(out) != "boop" { 152 t.Error("unexpected conn output", data) 153 } 154 155 // fmt.Println("closing") 156 c.Close() 157 l.Close() 158 cancel() 159 }