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  }