bp_manager_test.cpp 3.7 KB
Newer Older
羽飞's avatar
羽飞 已提交
1
/* Copyright (c) 2021 OceanBase and/or its affiliates. All rights reserved.
羽飞's avatar
羽飞 已提交
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
miniob is licensed under Mulan PSL v2.
You can use this software according to the terms and conditions of the Mulan PSL v2.
You may obtain a copy of Mulan PSL v2 at:
         http://license.coscl.org.cn/MulanPSL2
THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
See the Mulan PSL v2 for more details. */

//
// Created by wangyunlai.wyl on 2021
//

#include "storage/default/disk_buffer_pool.h"
#include "gtest/gtest.h"

羽飞's avatar
羽飞 已提交
18
void test_get(BPFrameManager &frame_manager)
L
Longda 已提交
19
{
羽飞's avatar
羽飞 已提交
20 21 22
  const int file_desc = 0;
  PageNum page_num = 1;
  Frame *frame1 = frame_manager.alloc(file_desc, page_num);
羽飞's avatar
羽飞 已提交
23 24
  ASSERT_NE(frame1, nullptr);

羽飞's avatar
羽飞 已提交
25 26
  frame1->set_file_desc(file_desc);
  frame1->set_page_num(page_num);
羽飞's avatar
羽飞 已提交
27

羽飞's avatar
羽飞 已提交
28
  ASSERT_EQ(frame1, frame_manager.get(file_desc, 1));
羽飞's avatar
羽飞 已提交
29
  frame1->unpin();
羽飞's avatar
羽飞 已提交
30

羽飞's avatar
羽飞 已提交
31
  Frame *frame2 = frame_manager.alloc(file_desc, 2);
羽飞's avatar
羽飞 已提交
32
  ASSERT_NE(frame2, nullptr);
羽飞's avatar
羽飞 已提交
33 34
  frame2->set_file_desc(0);
  frame2->set_page_num(2);
羽飞's avatar
羽飞 已提交
35

羽飞's avatar
羽飞 已提交
36
  ASSERT_EQ(frame1, frame_manager.get(file_desc, 1));
羽飞's avatar
羽飞 已提交
37
  frame1->unpin();
羽飞's avatar
羽飞 已提交
38

羽飞's avatar
羽飞 已提交
39
  Frame *frame3 = frame_manager.alloc(file_desc, 3);
羽飞's avatar
羽飞 已提交
40
  ASSERT_NE(frame3, nullptr);
羽飞's avatar
羽飞 已提交
41
  frame3->set_file_desc(file_desc);
羽飞's avatar
羽飞 已提交
42
  frame3->set_page_num(3);
羽飞's avatar
羽飞 已提交
43

羽飞's avatar
羽飞 已提交
44
  frame2 = frame_manager.get(file_desc, 2);
L
Longda 已提交
45
  ASSERT_NE(frame2, nullptr);
羽飞's avatar
羽飞 已提交
46
  frame2->unpin();
羽飞's avatar
羽飞 已提交
47

羽飞's avatar
羽飞 已提交
48 49
  Frame *frame4 = frame_manager.alloc(file_desc, 4);
  frame4->set_file_desc(file_desc);
羽飞's avatar
羽飞 已提交
50
  frame4->set_page_num(4);
羽飞's avatar
羽飞 已提交
51

羽飞's avatar
羽飞 已提交
52 53
  frame_manager.free(file_desc, frame1->page_num(), frame1);
  frame1 = frame_manager.get(file_desc, 1);
羽飞's avatar
羽飞 已提交
54 55
  ASSERT_EQ(frame1, nullptr);

羽飞's avatar
羽飞 已提交
56
  ASSERT_EQ(frame3, frame_manager.get(file_desc, 3));
羽飞's avatar
羽飞 已提交
57
  frame3->unpin();
L
Longda 已提交
58

羽飞's avatar
羽飞 已提交
59
  ASSERT_EQ(frame4, frame_manager.get(file_desc, 4));
羽飞's avatar
羽飞 已提交
60
  frame4->unpin();
L
Longda 已提交
61

羽飞's avatar
羽飞 已提交
62 63 64
  frame_manager.free(file_desc, frame2->page_num(), frame2);
  frame_manager.free(file_desc, frame3->page_num(), frame3);
  frame_manager.free(file_desc, frame4->page_num(), frame4);
羽飞's avatar
羽飞 已提交
65

羽飞's avatar
羽飞 已提交
66 67 68
  ASSERT_EQ(nullptr, frame_manager.get(file_desc, 2));
  ASSERT_EQ(nullptr, frame_manager.get(file_desc, 3));
  ASSERT_EQ(nullptr, frame_manager.get(file_desc, 4));
羽飞's avatar
羽飞 已提交
69 70
}

羽飞's avatar
羽飞 已提交
71
void test_alloc(BPFrameManager &frame_manager)
L
Longda 已提交
72 73 74
{
  std::list<Frame *> used_list;

羽飞's avatar
羽飞 已提交
75 76 77 78 79 80 81 82 83 84 85
  const int file_desc = 0;
  size_t size = 0;
  for ( ; true; size++) {
    Frame *item = frame_manager.alloc(file_desc, size);
    if (item != nullptr) {
      item->set_file_desc(file_desc);
      item->set_page_num(size);
      used_list.push_back(item);
    } else {
      break;
    }
L
Longda 已提交
86
  }
羽飞's avatar
羽飞 已提交
87
  size++;
L
Longda 已提交
88

羽飞's avatar
羽飞 已提交
89
  ASSERT_EQ(used_list.size(), frame_manager.frame_num());
L
Longda 已提交
90

羽飞's avatar
羽飞 已提交
91 92
  for (size_t i = size; i < size * 2; i++) {
    Frame *item = frame_manager.alloc(file_desc, i);
L
Longda 已提交
93 94 95 96

    ASSERT_EQ(item, nullptr);
  }

羽飞's avatar
羽飞 已提交
97 98
  for (size_t i = size * 2; i < size * 10; i++) {
    if (i % 2 == 0) { // from size * 2, that free one frame first
L
Longda 已提交
99 100 101
      Frame *item = used_list.front();
      used_list.pop_front();

羽飞's avatar
羽飞 已提交
102 103
      RC rc = frame_manager.free(file_desc, item->page_num(), item);
      ASSERT_EQ(rc, RC::SUCCESS);
L
Longda 已提交
104
    } else {
羽飞's avatar
羽飞 已提交
105 106 107 108
      Frame *item = frame_manager.alloc(file_desc, i);
      ASSERT_NE(item, nullptr);
      item->set_file_desc(file_desc);
      item->set_page_num(i);
L
Longda 已提交
109 110 111
      used_list.push_back(item);
    }

羽飞's avatar
羽飞 已提交
112
    ASSERT_EQ(used_list.size(), frame_manager.frame_num());
L
Longda 已提交
113 114 115
  }
}

羽飞's avatar
羽飞 已提交
116
TEST(test_frame_manager, test_frame_manager_simple_lru)
L
Longda 已提交
117
{
羽飞's avatar
羽飞 已提交
118
  BPFrameManager frame_manager("Test");
羽飞's avatar
羽飞 已提交
119
  frame_manager.init(2);
L
Longda 已提交
120

羽飞's avatar
羽飞 已提交
121
  test_get(frame_manager);
L
Longda 已提交
122

羽飞's avatar
羽飞 已提交
123
  test_alloc(frame_manager);
L
Longda 已提交
124

羽飞's avatar
羽飞 已提交
125
  frame_manager.cleanup();
L
Longda 已提交
126
}
羽飞's avatar
羽飞 已提交
127

L
Longda 已提交
128 129
int main(int argc, char **argv)
{
羽飞's avatar
羽飞 已提交
130 131 132 133 134 135 136

  // 分析gtest程序的命令行参数
  testing::InitGoogleTest(&argc, argv);

  // 调用RUN_ALL_TESTS()运行所有测试用例
  // main函数返回RUN_ALL_TESTS()的运行结果
  return RUN_ALL_TESTS();
羽飞's avatar
羽飞 已提交
137
}