]>
git.proxmox.com Git - ceph.git/blob - ceph/src/test/common/test_lru.cc
b3630792aef81bd61750fee4557ffc13cfa13ba9
1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
4 * Ceph - scalable distributed file system
6 * Copyright (C) 2014 Cloudwatt <libre.licensing@cloudwatt.com>
8 * Author: Sahid Orentino Ferdjaoui <sahid.ferdjaoui@cloudwatt.com>
10 * This library is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU Lesser General Public
12 * License as published by the Free Software Foundation; either
13 * version 2.1 of the License, or (at your option) any later version.
18 #include <gtest/gtest.h>
20 #include "include/lru.h"
23 class Item
: public LRUObject
{
26 explicit Item(int v
) : id(v
) {}
30 TEST(lru
, InsertTop
) {
33 lru
.lru_set_midpoint(.5); // 50% of 10 elements.
34 for (int i
=0; i
<100; i
++) {
35 lru
.lru_insert_top(new Item(i
));
37 ASSERT_EQ(5U, lru
.lru_get_top());
38 ASSERT_EQ(95U, lru
.lru_get_bot());
39 ASSERT_EQ(100U, lru
.lru_get_size());
41 ASSERT_EQ(0, (static_cast<Item
*>(lru
.lru_expire()))->id
);
44 TEST(lru
, InsertMid
) {
47 for (int i
=0; i
<100; i
++) {
48 lru
.lru_insert_mid(new Item(i
));
50 ASSERT_EQ(0U, lru
.lru_get_top());
51 ASSERT_EQ(100U, lru
.lru_get_bot());
52 ASSERT_EQ(100U, lru
.lru_get_size());
54 ASSERT_EQ(0, (static_cast<Item
*>(lru
.lru_expire()))->id
);
57 TEST(lru
, InsertBot
) {
60 for (int i
=0; i
<100; i
++) {
61 lru
.lru_insert_bot(new Item(i
));
63 ASSERT_EQ(0U, lru
.lru_get_top());
64 ASSERT_EQ(100U, lru
.lru_get_bot());
65 ASSERT_EQ(100U, lru
.lru_get_size());
67 ASSERT_EQ(99, (static_cast<Item
*>(lru
.lru_expire()))->id
);
73 lru
.lru_set_midpoint(.6); // 60% of 10 elements.
74 for (int i
=0; i
<100; i
++) {
75 lru
.lru_touch(new Item(i
));
77 ASSERT_EQ(6U, lru
.lru_get_top());
78 ASSERT_EQ(94U, lru
.lru_get_bot());
79 ASSERT_EQ(100U, lru
.lru_get_size());
83 lru
.lru_set_midpoint(1.2); // 120% of 10 elements.
84 for (int i
=0; i
<100; i
++) {
85 lru
.lru_touch(new Item(i
));
87 ASSERT_EQ(12U, lru
.lru_get_top());
88 ASSERT_EQ(88U, lru
.lru_get_bot());
89 ASSERT_EQ(100U, lru
.lru_get_size());
95 Item
*ob0
= new Item(0);
96 Item
*ob1
= new Item(1);
98 // test before ob1 are in a LRU
100 ASSERT_FALSE(ob1
->lru_is_expireable());
103 ASSERT_TRUE(ob1
->lru_is_expireable());
105 // test when ob1 are in a LRU
110 ob1
->lru_pin(); // Verify that, one incr.
111 ASSERT_EQ(1U, lru
.lru_get_num_pinned());
112 ASSERT_FALSE(ob1
->lru_is_expireable());
115 ob1
->lru_unpin(); // Verify that, one decr.
116 ASSERT_EQ(0U, lru
.lru_get_num_pinned());
117 ASSERT_TRUE(ob1
->lru_is_expireable());
119 ASSERT_EQ(0, (static_cast<Item
*>(lru
.lru_expire()))->id
);
121 ASSERT_EQ(1, (static_cast<Item
*>(lru
.lru_expire()))->id
);
127 * compile-command: "cd ../.. ; make -j4 &&
128 * make unittest_lru &&
129 * valgrind --tool=memcheck --leak-check=full \