recovery_p2p.go 1.4 KB
Newer Older
1 2
package recovery

D
DoMyJob 已提交
3
import (
4 5
	// "fmt"
	// "bytes"
6
	"time"
7 8 9 10 11 12 13 14 15

	"github.com/ethereum/go-ethereum/common"
)

// P2PLocation is the address of the p2p network
type P2PLocation common.Address

// P2PNetwork interface defines the P2P operations and implements mock for test
type P2PNetwork interface {
16
	RetrieveData(peer P2PLocation, hash common.Hash) ([]byte, error)
17 18 19
}

// P2PMock mocks a p2p network for test
D
DoMyJob 已提交
20
type P2PMock struct {
21 22
	networkData  map[P2PLocation][]byte
	networkDelay map[P2PLocation]time.Duration
23 24
}

25 26
const defaultNetworkDelayInMS time.Duration = 50

27
// RetrieveData get data from p2p network address
28 29 30 31 32 33 34 35 36
func (mock P2PMock) RetrieveData(peer P2PLocation, hash common.Hash) ([]byte, error) {
	if delay, ok := mock.networkDelay[peer]; ok {
		time.Sleep(delay * time.Millisecond)
	} else {
		time.Sleep(defaultNetworkDelayInMS * time.Millisecond)
	}
	msgByte := make([]byte, len(mock.networkData[peer]))
	copy(msgByte, mock.networkData[peer])
	return msgByte, nil
37 38 39
}

// InititalP2PMock initializes P2P mock module
40
func InititalP2PMock(peers []P2PLocation, dataBlks [][]byte, networkParams ...time.Duration) (P2PNetwork, error) {
41 42
	p2p := P2PMock{
		map[P2PLocation][]byte{},
43
		map[P2PLocation]time.Duration{},
44 45
	}

D
DoMyJob 已提交
46
	for i := 0; i < len(peers); i++ {
47
		p2p.networkData[peers[i]] = dataBlks[i]
48
	}
49 50 51 52 53

	for i, delay := range networkParams {
		p2p.networkDelay[peers[i]] = delay
	}

54 55
	return p2p, nil
}