# so simpler / quicker just to link them into a single executable).
ADD_EXECUTABLE(ep-engine_ep_unit_tests
tests/mock/mock_dcp.cc
+ tests/module_tests/checkpoint_test.cc
+ tests/module_tests/defragmenter_test.cc
tests/module_tests/ep_unit_tests_main.cc
tests/module_tests/dcp_test.cc
tests/module_tests/evp_engine_test.cc
src/testlogger.cc)
TARGET_LINK_LIBRARIES(ep-engine_atomic_test platform)
-ADD_EXECUTABLE(ep-engine_checkpoint_test
- tests/module_tests/checkpoint_test.cc
- src/atomic.cc
- src/bloomfilter.cc
- src/checkpoint.cc
- src/compress.cc
- src/failover-table.cc
- src/item.cc
- src/murmurhash3.cc
- src/stored-value.cc
- src/testlogger.cc
- src/vbucket.cc
- ${OBJECTREGISTRY_SOURCE} ${CONFIG_SOURCE})
-TARGET_LINK_LIBRARIES(ep-engine_checkpoint_test gtest ${SNAPPY_LIBRARIES} cJSON platform)
-
ADD_EXECUTABLE(ep-engine_chunk_creation_test
tests/module_tests/chunk_creation_test.cc)
TARGET_LINK_LIBRARIES(ep-engine_chunk_creation_test platform)
ADD_TEST(ep-engine_atomic_ptr_test ep-engine_atomic_ptr_test)
ADD_TEST(ep-engine_atomic_test ep-engine_atomic_test)
-ADD_TEST(ep-engine_checkpoint_test ep-engine_checkpoint_test)
ADD_TEST(ep-engine_chunk_creation_test ep-engine_chunk_creation_test)
ADD_TEST(ep-engine_compress_test ep-engine_compress_test)
ADD_TEST(ep-engine_configuration_test ep-engine_configuration_test)
ADD_TEST(ep-engine_mutex_test ep-engine_mutex_test)
ADD_TEST(ep-engine_ringbuffer_test ep-engine_ringbuffer_test)
ADD_TEST(ep-engine_kvstore_test ep-engine_kvstore_test)
-ADD_TEST(ep-engine_defragmenter_test ep-engine_defragmenter_test)
ADD_TEST(ep-engine_memory_tracker_test ep-engine_memory_tracker_test)
ADD_LIBRARY(timing_tests SHARED tests/module_tests/timing_tests.cc)
${OBJECTREGISTRY_SOURCE} ${CONFIG_SOURCE})
TARGET_LINK_LIBRARIES(ep-engine_sizes platform)
-ADD_EXECUTABLE(ep-engine_defragmenter_test
- tests/module_tests/defragmenter_test.cc
- src/bloomfilter.cc
- src/checkpoint.cc
- src/compress.cc
- src/configuration.cc
- src/defragmenter_visitor.cc
- src/ep_time.c
- src/generated_configuration.cc
- src/failover-table.cc
- src/item.cc
- src/memory_tracker.cc
- src/murmurhash3.cc
- src/stored-value.cc
- src/testlogger.cc
- src/vbucket.cc
- ${OBJECTREGISTRY_SOURCE}
- ${Memcached_SOURCE_DIR}/utilities/extension_loggers.c
- ${Memcached_SOURCE_DIR}/programs/engine_testapp/mock_server.cc
- $<TARGET_OBJECTS:memory_tracking>)
-TARGET_LINK_LIBRARIES(ep-engine_defragmenter_test
- cJSON gtest mcd_util platform ${MALLOC_LIBRARIES}
- ${SNAPPY_LIBRARIES})
-
ADD_LIBRARY(ep_testsuite SHARED
tests/ep_testsuite.cc
src/atomic.cc
#include "config.h"
-#include <signal.h>
-
#include <algorithm>
#include <set>
#include <vector>
#include <gtest/gtest.h>
-#ifdef _MSC_VER
-#define alarm(a)
-#endif
-
#define NUM_TAP_THREADS 3
#define NUM_SET_THREADS 4
};
extern "C" {
-static rel_time_t basic_current_time(void) {
- return 0;
-}
-
-rel_time_t (*ep_current_time)() = basic_current_time;
-
-time_t ep_real_time() {
- return time(NULL);
-}
/**
* Dummy callback to replace the flusher callback.
MustSendCheckpointEnd::YES);
}
- // Start a timer so that the test can be killed if it doesn't finish in a
- // reasonable amount of time
- alarm(60);
-
rc = cb_create_thread(&persistence_thread, launch_persistence_thread, &t_args, 0);
EXPECT_EQ(0, rc);
}
-/* static storage for environment variable set by putenv(). */
-static char allow_no_stats_env[] = "ALLOW_NO_STATS_UPDATE=yeah";
-
-int main(int argc, char **argv) {
- ::testing::InitGoogleTest(&argc, argv);
- putenv(allow_no_stats_env);
-
- HashTable::setDefaultNumBuckets(5);
- HashTable::setDefaultNumLocks(1);
-
- return RUN_ALL_TESTS();
-}
#include <platform/cb_malloc.h>
-static time_t start_time;
-
-static time_t mock_abstime(const rel_time_t exptime) {
- return start_time + exptime;
-}
-
-static rel_time_t mock_current_time(void) {
- rel_time_t result = (rel_time_t)(time(NULL) - start_time);
- return result;
-}
-
/**
* Dummy callback to replace the flusher callback.
*/
return size_t(visited / duration_s);
}
-class DefragmenterBenchmarkTest : public ::testing::Test {
+class DefragmenterTest : public ::testing::Test {
protected:
static void SetUpTestCase() {
+
+ // Setup the MemoryTracker.
+ MemoryTracker::getInstance(*get_mock_server_api()->alloc_hooks);
+ }
+
+ static void TearDownTestCase() {
+ MemoryTracker::destroyInstance();
+ }
+
+ void SetUp() override {
+ // Setup object registry. As we do not create a full ep-engine, we
+ // use the "initial_tracking" for all memory tracking".
+ ObjectRegistry::setStats(&mem_used);
+ }
+
+ void TearDown() override {
+ ObjectRegistry::setStats(nullptr);
+ }
+
+ // Track of memory used (from ObjectRegistry).
+ std::atomic<size_t> mem_used{0};
+};
+
+
+class DefragmenterBenchmarkTest : public DefragmenterTest {
+protected:
+ static void SetUpTestCase() {
+ DefragmenterTest::SetUpTestCase();
+
/* Create the vbucket */
std::shared_ptr<Callback<uint16_t> > cb(new DummyCB());
vbucket.reset(new VBucket(0, vbucket_state_active, stats, config,
static void TearDownTestCase() {
vbucket.reset();
+
+ DefragmenterTest::TearDownTestCase();
}
static EPStats stats;
return true;
}
-ALLOCATOR_HOOKS_API* getHooksApi(void) {
- static ALLOCATOR_HOOKS_API hooksApi;
- hooksApi.add_new_hook = mc_add_new_hook;
- hooksApi.remove_new_hook = mc_remove_new_hook;
- hooksApi.add_delete_hook = mc_add_delete_hook;
- hooksApi.remove_delete_hook = mc_remove_delete_hook;
- hooksApi.get_extra_stats_size = mc_get_extra_stats_size;
- hooksApi.get_allocator_stats = mc_get_allocator_stats;
- hooksApi.get_allocation_size = mc_get_allocation_size;
- return &hooksApi;
-}
-
// Create a number of documents, spanning at least two or more pages, then
// delete most (but not all) of them - crucially ensure that one document from
// each page is still present. This will result in the rest of that page
* memory allocator.
*/
#if defined(HAVE_JEMALLOC)
-TEST(DefragmenterTest, MappedMemory) {
+TEST_F(DefragmenterTest, MappedMemory) {
#else
-TEST(DefragmenterTest, DISABLED_MappedMemory) {
+TEST_F(DefragmenterTest, DISABLED_MappedMemory) {
#endif
- // Instantiate memory tracker (singleton created on-demand).
- (void)MemoryTracker::getInstance(*get_mock_server_api()->alloc_hooks);
-
- // Setup object registry. As we do not create a full ep-engine, we
- // use the "initial_tracking" for all memory tracking".
- std::atomic<size_t> mem_used(0);
- ObjectRegistry::setStats(&mem_used);
-
// Sanity check - need memory tracker to be able to check our memory usage.
ASSERT_TRUE(MemoryTracker::trackingMemoryAllocations())
<< "Memory tracker not enabled - cannot continue";
<< "estimate (" << expected_mapped << ") after the defragmentater "
<< "visited " << visitor.getVisitedCount() << " items "
<< "and moved " << visitor.getDefragCount() << " items!";
-
- MemoryTracker::destroyInstance();
-}
-
-
-static char allow_no_stats_env[] = "ALLOW_NO_STATS_UPDATE=1";
-
-int main(int argc, char** argv) {
- /* Setup mock time functions */
- start_time = time(0);
- ep_abs_time = mock_abstime;
- ep_current_time = mock_current_time;
-
- putenv(allow_no_stats_env);
-
- // Set number of hashtable locks equal to current JSON config default.
- HashTable::setDefaultNumLocks(47);
-
- init_alloc_hooks();
-
- ::testing::InitGoogleTest(&argc, argv);
- return RUN_ALL_TESTS();
}