]> git.proxmox.com Git - ceph.git/blob - ceph/src/test/common/test_lru.cc
b3630792aef81bd61750fee4557ffc13cfa13ba9
[ceph.git] / ceph / src / test / common / test_lru.cc
1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
3 /*
4 * Ceph - scalable distributed file system
5 *
6 * Copyright (C) 2014 Cloudwatt <libre.licensing@cloudwatt.com>
7 *
8 * Author: Sahid Orentino Ferdjaoui <sahid.ferdjaoui@cloudwatt.com>
9 *
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.
14 *
15 */
16
17 #include <errno.h>
18 #include <gtest/gtest.h>
19
20 #include "include/lru.h"
21
22
23 class Item : public LRUObject {
24 public:
25 int id;
26 explicit Item(int v) : id(v) {}
27 };
28
29
30 TEST(lru, InsertTop) {
31 LRU lru = LRU(10);
32
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));
36 }
37 ASSERT_EQ(5U, lru.lru_get_top());
38 ASSERT_EQ(95U, lru.lru_get_bot());
39 ASSERT_EQ(100U, lru.lru_get_size());
40
41 ASSERT_EQ(0, (static_cast<Item*>(lru.lru_expire()))->id);
42 }
43
44 TEST(lru, InsertMid) {
45 LRU lru = LRU(10);
46
47 for (int i=0; i<100; i++) {
48 lru.lru_insert_mid(new Item(i));
49 }
50 ASSERT_EQ(0U, lru.lru_get_top());
51 ASSERT_EQ(100U, lru.lru_get_bot());
52 ASSERT_EQ(100U, lru.lru_get_size());
53
54 ASSERT_EQ(0, (static_cast<Item*>(lru.lru_expire()))->id);
55 }
56
57 TEST(lru, InsertBot) {
58 LRU lru = LRU(10);
59
60 for (int i=0; i<100; i++) {
61 lru.lru_insert_bot(new Item(i));
62 }
63 ASSERT_EQ(0U, lru.lru_get_top());
64 ASSERT_EQ(100U, lru.lru_get_bot());
65 ASSERT_EQ(100U, lru.lru_get_size());
66
67 ASSERT_EQ(99, (static_cast<Item*>(lru.lru_expire()))->id);
68 }
69
70 TEST(lru, Adjust) {
71 LRU lru = LRU(10);
72
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));
76 }
77 ASSERT_EQ(6U, lru.lru_get_top());
78 ASSERT_EQ(94U, lru.lru_get_bot());
79 ASSERT_EQ(100U, lru.lru_get_size());
80
81 lru.lru_clear();
82
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));
86 }
87 ASSERT_EQ(12U, lru.lru_get_top());
88 ASSERT_EQ(88U, lru.lru_get_bot());
89 ASSERT_EQ(100U, lru.lru_get_size());
90 }
91
92 TEST(lru, Pinning) {
93 LRU lru = LRU();
94
95 Item *ob0 = new Item(0);
96 Item *ob1 = new Item(1);
97
98 // test before ob1 are in a LRU
99 ob1->lru_pin();
100 ASSERT_FALSE(ob1->lru_is_expireable());
101
102 ob1->lru_unpin();
103 ASSERT_TRUE(ob1->lru_is_expireable());
104
105 // test when ob1 are in a LRU
106 lru.lru_touch(ob0);
107 lru.lru_touch(ob1);
108
109 ob1->lru_pin();
110 ob1->lru_pin(); // Verify that, one incr.
111 ASSERT_EQ(1U, lru.lru_get_num_pinned());
112 ASSERT_FALSE(ob1->lru_is_expireable());
113
114 ob1->lru_unpin();
115 ob1->lru_unpin(); // Verify that, one decr.
116 ASSERT_EQ(0U, lru.lru_get_num_pinned());
117 ASSERT_TRUE(ob1->lru_is_expireable());
118
119 ASSERT_EQ(0, (static_cast<Item*>(lru.lru_expire()))->id);
120 ob0->lru_pin();
121 ASSERT_EQ(1, (static_cast<Item*>(lru.lru_expire()))->id);
122 }
123
124
125 /*
126 * Local Variables:
127 * compile-command: "cd ../.. ; make -j4 &&
128 * make unittest_lru &&
129 * valgrind --tool=memcheck --leak-check=full \
130 * ./unittest_lru
131 * "
132 * End:
133 */