// Copyright (C) 2016 Red Hat, Inc. All rights reserved. // // This file is part of the thin-provisioning-tools source. // // thin-provisioning-tools is free software: you can redistribute it // and/or modify it under the terms of the GNU General Public License // as published by the Free Software Foundation, either version 3 of // the License, or (at your option) any later version. // // thin-provisioning-tools is distributed in the hope that it will be // useful, but WITHOUT ANY WARRANTY; without even the implied warranty // of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License along // with thin-provisioning-tools. If not, see // . #include "gmock/gmock.h" #include "block-cache/mem_pool.h" #include "test_utils.h" #include using namespace boost; using namespace std; using namespace test; using namespace testing; //---------------------------------------------------------------- namespace { class MempoolTests : public Test { public: bool aligned(void *data, size_t alignment) { return (reinterpret_cast(data) % alignment) == 0; } private: }; } //---------------------------------------------------------------- TEST_F(MempoolTests, empty_test) { } TEST_F(MempoolTests, create_destroy_cycle) { for (size_t bs = 64; bs <= 512; bs *= 2) { mempool mp(bs, 4 * 1024 * 1024, bs); } } TEST_F(MempoolTests, alignments_observed) { for (size_t bs = 64; bs <= 512; bs *= 2) { mempool mp(bs, 512 * 1024, bs); for (unsigned i = 0; i < 100; i++) { auto md = mp.alloc(); if (!md) throw runtime_error("couldn't alloc"); ASSERT_TRUE(aligned(md, bs)); } } } TEST_F(MempoolTests, alloc_free_cycle) { mempool mp(512, 512 * 1024, 512); for (unsigned i = 0; i < 10000; i++) { auto md = mp.alloc(); mp.free(md); } } TEST_F(MempoolTests, exhaust_pool) { mempool mp(512, 100 * 512, 512); for (unsigned i = 0; i < 100; i++) { auto md = mp.alloc(); ASSERT_NE(md, nullptr); } auto md = mp.alloc(); ASSERT_EQ(md, nullptr); } // Use valgrind TEST_F(MempoolTests, data_can_be_written) { mempool mp(512, 100 * 512, 512); for (unsigned i = 0; i < 100; i++) { auto md = mp.alloc(); ASSERT_NE(md, nullptr); memset(md, 0, 512); } auto md = mp.alloc(); ASSERT_EQ(md, nullptr); } //----------------------------------------------------------------