Exemplo n.º 1
0
        public void Capacity_is_never_exceeded_when_there_are_duplicates()
        {
            var pool = new DistinctValueSortedPool <int, WithFinalizer>(Capacity, (t1, t2) =>
            {
                int t1Oddity = t1.Index % 2;
                int t2Oddity = t2.Index % 2;

                if (t1Oddity.CompareTo(t2Oddity) != 0)
                {
                    return(t1Oddity.CompareTo(t2Oddity));
                }

                return(t1.Index.CompareTo(t2.Index));
            }, new WithFinalizerComparer());

            int capacityMultiplier = 10;

            for (int i = 0; i < Capacity * capacityMultiplier; i++)
            {
                WithFinalizer newOne = new WithFinalizer(i % (Capacity * 2));
                pool.TryInsert(newOne.Index, newOne);
            }

            CollectAndFinalize();

            _finalizedCount.Should().BeLessOrEqualTo(Capacity * (capacityMultiplier - 1));
            _allCount.Should().Be(Capacity * capacityMultiplier);
            pool.Count.Should().Be(Capacity);
        }
Exemplo n.º 2
0
        public void Capacity_is_never_exceeded()
        {
            var pool = new DistinctValueSortedPool <int, WithFinalizer>(Capacity, (t1, t2) =>
            {
                int t1Oddity = t1.Index % 2;
                int t2Oddity = t2.Index % 2;

                if (t1Oddity.CompareTo(t2Oddity) != 0)
                {
                    return(t1Oddity.CompareTo(t2Oddity));
                }

                return(t1.Index.CompareTo(t2.Index));
            }, new WithFinalizerComparer());

            int capacityMultiplier = 10;
            int expectedAllCount   = Capacity * capacityMultiplier;

            WithFinalizer newOne;

            for (int i = 0; i < expectedAllCount; i++)
            {
                newOne = new WithFinalizer();
                pool.TryInsert(newOne.Index, newOne);
            }

            newOne = null;

            CollectAndFinalize();

            _allCount.Should().Be(expectedAllCount);
            _finalizedCount.Should().BeLessOrEqualTo(expectedAllCount - Capacity);
            pool.Count.Should().Be(Capacity);
        }
Exemplo n.º 3
0
        public async Task Capacity_is_never_exceeded_with_multiple_threads()
        {
            int capacityMultiplier = 10;

            _finalizedCount.Should().Be(0);
            _allCount.Should().Be(0);

            var pool = new DistinctValueSortedPool <int, WithFinalizer>(Capacity, (t1, t2) =>
            {
                int t1Oddity = t1.Index % 2;
                int t2Oddity = t2.Index % 2;

                if (t1Oddity.CompareTo(t2Oddity) != 0)
                {
                    return(t1Oddity.CompareTo(t2Oddity));
                }

                return(t1.Index.CompareTo(t2.Index));
            }, new WithFinalizerComparer());

            void KeepGoing(int iterations)
            {
                for (int i = 0; i < iterations; i++)
                {
                    if (i % 3 == 2)
                    {
                        pool.TryRemove(i - 1, out _);
                    }

                    pool.TryInsert(i, new WithFinalizer(i));

                    if (i % 3 == 1)
                    {
                        pool.GetSnapshot();
                    }
                }
            }

            Task a = new Task(() => KeepGoing(Capacity * capacityMultiplier));
            Task b = new Task(() => KeepGoing(Capacity * capacityMultiplier));
            Task c = new Task(() => KeepGoing(Capacity * capacityMultiplier));

            a.Start();
            b.Start();
            c.Start();

            await Task.WhenAll(a, b, c);

            CollectAndFinalize();

            int expectedAllCount = Capacity * capacityMultiplier * 3;

            _allCount.Should().Be(expectedAllCount);
            _finalizedCount.Should().BeGreaterOrEqualTo(expectedAllCount - Capacity);
        }
Exemplo n.º 4
0
        public void Distinct_transactions_are_all_added(Transaction[] transactions, int expectedCount)
        {
            var pool = new DistinctValueSortedPool <Keccak, Transaction>(Capacity, (t1, t2) => t1.GasPrice.CompareTo(t2.GasPrice), PendingTransactionComparer.Default);

            foreach (var transaction in transactions)
            {
                pool.TryInsert(transaction.Hash, transaction);
            }

            pool.Count.Should().Be(expectedCount);
        }
Exemplo n.º 5
0
        public void Same_transactions_are_all_replaced_with_highest_gas_price(bool gasPriceAscending)
        {
            var pool = new DistinctValueSortedPool <Keccak, Transaction>(Capacity, (t1, t2) => t1.GasPrice.CompareTo(t2.GasPrice), PendingTransactionComparer.Default);

            var transactions = gasPriceAscending
                ? GenerateTransactions(address: TestItem.AddressB, nonce: 3).OrderBy(t => t.GasPrice)
                : GenerateTransactions(address: TestItem.AddressB, nonce: 3).OrderByDescending(t => t.GasPrice);

            foreach (var transaction in transactions)
            {
                pool.TryInsert(transaction.Hash, transaction);
            }

            pool.Count.Should().Be(1);
            pool.GetSnapshot().First().GasPrice.Should().Be(Capacity - 1);
        }