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 }