public void TestGetRelease_NonBucketSizes()
        {
            _pool = new TestPool(10, 10, MakeBucketSizeArray(2, 1, 4, 1, 6, 1));
            _stats.SetPool(_pool);

            _pool.Get(2);
            byte[] b1 = _pool.Get(7);
            _stats.Refresh();
            Assert.AreEqual(10, _stats.UsedBytes);
            Assert.AreEqual(2, _stats.UsedCount);
            _pool.Release(b1);
            _stats.Refresh();
            Assert.AreEqual(2, _stats.UsedBytes);
            Assert.AreEqual(1, _stats.UsedCount);
            Assert.AreEqual(0, _stats.FreeBytes);
            Assert.AreEqual(0, _stats.FreeCount);

            byte[] b2 = new byte[3];
            _pool.Release(b2);
            _stats.Refresh();
            Assert.AreEqual(2, _stats.UsedBytes);
            Assert.AreEqual(1, _stats.UsedCount);
            Assert.AreEqual(0, _stats.FreeBytes);
            Assert.AreEqual(0, _stats.FreeCount);
        }
        public void TestTrimToSize()
        {
            _pool = new TestPool(100, 100, MakeBucketSizeArray(2, 2, 4, 2, 6, 2));
            _stats.SetPool(_pool);

            // Allocate and release multiple buffers
            byte[] b1;
            _pool.Get(2);
            b1 = _pool.Get(2);
            _pool.Release(b1);
            b1 = _pool.Get(6);
            _pool.Release(b1);
            b1 = _pool.Get(4);
            _pool.Release(b1);

            _stats.Refresh();
            Assert.AreEqual(12, _stats.FreeBytes);
            Assert.AreEqual(2, _stats.UsedBytes);

            // Perform a dummy trim - nothing should happen
            _pool.TrimToSize(100);
            _stats.Refresh();
            Assert.AreEqual(12, _stats.FreeBytes);
            Assert.AreEqual(2, _stats.UsedBytes);

            // Now perform the real trim
            _pool.TrimToSize(8);
            _stats.Refresh();
            Assert.AreEqual(6, _stats.FreeBytes);
            Assert.AreEqual(2, _stats.UsedBytes);
            var testStat = new Dictionary <int, Tuple <int, int> >()
            {
                { 2, new Tuple <int, int>(1, 0) },
                { 4, new Tuple <int, int>(0, 0) },
                { 6, new Tuple <int, int>(0, 1) }
            };

            Assert.IsTrue(testStat.All(e => _stats.BucketStats.Contains(e)));

            // Perform another trim
            _pool.TrimToSize(1);
            _stats.Refresh();
            Assert.AreEqual(0, _stats.FreeBytes);
            Assert.AreEqual(2, _stats.UsedBytes);
            testStat = new Dictionary <int, Tuple <int, int> >()
            {
                { 2, new Tuple <int, int>(1, 0) },
                { 4, new Tuple <int, int>(0, 0) },
                { 6, new Tuple <int, int>(0, 0) }
            };

            Assert.IsTrue(testStat.All(e => _stats.BucketStats.Contains(e)));
        }
        public void TestRelease_BucketLengths()
        {
            _pool = new TestPool(int.MaxValue, int.MaxValue, MakeBucketSizeArray(2, 2));
            _stats.SetPool(_pool);

            byte[] b0 = _pool.Get(2);
            _pool.Get(2);
            _pool.Get(2);
            _stats.Refresh();
            var testStat = new Dictionary <int, Tuple <int, int> >()
            {
                { 2, new Tuple <int, int>(3, 0) }
            };

            Assert.IsTrue(testStat.All(e => _stats.BucketStats.Contains(e)));
            Assert.AreEqual(6, _stats.UsedBytes);
            Assert.AreEqual(3, _stats.UsedCount);
            Assert.AreEqual(0, _stats.FreeBytes);
            Assert.AreEqual(0, _stats.FreeCount);

            // Now release one of the buffers
            _pool.Release(b0);
            _stats.Refresh();
            testStat = new Dictionary <int, Tuple <int, int> >()
            {
                { 2, new Tuple <int, int>(2, 0) }
            };

            Assert.IsTrue(testStat.All(e => _stats.BucketStats.Contains(e)));
            Assert.AreEqual(4, _stats.UsedBytes);
            Assert.AreEqual(2, _stats.UsedCount);
            Assert.AreEqual(0, _stats.FreeBytes);
            Assert.AreEqual(0, _stats.FreeCount);
        }
        public void TestGet_AllocAndTrim()
        {
            _pool = new TestPool(10, 10, MakeBucketSizeArray(2, 2, 4, 2, 6, 2));
            _stats.SetPool(_pool);

            // Allocate and release multiple buffers
            byte[] b1 = _pool.Get(2);
            _pool.Release(b1);
            b1 = _pool.Get(6);
            _pool.Release(b1);

            // Get current stats
            _stats.Refresh();
            var testStat = new Dictionary <int, Tuple <int, int> >()
            {
                { 2, new Tuple <int, int>(0, 1) },
                { 4, new Tuple <int, int>(0, 0) },
                { 6, new Tuple <int, int>(0, 1) }
            };

            Assert.IsTrue(testStat.All(e => _stats.BucketStats.Contains(e)));

            // Get a new buffer; this should cause an alloc and a trim
            _pool.Get(3);
            _stats.Refresh();

            // Validate stats
            testStat = new Dictionary <int, Tuple <int, int> >()
            {
                { 2, new Tuple <int, int>(0, 0) },
                { 4, new Tuple <int, int>(1, 0) },
                { 6, new Tuple <int, int>(0, 1) }
            };

            Assert.IsTrue(testStat.All(e => _stats.BucketStats.Contains(e)));
            Assert.AreEqual(6, _stats.FreeBytes);
            Assert.AreEqual(4, _stats.UsedBytes);
            Assert.AreEqual(1, _stats.FreeCount);
            Assert.AreEqual(1, _stats.UsedCount);
        }
        public void TestRelease_Free2()
        {
            // Create a new pool with a max size cap of zero.
            _pool = new TestPool(0, 10);
            _stats.SetPool(_pool);

            // get a buffer and release it - this should trigger the soft cap
            byte[] b1 = _pool.Get(4);
            _pool.Release(b1);
            _stats.Refresh();
            var testStat = new Dictionary <int, Tuple <int, int> >()
            {
                { 4, new Tuple <int, int>(0, 0) }
            };

            Assert.IsTrue(testStat.All(e => _stats.BucketStats.Contains(e)));
            Assert.AreEqual(0, _stats.FreeBytes);
            Assert.AreEqual(0, _stats.UsedBytes);
            Assert.AreEqual(0, _stats.FreeCount);
            Assert.AreEqual(0, _stats.UsedCount);
        }