Blame memkind-1.10.1/test/memkind_allocator_tests.cpp

Packit Service 7f3b24
// SPDX-License-Identifier: BSD-2-Clause
Packit Service 7f3b24
/* Copyright (C) 2019 - 2020 Intel Corporation. */
Packit Service 7f3b24
Packit Service 7f3b24
#include "memkind_allocator.h"
Packit Service 7f3b24
#include "common.h"
Packit Service 7f3b24
#include <vector>
Packit Service 7f3b24
#include <memory>
Packit Service 7f3b24
#include <array>
Packit Service 7f3b24
#include <list>
Packit Service 7f3b24
#include <map>
Packit Service 7f3b24
#include <utility>
Packit Service 7f3b24
#include <string>
Packit Service 7f3b24
#include <algorithm>
Packit Service 7f3b24
#include <scoped_allocator>
Packit Service 7f3b24
#include <thread>
Packit Service 7f3b24
Packit Service 7f3b24
// Tests for memkind::allocator class.
Packit Service 7f3b24
class MemkindAllocatorTests: public ::testing::Test
Packit Service 7f3b24
{
Packit Service 7f3b24
public:
Packit Service 7f3b24
    libmemkind::static_kind::allocator<int> int_alc_regular { libmemkind::kinds::REGULAR };
Packit Service 7f3b24
    libmemkind::static_kind::allocator<int> int_alc_default { libmemkind::kinds::DEFAULT };
Packit Service 7f3b24
Packit Service 7f3b24
protected:
Packit Service 7f3b24
    void SetUp()
Packit Service 7f3b24
    {}
Packit Service 7f3b24
Packit Service 7f3b24
    void TearDown()
Packit Service 7f3b24
    {}
Packit Service 7f3b24
};
Packit Service 7f3b24
Packit Service 7f3b24
Packit Service 7f3b24
//Compare two same kind different type allocators
Packit Service 7f3b24
TEST_F(MemkindAllocatorTests,
Packit Service 7f3b24
       test_TC_MEMKIND_AllocatorCompare_SameKindDifferentType_Test)
Packit Service 7f3b24
{
Packit Service 7f3b24
    libmemkind::static_kind::allocator<int> alc1 { int_alc_regular };
Packit Service 7f3b24
    libmemkind::static_kind::allocator<char> alc2 { int_alc_regular };
Packit Service 7f3b24
    ASSERT_TRUE(alc1 == alc2);
Packit Service 7f3b24
    ASSERT_FALSE(alc1 != alc2);
Packit Service 7f3b24
}
Packit Service 7f3b24
Packit Service 7f3b24
//Compare two same kind same type
Packit Service 7f3b24
TEST_F(MemkindAllocatorTests,
Packit Service 7f3b24
       test_TC_MEMKIND_AllocatorCompare_SameKindSameType_Test)
Packit Service 7f3b24
{
Packit Service 7f3b24
    libmemkind::static_kind::allocator<int> alc1 { int_alc_default };
Packit Service 7f3b24
    libmemkind::static_kind::allocator<int> alc2 { int_alc_default };
Packit Service 7f3b24
    ASSERT_TRUE(alc1 == alc2);
Packit Service 7f3b24
    ASSERT_FALSE(alc1 != alc2);
Packit Service 7f3b24
}
Packit Service 7f3b24
Packit Service 7f3b24
////Compare two different kind different type
Packit Service 7f3b24
TEST_F(MemkindAllocatorTests,
Packit Service 7f3b24
       test_TC_MEMKIND_AllocatorCompare_DifferentKindDifferentType_Test)
Packit Service 7f3b24
{
Packit Service 7f3b24
    libmemkind::static_kind::allocator<int> alc1 { int_alc_regular };
Packit Service 7f3b24
    libmemkind::static_kind::allocator<char> alc2 { int_alc_default };
Packit Service 7f3b24
    ASSERT_FALSE(alc1 == alc2);
Packit Service 7f3b24
    ASSERT_TRUE(alc1 != alc2);
Packit Service 7f3b24
}
Packit Service 7f3b24
Packit Service 7f3b24
////Compare two different kind same type allocators
Packit Service 7f3b24
TEST_F(MemkindAllocatorTests,
Packit Service 7f3b24
       test_TC_MEMKIND_AllocatorCompare_DifferentKindSameType_Test)
Packit Service 7f3b24
{
Packit Service 7f3b24
    libmemkind::static_kind::allocator<int> alc1 { int_alc_regular };
Packit Service 7f3b24
    libmemkind::static_kind::allocator<int> alc2 { int_alc_default };
Packit Service 7f3b24
    ASSERT_FALSE(alc1 == alc2);
Packit Service 7f3b24
    ASSERT_TRUE(alc1 != alc2);
Packit Service 7f3b24
}
Packit Service 7f3b24
Packit Service 7f3b24
////Copy assignment test
Packit Service 7f3b24
TEST_F(MemkindAllocatorTests, test_TC_MEMKIND_Allocator_CopyAssignment_Test)
Packit Service 7f3b24
{
Packit Service 7f3b24
    libmemkind::static_kind::allocator<int> alc1 { int_alc_regular };
Packit Service 7f3b24
    libmemkind::static_kind::allocator<int> alc2 { int_alc_default };
Packit Service 7f3b24
    ASSERT_TRUE(alc1 != alc2);
Packit Service 7f3b24
    alc1 = alc2;
Packit Service 7f3b24
    ASSERT_TRUE(alc1 == alc2);
Packit Service 7f3b24
}
Packit Service 7f3b24
Packit Service 7f3b24
////Move constructor test
Packit Service 7f3b24
TEST_F(MemkindAllocatorTests, test_TC_MEMKIND_Allocator_MoveConstructor_Test)
Packit Service 7f3b24
{
Packit Service 7f3b24
    libmemkind::static_kind::allocator<int> alc1 { int_alc_default };
Packit Service 7f3b24
    libmemkind::static_kind::allocator<int> alc2 { int_alc_default };
Packit Service 7f3b24
    ASSERT_TRUE(alc2 == alc1);
Packit Service 7f3b24
    libmemkind::static_kind::allocator<int> alc3 = std::move(alc1);
Packit Service 7f3b24
    ASSERT_TRUE(alc2 == alc3);
Packit Service 7f3b24
}
Packit Service 7f3b24
Packit Service 7f3b24
////Move assignment test
Packit Service 7f3b24
TEST_F(MemkindAllocatorTests, test_TC_MEMKIND_Allocator_MoveAssignment_Test)
Packit Service 7f3b24
{
Packit Service 7f3b24
    libmemkind::static_kind::allocator<int> alc1 { int_alc_regular };
Packit Service 7f3b24
    libmemkind::static_kind::allocator<int> alc2 { int_alc_default };
Packit Service 7f3b24
    ASSERT_TRUE(alc1 != alc2);
Packit Service 7f3b24
Packit Service 7f3b24
    {
Packit Service 7f3b24
        libmemkind::static_kind::allocator<int> alc3 { alc2 };
Packit Service 7f3b24
        alc1 = std::move(alc3);
Packit Service 7f3b24
    }
Packit Service 7f3b24
    ASSERT_TRUE(alc1 == alc2);
Packit Service 7f3b24
}
Packit Service 7f3b24
Packit Service 7f3b24
////Single allocation-deallocation test
Packit Service 7f3b24
TEST_F(MemkindAllocatorTests,
Packit Service 7f3b24
       test_TC_MEMKIND_Allocator_SingleAllocationDeallocation_Test)
Packit Service 7f3b24
{
Packit Service 7f3b24
    libmemkind::static_kind::allocator<int> alc1 { int_alc_default };
Packit Service 7f3b24
    int *created_object = alc1.allocate(1);
Packit Service 7f3b24
    alc1.deallocate(created_object, 1);
Packit Service 7f3b24
}
Packit Service 7f3b24
Packit Service 7f3b24
////Shared cross-allocation-deallocation test
Packit Service 7f3b24
TEST_F(MemkindAllocatorTests,
Packit Service 7f3b24
       test_TC_MEMKIND_Allocator_SharedAllocationDeallocation_Test)
Packit Service 7f3b24
{
Packit Service 7f3b24
    libmemkind::static_kind::allocator<int> alc1 { int_alc_default };
Packit Service 7f3b24
    libmemkind::static_kind::allocator<int> alc2 { int_alc_default };
Packit Service 7f3b24
    int *created_object = nullptr;
Packit Service 7f3b24
    int *created_object_2 = nullptr;
Packit Service 7f3b24
    created_object = alc1.allocate(1);
Packit Service 7f3b24
    ASSERT_TRUE(alc1 == alc2);
Packit Service 7f3b24
    alc2.deallocate(created_object, 1);
Packit Service 7f3b24
    created_object = alc2.allocate(1);
Packit Service 7f3b24
    alc1.deallocate(created_object, 1);
Packit Service 7f3b24
Packit Service 7f3b24
    created_object = alc1.allocate(1);
Packit Service 7f3b24
    created_object_2 = alc2.allocate(1);
Packit Service 7f3b24
    alc2.deallocate(created_object, 1);
Packit Service 7f3b24
    alc1.deallocate(created_object_2, 1);
Packit Service 7f3b24
}
Packit Service 7f3b24
Packit Service 7f3b24
////Construct-destroy test
Packit Service 7f3b24
TEST_F(MemkindAllocatorTests, test_TC_MEMKIND_Allocator_ConstructDestroy_Test)
Packit Service 7f3b24
{
Packit Service 7f3b24
    libmemkind::static_kind::allocator<int> alc1 { int_alc_regular };
Packit Service 7f3b24
    int *created_object = alc1.allocate(1);
Packit Service 7f3b24
    alc1.construct(created_object);
Packit Service 7f3b24
    alc1.destroy(created_object);
Packit Service 7f3b24
}
Packit Service 7f3b24
Packit Service 7f3b24
////Testing thread-safety support
Packit Service 7f3b24
TEST_F(MemkindAllocatorTests,
Packit Service 7f3b24
       test_TC_MEMKIND_Allocator_MultithreadingSupport_Test)
Packit Service 7f3b24
{
Packit Service 7f3b24
    const size_t num_threads = 1000;
Packit Service 7f3b24
    const size_t iteration_count = 5000;
Packit Service 7f3b24
Packit Service 7f3b24
    std::vector<std::thread> thds;
Packit Service 7f3b24
    for (size_t i = 0; i < num_threads; ++i) {
Packit Service 7f3b24
Packit Service 7f3b24
        thds.push_back(std::thread( [&]() {
Packit Service 7f3b24
            std::vector<libmemkind::static_kind::allocator<int>> allocators_local;
Packit Service 7f3b24
            for (size_t j = 0; j < iteration_count; j++) {
Packit Service 7f3b24
                allocators_local.push_back(libmemkind::static_kind::allocator<int>
Packit Service 7f3b24
                                           ( int_alc_regular ));
Packit Service 7f3b24
            }
Packit Service 7f3b24
            for (size_t j = 0; j < iteration_count; j++) {
Packit Service 7f3b24
                allocators_local.pop_back();
Packit Service 7f3b24
            }
Packit Service 7f3b24
        }));
Packit Service 7f3b24
    }
Packit Service 7f3b24
Packit Service 7f3b24
    for (size_t i = 0; i < num_threads; ++i) {
Packit Service 7f3b24
        thds[i].join();
Packit Service 7f3b24
    }
Packit Service 7f3b24
}
Packit Service 7f3b24
Packit Service 7f3b24
////Test multiple memkind allocator usage
Packit Service 7f3b24
TEST_F(MemkindAllocatorTests, test_TC_MEMKIND_MultipleAllocatorUsage_Test)
Packit Service 7f3b24
{
Packit Service 7f3b24
    {
Packit Service 7f3b24
        libmemkind::static_kind::allocator<int> alloc { libmemkind::kinds::HBW } ;
Packit Service 7f3b24
    }
Packit Service 7f3b24
Packit Service 7f3b24
    {
Packit Service 7f3b24
        libmemkind::static_kind::allocator<int> alloc { libmemkind::kinds::DAX_KMEM } ;
Packit Service 7f3b24
    }
Packit Service 7f3b24
}
Packit Service 7f3b24
Packit Service 7f3b24
////Test vector
Packit Service 7f3b24
TEST_F(MemkindAllocatorTests, test_TC_MEMKIND_AllocatorUsage_Vector_Test)
Packit Service 7f3b24
{
Packit Service 7f3b24
    libmemkind::static_kind::allocator<int> alc{ int_alc_default };
Packit Service 7f3b24
    std::vector<int, libmemkind::static_kind::allocator<int>> vector{ alc };
Packit Service 7f3b24
Packit Service 7f3b24
    const int num = 20;
Packit Service 7f3b24
Packit Service 7f3b24
    for (int i = 0; i < num; ++i) {
Packit Service 7f3b24
        vector.push_back(0xDEAD + i);
Packit Service 7f3b24
    }
Packit Service 7f3b24
Packit Service 7f3b24
    for (int i = 0; i < num; ++i) {
Packit Service 7f3b24
        ASSERT_TRUE(vector[i] == 0xDEAD + i);
Packit Service 7f3b24
    }
Packit Service 7f3b24
}
Packit Service 7f3b24
Packit Service 7f3b24
////Test list
Packit Service 7f3b24
TEST_F(MemkindAllocatorTests, test_TC_MEMKIND_AllocatorUsage_List_Test)
Packit Service 7f3b24
{
Packit Service 7f3b24
    libmemkind::static_kind::allocator<int> alc{ int_alc_regular };
Packit Service 7f3b24
Packit Service 7f3b24
    std::list<int, libmemkind::static_kind::allocator<int>> list{ alc };
Packit Service 7f3b24
Packit Service 7f3b24
    const int num = 4;
Packit Service 7f3b24
Packit Service 7f3b24
    for (int i = 0; i < num; ++i) {
Packit Service 7f3b24
        list.emplace_back(0xBEAC011 + i);
Packit Service 7f3b24
        ASSERT_TRUE(list.back() == 0xBEAC011 + i);
Packit Service 7f3b24
    }
Packit Service 7f3b24
Packit Service 7f3b24
    for (int i = 0; i < num; ++i) {
Packit Service 7f3b24
        list.pop_back();
Packit Service 7f3b24
    }
Packit Service 7f3b24
}
Packit Service 7f3b24
Packit Service 7f3b24
////Test map
Packit Service 7f3b24
TEST_F(MemkindAllocatorTests, test_TC_MEMKIND_AllocatorUsage_Map_Test)
Packit Service 7f3b24
{
Packit Service 7f3b24
    typedef std::basic_string<std::pair<const std::string, std::string>, libmemkind::static_kind::allocator<char>>
Packit Service 7f3b24
            memkind_string;
Packit Service 7f3b24
    libmemkind::static_kind::allocator<memkind_string> alc{ libmemkind::kinds::REGULAR };
Packit Service 7f3b24
Packit Service 7f3b24
    std::map<std::string, std::string, std::less<std::string>, libmemkind::static_kind::allocator<std::pair<const std::string, std::string>>>
Packit Service 7f3b24
    map{ std::less<std::string>(), alc };
Packit Service 7f3b24
Packit Service 7f3b24
    const int num = 10;
Packit Service 7f3b24
Packit Service 7f3b24
    for (int i = 0; i < num; ++i) {
Packit Service 7f3b24
        map[std::to_string(i)] = std::to_string(0x0CEA11 + i);
Packit Service 7f3b24
        ASSERT_TRUE(map[std::to_string(i)] == std::to_string(0x0CEA11 + i));
Packit Service 7f3b24
        map[std::to_string((i * 997 + 83) % 113)] = std::to_string(0x0CEA11 + i);
Packit Service 7f3b24
        ASSERT_TRUE(map[std::to_string((i * 997 + 83) % 113)] == std::to_string(
Packit Service 7f3b24
                        0x0CEA11 + i));
Packit Service 7f3b24
    }
Packit Service 7f3b24
}
Packit Service 7f3b24
Packit Service 7f3b24
#if _GLIBCXX_USE_CXX11_ABI
Packit Service 7f3b24
//Test vector of strings
Packit Service 7f3b24
TEST_F(MemkindAllocatorTests,
Packit Service 7f3b24
       test_TC_MEMKIND_AllocatorUsage_VectorOfString_Test)
Packit Service 7f3b24
{
Packit Service 7f3b24
    typedef std::basic_string<char, std::char_traits<char>, libmemkind::static_kind::allocator<char>>
Packit Service 7f3b24
            memkind_string;
Packit Service 7f3b24
    typedef libmemkind::static_kind::allocator<memkind_string> memkind_alloc;
Packit Service 7f3b24
Packit Service 7f3b24
    memkind_alloc alc{ libmemkind::kinds::DEFAULT };
Packit Service 7f3b24
    libmemkind::static_kind::allocator<char> st_alc{alc};
Packit Service 7f3b24
Packit Service 7f3b24
    std::vector<memkind_string,std::scoped_allocator_adaptor<memkind_alloc>> vec{ alc };
Packit Service 7f3b24
    memkind_string arg{ "Very very loooong striiiing", st_alc };
Packit Service 7f3b24
Packit Service 7f3b24
    vec.push_back(arg);
Packit Service 7f3b24
    ASSERT_TRUE(vec.back() == arg);
Packit Service 7f3b24
}
Packit Service 7f3b24
Packit Service 7f3b24
////Test map of int strings
Packit Service 7f3b24
TEST_F(MemkindAllocatorTests,
Packit Service 7f3b24
       test_TC_MEMKIND_AllocatorScopedUsage_MapOfIntString_Test)
Packit Service 7f3b24
{
Packit Service 7f3b24
    typedef std::basic_string<char, std::char_traits<char>, libmemkind::static_kind::allocator<char>>
Packit Service 7f3b24
            memkind_string;
Packit Service 7f3b24
    typedef int key_t;
Packit Service 7f3b24
    typedef memkind_string value_t;
Packit Service 7f3b24
    typedef std::pair<const key_t, value_t> target_pair;
Packit Service 7f3b24
    typedef libmemkind::static_kind::allocator<target_pair> pmem_alloc;
Packit Service 7f3b24
    typedef libmemkind::static_kind::allocator<char> str_allocator_t;
Packit Service 7f3b24
    typedef std::map<key_t, value_t, std::less<key_t>, std::scoped_allocator_adaptor<pmem_alloc>>
Packit Service 7f3b24
            map_t;
Packit Service 7f3b24
Packit Service 7f3b24
    pmem_alloc map_allocator( libmemkind::kinds::REGULAR );
Packit Service 7f3b24
Packit Service 7f3b24
    str_allocator_t str_allocator( map_allocator );
Packit Service 7f3b24
Packit Service 7f3b24
    value_t source_str1("Lorem ipsum dolor ", str_allocator);
Packit Service 7f3b24
    value_t source_str2("sit amet consectetuer adipiscing elit", str_allocator );
Packit Service 7f3b24
Packit Service 7f3b24
    map_t target_map{ std::scoped_allocator_adaptor<pmem_alloc>(map_allocator) };
Packit Service 7f3b24
Packit Service 7f3b24
    target_map[key_t(165)] = source_str1;
Packit Service 7f3b24
    ASSERT_TRUE(target_map[key_t(165)] == source_str1);
Packit Service 7f3b24
    target_map[key_t(165)] = source_str2;
Packit Service 7f3b24
    ASSERT_TRUE(target_map[key_t(165)] == source_str2);
Packit Service 7f3b24
}
Packit Service 7f3b24
#endif // _GLIBCXX_USE_CXX11_ABI