예제 #1
0
        public void TryAdd_DataNotContinuous()
        {
            var chainId        = 123;
            var initTarget     = 1;
            var blockInfoCache = new ChainCacheEntity(chainId, initTarget);

            blockInfoCache.TryAdd(new SideChainBlockData
            {
                Height  = 1,
                ChainId = chainId,
                TransactionStatusMerkleTreeRoot = Hash.FromString("1")
            });
            blockInfoCache.TryAdd(new SideChainBlockData
            {
                Height  = 2,
                ChainId = chainId,
                TransactionStatusMerkleTreeRoot = Hash.FromString("2")
            });

            // 3 is absent.
            blockInfoCache.TryAdd(new SideChainBlockData
            {
                Height  = 4,
                ChainId = chainId,
                TransactionStatusMerkleTreeRoot = Hash.FromString("4")
            });
            Assert.True(blockInfoCache.TargetChainHeight() == 3);
        }
예제 #2
0
        public void TryTake_WithoutCache()
        {
            var chainId        = 123;
            var initTarget     = 1;
            var blockInfoCache = new ChainCacheEntity(chainId, initTarget);
            var res            = blockInfoCache.TryTake(initTarget, out _, false);

            Assert.False(res);
        }
예제 #3
0
        public void TryAdd_SingleThread_Success()
        {
            var chainId        = 123;
            var height         = 1;
            var blockInfoCache = new ChainCacheEntity(chainId, 1);
            var res            = blockInfoCache.TryAdd(new SideChainBlockData
            {
                Height = height
            });

            Assert.True(res);
            Assert.True(blockInfoCache.TargetChainHeight() == height + 1);
        }
예제 #4
0
        public void TryAdd_SingleThread_Fail()
        {
            var height         = 2;
            var initTarget     = 1;
            var chainId        = 123;
            var blockInfoCache = new ChainCacheEntity(chainId, initTarget);
            var res            = blockInfoCache.TryAdd(new SideChainBlockData
            {
                Height = height
            });

            Assert.False(res);
            Assert.True(blockInfoCache.TargetChainHeight() == initTarget);
        }
예제 #5
0
        public void TryAdd_SingleThread_Success()
        {
            var chainId        = 123;
            var height         = 1;
            var blockInfoCache = new ChainCacheEntity(chainId, 1);
            var res            = blockInfoCache.TryAdd(new SideChainBlockData
            {
                Height  = height,
                ChainId = chainId,
                TransactionStatusMerkleTreeRoot = Hash.FromString(height.ToString())
            });

            Assert.True(res);
            Assert.True(blockInfoCache.TargetChainHeight() == height + 1);
        }
예제 #6
0
        public void TryTake_WithoutSizeLimit()
        {
            var chainId        = 123;
            var initTarget     = 1;
            var blockInfoCache = new ChainCacheEntity(chainId, initTarget);

            blockInfoCache.TryAdd(new SideChainBlockData
            {
                Height = 1
            });
            var res = blockInfoCache.TryTake(initTarget, out var blockInfo, false);

            Assert.True(res);
            Assert.True(blockInfo.Height == initTarget);
        }
예제 #7
0
        public void TryAdd_DataContinuous()
        {
            var chainId        = 123;
            var initTarget     = 1;
            var blockInfoCache = new ChainCacheEntity(chainId, initTarget);
            var i = 0;

            while (i < 5)
            {
                blockInfoCache.TryAdd(new SideChainBlockData
                {
                    Height = i++
                });
            }
            Assert.True(blockInfoCache.TargetChainHeight() == 5);
        }
예제 #8
0
        public void TryTake_WrongIndex()
        {
            int chainId            = 123;
            var blockInfoCache     = new ChainCacheEntity(chainId, 1);
            var sideChainBlockData = CreateSideChainBlockData(chainId, 1);

            blockInfoCache.TryAdd(sideChainBlockData);
            var dict = new Dictionary <int, ChainCacheEntity>
            {
                { chainId, blockInfoCache }
            };

            CreateFakeCache(dict);
            var blockInfo = _blockCacheEntityConsumer.Take <SideChainBlockData>(chainId, 2, false);

            Assert.Null(blockInfo);
        }
예제 #9
0
        public void TryTake_WithoutSizeLimit()
        {
            var chainId        = 123;
            var initTarget     = 1;
            var blockInfoCache = new ChainCacheEntity(chainId, initTarget);

            blockInfoCache.TryAdd(new SideChainBlockData
            {
                Height  = 1,
                ChainId = chainId,
                TransactionStatusMerkleTreeRoot = Hash.FromString("1")
            });
            var res = blockInfoCache.TryTake(initTarget, out var blockInfo, false);

            Assert.True(res);
            Assert.True(blockInfo.Height == initTarget);
        }
예제 #10
0
        public void TryAdd_DataContinuous()
        {
            var chainId        = 123;
            var initTarget     = 1;
            var blockInfoCache = new ChainCacheEntity(chainId, initTarget);
            var i = 0;

            while (i < 5)
            {
                blockInfoCache.TryAdd(new SideChainBlockData
                {
                    Height  = i,
                    ChainId = chainId,
                    TransactionStatusMerkleTreeRoot = Hash.FromString(i++.ToString())
                });
            }

            Assert.True(blockInfoCache.TargetChainHeight() == 5);
        }
예제 #11
0
        public void TryTake_WithoutEnoughCache()
        {
            var chainId        = 123;
            var initTarget     = 1;
            var blockInfoCache = new ChainCacheEntity(chainId, initTarget);
            int i = 0;

            while (i++ < CrossChainConstants.DefaultBlockCacheEntityCount)
            {
                blockInfoCache.TryAdd(new SideChainBlockData
                {
                    Height = i
                });
            }

            var res = blockInfoCache.TryTake(initTarget, out _, true);

            Assert.False(res);
        }
예제 #12
0
        public void TargetHeight_WithEmptyQueue()
        {
            var chainId        = 123;
            var initTarget     = 1;
            var blockInfoCache = new ChainCacheEntity(chainId, initTarget);

            blockInfoCache.TryAdd(new SideChainBlockData
            {
                Height = 1
            });
            blockInfoCache.TryAdd(new SideChainBlockData
            {
                Height = 2
            });
            blockInfoCache.TryTake(1, out _, false);
            blockInfoCache.TryTake(2, out _, false);

            Assert.Equal(3, blockInfoCache.TargetChainHeight());
        }
예제 #13
0
        public void TryAdd_MultiThreads_WithSameData()
        {
            var chainId        = 123;
            var initTarget     = 1;
            var blockInfoCache = new ChainCacheEntity(chainId, initTarget);
            var i        = 0;
            var taskList = new List <Task>();

            while (i++ < 5)
            {
                var t = Task.Run(() => blockInfoCache.TryAdd(new SideChainBlockData
                {
                    Height = initTarget
                }));
                taskList.Add(t);
            }

            Task.WaitAll(taskList.ToArray());
            Assert.True(blockInfoCache.TargetChainHeight() == initTarget + 1);
        }
예제 #14
0
        public void TryTake_WithClearCacheNeeded()
        {
            var chainId        = 123;
            var initTarget     = 2;
            var blockInfoCache = new ChainCacheEntity(chainId, initTarget);
            int i = 0;

            while (i++ < (int)initTarget + CrossChainConstants.MinimalBlockCacheEntityCount)
            {
                var t = blockInfoCache.TryAdd(new SideChainBlockData
                {
                    Height = i
                });
            }

            var res = blockInfoCache.TryTake(initTarget, out var blockInfo, true);

            Assert.True(res);
            Assert.True(blockInfo.Height == initTarget);
        }
예제 #15
0
        public void TryTake_OutDatedData()
        {
            var chainId        = 123;
            var initTarget     = 1;
            var blockInfoCache = new ChainCacheEntity(chainId, initTarget);
            int i = 0;

            while (i++ < initTarget + CrossChainConstants.MinimalBlockCacheEntityCount)
            {
                var t = blockInfoCache.TryAdd(new SideChainBlockData
                {
                    Height = i
                });
            }

            blockInfoCache.TryTake(2, out var b1, true);
            var res = blockInfoCache.TryTake(1, out var b2, true);

            Assert.True(res);
            Assert.True(b2.Height == 1);
        }
예제 #16
0
        public void ClearByHeight()
        {
            var chainId        = 123;
            var initTarget     = 2;
            var blockInfoCache = new ChainCacheEntity(chainId, initTarget);
            int i = 0;

            while (i++ < initTarget + CrossChainConstants.DefaultBlockCacheEntityCount)
            {
                blockInfoCache.TryAdd(new SideChainBlockData
                {
                    Height  = i,
                    ChainId = chainId,
                    TransactionStatusMerkleTreeRoot = Hash.FromString(i.ToString())
                });
            }

            {
                blockInfoCache.ClearOutOfDateCacheByHeight(initTarget - 1);
                var res = blockInfoCache.TryTake(initTarget, out _, false);
                Assert.True(res);
            }

            {
                blockInfoCache.ClearOutOfDateCacheByHeight(initTarget);
                var res = blockInfoCache.TryTake(initTarget, out _, false);
                Assert.False(res);
            }

            {
                var targetHeight = blockInfoCache.TargetChainHeight();
                blockInfoCache.ClearOutOfDateCacheByHeight(targetHeight);
                Assert.True(targetHeight == blockInfoCache.TargetChainHeight());
                for (int j = 0; j < targetHeight; j++)
                {
                    var res = blockInfoCache.TryTake(j, out _, false);
                    Assert.False(res);
                }
            }
        }
예제 #17
0
        public void TryAdd_MultiThreads_WithSameData()
        {
            var chainId        = 123;
            var initTarget     = 1;
            var blockInfoCache = new ChainCacheEntity(chainId, initTarget);
            var i        = 0;
            var taskList = new List <Task>();

            while (i++ < 5)
            {
                var t = Task.Run(() => blockInfoCache.TryAdd(new SideChainBlockData
                {
                    Height  = initTarget,
                    ChainId = chainId,
                    TransactionStatusMerkleTreeRoot = Hash.FromString(initTarget.ToString())
                }));
                taskList.Add(t);
            }

            Task.WaitAll(taskList.ToArray());
            Assert.True(blockInfoCache.TargetChainHeight() == initTarget + 1);
        }
예제 #18
0
        public void TryTake_Twice()
        {
            var chainId        = 123;
            var initTarget     = 2;
            var blockInfoCache = new ChainCacheEntity(chainId, initTarget);
            int i = 0;

            while (i++ < initTarget + CrossChainConstants.MinimalBlockCacheEntityCount)
            {
                var t = blockInfoCache.TryAdd(new SideChainBlockData
                {
                    Height = i
                });
            }

            var res = blockInfoCache.TryTake(initTarget, out var b1, true);

            Assert.True(res);
            res = blockInfoCache.TryTake(initTarget, out var b2, true);
            Assert.True(res);
            Assert.Equal(b1, b2);
        }
예제 #19
0
        public void TryTake_WithClearCacheNeeded()
        {
            var chainId        = 123;
            var initTarget     = 2;
            var blockInfoCache = new ChainCacheEntity(chainId, initTarget);
            int i = 0;

            while (i++ < initTarget + CrossChainConstants.DefaultBlockCacheEntityCount)
            {
                blockInfoCache.TryAdd(new SideChainBlockData
                {
                    ChainId = chainId,
                    Height  = i,
                    TransactionStatusMerkleTreeRoot = Hash.FromString(i.ToString())
                });
            }

            var res = blockInfoCache.TryTake(initTarget, out var blockInfo, true);

            Assert.True(res);
            Assert.True(blockInfo.Height == initTarget);
        }
예제 #20
0
        public void TryAdd_DataNotContinuous()
        {
            var chainId        = 123;
            var initTarget     = 1;
            var blockInfoCache = new ChainCacheEntity(chainId, initTarget);

            blockInfoCache.TryAdd(new SideChainBlockData
            {
                Height = 1
            });
            blockInfoCache.TryAdd(new SideChainBlockData
            {
                Height = 2
            });

            // 3 is absent.
            blockInfoCache.TryAdd(new SideChainBlockData
            {
                Height = 4
            });
            Assert.True(blockInfoCache.TargetChainHeight() == 3);
        }
예제 #21
0
        public void TargetHeight_WithEmptyQueue()
        {
            var sideChainId    = 123;
            var initTarget     = 1;
            var blockInfoCache = new ChainCacheEntity(sideChainId, initTarget);

            blockInfoCache.TryAdd(new SideChainBlockData
            {
                Height  = 1,
                ChainId = sideChainId,
                TransactionStatusMerkleTreeRoot = Hash.FromString("1")
            });
            blockInfoCache.TryAdd(new SideChainBlockData
            {
                Height  = 2,
                ChainId = sideChainId,
                TransactionStatusMerkleTreeRoot = Hash.FromString("2")
            });
            blockInfoCache.TryTake(1, out _, false);
            blockInfoCache.TryTake(2, out _, false);

            Assert.Equal(3, blockInfoCache.TargetChainHeight());
        }
예제 #22
0
        public void TryTake_OutDatedData()
        {
            var chainId        = 123;
            var initTarget     = 1;
            var blockInfoCache = new ChainCacheEntity(chainId, initTarget);
            int i = 0;

            while (i++ < initTarget + CrossChainConstants.DefaultBlockCacheEntityCount)
            {
                blockInfoCache.TryAdd(new SideChainBlockData
                {
                    Height  = i,
                    ChainId = chainId,
                    TransactionStatusMerkleTreeRoot = Hash.FromString(i.ToString())
                });
            }

            blockInfoCache.TryTake(2, out _, true);
            var res = blockInfoCache.TryTake(1, out var b2, true);

            Assert.True(res);
            Assert.True(b2.Height == 1);
        }
        public void TryTake_Twice()
        {
            var chainId        = 123;
            var initTarget     = 2;
            var blockInfoCache = new ChainCacheEntity(chainId, initTarget);
            int i = 0;

            while (i++ < initTarget + CrossChainConstants.DefaultBlockCacheEntityCount)
            {
                var t = blockInfoCache.TryAdd(new SideChainBlockData
                {
                    Height  = i,
                    ChainId = chainId,
                    TransactionStatusMerkleTreeRoot = Hash.FromString(i.ToString())
                });
            }

            var res = blockInfoCache.TryTake(initTarget, out var b1, true);

            Assert.True(res);
            res = blockInfoCache.TryTake(initTarget, out var b2, true);
            Assert.True(res);
            Assert.Equal(b1, b2);
        }
        public void AddChainCacheEntity(int remoteChainId, long initialTargetHeight)
        {
            var chainCacheEntity = new ChainCacheEntity(remoteChainId, initialTargetHeight);

            _chainCacheEntities.TryAdd(remoteChainId, chainCacheEntity);
        }