| 30 | constexpr size_t SerializationBufferSize = 100 * 1024; |
| 31 | |
| 32 | TEST_F(MemoryPoolManagerTest, CreatePools) { |
| 33 | auto slabAlloc = createSlabAllocator(50); |
| 34 | auto nUsable = slabAlloc->getNumUsableSlabs(); |
| 35 | MemoryPoolManager m(*slabAlloc); |
| 36 | |
| 37 | // add some pools by name |
| 38 | |
| 39 | const std::string poolName1 = "foo"; |
| 40 | const std::string poolName2 = "bar"; |
| 41 | |
| 42 | // create two pools with 20 slabs worth of memory. |
| 43 | PoolId pool1Id = Slab::kInvalidPoolId; |
| 44 | size_t poolSize1 = 20 * Slab::kSize; |
| 45 | |
| 46 | auto allocSizes1 = getRandomAllocSizes(5); |
| 47 | |
| 48 | PoolId pool2Id = Slab::kInvalidPoolId; |
| 49 | size_t poolSize2 = 20 * Slab::kSize; |
| 50 | |
| 51 | auto allocSizes2 = getRandomAllocSizes(10); |
| 52 | |
| 53 | ASSERT_NO_THROW(pool1Id = m.createNewPool(poolName1, poolSize1, allocSizes1)); |
| 54 | ASSERT_NO_THROW(pool2Id = m.createNewPool(poolName2, poolSize2, allocSizes2)); |
| 55 | |
| 56 | MemoryPool& pool1 = m.getPoolById(pool1Id); |
| 57 | MemoryPool& pool2 = m.getPoolById(pool2Id); |
| 58 | |
| 59 | ASSERT_EQ(pool1.getPoolSize(), poolSize1); |
| 60 | ASSERT_EQ(pool2.getPoolSize(), poolSize2); |
| 61 | // pools should have unique id. |
| 62 | ASSERT_NE(pool1.getId(), pool2.getId()); |
| 63 | |
| 64 | // trying to create a new pool with not enough memory left should throw |
| 65 | const size_t remaining = (nUsable * Slab::kSize) - poolSize1 - poolSize2; |
| 66 | ASSERT_GT(remaining, 0); |
| 67 | ASSERT_THROW( |
| 68 | m.createNewPool("bazz", remaining + Slab::kSize, getRandomAllocSizes(4)), |
| 69 | std::invalid_argument); |
| 70 | |
| 71 | // trying to create pools with duplicate names should fail. |
| 72 | ASSERT_THROW(m.createNewPool(poolName1, Slab::kSize, getRandomAllocSizes(3)), |
| 73 | std::invalid_argument); |
| 74 | |
| 75 | const std::string poolName3 = "bazz"; |
| 76 | PoolId pool3Id = Slab::kInvalidPoolId; |
| 77 | ASSERT_NO_THROW( |
| 78 | pool3Id = m.createNewPool(poolName3, remaining, getRandomAllocSizes(4))); |
| 79 | auto& pool3 = m.getPoolById(pool3Id); |
| 80 | ASSERT_NE(pool1.getId(), pool3.getId()); |
| 81 | ASSERT_NE(pool2.getId(), pool3.getId()); |
| 82 | |
| 83 | // any more pool creations should fail since we are out of memory in slab |
| 84 | // allocator. |
| 85 | ASSERT_THROW(m.createNewPool("another", Slab::kSize, getRandomAllocSizes(4)), |
| 86 | std::invalid_argument); |
| 87 | } |
| 88 | |
| 89 | // ensure that we can not create more than the maximum number of pools. |
nothing calls this directly
no test coverage detected