Skip to content

Commit

Permalink
Fix nondeterministic unit tests
Browse files Browse the repository at this point in the history
  • Loading branch information
limebell committed Mar 2, 2021
1 parent 9911c4f commit 5214e34
Show file tree
Hide file tree
Showing 4 changed files with 47 additions and 33 deletions.
18 changes: 9 additions & 9 deletions Libplanet.Tests/Net/Protocols/ProtocolTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -212,9 +212,9 @@ public async Task RoutingTableFull()
await StartTestTransportAsync(transportB);
await StartTestTransportAsync(transportC);

await transportA.AddPeersAsync(new[] { transport.AsPeer }, null);
await transportB.AddPeersAsync(new[] { transport.AsPeer }, null);
await transportC.AddPeersAsync(new[] { transport.AsPeer }, null);
await transport.AddPeersAsync(new[] { transportA.AsPeer }, null);
await transport.AddPeersAsync(new[] { transportB.AsPeer }, null);
await transport.AddPeersAsync(new[] { transportC.AsPeer }, null);

Assert.Single(transportA.Peers);
Assert.Contains(transportA.AsPeer, transport.Peers);
Expand All @@ -240,10 +240,10 @@ public async Task ReplacementCache()
await StartTestTransportAsync(transportB);
await StartTestTransportAsync(transportC);

await transportA.AddPeersAsync(new[] { transport.AsPeer }, null);
await transportB.AddPeersAsync(new[] { transport.AsPeer }, null);
await transport.AddPeersAsync(new[] { transportA.AsPeer }, null);
await transport.AddPeersAsync(new[] { transportB.AsPeer }, null);
await Task.Delay(100);
await transportC.AddPeersAsync(new[] { transport.AsPeer }, null);
await transport.AddPeersAsync(new[] { transportC.AsPeer }, null);

Assert.Single(transportA.Peers);
Assert.Contains(transportA.AsPeer, transport.Peers);
Expand Down Expand Up @@ -276,8 +276,8 @@ public async Task RemoveDeadReplacementCache()
await StartTestTransportAsync(transportB);
await StartTestTransportAsync(transportC);

await transportA.AddPeersAsync(new[] { transport.AsPeer }, null);
await transportB.AddPeersAsync(new[] { transport.AsPeer }, null);
await transport.AddPeersAsync(new[] { transportA.AsPeer }, null);
await transport.AddPeersAsync(new[] { transportB.AsPeer }, null);

Assert.Single(transport.Peers);
Assert.Contains(transportA.AsPeer, transport.Peers);
Expand All @@ -286,7 +286,7 @@ public async Task RemoveDeadReplacementCache()
await transportA.StopAsync(TimeSpan.Zero);
await transportB.StopAsync(TimeSpan.Zero);

await transportC.AddPeersAsync(new[] { transport.AsPeer }, null);
await transport.AddPeersAsync(new[] { transportC.AsPeer }, null);
await transport.Protocol.RefreshTableAsync(TimeSpan.Zero, default(CancellationToken));
await transport.Protocol.CheckReplacementCacheAsync(default(CancellationToken));

Expand Down
4 changes: 2 additions & 2 deletions Libplanet.Tests/Net/SwarmTest.Broadcast.cs
Original file line number Diff line number Diff line change
Expand Up @@ -627,7 +627,7 @@ public async Task BroadcastBlockWithSkip()
await StartAsync(minerSwarm);
await StartAsync(receiverSwarm);

await BootstrapAsync(receiverSwarm, minerSwarm.AsPeer);
minerSwarm.AddPeer(receiverSwarm.AsPeer);

var block1 = TestUtils.MineNext(
blockChain.Genesis,
Expand Down Expand Up @@ -673,7 +673,7 @@ public async Task BroadcastBlockWithoutGenesis()
await StartAsync(swarmA);
await StartAsync(swarmB);

await BootstrapAsync(swarmB, swarmA.AsPeer);
swarmA.AddPeer(swarmB.AsPeer);

await chainA.MineBlock(swarmA.Address);
swarmA.BroadcastBlock(chainA[-1]);
Expand Down
52 changes: 30 additions & 22 deletions Libplanet.Tests/Net/SwarmTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -223,6 +223,7 @@ public async Task AutoConnectAfterStart()
await StartAsync(swarmB);

await BootstrapAsync(swarmA, swarmB.AsPeer);
await Task.Delay(1000);

Assert.Contains(swarmB.AsPeer, swarmA.Peers);
Assert.Empty(swarmB.Peers);
Expand Down Expand Up @@ -780,7 +781,6 @@ public async Task ForkByDifficulty()
await StartAsync(miner1);
await StartAsync(miner2);

await BootstrapAsync(miner2, miner1.AsPeer);
miner2.AddPeer(miner1.AsPeer);

miner2.BroadcastBlock(block);
Expand Down Expand Up @@ -831,8 +831,8 @@ Swarm<Sleep> MakeSwarm() => CreateSwarm(TestUtils.MakeBlockChain(
await StartAsync(miner1);
await StartAsync(miner2);

await BootstrapAsync(miner2, miner1.AsPeer);
await BootstrapAsync(receiver, miner1.AsPeer);
miner1.AddPeers(new[] { receiver.AsPeer, miner2.AsPeer });
miner2.AddPeers(new[] { receiver.AsPeer, miner1.AsPeer });

var t = receiver.PreloadAsync();
await miner1.BlockChain.MineBlock(miner1.Address);
Expand Down Expand Up @@ -896,9 +896,9 @@ public async void RestageTransactionsOnceLocallyMinedAfterReorg(bool restage)
await StartAsync(minerA);
await StartAsync(minerB);

await BootstrapAsync(minerA, minerB.AsPeer);
minerB.AddPeer(minerA.AsPeer);

Log.Debug("Reorg occurrs.");
Log.Debug("Reorg occurs.");
minerB.BroadcastBlock(blockC);
await minerA.BlockAppended.WaitAsync();

Expand Down Expand Up @@ -962,7 +962,7 @@ bool IsSignerValid(Transaction<DumbAction> tx, BlockChain<DumbAction> chain)
await StartAsync(swarmA);
await StartAsync(swarmB);

await BootstrapAsync(swarmA, swarmB.AsPeer);
swarmA.AddPeer(swarmB.AsPeer);

swarmA.BroadcastTxs(new[] { validTx, invalidTx });
await swarmB.TxReceived.WaitAsync();
Expand Down Expand Up @@ -1025,7 +1025,7 @@ bool IsSignerValid(Transaction<DumbAction> tx, BlockChain<DumbAction> chain)
await StartAsync(swarmA);
await StartAsync(swarmB);

await BootstrapAsync(swarmA, swarmB.AsPeer);
swarmA.AddPeer(swarmB.AsPeer);

swarmA.BroadcastTxs(new[] { tx });
await swarmB.TxReceived.WaitAsync();
Expand Down Expand Up @@ -1072,8 +1072,8 @@ public async Task CreateNewChainWhenBranchPointNotExist()
await StartAsync(minerSwarmB);
await StartAsync(receiverSwarm);

await BootstrapAsync(minerSwarmA, receiverSwarm.AsPeer);
await BootstrapAsync(minerSwarmB, receiverSwarm.AsPeer);
minerSwarmA.AddPeer(receiverSwarm.AsPeer);
minerSwarmB.AddPeer(receiverSwarm.AsPeer);

// Broadcast SwarmA's first block.
var b1 = await minerChainA.MineBlock(minerSwarmA.Address);
Expand Down Expand Up @@ -1382,7 +1382,7 @@ public async Task DoNotFillWhenGetAllBlockAtFirstTimeFromSender()

try
{
await BootstrapAsync(sender, receiver.AsPeer);
sender.AddPeer(receiver.AsPeer);

sender.BroadcastBlock(sender.BlockChain.Tip);

Expand Down Expand Up @@ -1423,7 +1423,7 @@ public async Task FillWhenGetAllBlocksFromSender()

try
{
await BootstrapAsync(sender, receiver.AsPeer);
sender.AddPeer(receiver.AsPeer);

sender.BroadcastBlock(sender.BlockChain.Tip);

Expand Down Expand Up @@ -1458,8 +1458,8 @@ public async Task DoNotFillMultipleTimes()

try
{
await BootstrapAsync(sender1, receiver.AsPeer);
await BootstrapAsync(sender2, receiver.AsPeer);
sender1.AddPeer(receiver.AsPeer);
sender2.AddPeer(receiver.AsPeer);

sender1.BlockChain.Append(b1);
sender2.BlockChain.Append(b1);
Expand Down Expand Up @@ -1523,7 +1523,7 @@ public async Task GetPeerChainStateAsync()
await StartAsync(swarm2);
await StartAsync(swarm3);

await BootstrapAsync(swarm1, swarm2.AsPeer);
swarm1.AddPeer(swarm2.AsPeer);

peerChainState = await swarm1.GetPeerChainStateAsync(
TimeSpan.FromSeconds(1), default);
Expand All @@ -1540,7 +1540,7 @@ public async Task GetPeerChainStateAsync()
peerChainState.First()
);

await BootstrapAsync(swarm1, swarm3.AsPeer);
swarm1.AddPeer(swarm3.AsPeer);
peerChainState = await swarm1.GetPeerChainStateAsync(
TimeSpan.FromSeconds(1), default);
Assert.Equal(
Expand Down Expand Up @@ -1573,6 +1573,7 @@ public async Task LastMessageTimestamp()
Assert.Null(swarm1.LastMessageTimestamp);
DateTimeOffset bootstrappedAt = DateTimeOffset.UtcNow;
await BootstrapAsync(swarm2, swarm1.AsPeer);
await Task.Delay(1000);
await StartAsync(swarm2);

Assert.NotNull(swarm1.LastMessageTimestamp);
Expand Down Expand Up @@ -1600,25 +1601,32 @@ public async Task Restart()
{
// Setup
await StartAsync(swarm1);
await BootstrapAsync(swarm2, swarm1.AsPeer);
await StartAsync(swarm2);

await BootstrapAsync(swarm2, swarm1.AsPeer);
await Task.Delay(1000);

Assert.True(
swarm1.Peers.Contains(swarm2.AsPeer),
"Swarm2 does not exist in swarm1's routing table after setup.");

// Restart
await swarm1.StopAsync();
Assert.False(swarm1.Running);
await Task.Delay(1000);
await StartAsync(swarm1);
DateTimeOffset restartedAt = DateTimeOffset.UtcNow;

// Check
await swarm1.CheckAllPeersAsync();
await swarm2.CheckAllPeersAsync();
await Task.Delay(1000);

Assert.Contains(swarm1.AsPeer, swarm2.Peers);
Assert.Contains(swarm2.AsPeer, swarm1.Peers);
Assert.True(
swarm1.Peers.Contains(swarm2.AsPeer),
"Swarm2 does not exist in swarm1's routing table.");
Assert.True(
swarm2.Peers.Contains(swarm1.AsPeer),
"Swarm1 does not exist in swarm2's routing table.");
Assert.NotNull(swarm1.LastMessageTimestamp);
Assert.NotNull(swarm2.LastMessageTimestamp);
Assert.InRange(
swarm1.LastMessageTimestamp.Value,
restartedAt,
Expand Down Expand Up @@ -1781,7 +1789,7 @@ public async Task ResetBlockDemandIfNotChanged()

await StartAsync(sender);
await StartAsync(receiver);
await BootstrapAsync(sender, receiver.AsPeer);
sender.AddPeer(receiver.AsPeer);

sender.BroadcastBlock(lowerBlock);
await receiver.FillBlocksAsyncStarted.WaitAsync();
Expand Down
6 changes: 6 additions & 0 deletions Libplanet/Net/Protocols/KademliaProtocol.cs
Original file line number Diff line number Diff line change
Expand Up @@ -551,6 +551,12 @@ private async Task ValidateAsync(
RemovePeer(peer);
throw;
}
catch (InvalidMessageException)
{
_logger.Verbose("Peer {Peer} is invalid, removing...", peer);
RemovePeer(peer);
throw;
}
}

/// <summary>
Expand Down

0 comments on commit 5214e34

Please sign in to comment.