github.com/keltia/go-ipfs@v0.3.8-0.20150909044612-210793031c63/p2p/net/mock/mock_link.go (about)

     1  package mocknet
     2  
     3  import (
     4  	//	"fmt"
     5  	"io"
     6  	"sync"
     7  	"time"
     8  
     9  	inet "github.com/ipfs/go-ipfs/p2p/net"
    10  	peer "github.com/ipfs/go-ipfs/p2p/peer"
    11  )
    12  
    13  // link implements mocknet.Link
    14  // and, for simplicity, inet.Conn
    15  type link struct {
    16  	mock        *mocknet
    17  	nets        []*peernet
    18  	opts        LinkOptions
    19  	ratelimiter *ratelimiter
    20  	// this could have addresses on both sides.
    21  
    22  	sync.RWMutex
    23  }
    24  
    25  func newLink(mn *mocknet, opts LinkOptions) *link {
    26  	l := &link{mock: mn,
    27  		opts:        opts,
    28  		ratelimiter: NewRatelimiter(opts.Bandwidth)}
    29  	return l
    30  }
    31  
    32  func (l *link) newConnPair(dialer *peernet) (*conn, *conn) {
    33  	l.RLock()
    34  	defer l.RUnlock()
    35  
    36  	mkconn := func(ln, rn *peernet) *conn {
    37  		c := &conn{net: ln, link: l}
    38  		c.local = ln.peer
    39  		c.remote = rn.peer
    40  
    41  		c.localAddr = ln.ps.Addrs(ln.peer)[0]
    42  		c.remoteAddr = rn.ps.Addrs(rn.peer)[0]
    43  
    44  		c.localPrivKey = ln.ps.PrivKey(ln.peer)
    45  		c.remotePubKey = rn.ps.PubKey(rn.peer)
    46  
    47  		return c
    48  	}
    49  
    50  	c1 := mkconn(l.nets[0], l.nets[1])
    51  	c2 := mkconn(l.nets[1], l.nets[0])
    52  	c1.rconn = c2
    53  	c2.rconn = c1
    54  
    55  	if dialer == c1.net {
    56  		return c1, c2
    57  	}
    58  	return c2, c1
    59  }
    60  
    61  func (l *link) newStreamPair() (*stream, *stream) {
    62  	r1, w1 := io.Pipe()
    63  	r2, w2 := io.Pipe()
    64  
    65  	s1 := NewStream(w2, r1)
    66  	s2 := NewStream(w1, r2)
    67  	return s1, s2
    68  }
    69  
    70  func (l *link) Networks() []inet.Network {
    71  	l.RLock()
    72  	defer l.RUnlock()
    73  
    74  	cp := make([]inet.Network, len(l.nets))
    75  	for i, n := range l.nets {
    76  		cp[i] = n
    77  	}
    78  	return cp
    79  }
    80  
    81  func (l *link) Peers() []peer.ID {
    82  	l.RLock()
    83  	defer l.RUnlock()
    84  
    85  	cp := make([]peer.ID, len(l.nets))
    86  	for i, n := range l.nets {
    87  		cp[i] = n.peer
    88  	}
    89  	return cp
    90  }
    91  
    92  func (l *link) SetOptions(o LinkOptions) {
    93  	l.opts = o
    94  	l.ratelimiter.UpdateBandwidth(l.opts.Bandwidth)
    95  }
    96  
    97  func (l *link) Options() LinkOptions {
    98  	return l.opts
    99  }
   100  
   101  func (l *link) GetLatency() time.Duration {
   102  	return l.opts.Latency
   103  }
   104  
   105  func (l *link) RateLimit(dataSize int) time.Duration {
   106  	return l.ratelimiter.Limit(dataSize)
   107  }