mock_link.go 1.68 KB
Newer Older
Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
1 2 3 4
package mocknet

import (
	"sync"
Karthik Bala's avatar
Karthik Bala committed
5
	"time"
Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
6

tavit ohanian's avatar
tavit ohanian committed
7 8
	"gitlab.dms3.io/p2p/go-p2p-core/network"
	"gitlab.dms3.io/p2p/go-p2p-core/peer"
9 10

	process "github.com/jbenet/goprocess"
Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
11 12 13
)

// link implements mocknet.Link
14
// and, for simplicity, network.Conn
Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
15
type link struct {
Karthik Bala's avatar
Karthik Bala committed
16 17 18
	mock        *mocknet
	nets        []*peernet
	opts        LinkOptions
19
	ratelimiter *RateLimiter
Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
20 21 22 23 24 25
	// this could have addresses on both sides.

	sync.RWMutex
}

func newLink(mn *mocknet, opts LinkOptions) *link {
Karthik Bala's avatar
Karthik Bala committed
26 27
	l := &link{mock: mn,
		opts:        opts,
28
		ratelimiter: NewRateLimiter(opts.Bandwidth)}
Karthik Bala's avatar
Karthik Bala committed
29
	return l
Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
30 31 32 33 34 35
}

func (l *link) newConnPair(dialer *peernet) (*conn, *conn) {
	l.RLock()
	defer l.RUnlock()

36
	parent := process.WithTeardown(func() error { return nil })
37 38 39
	target := l.nets[0]
	if target == dialer {
		target = l.nets[1]
Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
40
	}
41 42 43 44 45
	dc := newConn(parent, dialer, target, l, network.DirOutbound)
	tc := newConn(parent, target, dialer, l, network.DirInbound)
	dc.rconn = tc
	tc.rconn = dc
	return dc, tc
Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
46 47
}

48
func (l *link) Networks() []network.Network {
Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
49 50 51
	l.RLock()
	defer l.RUnlock()

52
	cp := make([]network.Network, len(l.nets))
Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
	for i, n := range l.nets {
		cp[i] = n
	}
	return cp
}

func (l *link) Peers() []peer.ID {
	l.RLock()
	defer l.RUnlock()

	cp := make([]peer.ID, len(l.nets))
	for i, n := range l.nets {
		cp[i] = n.peer
	}
	return cp
}

func (l *link) SetOptions(o LinkOptions) {
Steven Allen's avatar
Steven Allen committed
71 72
	l.Lock()
	defer l.Unlock()
Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
73
	l.opts = o
Karthik Bala's avatar
Karthik Bala committed
74
	l.ratelimiter.UpdateBandwidth(l.opts.Bandwidth)
Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
75 76 77
}

func (l *link) Options() LinkOptions {
Steven Allen's avatar
Steven Allen committed
78 79
	l.RLock()
	defer l.RUnlock()
Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
80 81
	return l.opts
}
Karthik Bala's avatar
Karthik Bala committed
82 83

func (l *link) GetLatency() time.Duration {
Steven Allen's avatar
Steven Allen committed
84 85
	l.RLock()
	defer l.RUnlock()
Karthik Bala's avatar
Karthik Bala committed
86 87 88 89 90 91
	return l.opts.Latency
}

func (l *link) RateLimit(dataSize int) time.Duration {
	return l.ratelimiter.Limit(dataSize)
}