public void ConnectHeaders_SupplyHeadersThenSupplyMore_Both_Tip_PeerId_Maps_ShouldBeUpdated() { var testContext = new TestContext(); ChainedHeaderTree cht = testContext.CreateChainedHeaderTree(); ChainedHeader chainTip = testContext.ExtendAChain(10); cht.Initialize(chainTip, true); List <BlockHeader> listOfExistingHeaders = testContext.ChainedHeaderToList(chainTip, 10); cht.ConnectNewHeaders(1, listOfExistingHeaders); Dictionary <uint256, HashSet <int> > peerIdsByTipHashBefore = cht.GetPeerIdsByTipHash().ToDictionary(entry => entry.Key, entry => new HashSet <int>(entry.Value)); Dictionary <int, uint256> peerTipsByPeerIdBefore = cht.GetPeerTipsByPeerId().ToDictionary(entry => entry.Key, entry => new uint256(entry.Value)); // (of 25 headers) supply last 5 existing and first 10 new ChainedHeader newChainTip = testContext.ExtendAChain(15, chainTip); List <BlockHeader> listOfNewAndOldHeaders = testContext.ChainedHeaderToList(newChainTip, 25).GetRange(5, 15); cht.ConnectNewHeaders(1, listOfNewAndOldHeaders); Dictionary <uint256, HashSet <int> > peerIdsByTipHashAfter = cht.GetPeerIdsByTipHash(); Dictionary <int, uint256> peerTipsByPeerIdAfter = cht.GetPeerTipsByPeerId(); // Tip # -> peer id map has changed Assert.True(peerIdsByTipHashBefore.FirstOrDefault(x => x.Value.Contains(1)).Key != peerIdsByTipHashAfter.FirstOrDefault(x => x.Value.Contains(1)).Key); // Peer id -> tip # map has changed Assert.True(peerTipsByPeerIdBefore[1] != peerTipsByPeerIdAfter[1]); // reassigning # so amount of items the same Assert.True(peerTipsByPeerIdBefore.Values.Count == peerTipsByPeerIdAfter.Values.Count); }
public static ChainedHeader GetPeerTipChainedHeaderByPeerId(this ChainedHeaderTree chainedHeaderTree, int peer) { return(chainedHeaderTree.GetChainedHeadersByHash()[chainedHeaderTree.GetPeerTipsByPeerId()[peer]]); }