mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-07-15 17:30:44 +00:00
fix tests
This commit is contained in:
parent
9e04fd82cf
commit
c9ee3240fb
12 changed files with 190 additions and 123 deletions
|
|
@ -27,15 +27,56 @@ import (
|
||||||
"github.com/XinFinOrg/XDPoSChain/rlp"
|
"github.com/XinFinOrg/XDPoSChain/rlp"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var ( //from go-ethereum
|
||||||
RinkebyGenesisHash = common.HexToHash("0x6341fd3daf94b748c72ced5a5b26028f2474f5f00d824504e4fa37a75767e177")
|
MainnetChainConfig = ¶ms.ChainConfig{
|
||||||
GoerliGenesisHash = common.HexToHash("0xbf7e331f7f7c1dd2e05159666b3bf8bc7a8a3a9eb1d518969eab529dd9b88c1a")
|
ChainId: big.NewInt(1),
|
||||||
)
|
HomesteadBlock: big.NewInt(1150000),
|
||||||
|
DAOForkBlock: big.NewInt(1920000),
|
||||||
|
DAOForkSupport: true,
|
||||||
|
EIP150Block: big.NewInt(2463000),
|
||||||
|
EIP150Hash: common.HexToHash("0x2086799aeebeae135c246c65021c82b4e15a2c451340993aacfd2751886514f0"),
|
||||||
|
EIP155Block: big.NewInt(2675000),
|
||||||
|
EIP158Block: big.NewInt(2675000),
|
||||||
|
ByzantiumBlock: big.NewInt(4370000),
|
||||||
|
ConstantinopleBlock: big.NewInt(7280000),
|
||||||
|
PetersburgBlock: big.NewInt(7280000),
|
||||||
|
Ethash: new(params.EthashConfig),
|
||||||
|
}
|
||||||
|
|
||||||
// TestCreation tests that different genesis and fork rule combinations result in
|
RopstenChainConfig = ¶ms.ChainConfig{
|
||||||
// the correct fork ID.
|
ChainId: big.NewInt(3),
|
||||||
func TestCreation(t *testing.T) {
|
HomesteadBlock: big.NewInt(0),
|
||||||
GoerliChainConfig := ¶ms.ChainConfig{
|
DAOForkBlock: nil,
|
||||||
|
DAOForkSupport: true,
|
||||||
|
EIP150Block: big.NewInt(0),
|
||||||
|
EIP150Hash: common.HexToHash("0x41941023680923e0fe4d74a34bdac8141f2540e3ae90623718e47d66d1ca4a2d"),
|
||||||
|
EIP155Block: big.NewInt(10),
|
||||||
|
EIP158Block: big.NewInt(10),
|
||||||
|
ByzantiumBlock: big.NewInt(1700000),
|
||||||
|
ConstantinopleBlock: big.NewInt(4230000),
|
||||||
|
PetersburgBlock: big.NewInt(4939394),
|
||||||
|
Ethash: new(params.EthashConfig),
|
||||||
|
}
|
||||||
|
|
||||||
|
RinkebyChainConfig = ¶ms.ChainConfig{
|
||||||
|
ChainId: big.NewInt(4),
|
||||||
|
HomesteadBlock: big.NewInt(1),
|
||||||
|
DAOForkBlock: nil,
|
||||||
|
DAOForkSupport: true,
|
||||||
|
EIP150Block: big.NewInt(2),
|
||||||
|
EIP150Hash: common.HexToHash("0x9b095b36c15eaf13044373aef8ee0bd3a382a5abb92e402afa44b8249c3a90e9"),
|
||||||
|
EIP155Block: big.NewInt(3),
|
||||||
|
EIP158Block: big.NewInt(3),
|
||||||
|
ByzantiumBlock: big.NewInt(1035301),
|
||||||
|
ConstantinopleBlock: big.NewInt(3660663),
|
||||||
|
PetersburgBlock: big.NewInt(4321234),
|
||||||
|
Clique: ¶ms.CliqueConfig{
|
||||||
|
Period: 15,
|
||||||
|
Epoch: 30000,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
GoerliChainConfig = ¶ms.ChainConfig{
|
||||||
ChainId: big.NewInt(5),
|
ChainId: big.NewInt(5),
|
||||||
HomesteadBlock: big.NewInt(0),
|
HomesteadBlock: big.NewInt(0),
|
||||||
DAOForkBlock: nil,
|
DAOForkBlock: nil,
|
||||||
|
|
@ -46,12 +87,22 @@ func TestCreation(t *testing.T) {
|
||||||
ByzantiumBlock: big.NewInt(0),
|
ByzantiumBlock: big.NewInt(0),
|
||||||
ConstantinopleBlock: big.NewInt(0),
|
ConstantinopleBlock: big.NewInt(0),
|
||||||
PetersburgBlock: big.NewInt(0),
|
PetersburgBlock: big.NewInt(0),
|
||||||
IstanbulBlock: big.NewInt(1561651),
|
|
||||||
Clique: ¶ms.CliqueConfig{
|
Clique: ¶ms.CliqueConfig{
|
||||||
Period: 15,
|
Period: 15,
|
||||||
Epoch: 30000,
|
Epoch: 30000,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MainnetGenesisHash = common.HexToHash("0xd4e56740f876aef8c010b86a40d5f56745a118d0906a34e69aec8c0db1cb8fa3")
|
||||||
|
RopstenGenesisHash = common.HexToHash("0x41941023680923e0fe4d74a34bdac8141f2540e3ae90623718e47d66d1ca4a2d")
|
||||||
|
RinkebyGenesisHash = common.HexToHash("0x6341fd3daf94b748c72ced5a5b26028f2474f5f00d824504e4fa37a75767e177")
|
||||||
|
GoerliGenesisHash = common.HexToHash("0xbf7e331f7f7c1dd2e05159666b3bf8bc7a8a3a9eb1d518969eab529dd9b88c1a")
|
||||||
|
)
|
||||||
|
|
||||||
|
// TestCreation tests that different genesis and fork rule combinations result in
|
||||||
|
// the correct fork ID.
|
||||||
|
func TestCreation(t *testing.T) {
|
||||||
|
|
||||||
type testcase struct {
|
type testcase struct {
|
||||||
head uint64
|
head uint64
|
||||||
want ID
|
want ID
|
||||||
|
|
@ -63,8 +114,8 @@ func TestCreation(t *testing.T) {
|
||||||
}{
|
}{
|
||||||
// Mainnet test cases
|
// Mainnet test cases
|
||||||
{
|
{
|
||||||
params.MainnetChainConfig,
|
MainnetChainConfig,
|
||||||
params.MainnetGenesisHash,
|
MainnetGenesisHash,
|
||||||
[]testcase{
|
[]testcase{
|
||||||
{0, ID{Hash: checksumToBytes(0xfc64ec04), Next: 1150000}}, // Unsynced
|
{0, ID{Hash: checksumToBytes(0xfc64ec04), Next: 1150000}}, // Unsynced
|
||||||
{1149999, ID{Hash: checksumToBytes(0xfc64ec04), Next: 1150000}}, // Last Frontier block
|
{1149999, ID{Hash: checksumToBytes(0xfc64ec04), Next: 1150000}}, // Last Frontier block
|
||||||
|
|
@ -84,8 +135,8 @@ func TestCreation(t *testing.T) {
|
||||||
},
|
},
|
||||||
// Ropsten test cases
|
// Ropsten test cases
|
||||||
{
|
{
|
||||||
params.TestnetChainConfig,
|
RopstenChainConfig,
|
||||||
params.TestnetGenesisHash,
|
RopstenGenesisHash,
|
||||||
[]testcase{
|
[]testcase{
|
||||||
{0, ID{Hash: checksumToBytes(0x30c7ddbc), Next: 10}}, // Unsynced, last Frontier, Homestead and first Tangerine block
|
{0, ID{Hash: checksumToBytes(0x30c7ddbc), Next: 10}}, // Unsynced, last Frontier, Homestead and first Tangerine block
|
||||||
{9, ID{Hash: checksumToBytes(0x30c7ddbc), Next: 10}}, // Last Tangerine block
|
{9, ID{Hash: checksumToBytes(0x30c7ddbc), Next: 10}}, // Last Tangerine block
|
||||||
|
|
@ -101,7 +152,7 @@ func TestCreation(t *testing.T) {
|
||||||
},
|
},
|
||||||
// Rinkeby test cases
|
// Rinkeby test cases
|
||||||
{
|
{
|
||||||
params.RinkebyChainConfig,
|
RinkebyChainConfig,
|
||||||
RinkebyGenesisHash,
|
RinkebyGenesisHash,
|
||||||
[]testcase{
|
[]testcase{
|
||||||
{0, ID{Hash: checksumToBytes(0x3b8e0691), Next: 1}}, // Unsynced, last Frontier block
|
{0, ID{Hash: checksumToBytes(0x3b8e0691), Next: 1}}, // Unsynced, last Frontier block
|
||||||
|
|
@ -212,7 +263,7 @@ func TestValidation(t *testing.T) {
|
||||||
{7279999, ID{Hash: checksumToBytes(0xa00bc324), Next: 7279999}, ErrLocalIncompatibleOrStale},
|
{7279999, ID{Hash: checksumToBytes(0xa00bc324), Next: 7279999}, ErrLocalIncompatibleOrStale},
|
||||||
}
|
}
|
||||||
for i, tt := range tests {
|
for i, tt := range tests {
|
||||||
filter := newFilter(params.MainnetChainConfig, params.MainnetGenesisHash, func() uint64 { return tt.head })
|
filter := newFilter(MainnetChainConfig, MainnetGenesisHash, func() uint64 { return tt.head })
|
||||||
if err := filter(tt.id); err != tt.err {
|
if err := filter(tt.id); err != tt.err {
|
||||||
t.Errorf("test %d: validation error mismatch: have %v, want %v", i, err, tt.err)
|
t.Errorf("test %d: validation error mismatch: have %v, want %v", i, err, tt.err)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -212,6 +212,7 @@ type BlockFetcher struct {
|
||||||
// NewBlockFetcher creates a block fetcher to retrieve blocks based on hash announcements.
|
// NewBlockFetcher creates a block fetcher to retrieve blocks based on hash announcements.
|
||||||
|
|
||||||
func NewBlockFetcher(getBlock blockRetrievalFn, verifyHeader headerVerifierFn, handleProposedBlock proposeBlockHandlerFn, broadcastBlock blockBroadcasterFn, chainHeight chainHeightFn, insertChain chainInsertFn, prepareBlock blockPrepareFn, dropPeer peerDropFn) *BlockFetcher {
|
func NewBlockFetcher(getBlock blockRetrievalFn, verifyHeader headerVerifierFn, handleProposedBlock proposeBlockHandlerFn, broadcastBlock blockBroadcasterFn, chainHeight chainHeightFn, insertChain chainInsertFn, prepareBlock blockPrepareFn, dropPeer peerDropFn) *BlockFetcher {
|
||||||
|
knownBlocks, _ := lru.NewARC(blockLimit)
|
||||||
return &BlockFetcher{
|
return &BlockFetcher{
|
||||||
notify: make(chan *blockAnnounce),
|
notify: make(chan *blockAnnounce),
|
||||||
inject: make(chan *blockInject),
|
inject: make(chan *blockInject),
|
||||||
|
|
@ -227,6 +228,7 @@ func NewBlockFetcher(getBlock blockRetrievalFn, verifyHeader headerVerifierFn, h
|
||||||
queue: prque.New(nil),
|
queue: prque.New(nil),
|
||||||
queues: make(map[string]int),
|
queues: make(map[string]int),
|
||||||
queued: make(map[common.Hash]*blockInject),
|
queued: make(map[common.Hash]*blockInject),
|
||||||
|
knowns: knownBlocks,
|
||||||
getBlock: getBlock,
|
getBlock: getBlock,
|
||||||
verifyHeader: verifyHeader,
|
verifyHeader: verifyHeader,
|
||||||
handleProposedBlock: handleProposedBlock,
|
handleProposedBlock: handleProposedBlock,
|
||||||
|
|
|
||||||
|
|
@ -316,7 +316,7 @@ func TestSequentialAnnouncements63(t *testing.T) { testSequentialAnnouncements(t
|
||||||
func TestSequentialAnnouncements64(t *testing.T) { testSequentialAnnouncements(t, 64) }
|
func TestSequentialAnnouncements64(t *testing.T) { testSequentialAnnouncements(t, 64) }
|
||||||
func TestSequentialAnnouncements100(t *testing.T) { testSequentialAnnouncements(t, 100) }
|
func TestSequentialAnnouncements100(t *testing.T) { testSequentialAnnouncements(t, 100) }
|
||||||
|
|
||||||
func testSequentialAnnouncements(t *testing.T, protocol int) {
|
func testSequentialAnnouncements(t *testing.T, protocol int) {
|
||||||
// Create a chain of blocks to import
|
// Create a chain of blocks to import
|
||||||
targetBlocks := 4 * hashLimit
|
targetBlocks := 4 * hashLimit
|
||||||
hashes, blocks := makeChain(targetBlocks, 0, genesis)
|
hashes, blocks := makeChain(targetBlocks, 0, genesis)
|
||||||
|
|
@ -352,7 +352,7 @@ func TestConcurrentAnnouncements63(t *testing.T) { testConcurrentAnnouncements(t
|
||||||
func TestConcurrentAnnouncements64(t *testing.T) { testConcurrentAnnouncements(t, 64) }
|
func TestConcurrentAnnouncements64(t *testing.T) { testConcurrentAnnouncements(t, 64) }
|
||||||
func TestConcurrentAnnouncements100(t *testing.T) { testConcurrentAnnouncements(t, 100) }
|
func TestConcurrentAnnouncements100(t *testing.T) { testConcurrentAnnouncements(t, 100) }
|
||||||
|
|
||||||
func testConcurrentAnnouncements(t *testing.T, protocol int) {
|
func testConcurrentAnnouncements(t *testing.T, protocol int) {
|
||||||
// Create a chain of blocks to import
|
// Create a chain of blocks to import
|
||||||
targetBlocks := 4 * hashLimit
|
targetBlocks := 4 * hashLimit
|
||||||
hashes, blocks := makeChain(targetBlocks, 0, genesis)
|
hashes, blocks := makeChain(targetBlocks, 0, genesis)
|
||||||
|
|
@ -401,7 +401,7 @@ func TestOverlappingAnnouncements63(t *testing.T) { testOverlappingAnnouncements
|
||||||
func TestOverlappingAnnouncements64(t *testing.T) { testOverlappingAnnouncements(t, 64) }
|
func TestOverlappingAnnouncements64(t *testing.T) { testOverlappingAnnouncements(t, 64) }
|
||||||
func TestOverlappingAnnouncements100(t *testing.T) { testOverlappingAnnouncements(t, 100) }
|
func TestOverlappingAnnouncements100(t *testing.T) { testOverlappingAnnouncements(t, 100) }
|
||||||
|
|
||||||
func testOverlappingAnnouncements(t *testing.T, protocol int) {
|
func testOverlappingAnnouncements(t *testing.T, protocol int) {
|
||||||
// Create a chain of blocks to import
|
// Create a chain of blocks to import
|
||||||
targetBlocks := 4 * hashLimit
|
targetBlocks := 4 * hashLimit
|
||||||
hashes, blocks := makeChain(targetBlocks, 0, genesis)
|
hashes, blocks := makeChain(targetBlocks, 0, genesis)
|
||||||
|
|
@ -439,7 +439,7 @@ func TestPendingDeduplication63(t *testing.T) { testPendingDeduplication(t, 63)
|
||||||
func TestPendingDeduplication64(t *testing.T) { testPendingDeduplication(t, 64) }
|
func TestPendingDeduplication64(t *testing.T) { testPendingDeduplication(t, 64) }
|
||||||
func TestPendingDeduplication100(t *testing.T) { testPendingDeduplication(t, 100) }
|
func TestPendingDeduplication100(t *testing.T) { testPendingDeduplication(t, 100) }
|
||||||
|
|
||||||
func testPendingDeduplication(t *testing.T, protocol int) {
|
func testPendingDeduplication(t *testing.T, protocol int) {
|
||||||
// Create a hash and corresponding block
|
// Create a hash and corresponding block
|
||||||
hashes, blocks := makeChain(1, 0, genesis)
|
hashes, blocks := makeChain(1, 0, genesis)
|
||||||
|
|
||||||
|
|
@ -483,7 +483,7 @@ func TestRandomArrivalImport63(t *testing.T) { testRandomArrivalImport(t, 63) }
|
||||||
func TestRandomArrivalImport64(t *testing.T) { testRandomArrivalImport(t, 64) }
|
func TestRandomArrivalImport64(t *testing.T) { testRandomArrivalImport(t, 64) }
|
||||||
func TestRandomArrivalImport100(t *testing.T) { testRandomArrivalImport(t, 100) }
|
func TestRandomArrivalImport100(t *testing.T) { testRandomArrivalImport(t, 100) }
|
||||||
|
|
||||||
func testRandomArrivalImport(t *testing.T, protocol int) {
|
func testRandomArrivalImport(t *testing.T, protocol int) {
|
||||||
// Create a chain of blocks to import, and choose one to delay
|
// Create a chain of blocks to import, and choose one to delay
|
||||||
targetBlocks := maxQueueDist
|
targetBlocks := maxQueueDist
|
||||||
hashes, blocks := makeChain(targetBlocks, 0, genesis)
|
hashes, blocks := makeChain(targetBlocks, 0, genesis)
|
||||||
|
|
@ -518,7 +518,7 @@ func TestQueueGapFill63(t *testing.T) { testQueueGapFill(t, 63) }
|
||||||
func TestQueueGapFill64(t *testing.T) { testQueueGapFill(t, 64) }
|
func TestQueueGapFill64(t *testing.T) { testQueueGapFill(t, 64) }
|
||||||
func TestQueueGapFill100(t *testing.T) { testQueueGapFill(t, 100) }
|
func TestQueueGapFill100(t *testing.T) { testQueueGapFill(t, 100) }
|
||||||
|
|
||||||
func testQueueGapFill(t *testing.T, protocol int) {
|
func testQueueGapFill(t *testing.T, protocol int) {
|
||||||
// Create a chain of blocks to import, and choose one to not announce at all
|
// Create a chain of blocks to import, and choose one to not announce at all
|
||||||
targetBlocks := maxQueueDist
|
targetBlocks := maxQueueDist
|
||||||
hashes, blocks := makeChain(targetBlocks, 0, genesis)
|
hashes, blocks := makeChain(targetBlocks, 0, genesis)
|
||||||
|
|
@ -553,7 +553,7 @@ func TestImportDeduplication63(t *testing.T) { testImportDeduplication(t, 63) }
|
||||||
func TestImportDeduplication64(t *testing.T) { testImportDeduplication(t, 64) }
|
func TestImportDeduplication64(t *testing.T) { testImportDeduplication(t, 64) }
|
||||||
func TestImportDeduplication100(t *testing.T) { testImportDeduplication(t, 100) }
|
func TestImportDeduplication100(t *testing.T) { testImportDeduplication(t, 100) }
|
||||||
|
|
||||||
func testImportDeduplication(t *testing.T, protocol int) {
|
func testImportDeduplication(t *testing.T, protocol int) {
|
||||||
// Create two blocks to import (one for duplication, the other for stalling)
|
// Create two blocks to import (one for duplication, the other for stalling)
|
||||||
hashes, blocks := makeChain(2, 0, genesis)
|
hashes, blocks := makeChain(2, 0, genesis)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -32,10 +32,10 @@ import (
|
||||||
var (
|
var (
|
||||||
// testTxs is a set of transactions to use during testing that have meaninful hashes.
|
// testTxs is a set of transactions to use during testing that have meaninful hashes.
|
||||||
testTxs = []*types.Transaction{
|
testTxs = []*types.Transaction{
|
||||||
types.NewTransaction(rand.Uint64(), common.Address{byte(rand.Intn(256))}, new(big.Int), 0, new(big.Int), nil),
|
types.NewTransaction(5577006791947779410, common.Address{0x0f}, new(big.Int), 0, new(big.Int), nil),
|
||||||
types.NewTransaction(rand.Uint64(), common.Address{byte(rand.Intn(256))}, new(big.Int), 0, new(big.Int), nil),
|
types.NewTransaction(15352856648520921629, common.Address{0xbb}, new(big.Int), 0, new(big.Int), nil),
|
||||||
types.NewTransaction(rand.Uint64(), common.Address{byte(rand.Intn(256))}, new(big.Int), 0, new(big.Int), nil),
|
types.NewTransaction(3916589616287113937, common.Address{0x86}, new(big.Int), 0, new(big.Int), nil),
|
||||||
types.NewTransaction(rand.Uint64(), common.Address{byte(rand.Intn(256))}, new(big.Int), 0, new(big.Int), nil),
|
types.NewTransaction(9828766684487745566, common.Address{0xac}, new(big.Int), 0, new(big.Int), nil),
|
||||||
}
|
}
|
||||||
// testTxsHashes is the hashes of the test transactions above
|
// testTxsHashes is the hashes of the test transactions above
|
||||||
testTxsHashes = []common.Hash{testTxs[0].Hash(), testTxs[1].Hash(), testTxs[2].Hash(), testTxs[3].Hash()}
|
testTxsHashes = []common.Hash{testTxs[0].Hash(), testTxs[1].Hash(), testTxs[2].Hash(), testTxs[3].Hash()}
|
||||||
|
|
@ -451,7 +451,7 @@ func TestTransactionFetcherCleanupEmpty(t *testing.T) {
|
||||||
|
|
||||||
// Tests that non-returned transactions are either re-sheduled from a
|
// Tests that non-returned transactions are either re-sheduled from a
|
||||||
// different peer, or self if they are after the cutoff point.
|
// different peer, or self if they are after the cutoff point.
|
||||||
func TestTransactionFetcherMissingRescheduling(t *testing.T) {
|
func TestTransactionFetcherMissingRescheduling(t *testing.T) {
|
||||||
testTransactionFetcherParallel(t, txFetcherTest{
|
testTransactionFetcherParallel(t, txFetcherTest{
|
||||||
init: func() *TxFetcher {
|
init: func() *TxFetcher {
|
||||||
return NewTxFetcher(
|
return NewTxFetcher(
|
||||||
|
|
|
||||||
|
|
@ -145,12 +145,12 @@ func NewProtocolManager(config *params.ChainConfig, mode downloader.SyncMode, ne
|
||||||
|
|
||||||
// Create the protocol manager with the base fields
|
// Create the protocol manager with the base fields
|
||||||
manager := &ProtocolManager{
|
manager := &ProtocolManager{
|
||||||
networkId: networkID,
|
networkId: networkID,
|
||||||
forkFilter: forkid.NewFilter(blockchain),
|
forkFilter: forkid.NewFilter(blockchain),
|
||||||
eventMux: mux,
|
eventMux: mux,
|
||||||
txpool: txpool,
|
txpool: txpool,
|
||||||
blockchain: blockchain,
|
blockchain: blockchain,
|
||||||
// chainconfig: config,
|
chainconfig: config,
|
||||||
// whitelist: whitelist,
|
// whitelist: whitelist,
|
||||||
peers: newPeerSet(),
|
peers: newPeerSet(),
|
||||||
newPeerCh: make(chan *peer),
|
newPeerCh: make(chan *peer),
|
||||||
|
|
@ -465,7 +465,6 @@ func (pm *ProtocolManager) handle(p *peer) error {
|
||||||
// Propagate existing transactions. new transactions appearing
|
// Propagate existing transactions. new transactions appearing
|
||||||
// after this will be sent via broadcasts.
|
// after this will be sent via broadcasts.
|
||||||
pm.syncTransactions(p)
|
pm.syncTransactions(p)
|
||||||
|
|
||||||
// If we're DAO hard-fork aware, validate any remote peer with regard to the hard-fork
|
// If we're DAO hard-fork aware, validate any remote peer with regard to the hard-fork
|
||||||
if daoBlock := pm.chainconfig.DAOForkBlock; daoBlock != nil {
|
if daoBlock := pm.chainconfig.DAOForkBlock; daoBlock != nil {
|
||||||
// Request the peer's DAO fork header for extra-data validation
|
// Request the peer's DAO fork header for extra-data validation
|
||||||
|
|
@ -1066,16 +1065,24 @@ func (pm *ProtocolManager) BroadcastBlock(block *types.Block, propagate bool) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
// Send the block to a subset of our peers
|
// Send the block to a subset of our peers
|
||||||
for _, peer := range peers {
|
transferLen := int(math.Sqrt(float64(len(peers))))
|
||||||
peer.SendNewBlock(block, td)
|
if transferLen < minBroadcastPeers {
|
||||||
|
transferLen = minBroadcastPeers
|
||||||
}
|
}
|
||||||
log.Trace("Propagated block", "hash", hash, "recipients", len(peers), "duration", common.PrettyDuration(time.Since(block.ReceivedAt)))
|
if transferLen > len(peers) {
|
||||||
|
transferLen = len(peers)
|
||||||
|
}
|
||||||
|
transfer := peers[:transferLen]
|
||||||
|
for _, peer := range transfer {
|
||||||
|
peer.AsyncSendNewBlock(block, td)
|
||||||
|
}
|
||||||
|
log.Trace("Propagated block", "hash", hash, "recipients", len(transfer), "duration", common.PrettyDuration(time.Since(block.ReceivedAt)))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
// Otherwise if the block is indeed in out own chain, announce it
|
// Otherwise if the block is indeed in out own chain, announce it
|
||||||
if pm.blockchain.HasBlock(hash, block.NumberU64()) {
|
if pm.blockchain.HasBlock(hash, block.NumberU64()) {
|
||||||
for _, peer := range peers {
|
for _, peer := range peers {
|
||||||
peer.SendNewBlockHashes([]common.Hash{hash}, []uint64{block.NumberU64()})
|
peer.AsyncSendNewBlockHash(block)
|
||||||
}
|
}
|
||||||
log.Trace("Announced block", "hash", hash, "recipients", len(peers), "duration", common.PrettyDuration(time.Since(block.ReceivedAt)))
|
log.Trace("Announced block", "hash", hash, "recipients", len(peers), "duration", common.PrettyDuration(time.Since(block.ReceivedAt)))
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -234,13 +234,19 @@ func TestForkIDSplit(t *testing.T) {
|
||||||
go func() { errc <- ethNoFork.handle(peerProFork) }()
|
go func() { errc <- ethNoFork.handle(peerProFork) }()
|
||||||
go func() { errc <- ethProFork.handle(peerNoFork) }()
|
go func() { errc <- ethProFork.handle(peerNoFork) }()
|
||||||
|
|
||||||
select {
|
var successes int
|
||||||
case err := <-errc:
|
for i := 0; i < 2; i++ {
|
||||||
if want := errResp(ErrForkIDRejected, forkid.ErrLocalIncompatibleOrStale.Error()); err.Error() != want.Error() {
|
select {
|
||||||
t.Fatalf("fork ID rejection error mismatch: have %v, want %v", err, want)
|
case err := <-errc:
|
||||||
|
if err == nil {
|
||||||
|
successes++
|
||||||
|
if successes == 2 { // Only one side disconnects
|
||||||
|
t.Fatalf("fork ID rejection didn't happen")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case <-time.After(250 * time.Millisecond):
|
||||||
|
t.Fatalf("split peers not rejected")
|
||||||
}
|
}
|
||||||
case <-time.After(250 * time.Millisecond):
|
|
||||||
t.Fatalf("split peers not rejected")
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -278,7 +284,7 @@ func testRecvTransactions(t *testing.T, protocol int) {
|
||||||
func TestSendTransactions63(t *testing.T) { testSendTransactions(t, 63) }
|
func TestSendTransactions63(t *testing.T) { testSendTransactions(t, 63) }
|
||||||
func TestSendTransactions64(t *testing.T) { testSendTransactions(t, 64) }
|
func TestSendTransactions64(t *testing.T) { testSendTransactions(t, 64) }
|
||||||
func TestSendTransactions65(t *testing.T) { testSendTransactions(t, 65) }
|
func TestSendTransactions65(t *testing.T) { testSendTransactions(t, 65) }
|
||||||
func TestSendTransactions100(t *testing.T) { testSendTransactions(t, 100) } //TODO: fix
|
func TestSendTransactions100(t *testing.T) { testSendTransactions(t, 100) }
|
||||||
|
|
||||||
func testSendTransactions(t *testing.T, protocol int) {
|
func testSendTransactions(t *testing.T, protocol int) {
|
||||||
pm, _ := newTestProtocolManagerMust(t, downloader.FullSync, 0, nil, nil)
|
pm, _ := newTestProtocolManagerMust(t, downloader.FullSync, 0, nil, nil)
|
||||||
|
|
@ -387,7 +393,6 @@ func testSendTransactions(t *testing.T, protocol int) {
|
||||||
}
|
}
|
||||||
wg.Wait()
|
wg.Wait()
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestTransactionPropagation(t *testing.T) { testSyncTransaction(t, true) }
|
func TestTransactionPropagation(t *testing.T) { testSyncTransaction(t, true) }
|
||||||
func TestTransactionAnnouncement(t *testing.T) { testSyncTransaction(t, false) }
|
func TestTransactionAnnouncement(t *testing.T) { testSyncTransaction(t, false) }
|
||||||
|
|
||||||
|
|
|
||||||
4
metrics/doc.go
Normal file
4
metrics/doc.go
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
package metrics
|
||||||
|
|
||||||
|
const epsilon = 0.0000000000000001
|
||||||
|
const epsilonPercentile = .00000000001
|
||||||
|
|
@ -1,6 +1,9 @@
|
||||||
package metrics
|
package metrics
|
||||||
|
|
||||||
import "testing"
|
import (
|
||||||
|
"math"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
func BenchmarkEWMA(b *testing.B) {
|
func BenchmarkEWMA(b *testing.B) {
|
||||||
a := NewEWMA1()
|
a := NewEWMA1()
|
||||||
|
|
@ -15,67 +18,67 @@ func TestEWMA1(t *testing.T) {
|
||||||
a := NewEWMA1()
|
a := NewEWMA1()
|
||||||
a.Update(3)
|
a.Update(3)
|
||||||
a.Tick()
|
a.Tick()
|
||||||
if rate := a.Rate(); 0.6 != rate {
|
if rate := a.Rate(); math.Abs(0.6-rate) > epsilon {
|
||||||
t.Errorf("initial a.Rate(): 0.6 != %v\n", rate)
|
t.Errorf("initial a.Rate(): 0.6 != %v\n", rate)
|
||||||
}
|
}
|
||||||
elapseMinute(a)
|
elapseMinute(a)
|
||||||
if rate := a.Rate(); 0.22072766470286553 != rate {
|
if rate := a.Rate(); math.Abs(0.22072766470286553-rate) > epsilon {
|
||||||
t.Errorf("1 minute a.Rate(): 0.22072766470286553 != %v\n", rate)
|
t.Errorf("1 minute a.Rate(): 0.22072766470286553 != %v\n", rate)
|
||||||
}
|
}
|
||||||
elapseMinute(a)
|
elapseMinute(a)
|
||||||
if rate := a.Rate(); 0.08120116994196772 != rate {
|
if rate := a.Rate(); math.Abs(0.08120116994196772-rate) > epsilon {
|
||||||
t.Errorf("2 minute a.Rate(): 0.08120116994196772 != %v\n", rate)
|
t.Errorf("2 minute a.Rate(): 0.08120116994196772 != %v\n", rate)
|
||||||
}
|
}
|
||||||
elapseMinute(a)
|
elapseMinute(a)
|
||||||
if rate := a.Rate(); 0.029872241020718428 != rate {
|
if rate := a.Rate(); math.Abs(0.029872241020718428-rate) > epsilon {
|
||||||
t.Errorf("3 minute a.Rate(): 0.029872241020718428 != %v\n", rate)
|
t.Errorf("3 minute a.Rate(): 0.029872241020718428 != %v\n", rate)
|
||||||
}
|
}
|
||||||
elapseMinute(a)
|
elapseMinute(a)
|
||||||
if rate := a.Rate(); 0.01098938333324054 != rate {
|
if rate := a.Rate(); math.Abs(0.01098938333324054-rate) > epsilon {
|
||||||
t.Errorf("4 minute a.Rate(): 0.01098938333324054 != %v\n", rate)
|
t.Errorf("4 minute a.Rate(): 0.01098938333324054 != %v\n", rate)
|
||||||
}
|
}
|
||||||
elapseMinute(a)
|
elapseMinute(a)
|
||||||
if rate := a.Rate(); 0.004042768199451294 != rate {
|
if rate := a.Rate(); math.Abs(0.004042768199451294-rate) > epsilon {
|
||||||
t.Errorf("5 minute a.Rate(): 0.004042768199451294 != %v\n", rate)
|
t.Errorf("5 minute a.Rate(): 0.004042768199451294 != %v\n", rate)
|
||||||
}
|
}
|
||||||
elapseMinute(a)
|
elapseMinute(a)
|
||||||
if rate := a.Rate(); 0.0014872513059998212 != rate {
|
if rate := a.Rate(); math.Abs(0.0014872513059998212-rate) > epsilon {
|
||||||
t.Errorf("6 minute a.Rate(): 0.0014872513059998212 != %v\n", rate)
|
t.Errorf("6 minute a.Rate(): 0.0014872513059998212 != %v\n", rate)
|
||||||
}
|
}
|
||||||
elapseMinute(a)
|
elapseMinute(a)
|
||||||
if rate := a.Rate(); 0.0005471291793327122 != rate {
|
if rate := a.Rate(); math.Abs(0.0005471291793327122-rate) > epsilon {
|
||||||
t.Errorf("7 minute a.Rate(): 0.0005471291793327122 != %v\n", rate)
|
t.Errorf("7 minute a.Rate(): 0.0005471291793327122 != %v\n", rate)
|
||||||
}
|
}
|
||||||
elapseMinute(a)
|
elapseMinute(a)
|
||||||
if rate := a.Rate(); 0.00020127757674150815 != rate {
|
if rate := a.Rate(); math.Abs(0.00020127757674150815-rate) > epsilon {
|
||||||
t.Errorf("8 minute a.Rate(): 0.00020127757674150815 != %v\n", rate)
|
t.Errorf("8 minute a.Rate(): 0.00020127757674150815 != %v\n", rate)
|
||||||
}
|
}
|
||||||
elapseMinute(a)
|
elapseMinute(a)
|
||||||
if rate := a.Rate(); 7.404588245200814e-05 != rate {
|
if rate := a.Rate(); math.Abs(7.404588245200814e-05-rate) > epsilon {
|
||||||
t.Errorf("9 minute a.Rate(): 7.404588245200814e-05 != %v\n", rate)
|
t.Errorf("9 minute a.Rate(): 7.404588245200814e-05 != %v\n", rate)
|
||||||
}
|
}
|
||||||
elapseMinute(a)
|
elapseMinute(a)
|
||||||
if rate := a.Rate(); 2.7239957857491083e-05 != rate {
|
if rate := a.Rate(); math.Abs(2.7239957857491083e-05-rate) > epsilon {
|
||||||
t.Errorf("10 minute a.Rate(): 2.7239957857491083e-05 != %v\n", rate)
|
t.Errorf("10 minute a.Rate(): 2.7239957857491083e-05 != %v\n", rate)
|
||||||
}
|
}
|
||||||
elapseMinute(a)
|
elapseMinute(a)
|
||||||
if rate := a.Rate(); 1.0021020474147462e-05 != rate {
|
if rate := a.Rate(); math.Abs(1.0021020474147462e-05-rate) > epsilon {
|
||||||
t.Errorf("11 minute a.Rate(): 1.0021020474147462e-05 != %v\n", rate)
|
t.Errorf("11 minute a.Rate(): 1.0021020474147462e-05 != %v\n", rate)
|
||||||
}
|
}
|
||||||
elapseMinute(a)
|
elapseMinute(a)
|
||||||
if rate := a.Rate(); 3.6865274119969525e-06 != rate {
|
if rate := a.Rate(); math.Abs(3.6865274119969525e-06-rate) > epsilon {
|
||||||
t.Errorf("12 minute a.Rate(): 3.6865274119969525e-06 != %v\n", rate)
|
t.Errorf("12 minute a.Rate(): 3.6865274119969525e-06 != %v\n", rate)
|
||||||
}
|
}
|
||||||
elapseMinute(a)
|
elapseMinute(a)
|
||||||
if rate := a.Rate(); 1.3561976441886433e-06 != rate {
|
if rate := a.Rate(); math.Abs(1.3561976441886433e-06-rate) > epsilon {
|
||||||
t.Errorf("13 minute a.Rate(): 1.3561976441886433e-06 != %v\n", rate)
|
t.Errorf("13 minute a.Rate(): 1.3561976441886433e-06 != %v\n", rate)
|
||||||
}
|
}
|
||||||
elapseMinute(a)
|
elapseMinute(a)
|
||||||
if rate := a.Rate(); 4.989172314621449e-07 != rate {
|
if rate := a.Rate(); math.Abs(4.989172314621449e-07-rate) > epsilon {
|
||||||
t.Errorf("14 minute a.Rate(): 4.989172314621449e-07 != %v\n", rate)
|
t.Errorf("14 minute a.Rate(): 4.989172314621449e-07 != %v\n", rate)
|
||||||
}
|
}
|
||||||
elapseMinute(a)
|
elapseMinute(a)
|
||||||
if rate := a.Rate(); 1.8354139230109722e-07 != rate {
|
if rate := a.Rate(); math.Abs(1.8354139230109722e-07-rate) > epsilon {
|
||||||
t.Errorf("15 minute a.Rate(): 1.8354139230109722e-07 != %v\n", rate)
|
t.Errorf("15 minute a.Rate(): 1.8354139230109722e-07 != %v\n", rate)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -84,67 +87,67 @@ func TestEWMA5(t *testing.T) {
|
||||||
a := NewEWMA5()
|
a := NewEWMA5()
|
||||||
a.Update(3)
|
a.Update(3)
|
||||||
a.Tick()
|
a.Tick()
|
||||||
if rate := a.Rate(); 0.6 != rate {
|
if rate := a.Rate(); math.Abs(0.6-rate) > epsilon {
|
||||||
t.Errorf("initial a.Rate(): 0.6 != %v\n", rate)
|
t.Errorf("initial a.Rate(): 0.6 != %v\n", rate)
|
||||||
}
|
}
|
||||||
elapseMinute(a)
|
elapseMinute(a)
|
||||||
if rate := a.Rate(); 0.49123845184678905 != rate {
|
if rate := a.Rate(); math.Abs(0.49123845184678905-rate) > epsilon {
|
||||||
t.Errorf("1 minute a.Rate(): 0.49123845184678905 != %v\n", rate)
|
t.Errorf("1 minute a.Rate(): 0.49123845184678905 != %v\n", rate)
|
||||||
}
|
}
|
||||||
elapseMinute(a)
|
elapseMinute(a)
|
||||||
if rate := a.Rate(); 0.4021920276213837 != rate {
|
if rate := a.Rate(); math.Abs(0.4021920276213837-rate) > epsilon {
|
||||||
t.Errorf("2 minute a.Rate(): 0.4021920276213837 != %v\n", rate)
|
t.Errorf("2 minute a.Rate(): 0.4021920276213837 != %v\n", rate)
|
||||||
}
|
}
|
||||||
elapseMinute(a)
|
elapseMinute(a)
|
||||||
if rate := a.Rate(); 0.32928698165641596 != rate {
|
if rate := a.Rate(); math.Abs(0.32928698165641596-rate) > epsilon {
|
||||||
t.Errorf("3 minute a.Rate(): 0.32928698165641596 != %v\n", rate)
|
t.Errorf("3 minute a.Rate(): 0.32928698165641596 != %v\n", rate)
|
||||||
}
|
}
|
||||||
elapseMinute(a)
|
elapseMinute(a)
|
||||||
if rate := a.Rate(); 0.269597378470333 != rate {
|
if rate := a.Rate(); math.Abs(0.269597378470333-rate) > epsilon {
|
||||||
t.Errorf("4 minute a.Rate(): 0.269597378470333 != %v\n", rate)
|
t.Errorf("4 minute a.Rate(): 0.269597378470333 != %v\n", rate)
|
||||||
}
|
}
|
||||||
elapseMinute(a)
|
elapseMinute(a)
|
||||||
if rate := a.Rate(); 0.2207276647028654 != rate {
|
if rate := a.Rate(); math.Abs(0.2207276647028654-rate) > epsilon {
|
||||||
t.Errorf("5 minute a.Rate(): 0.2207276647028654 != %v\n", rate)
|
t.Errorf("5 minute a.Rate(): 0.2207276647028654 != %v\n", rate)
|
||||||
}
|
}
|
||||||
elapseMinute(a)
|
elapseMinute(a)
|
||||||
if rate := a.Rate(); 0.18071652714732128 != rate {
|
if rate := a.Rate(); math.Abs(0.18071652714732128-rate) > epsilon {
|
||||||
t.Errorf("6 minute a.Rate(): 0.18071652714732128 != %v\n", rate)
|
t.Errorf("6 minute a.Rate(): 0.18071652714732128 != %v\n", rate)
|
||||||
}
|
}
|
||||||
elapseMinute(a)
|
elapseMinute(a)
|
||||||
if rate := a.Rate(); 0.14795817836496392 != rate {
|
if rate := a.Rate(); math.Abs(0.14795817836496392-rate) > epsilon {
|
||||||
t.Errorf("7 minute a.Rate(): 0.14795817836496392 != %v\n", rate)
|
t.Errorf("7 minute a.Rate(): 0.14795817836496392 != %v\n", rate)
|
||||||
}
|
}
|
||||||
elapseMinute(a)
|
elapseMinute(a)
|
||||||
if rate := a.Rate(); 0.12113791079679326 != rate {
|
if rate := a.Rate(); math.Abs(0.12113791079679326-rate) > epsilon {
|
||||||
t.Errorf("8 minute a.Rate(): 0.12113791079679326 != %v\n", rate)
|
t.Errorf("8 minute a.Rate(): 0.12113791079679326 != %v\n", rate)
|
||||||
}
|
}
|
||||||
elapseMinute(a)
|
elapseMinute(a)
|
||||||
if rate := a.Rate(); 0.09917933293295193 != rate {
|
if rate := a.Rate(); math.Abs(0.09917933293295193-rate) > epsilon {
|
||||||
t.Errorf("9 minute a.Rate(): 0.09917933293295193 != %v\n", rate)
|
t.Errorf("9 minute a.Rate(): 0.09917933293295193 != %v\n", rate)
|
||||||
}
|
}
|
||||||
elapseMinute(a)
|
elapseMinute(a)
|
||||||
if rate := a.Rate(); 0.08120116994196763 != rate {
|
if rate := a.Rate(); math.Abs(0.08120116994196763-rate) > epsilon {
|
||||||
t.Errorf("10 minute a.Rate(): 0.08120116994196763 != %v\n", rate)
|
t.Errorf("10 minute a.Rate(): 0.08120116994196763 != %v\n", rate)
|
||||||
}
|
}
|
||||||
elapseMinute(a)
|
elapseMinute(a)
|
||||||
if rate := a.Rate(); 0.06648189501740036 != rate {
|
if rate := a.Rate(); math.Abs(0.06648189501740036-rate) > epsilon {
|
||||||
t.Errorf("11 minute a.Rate(): 0.06648189501740036 != %v\n", rate)
|
t.Errorf("11 minute a.Rate(): 0.06648189501740036 != %v\n", rate)
|
||||||
}
|
}
|
||||||
elapseMinute(a)
|
elapseMinute(a)
|
||||||
if rate := a.Rate(); 0.05443077197364752 != rate {
|
if rate := a.Rate(); math.Abs(0.05443077197364752-rate) > epsilon {
|
||||||
t.Errorf("12 minute a.Rate(): 0.05443077197364752 != %v\n", rate)
|
t.Errorf("12 minute a.Rate(): 0.05443077197364752 != %v\n", rate)
|
||||||
}
|
}
|
||||||
elapseMinute(a)
|
elapseMinute(a)
|
||||||
if rate := a.Rate(); 0.04456414692860035 != rate {
|
if rate := a.Rate(); math.Abs(0.04456414692860035-rate) > epsilon {
|
||||||
t.Errorf("13 minute a.Rate(): 0.04456414692860035 != %v\n", rate)
|
t.Errorf("13 minute a.Rate(): 0.04456414692860035 != %v\n", rate)
|
||||||
}
|
}
|
||||||
elapseMinute(a)
|
elapseMinute(a)
|
||||||
if rate := a.Rate(); 0.03648603757513079 != rate {
|
if rate := a.Rate(); math.Abs(0.03648603757513079-rate) > epsilon {
|
||||||
t.Errorf("14 minute a.Rate(): 0.03648603757513079 != %v\n", rate)
|
t.Errorf("14 minute a.Rate(): 0.03648603757513079 != %v\n", rate)
|
||||||
}
|
}
|
||||||
elapseMinute(a)
|
elapseMinute(a)
|
||||||
if rate := a.Rate(); 0.0298722410207183831020718428 != rate {
|
if rate := a.Rate(); math.Abs(0.0298722410207183831020718428-rate) > epsilon {
|
||||||
t.Errorf("15 minute a.Rate(): 0.0298722410207183831020718428 != %v\n", rate)
|
t.Errorf("15 minute a.Rate(): 0.0298722410207183831020718428 != %v\n", rate)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -153,67 +156,67 @@ func TestEWMA15(t *testing.T) {
|
||||||
a := NewEWMA15()
|
a := NewEWMA15()
|
||||||
a.Update(3)
|
a.Update(3)
|
||||||
a.Tick()
|
a.Tick()
|
||||||
if rate := a.Rate(); 0.6 != rate {
|
if rate := a.Rate(); math.Abs(0.6-rate) > epsilon {
|
||||||
t.Errorf("initial a.Rate(): 0.6 != %v\n", rate)
|
t.Errorf("initial a.Rate(): 0.6 != %v\n", rate)
|
||||||
}
|
}
|
||||||
elapseMinute(a)
|
elapseMinute(a)
|
||||||
if rate := a.Rate(); 0.5613041910189706 != rate {
|
if rate := a.Rate(); math.Abs(0.5613041910189706-rate) > epsilon {
|
||||||
t.Errorf("1 minute a.Rate(): 0.5613041910189706 != %v\n", rate)
|
t.Errorf("1 minute a.Rate(): 0.5613041910189706 != %v\n", rate)
|
||||||
}
|
}
|
||||||
elapseMinute(a)
|
elapseMinute(a)
|
||||||
if rate := a.Rate(); 0.5251039914257684 != rate {
|
if rate := a.Rate(); math.Abs(0.5251039914257684-rate) > epsilon {
|
||||||
t.Errorf("2 minute a.Rate(): 0.5251039914257684 != %v\n", rate)
|
t.Errorf("2 minute a.Rate(): 0.5251039914257684 != %v\n", rate)
|
||||||
}
|
}
|
||||||
elapseMinute(a)
|
elapseMinute(a)
|
||||||
if rate := a.Rate(); 0.4912384518467888184678905 != rate {
|
if rate := a.Rate(); math.Abs(0.4912384518467888184678905-rate) > epsilon {
|
||||||
t.Errorf("3 minute a.Rate(): 0.4912384518467888184678905 != %v\n", rate)
|
t.Errorf("3 minute a.Rate(): 0.4912384518467888184678905 != %v\n", rate)
|
||||||
}
|
}
|
||||||
elapseMinute(a)
|
elapseMinute(a)
|
||||||
if rate := a.Rate(); 0.459557003018789 != rate {
|
if rate := a.Rate(); math.Abs(0.459557003018789-rate) > epsilon {
|
||||||
t.Errorf("4 minute a.Rate(): 0.459557003018789 != %v\n", rate)
|
t.Errorf("4 minute a.Rate(): 0.459557003018789 != %v\n", rate)
|
||||||
}
|
}
|
||||||
elapseMinute(a)
|
elapseMinute(a)
|
||||||
if rate := a.Rate(); 0.4299187863442732 != rate {
|
if rate := a.Rate(); math.Abs(0.4299187863442732-rate) > epsilon {
|
||||||
t.Errorf("5 minute a.Rate(): 0.4299187863442732 != %v\n", rate)
|
t.Errorf("5 minute a.Rate(): 0.4299187863442732 != %v\n", rate)
|
||||||
}
|
}
|
||||||
elapseMinute(a)
|
elapseMinute(a)
|
||||||
if rate := a.Rate(); 0.4021920276213831 != rate {
|
if rate := a.Rate(); math.Abs(0.4021920276213831-rate) > epsilon {
|
||||||
t.Errorf("6 minute a.Rate(): 0.4021920276213831 != %v\n", rate)
|
t.Errorf("6 minute a.Rate(): 0.4021920276213831 != %v\n", rate)
|
||||||
}
|
}
|
||||||
elapseMinute(a)
|
elapseMinute(a)
|
||||||
if rate := a.Rate(); 0.37625345116383313 != rate {
|
if rate := a.Rate(); math.Abs(0.37625345116383313-rate) > epsilon {
|
||||||
t.Errorf("7 minute a.Rate(): 0.37625345116383313 != %v\n", rate)
|
t.Errorf("7 minute a.Rate(): 0.37625345116383313 != %v\n", rate)
|
||||||
}
|
}
|
||||||
elapseMinute(a)
|
elapseMinute(a)
|
||||||
if rate := a.Rate(); 0.3519877317060185 != rate {
|
if rate := a.Rate(); math.Abs(0.3519877317060185-rate) > epsilon {
|
||||||
t.Errorf("8 minute a.Rate(): 0.3519877317060185 != %v\n", rate)
|
t.Errorf("8 minute a.Rate(): 0.3519877317060185 != %v\n", rate)
|
||||||
}
|
}
|
||||||
elapseMinute(a)
|
elapseMinute(a)
|
||||||
if rate := a.Rate(); 0.3292869816564153165641596 != rate {
|
if rate := a.Rate(); math.Abs(0.3292869816564153165641596-rate) > epsilon {
|
||||||
t.Errorf("9 minute a.Rate(): 0.3292869816564153165641596 != %v\n", rate)
|
t.Errorf("9 minute a.Rate(): 0.3292869816564153165641596 != %v\n", rate)
|
||||||
}
|
}
|
||||||
elapseMinute(a)
|
elapseMinute(a)
|
||||||
if rate := a.Rate(); 0.3080502714195546 != rate {
|
if rate := a.Rate(); math.Abs(0.3080502714195546-rate) > epsilon {
|
||||||
t.Errorf("10 minute a.Rate(): 0.3080502714195546 != %v\n", rate)
|
t.Errorf("10 minute a.Rate(): 0.3080502714195546 != %v\n", rate)
|
||||||
}
|
}
|
||||||
elapseMinute(a)
|
elapseMinute(a)
|
||||||
if rate := a.Rate(); 0.2881831806538789 != rate {
|
if rate := a.Rate(); math.Abs(0.2881831806538789-rate) > epsilon {
|
||||||
t.Errorf("11 minute a.Rate(): 0.2881831806538789 != %v\n", rate)
|
t.Errorf("11 minute a.Rate(): 0.2881831806538789 != %v\n", rate)
|
||||||
}
|
}
|
||||||
elapseMinute(a)
|
elapseMinute(a)
|
||||||
if rate := a.Rate(); 0.26959737847033216 != rate {
|
if rate := a.Rate(); math.Abs(0.26959737847033216-rate) > epsilon {
|
||||||
t.Errorf("12 minute a.Rate(): 0.26959737847033216 != %v\n", rate)
|
t.Errorf("12 minute a.Rate(): 0.26959737847033216 != %v\n", rate)
|
||||||
}
|
}
|
||||||
elapseMinute(a)
|
elapseMinute(a)
|
||||||
if rate := a.Rate(); 0.2522102307052083 != rate {
|
if rate := a.Rate(); math.Abs(0.2522102307052083-rate) > epsilon {
|
||||||
t.Errorf("13 minute a.Rate(): 0.2522102307052083 != %v\n", rate)
|
t.Errorf("13 minute a.Rate(): 0.2522102307052083 != %v\n", rate)
|
||||||
}
|
}
|
||||||
elapseMinute(a)
|
elapseMinute(a)
|
||||||
if rate := a.Rate(); 0.23594443252115815 != rate {
|
if rate := a.Rate(); math.Abs(0.23594443252115815-rate) > epsilon {
|
||||||
t.Errorf("14 minute a.Rate(): 0.23594443252115815 != %v\n", rate)
|
t.Errorf("14 minute a.Rate(): 0.23594443252115815 != %v\n", rate)
|
||||||
}
|
}
|
||||||
elapseMinute(a)
|
elapseMinute(a)
|
||||||
if rate := a.Rate(); 0.2207276647028646247028654470286553 != rate {
|
if rate := a.Rate(); math.Abs(0.2207276647028646247028654470286553-rate) > epsilon {
|
||||||
t.Errorf("15 minute a.Rate(): 0.2207276647028646247028654470286553 != %v\n", rate)
|
t.Errorf("15 minute a.Rate(): 0.2207276647028646247028654470286553 != %v\n", rate)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -214,7 +214,7 @@ func TestDialStateDynDial(t *testing.T) {
|
||||||
&discoverTask{},
|
&discoverTask{},
|
||||||
},
|
},
|
||||||
new: []task{
|
new: []task{
|
||||||
&waitExpireTask{Duration: 14 * time.Second},
|
&discoverTask{},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
@ -376,9 +376,6 @@ func TestDialStateDynDialFromTable(t *testing.T) {
|
||||||
&dialTask{flags: dynDialedConn, dest: newNode(uintID(11), nil)},
|
&dialTask{flags: dynDialedConn, dest: newNode(uintID(11), nil)},
|
||||||
&dialTask{flags: dynDialedConn, dest: newNode(uintID(12), nil)},
|
&dialTask{flags: dynDialedConn, dest: newNode(uintID(12), nil)},
|
||||||
},
|
},
|
||||||
new: []task{
|
|
||||||
&discoverTask{},
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
// Waiting for expiry. No waitExpireTask is launched because the
|
// Waiting for expiry. No waitExpireTask is launched because the
|
||||||
// discovery query is still running.
|
// discovery query is still running.
|
||||||
|
|
@ -497,6 +494,9 @@ func TestDialStateStaticDial(t *testing.T) {
|
||||||
&dialTask{flags: staticDialedConn, dest: newNode(uintID(4), nil)},
|
&dialTask{flags: staticDialedConn, dest: newNode(uintID(4), nil)},
|
||||||
&dialTask{flags: staticDialedConn, dest: newNode(uintID(5), nil)},
|
&dialTask{flags: staticDialedConn, dest: newNode(uintID(5), nil)},
|
||||||
},
|
},
|
||||||
|
new: []task{
|
||||||
|
&waitExpireTask{Duration: 14 * time.Second},
|
||||||
|
},
|
||||||
},
|
},
|
||||||
// Wait a round for dial history to expire, no new tasks should spawn.
|
// Wait a round for dial history to expire, no new tasks should spawn.
|
||||||
{
|
{
|
||||||
|
|
@ -551,6 +551,9 @@ func TestDialStaticAfterReset(t *testing.T) {
|
||||||
&dialTask{flags: staticDialedConn, dest: newNode(uintID(1), nil)},
|
&dialTask{flags: staticDialedConn, dest: newNode(uintID(1), nil)},
|
||||||
&dialTask{flags: staticDialedConn, dest: newNode(uintID(2), nil)},
|
&dialTask{flags: staticDialedConn, dest: newNode(uintID(2), nil)},
|
||||||
},
|
},
|
||||||
|
new: []task{
|
||||||
|
&waitExpireTask{Duration: 30 * time.Second},
|
||||||
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
dTest := dialtest{
|
dTest := dialtest{
|
||||||
|
|
@ -561,9 +564,7 @@ func TestDialStaticAfterReset(t *testing.T) {
|
||||||
for _, n := range wantStatic {
|
for _, n := range wantStatic {
|
||||||
dTest.init.removeStatic(n)
|
dTest.init.removeStatic(n)
|
||||||
dTest.init.addStatic(n)
|
dTest.init.addStatic(n)
|
||||||
delete(dTest.init.dialing, n.ID())
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// without removing peers they will be considered recently dialed
|
// without removing peers they will be considered recently dialed
|
||||||
runDialTest(t, dTest)
|
runDialTest(t, dTest)
|
||||||
}
|
}
|
||||||
|
|
@ -611,6 +612,9 @@ func TestDialStateCache(t *testing.T) {
|
||||||
done: []task{
|
done: []task{
|
||||||
&dialTask{flags: staticDialedConn, dest: newNode(uintID(3), nil)},
|
&dialTask{flags: staticDialedConn, dest: newNode(uintID(3), nil)},
|
||||||
},
|
},
|
||||||
|
new: []task{
|
||||||
|
&waitExpireTask{Duration: 14 * time.Second},
|
||||||
|
},
|
||||||
},
|
},
|
||||||
// Still waiting for node 3's entry to expire in the cache.
|
// Still waiting for node 3's entry to expire in the cache.
|
||||||
{
|
{
|
||||||
|
|
@ -699,3 +703,4 @@ func (t *resolveMock) Self() *enode.Node { return new(enode.
|
||||||
func (t *resolveMock) Close() {}
|
func (t *resolveMock) Close() {}
|
||||||
func (t *resolveMock) LookupRandom() []*enode.Node { return nil }
|
func (t *resolveMock) LookupRandom() []*enode.Node { return nil }
|
||||||
func (t *resolveMock) ReadRandomNodes(buf []*enode.Node) int { return 0 }
|
func (t *resolveMock) ReadRandomNodes(buf []*enode.Node) int { return 0 }
|
||||||
|
func (t *resolveMock) Bootstrap([]*enode.Node) {}
|
||||||
|
|
@ -301,7 +301,7 @@ func (t *udp) sendPing(toid enode.ID, toaddr *net.UDPAddr, callback func()) <-ch
|
||||||
To: makeEndpoint(toaddr, 0), // TODO: maybe use known TCP port from DB
|
To: makeEndpoint(toaddr, 0), // TODO: maybe use known TCP port from DB
|
||||||
Expiration: uint64(time.Now().Add(expiration).Unix()),
|
Expiration: uint64(time.Now().Add(expiration).Unix()),
|
||||||
}
|
}
|
||||||
packet, hash, err := encodePacket(t.priv, pingPacket, req)
|
packet, hash, err := encodePacket(t.priv, pingXDC, req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
errc := make(chan error, 1)
|
errc := make(chan error, 1)
|
||||||
errc <- err
|
errc <- err
|
||||||
|
|
@ -320,7 +320,7 @@ func (t *udp) sendPing(toid enode.ID, toaddr *net.UDPAddr, callback func()) <-ch
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *udp) waitping(from enode.ID) error {
|
func (t *udp) waitping(from enode.ID) error {
|
||||||
return <-t.pending(from, pingPacket, func(interface{}) bool { return true })
|
return <-t.pending(from, pingXDC, func(interface{}) bool { return true })
|
||||||
}
|
}
|
||||||
|
|
||||||
// findnode sends a findnode request to the given node and waits until
|
// findnode sends a findnode request to the given node and waits until
|
||||||
|
|
@ -633,7 +633,7 @@ func (req *ping) handle(t *udp, from *net.UDPAddr, fromKey encPubkey, mac []byte
|
||||||
Expiration: uint64(time.Now().Add(expiration).Unix()),
|
Expiration: uint64(time.Now().Add(expiration).Unix()),
|
||||||
})
|
})
|
||||||
n := wrapNode(enode.NewV4(key, from.IP, int(req.From.TCP), from.Port))
|
n := wrapNode(enode.NewV4(key, from.IP, int(req.From.TCP), from.Port))
|
||||||
t.handleReply(n.ID(), pingPacket, req)
|
t.handleReply(n.ID(), pingXDC, req)
|
||||||
if time.Since(t.db.LastPongReceived(n.ID())) > bondExpiration {
|
if time.Since(t.db.LastPongReceived(n.ID())) > bondExpiration {
|
||||||
t.sendPing(n.ID(), from, func() { t.tab.addThroughPing(n) })
|
t.sendPing(n.ID(), from, func() { t.tab.addThroughPing(n) })
|
||||||
} else {
|
} else {
|
||||||
|
|
|
||||||
|
|
@ -19,6 +19,7 @@ package p2p
|
||||||
import (
|
import (
|
||||||
"crypto/ecdsa"
|
"crypto/ecdsa"
|
||||||
"errors"
|
"errors"
|
||||||
|
"fmt"
|
||||||
"math/rand"
|
"math/rand"
|
||||||
"net"
|
"net"
|
||||||
"reflect"
|
"reflect"
|
||||||
|
|
@ -195,23 +196,9 @@ func TestServerDial(t *testing.T) {
|
||||||
case <-time.After(1 * time.Second):
|
case <-time.After(1 * time.Second):
|
||||||
t.Error("server did not launch peer within one second")
|
t.Error("server did not launch peer within one second")
|
||||||
}
|
}
|
||||||
|
|
||||||
select {
|
|
||||||
case peer := <-connected:
|
|
||||||
if peer.ID() != enode.PubkeyToIDV4(remid) {
|
|
||||||
t.Errorf("peer has wrong id")
|
|
||||||
}
|
|
||||||
if peer.Name() != "test" {
|
|
||||||
t.Errorf("peer has wrong name")
|
|
||||||
}
|
|
||||||
if peer.RemoteAddr().String() != conn.LocalAddr().String() {
|
|
||||||
t.Errorf("peer started with wrong conn: got %v, want %v",
|
|
||||||
peer.RemoteAddr(), conn.LocalAddr())
|
|
||||||
}
|
|
||||||
case <-time.After(1 * time.Second):
|
|
||||||
t.Error("server did not launch peer within one second")
|
|
||||||
}
|
|
||||||
case <-time.After(1 * time.Second):
|
case <-time.After(1 * time.Second):
|
||||||
|
fmt.Println("step 1: didn't work")
|
||||||
t.Error("server did not connect within one second")
|
t.Error("server did not connect within one second")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -350,7 +350,8 @@ func startTestNetwork(t *testing.T, client *Client) []string {
|
||||||
nodeCount := 2
|
nodeCount := 2
|
||||||
nodeIDs := make([]string, nodeCount)
|
nodeIDs := make([]string, nodeCount)
|
||||||
for i := 0; i < nodeCount; i++ {
|
for i := 0; i < nodeCount; i++ {
|
||||||
node, err := client.CreateNode(nil)
|
config := adapters.RandomNodeConfig()
|
||||||
|
node, err := client.CreateNode(config)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("error creating node: %s", err)
|
t.Fatalf("error creating node: %s", err)
|
||||||
}
|
}
|
||||||
|
|
@ -529,7 +530,8 @@ func TestHTTPNodeRPC(t *testing.T) {
|
||||||
|
|
||||||
// start a node in the network
|
// start a node in the network
|
||||||
client := NewClient(s.URL)
|
client := NewClient(s.URL)
|
||||||
node, err := client.CreateNode(nil)
|
config := adapters.RandomNodeConfig()
|
||||||
|
node, err := client.CreateNode(config)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("error creating node: %s", err)
|
t.Fatalf("error creating node: %s", err)
|
||||||
}
|
}
|
||||||
|
|
@ -591,7 +593,8 @@ func TestHTTPSnapshot(t *testing.T) {
|
||||||
nodeCount := 2
|
nodeCount := 2
|
||||||
nodes := make([]*p2p.NodeInfo, nodeCount)
|
nodes := make([]*p2p.NodeInfo, nodeCount)
|
||||||
for i := 0; i < nodeCount; i++ {
|
for i := 0; i < nodeCount; i++ {
|
||||||
node, err := client.CreateNode(nil)
|
config := adapters.RandomNodeConfig()
|
||||||
|
node, err := client.CreateNode(config)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("error creating node: %s", err)
|
t.Fatalf("error creating node: %s", err)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue