diff --git a/Makefile.in b/Makefile.in index 823ccc7d..b19c14f9 100644 --- a/Makefile.in +++ b/Makefile.in @@ -197,6 +197,7 @@ TESTS_UNIT := \ $(srcroot)test/unit/cache_bin.c \ $(srcroot)test/unit/ckh.c \ $(srcroot)test/unit/counter.c \ + $(srcroot)test/unit/decay.c \ $(srcroot)test/unit/div.c \ $(srcroot)test/unit/edata_cache.c \ $(srcroot)test/unit/emitter.c \ diff --git a/test/unit/decay.c b/test/unit/decay.c new file mode 100644 index 00000000..9da0d94c --- /dev/null +++ b/test/unit/decay.c @@ -0,0 +1,45 @@ +#include "test/jemalloc_test.h" + +#include "jemalloc/internal/decay.h" + +/* + * Honestly, this is mostly a stub for now. Eventually, we should beef up + * testing here. + */ + +TEST_BEGIN(test_decay_empty) { + /* If we never have any decaying pages, npages_limit should be 0. */ + decay_t decay; + memset(&decay, 0, sizeof(decay)); + + nstime_t curtime; + nstime_init(&curtime, 0); + + uint64_t decay_ms = 1000; + uint64_t decay_ns = decay_ms * 1000 * 1000; + + bool err = decay_init(&decay, &curtime, (ssize_t)decay_ms); + assert_false(err, ""); + + uint64_t time_between_calls = decay_epoch_duration_ns(&decay) / 5; + int nepochs = 0; + for (uint64_t i = 0; i < decay_ns / time_between_calls * 10; i++) { + size_t dirty_pages = 0; + nstime_init(&curtime, i * time_between_calls); + bool epoch_advanced = decay_maybe_advance_epoch(&decay, + &curtime, dirty_pages); + if (epoch_advanced) { + nepochs++; + assert_zu_eq(decay_npages_limit_get(&decay), 0, + "Should not increase the limit arbitrarily"); + } + } + assert_d_gt(nepochs, 0, "Should have advanced epochs"); +} +TEST_END + +int +main(void) { + return test( + test_decay_empty); +}