140 lines
3.6 KiB
C++

/* Copyright (c) 2014, 2019, Oracle and/or its affiliates. All rights reserved.
This program 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; version 2 of the License.
This program 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 this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
/* See http://code.google.com/p/googletest/wiki/Primer */
// First include (the generated) my_config.h, to get correct platform defines.
#include "my_config.h"
#include "univ.i"
#include "mem0mem.h"
#include "os0event.h"
#include "srv0conc.h"
#include "srv0srv.h"
#include "handler.h"
#include <gtest/gtest.h>
namespace innodb_mem0mem_unittest {
class mem0mem : public ::testing::Test {
protected:
static
void
SetUpTestCase()
{
srv_max_n_threads = srv_sync_array_size + 1;
os_event_global_init();
sync_check_init();
}
static
void
TearDownTestCase()
{
sync_check_close();
os_event_global_destroy();
}
};
/* test mem_heap_is_top() */
TEST_F(mem0mem, memheapistop)
{
mem_heap_t* heap;
const char* str = "aabbccddeeff";
size_t str_len = strlen(str);
char* str_in_heap;
void* dummy;
#define INITIAL_HEAP_SIZE 512
heap = mem_heap_create(INITIAL_HEAP_SIZE);
str_in_heap = mem_heap_strdup(heap, str);
EXPECT_TRUE(mem_heap_is_top(heap, str_in_heap, str_len + 1));
/* Check with a random pointer to make sure that mem_heap_is_top()
does not return true unconditionally. */
EXPECT_FALSE(mem_heap_is_top(heap, "foo", 4));
/* Allocate another chunk and check that our string is not at the
top anymore. */
dummy = mem_heap_alloc(heap, 32);
ut_a(dummy != NULL);
EXPECT_FALSE(mem_heap_is_top(heap, str_in_heap, str_len + 1));
/* Cause the heap to allocate a second block and retest. */
dummy = mem_heap_alloc(heap, INITIAL_HEAP_SIZE + 1);
str_in_heap = mem_heap_strdup(heap, str);
EXPECT_TRUE(mem_heap_is_top(heap, str_in_heap, str_len + 1));
/* Allocate another chunk, free it, and then confirm that our string
is still the topmost element. */
const ulint x = 64;
dummy = mem_heap_alloc(heap, x);
EXPECT_FALSE(mem_heap_is_top(heap, str_in_heap, str_len + 1));
mem_heap_free_top(heap, x);
EXPECT_TRUE(mem_heap_is_top(heap, str_in_heap, str_len + 1));
mem_heap_free(heap);
}
/* test mem_heap_replace() */
TEST_F(mem0mem, memheapreplace)
{
mem_heap_t* heap;
void* p1;
const ulint p1_size = 16;
void* p2;
const ulint p2_size = 32;
void* p3;
const ulint p3_size = 64;
void* p4;
const ulint p4_size = 128;
void* p5;
const ulint p5_size = 256;
heap = mem_heap_create(1024);
p1 = mem_heap_alloc(heap, p1_size);
p2 = mem_heap_alloc(heap, p2_size);
p3 = mem_heap_replace(heap, p1, p1_size, p3_size);
EXPECT_NE(p2, p3);
EXPECT_TRUE(mem_heap_is_top(heap, p3, p3_size));
p4 = mem_heap_replace(heap, p3, p3_size, p4_size);
EXPECT_EQ(p3, p4);
EXPECT_TRUE(mem_heap_is_top(heap, p4, p4_size));
p5 = mem_heap_replace(heap, p4, p4_size - 5, p5_size);
#ifdef UNIV_MEM_DEBUG
/* In UNIV_MEM_DEBUG we need to specify the correct size of the
old top in order for it to get replaced. */
EXPECT_NE(p4, p5);
#else /* UNIV_MEM_DEBUG */
EXPECT_EQ(p4, p5);
#endif /* UNIV_MEM_DEBUG */
EXPECT_TRUE(mem_heap_is_top(heap, p5, p5_size));
mem_heap_free(heap);
}
}