interface.go 2.67 KB
Newer Older
Juan Batiz-Benet's avatar
mock2  
Juan Batiz-Benet committed
1 2 3 4 5 6 7 8 9
// Package mocknet provides a mock net.Network to test with.
//
// - a Mocknet has many inet.Networks
// - a Mocknet has many Links
// - a Link joins two inet.Networks
// - inet.Conns and inet.Streams are created by inet.Networks
package mocknet

import (
10
	"io"
Juan Batiz-Benet's avatar
mock2  
Juan Batiz-Benet committed
11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
	"time"

	inet "github.com/jbenet/go-ipfs/net"
	peer "github.com/jbenet/go-ipfs/peer"
)

type Mocknet interface {
	GenPeer() (inet.Network, error)
	AddPeer(peer.ID) (inet.Network, error)

	// retrieve things
	Peer(peer.ID) peer.Peer
	Peers() []peer.Peer
	Net(peer.ID) inet.Network
	Nets() []inet.Network
26
	Links() LinkMap
Juan Batiz-Benet's avatar
mock2  
Juan Batiz-Benet committed
27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
	LinksBetweenPeers(a, b peer.Peer) []Link
	LinksBetweenNets(a, b inet.Network) []Link

	// Links are the **ability to connect**.
	// think of Links as the physical medium.
	// For p1 and p2 to connect, a link must exist between them.
	// (this makes it possible to test dial failures, and
	// things like relaying traffic)
	LinkPeers(peer.Peer, peer.Peer) (Link, error)
	LinkNets(inet.Network, inet.Network) (Link, error)
	Unlink(Link) error
	UnlinkPeers(peer.Peer, peer.Peer) error
	UnlinkNets(inet.Network, inet.Network) error

	// LinkDefaults are the default options that govern links
	// if they do not have thier own option set.
	SetLinkDefaults(LinkOptions)
	LinkDefaults() LinkOptions

	// Connections are the usual. Connecting means Dialing.
47
	// **to succeed, peers must be linked beforehand**
Juan Batiz-Benet's avatar
mock2  
Juan Batiz-Benet committed
48 49 50 51 52 53
	ConnectPeers(peer.Peer, peer.Peer) error
	ConnectNets(inet.Network, inet.Network) error
	DisconnectPeers(peer.Peer, peer.Peer) error
	DisconnectNets(inet.Network, inet.Network) error
}

54 55
// LinkOptions are used to change aspects of the links.
// Sorry but they dont work yet :(
Juan Batiz-Benet's avatar
mock2  
Juan Batiz-Benet committed
56 57 58 59 60 61
type LinkOptions struct {
	Latency   time.Duration
	Bandwidth int // in bytes-per-second
	// we can make these values distributions down the road.
}

62 63 64 65 66
// Link represents the **possibility** of a connection between
// two peers. Think of it like physical network links. Without
// them, the peers can try and try but they won't be able to
// connect. This allows constructing topologies where specific
// nodes cannot talk to each other directly. :)
Juan Batiz-Benet's avatar
mock2  
Juan Batiz-Benet committed
67 68 69 70 71 72 73 74 75
type Link interface {
	Networks() []inet.Network
	Peers() []peer.Peer

	SetOptions(LinkOptions)
	Options() LinkOptions

	// Metrics() Metrics
}
76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91

// LinkMap is a 3D map to give us an easy way to track links.
// (wow, much map. so data structure. how compose. ahhh pointer)
type LinkMap map[string]map[string]map[Link]struct{}

// Printer lets you inspect things :)
type Printer interface {
	// MocknetLinks shows the entire Mocknet's link table :)
	MocknetLinks(mn Mocknet)
	NetworkConns(ni inet.Network)
}

// PrinterTo returns a Printer ready to write to w.
func PrinterTo(w io.Writer) Printer {
	return &printer{w}
}