Skip to content
This repository has been archived by the owner on Sep 26, 2019. It is now read-only.

Integration of RecursivePeerRefreshState and PeerDiscoveryController #420

Merged
Merged
Changes from 1 commit
Commits
Show all changes
74 commits
Select commit Hold shift + click to select a range
943f775
minimal changeset
smatthewenglish Jan 24, 2019
8e9bc8a
candidate.getPeer().getStatus().equals(PeerDiscoveryStatus.BONDED)
smatthewenglish Jan 24, 2019
9aa3c69
update
smatthewenglish Jan 25, 2019
9965a90
fix peerSeenTwice
smatthewenglish Jan 25, 2019
48aeb33
update++
smatthewenglish Jan 25, 2019
02e1dfc
update
smatthewenglish Jan 25, 2019
c1a161d
update
smatthewenglish Jan 25, 2019
a1fa8ae
update
smatthewenglish Jan 25, 2019
7b9f565
yaya
smatthewenglish Jan 25, 2019
6a38f17
yaya
smatthewenglish Jan 25, 2019
93cd731
Ensure round timers are cancelled and many other cleanups.
ajsutton Jan 31, 2019
fda9183
Shutdown peer refresh state executors on stop.
ajsutton Jan 31, 2019
d7ce507
Trigger new recursive peer search when refreshing peer table. Reduce…
ajsutton Jan 31, 2019
c18bfa5
tests passing
smatthewenglish Jan 31, 2019
221b6cd
cleaning up
smatthewenglish Jan 31, 2019
2f176bc
remove useless, inbhibitive artifact from nearestPeers method
smatthewenglish Jan 31, 2019
022e68d
add round cieling
smatthewenglish Jan 31, 2019
fa8a0cb
remove mock from test
smatthewenglish Jan 31, 2019
d186a6c
working
smatthewenglish Jan 31, 2019
91c0955
revision to RecursivePeerRefreshStateTest
smatthewenglish Feb 1, 2019
d7f2c8d
test
smatthewenglish Feb 1, 2019
2bde9c5
Use TimerUtil to schedule timeout instead of our own ScheduledExecuto…
ajsutton Feb 1, 2019
b293620
Remove isBootstrap from Interaction. Start adding tests for Recursiv…
ajsutton Feb 1, 2019
eb22790
update to bootstrapPeersRetriesSent
smatthewenglish Feb 1, 2019
e251e76
fics helper method
smatthewenglish Feb 1, 2019
ad70f09
cleaning up
smatthewenglish Feb 1, 2019
9a8fcb8
cleaning up tests
smatthewenglish Feb 1, 2019
5abdac1
implement shouldOnlyQueryClosestThreeNeighbours
smatthewenglish Feb 1, 2019
a4c4b78
update to tests
smatthewenglish Feb 1, 2019
3c6671c
shouldBondWithNewNeighboursWhenSomeRequestsTimeOut
smatthewenglish Feb 1, 2019
de17792
increase test coverage
smatthewenglish Feb 1, 2019
6ae84c7
spotless
smatthewenglish Feb 1, 2019
789e477
test update
smatthewenglish Feb 4, 2019
c60bbd5
adding tests
smatthewenglish Feb 4, 2019
892a342
shouldNotQueryNodeThatIsAlreadyQueried
smatthewenglish Feb 4, 2019
f74dc18
shouldBondWithPeersInNeighboursResponseReceivedAfterTimeout
smatthewenglish Feb 4, 2019
0219607
simplification
smatthewenglish Feb 4, 2019
d45da4f
add tests
smatthewenglish Feb 4, 2019
221104b
merge conflicts
smatthewenglish Feb 4, 2019
41a8988
Fix tests to handle whitelisting.
ajsutton Feb 4, 2019
6168fa0
Ensure late bonding or neighbours responses don't kick off a new round.
ajsutton Feb 4, 2019
84b60ee
Merge remote-tracking branch 'upstream/master' into iterative-integra…
smatthewenglish Feb 5, 2019
cda3725
cleaning up
smatthewenglish Feb 5, 2019
73e29e8
add for loop
smatthewenglish Feb 5, 2019
0bc7b56
respoins with pong
smatthewenglish Feb 5, 2019
00158e7
concis
smatthewenglish Feb 5, 2019
6f98946
failing test
smatthewenglish Feb 5, 2019
022f40f
test passing
smatthewenglish Feb 5, 2019
3113e80
update
smatthewenglish Feb 5, 2019
46409d7
fix to tableRefreshSingleNode
smatthewenglish Feb 5, 2019
734ab01
Merge remote-tracking branch 'upstream/master' into iterative-integra…
smatthewenglish Feb 5, 2019
47482cd
update coment
smatthewenglish Feb 6, 2019
913d572
Update ethereum/p2p/src/test/java/tech/pegasys/pantheon/ethereum/p2p/…
mbaxter Feb 6, 2019
d03888c
update
smatthewenglish Feb 6, 2019
d55d7dd
Merge remote-tracking branch 'upstream/master' into iterative-integra…
smatthewenglish Feb 6, 2019
5c49e1d
merge
smatthewenglish Feb 7, 2019
9ab6760
tableRefreshSingleNode
smatthewenglish Feb 11, 2019
88b90fc
deconstructedIncrementalUpdateBootstrapPeersList
smatthewenglish Feb 11, 2019
f5079c4
setKeccak256
smatthewenglish Feb 11, 2019
d660ca5
Update ethereum/p2p/src/test/java/tech/pegasys/pantheon/ethereum/p2p/…
mbaxter Feb 11, 2019
f7413b3
Update ethereum/p2p/src/test/java/tech/pegasys/pantheon/ethereum/p2p/…
mbaxter Feb 11, 2019
c5c7906
Update ethereum/p2p/src/test/java/tech/pegasys/pantheon/ethereum/p2p/…
mbaxter Feb 11, 2019
c03c932
Update ethereum/p2p/src/test/java/tech/pegasys/pantheon/ethereum/p2p/…
mbaxter Feb 11, 2019
8ce92f4
synchronized
smatthewenglish Feb 11, 2019
3503716
update
smatthewenglish Feb 11, 2019
38130c9
merge
smatthewenglish Feb 11, 2019
acfa899
merge
smatthewenglish Feb 11, 2019
bcae3d5
filtering out known peers
smatthewenglish Feb 11, 2019
eda6ae1
update
smatthewenglish Feb 11, 2019
c77f9a9
update
smatthewenglish Feb 12, 2019
b8e9aff
Merge remote-tracking branch 'upstream/master' into iterative-integra…
smatthewenglish Feb 12, 2019
65714cf
update II
smatthewenglish Feb 12, 2019
b764320
merge ii
smatthewenglish Feb 12, 2019
6d2bbbd
Merge branch 'master' into iterative-integration
smatthewenglish Feb 12, 2019
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
test update
  • Loading branch information
smatthewenglish committed Feb 4, 2019
commit 789e47776e4c42e8c76f8da35fdaf257980840ce
Original file line number Diff line number Diff line change
@@ -0,0 +1,342 @@
/*
* Copyright 2019 ConsenSys AG.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License.
*/
package tech.pegasys.pantheon.ethereum.p2p.discovery.internal;

import static java.util.Arrays.asList;
import static java.util.Collections.singletonList;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.when;

import tech.pegasys.pantheon.ethereum.p2p.discovery.DiscoveryPeer;
import tech.pegasys.pantheon.ethereum.p2p.discovery.PeerDiscoveryStatus;
import tech.pegasys.pantheon.ethereum.p2p.discovery.internal.RecursivePeerRefreshState.BondingAgent;
import tech.pegasys.pantheon.ethereum.p2p.discovery.internal.RecursivePeerRefreshState.FindNeighbourDispatcher;
import tech.pegasys.pantheon.ethereum.p2p.peers.PeerBlacklist;
import tech.pegasys.pantheon.ethereum.p2p.permissioning.NodeWhitelistController;
import tech.pegasys.pantheon.util.bytes.BytesValue;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.junit.Before;
import org.junit.Test;

public class RecursivePeerRefreshState00 {
private static final BytesValue TARGET = createId(0);
private final PeerBlacklist peerBlacklist = mock(PeerBlacklist.class);
private final NodeWhitelistController peerWhitelist = mock(NodeWhitelistController.class);
private final BondingAgent bondingAgent = mock(BondingAgent.class);
private final FindNeighbourDispatcher neighborFinder = mock(FindNeighbourDispatcher.class);
private final MockTimerUtil timerUtil = new MockTimerUtil();

private final DiscoveryPeer peer1 = new DiscoveryPeer(createId(1), "127.0.0.1", 1, 1);
private final DiscoveryPeer peer2 = new DiscoveryPeer(createId(2), "127.0.0.2", 2, 2);
private final DiscoveryPeer peer3 = new DiscoveryPeer(createId(3), "127.0.0.3", 3, 3);

private final RecursivePeerRefreshState recursivePeerRefreshState =
new RecursivePeerRefreshState(
peerBlacklist, peerWhitelist, bondingAgent, neighborFinder, timerUtil, 5);

private DiscoveryPeer peer_000 =
new DiscoveryPeer(
BytesValue.fromHexString(
"0x11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"),
"0.0.0.0",
1,
1);
private DiscoveryPeer peer_010 =
new DiscoveryPeer(
BytesValue.fromHexString(
"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000"),
"0.0.0.0",
1,
1);
private DiscoveryPeer peer_020 =
new DiscoveryPeer(
BytesValue.fromHexString(
"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000"),
"0.0.0.0",
1,
1);
private DiscoveryPeer peer_021 =
new DiscoveryPeer(
BytesValue.fromHexString(
"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000"),
"0.0.0.0",
1,
1);
private DiscoveryPeer peer_022 =
new DiscoveryPeer(
BytesValue.fromHexString(
"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000"),
"0.0.0.0",
1,
1);
private DiscoveryPeer peer_023 =
new DiscoveryPeer(
BytesValue.fromHexString(
"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000"),
"0.0.0.0",
1,
1);
private DiscoveryPeer peer_011 =
new DiscoveryPeer(
BytesValue.fromHexString(
"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010"),
"0.0.0.0",
1,
1);
private DiscoveryPeer peer_120 =
new DiscoveryPeer(
BytesValue.fromHexString(
"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000"),
"0.0.0.0",
1,
1);
private DiscoveryPeer peer_121 =
new DiscoveryPeer(
BytesValue.fromHexString(
"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000"),
"0.0.0.0",
1,
1);
private DiscoveryPeer peer_122 =
new DiscoveryPeer(
BytesValue.fromHexString(
"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000"),
"0.0.0.0",
1,
1);
private DiscoveryPeer peer_123 =
new DiscoveryPeer(
BytesValue.fromHexString(
"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000"),
"0.0.0.0",
1,
1);
private DiscoveryPeer peer_012 =
new DiscoveryPeer(
BytesValue.fromHexString(
"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100"),
"0.0.0.0",
1,
1);
private DiscoveryPeer peer_220 =
new DiscoveryPeer(
BytesValue.fromHexString(
"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000"),
"0.0.0.0",
1,
1);
private DiscoveryPeer peer_221 =
new DiscoveryPeer(
BytesValue.fromHexString(
"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000"),
"0.0.0.0",
1,
1);
private DiscoveryPeer peer_222 =
new DiscoveryPeer(
BytesValue.fromHexString(
"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000"),
"0.0.0.0",
1,
1);
private DiscoveryPeer peer_223 =
new DiscoveryPeer(
BytesValue.fromHexString(
"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000"),
"0.0.0.0",
1,
1);
private DiscoveryPeer peer_013 =
new DiscoveryPeer(
BytesValue.fromHexString(
"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000"),
"0.0.0.0",
1,
1);
private DiscoveryPeer peer_320 =
new DiscoveryPeer(
BytesValue.fromHexString(
"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000"),
"0.0.0.0",
1,
1);
private DiscoveryPeer peer_321 =
new DiscoveryPeer(
BytesValue.fromHexString(
"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000"),
"0.0.0.0",
1,
1);
private DiscoveryPeer peer_322 =
new DiscoveryPeer(
BytesValue.fromHexString(
"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000"),
"0.0.0.0",
1,
1);
private DiscoveryPeer peer_323 =
new DiscoveryPeer(
BytesValue.fromHexString(
"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"),
"0.0.0.0",
1,
1);

List<DiscoveryPeer> peerTable_000 = Arrays.asList(peer_010, peer_011, peer_012, peer_013);
List<DiscoveryPeer> peerTable_010 = Arrays.asList(peer_020, peer_021, peer_022, peer_023);
List<DiscoveryPeer> peerTable_011 = Arrays.asList(peer_120, peer_121, peer_122, peer_123);
List<DiscoveryPeer> peerTable_012 = Arrays.asList(peer_220, peer_221, peer_222, peer_223);
List<DiscoveryPeer> peerTable_013 = Arrays.asList(peer_320, peer_321, peer_322, peer_323);

private NeighborsPacketData neighborsPacketData_000 = NeighborsPacketData.create(peerTable_000);
private NeighborsPacketData neighborsPacketData_010 = NeighborsPacketData.create(peerTable_010);
private NeighborsPacketData neighborsPacketData_011 = NeighborsPacketData.create(peerTable_011);
private NeighborsPacketData neighborsPacketData_012 = NeighborsPacketData.create(peerTable_012);
private NeighborsPacketData neighborsPacketData_013 = NeighborsPacketData.create(peerTable_013);

@Before
public void setUp() {
when(peerWhitelist.contains(any(DiscoveryPeer.class))).thenReturn(true);
}

@Test
public void shouldBondWithInitialNodesWhenStarted() {
recursivePeerRefreshState.start(asList(peer1, peer2, peer3), TARGET);

verify(bondingAgent).performBonding(peer1);
verify(bondingAgent).performBonding(peer2);
verify(bondingAgent).performBonding(peer3);
verifyNoMoreInteractions(bondingAgent, neighborFinder);
}

@Test
public void shouldOnlyBondWithUnbondedInitialNodes() {}

@Test
public void shouldSkipStraightToFindNeighboursIfAllInitialNodesAreBonded() {
peer1.setStatus(PeerDiscoveryStatus.BONDED);
peer2.setStatus(PeerDiscoveryStatus.BONDED);

recursivePeerRefreshState.start(asList(peer1, peer2), TARGET);

verify(neighborFinder).findNeighbours(peer1, TARGET);
verify(neighborFinder).findNeighbours(peer2, TARGET);

verifyNoMoreInteractions(bondingAgent, neighborFinder);
}

@Test
public void shouldBondWithNewlyDiscoveredNodes() {
peer1.setStatus(PeerDiscoveryStatus.BONDED);

recursivePeerRefreshState.start(singletonList(peer1), TARGET);

verify(neighborFinder).findNeighbours(peer1, TARGET);
recursivePeerRefreshState.onNeighboursPacketReceived(
peer1, NeighborsPacketData.create(asList(peer2, peer3)));

verify(bondingAgent).performBonding(peer2);
verify(bondingAgent).performBonding(peer3);

verifyNoMoreInteractions(bondingAgent, neighborFinder);
}

@Test
public void shouldMoveToNeighboursRoundWhenBondingTimesOut() {
peer1.setStatus(PeerDiscoveryStatus.BONDED);
recursivePeerRefreshState.start(asList(peer1, peer2), TARGET);

verify(bondingAgent).performBonding(peer2);
timerUtil.runTimerHandlers();

verify(neighborFinder).findNeighbours(peer1, TARGET);

verifyNoMoreInteractions(bondingAgent, neighborFinder);
}

@Test
public void shouldMoveToBondingRoundWhenNeighboursRoundTimesOut() {}

@Test
public void shouldStopWhenAllNodesHaveBeenQueried() {}

@Test
public void shouldStopWhenMaximumNumberOfRoundsReached() {}

@Test
public void shouldOnlyQueryClosestThreeNeighbours() {}

@Test
public void shouldNotQueryNodeThatIsAlreadyQueried() {}

@Test
public void shouldBondWithNewNeighboursWhenSomeRequestsTimeOut() {
recursivePeerRefreshState.start(singletonList(peer_000), TARGET);

verify(bondingAgent).performBonding(peer_000);

peer_000.setStatus(PeerDiscoveryStatus.BONDED);

recursivePeerRefreshState.onBondingComplete(peer_000);

verify(neighborFinder).findNeighbours(peer_000, TARGET);

recursivePeerRefreshState.onNeighboursPacketReceived(peer_000, neighborsPacketData_000);

peer_010.setStatus(PeerDiscoveryStatus.BONDED);
peer_011.setStatus(PeerDiscoveryStatus.BONDED);
peer_012.setStatus(PeerDiscoveryStatus.BONDED);
peer_013.setStatus(PeerDiscoveryStatus.BONDED);

recursivePeerRefreshState.onBondingComplete(peer_010); // Trigger the next round...

verify(neighborFinder, never()).findNeighbours(peer_010, TARGET);
verify(neighborFinder).findNeighbours(peer_011, TARGET);
verify(neighborFinder).findNeighbours(peer_012, TARGET);
verify(neighborFinder).findNeighbours(peer_013, TARGET);

timerUtil.runTimerHandlers();

verify(neighborFinder).findNeighbours(peer_010, TARGET);
}

@Test
public void shouldNotBondWithDiscoveredNodesThatAreAlreadyBonded() {}

@Test
public void shouldQueryNodeThatTimedOutWithBondingButLaterCompletedBonding() {}

@Test
public void shouldBondWithPeersInNeighboursResponseReceivedAfterTimeout() {}

@Test
public void shouldNotBondWithNodesOnBlacklist() {}

@Test
public void shouldNotBondWithNodesRejectedByWhitelist() {
reset(peerWhitelist);
}

private static BytesValue createId(final int id) {
return BytesValue.fromHexString(String.format("%0128x", id));
}
}