blob: 525f5baff228050ca229f95a8864919c69a655df [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* License); you may not use this file except in compliance
* with the License. You may obtain a copy of the License a
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
#include "common/allocator/alloc_base.h"
#include <gtest/gtest.h>
namespace common {
const uint32_t HEADER_SIZE_4B = 4;
const uint32_t HEADER_SIZE_8B = 8;
TEST(AllocBaseTest, BaseAllocator) {
BaseAllocator allocator;
for (AllocModID mod_id = MOD_DEFAULT; mod_id <= MOD_ZIGZAG_OBJ;
mod_id = (AllocModID)(mod_id + 1)) {
void *ptr = allocator.alloc(100, mod_id);
ASSERT_NE(ptr, nullptr);
allocator.free(ptr);
}
}
TEST(AllocBaseTest, AllocSmallSize) {
uint32_t size = 1024;
AllocModID mid = MOD_DEFAULT;
void *ptr = mem_alloc(size, mid);
ASSERT_NE(ptr, nullptr);
char *p = (char *)ptr - HEADER_SIZE_4B;
uint32_t header = *((uint32_t *)p);
EXPECT_EQ(header >> 8, size);
EXPECT_EQ(header & 0x7F, mid);
mem_free(ptr);
}
TEST(AllocBaseTest, AllocLargeSize) {
uint32_t size = 0x1000000;
AllocModID mid = MOD_DEFAULT;
void *ptr = mem_alloc(size, mid);
ASSERT_NE(ptr, nullptr);
char *p = (char *)ptr - HEADER_SIZE_8B;
uint32_t high4b = *(uint32_t *)p;
uint32_t low4b = *(uint32_t *)(p + 4);
uint64_t header = ((uint64_t)high4b << 32) | low4b;
EXPECT_EQ((header >> 8), size);
EXPECT_EQ((header & 0x7F), mid);
mem_free(ptr);
}
TEST(AllocBaseTest, ReallocateToLargerSize) {
const uint32_t initial_size = 1000;
const uint32_t new_size = 2000;
void *ptr = mem_alloc(initial_size, MOD_DEFAULT);
ASSERT_NE(ptr, nullptr);
ptr = mem_realloc(ptr, new_size);
ASSERT_NE(ptr, nullptr);
uint32_t *header = (uint32_t *)((char *)ptr - HEADER_SIZE_4B);
ASSERT_EQ(*header >> 8, new_size);
mem_free(ptr);
}
TEST(AllocBaseTest, ReallocateToSmallerSize) {
const uint32_t initial_size = 2000;
const uint32_t new_size = 1000;
void *ptr = mem_alloc(initial_size, MOD_DEFAULT);
ASSERT_NE(ptr, nullptr);
ptr = mem_realloc(ptr, new_size);
ASSERT_NE(ptr, nullptr);
uint32_t *header = (uint32_t *)((char *)ptr - HEADER_SIZE_4B);
ASSERT_EQ(*header >> 8, new_size);
mem_free(ptr);
}
} // namespace common