slice_transform_test.cc 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. // Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
  2. // This source code is licensed under both the GPLv2 (found in the
  3. // COPYING file in the root directory) and Apache 2.0 License
  4. // (found in the LICENSE.Apache file in the root directory).
  5. //
  6. // Copyright (c) 2011 The LevelDB Authors. All rights reserved.
  7. // Use of this source code is governed by a BSD-style license that can be
  8. // found in the LICENSE file. See the AUTHORS file for names of contributors.
  9. #include "rocksdb/slice_transform.h"
  10. #include "rocksdb/db.h"
  11. #include "rocksdb/env.h"
  12. #include "rocksdb/filter_policy.h"
  13. #include "rocksdb/statistics.h"
  14. #include "rocksdb/table.h"
  15. #include "test_util/testharness.h"
  16. namespace ROCKSDB_NAMESPACE {
  17. class SliceTransformTest : public testing::Test {};
  18. TEST_F(SliceTransformTest, CapPrefixTransform) {
  19. std::string s;
  20. s = "abcdefge";
  21. std::unique_ptr<const SliceTransform> transform;
  22. transform.reset(NewCappedPrefixTransform(6));
  23. ASSERT_EQ(transform->Transform(s).ToString(), "abcdef");
  24. ASSERT_TRUE(transform->SameResultWhenAppended("123456"));
  25. ASSERT_TRUE(transform->SameResultWhenAppended("1234567"));
  26. ASSERT_TRUE(!transform->SameResultWhenAppended("12345"));
  27. transform.reset(NewCappedPrefixTransform(8));
  28. ASSERT_EQ(transform->Transform(s).ToString(), "abcdefge");
  29. transform.reset(NewCappedPrefixTransform(10));
  30. ASSERT_EQ(transform->Transform(s).ToString(), "abcdefge");
  31. transform.reset(NewCappedPrefixTransform(0));
  32. ASSERT_EQ(transform->Transform(s).ToString(), "");
  33. transform.reset(NewCappedPrefixTransform(0));
  34. ASSERT_EQ(transform->Transform("").ToString(), "");
  35. }
  36. class SliceTransformDBTest : public testing::Test {
  37. private:
  38. std::string dbname_;
  39. Env* env_;
  40. DB* db_;
  41. public:
  42. SliceTransformDBTest() : env_(Env::Default()), db_(nullptr) {
  43. dbname_ = test::PerThreadDBPath("slice_transform_db_test");
  44. EXPECT_OK(DestroyDB(dbname_, last_options_));
  45. }
  46. ~SliceTransformDBTest() override {
  47. delete db_;
  48. EXPECT_OK(DestroyDB(dbname_, last_options_));
  49. }
  50. DB* db() { return db_; }
  51. // Return the current option configuration.
  52. Options* GetOptions() { return &last_options_; }
  53. void DestroyAndReopen() {
  54. // Destroy using last options
  55. Destroy();
  56. ASSERT_OK(TryReopen());
  57. }
  58. void Destroy() {
  59. delete db_;
  60. db_ = nullptr;
  61. ASSERT_OK(DestroyDB(dbname_, last_options_));
  62. }
  63. Status TryReopen() {
  64. delete db_;
  65. db_ = nullptr;
  66. last_options_.create_if_missing = true;
  67. return DB::Open(last_options_, dbname_, &db_);
  68. }
  69. Options last_options_;
  70. };
  71. namespace {
  72. uint64_t TestGetTickerCount(const Options& options, Tickers ticker_type) {
  73. return options.statistics->getTickerCount(ticker_type);
  74. }
  75. } // namespace
  76. TEST_F(SliceTransformDBTest, CapPrefix) {
  77. last_options_.prefix_extractor.reset(NewCappedPrefixTransform(8));
  78. last_options_.statistics = ROCKSDB_NAMESPACE::CreateDBStatistics();
  79. BlockBasedTableOptions bbto;
  80. bbto.filter_policy.reset(NewBloomFilterPolicy(10, false));
  81. bbto.whole_key_filtering = false;
  82. last_options_.table_factory.reset(NewBlockBasedTableFactory(bbto));
  83. ASSERT_OK(TryReopen());
  84. ReadOptions ro;
  85. FlushOptions fo;
  86. WriteOptions wo;
  87. ASSERT_OK(db()->Put(wo, "barbarbar", "foo"));
  88. ASSERT_OK(db()->Put(wo, "barbarbar2", "foo2"));
  89. ASSERT_OK(db()->Put(wo, "foo", "bar"));
  90. ASSERT_OK(db()->Put(wo, "foo3", "bar3"));
  91. ASSERT_OK(db()->Flush(fo));
  92. std::unique_ptr<Iterator> iter(db()->NewIterator(ro));
  93. iter->Seek("foo");
  94. ASSERT_OK(iter->status());
  95. ASSERT_TRUE(iter->Valid());
  96. ASSERT_EQ(iter->value().ToString(), "bar");
  97. ASSERT_EQ(TestGetTickerCount(last_options_, BLOOM_FILTER_PREFIX_USEFUL), 0U);
  98. iter->Seek("foo2");
  99. ASSERT_OK(iter->status());
  100. ASSERT_TRUE(!iter->Valid());
  101. ASSERT_EQ(TestGetTickerCount(last_options_, BLOOM_FILTER_PREFIX_USEFUL), 1U);
  102. iter->Seek("barbarbar");
  103. ASSERT_OK(iter->status());
  104. ASSERT_TRUE(iter->Valid());
  105. ASSERT_EQ(iter->value().ToString(), "foo");
  106. ASSERT_EQ(TestGetTickerCount(last_options_, BLOOM_FILTER_PREFIX_USEFUL), 1U);
  107. iter->Seek("barfoofoo");
  108. ASSERT_OK(iter->status());
  109. ASSERT_TRUE(!iter->Valid());
  110. ASSERT_EQ(TestGetTickerCount(last_options_, BLOOM_FILTER_PREFIX_USEFUL), 2U);
  111. iter->Seek("foobarbar");
  112. ASSERT_OK(iter->status());
  113. ASSERT_TRUE(!iter->Valid());
  114. ASSERT_EQ(TestGetTickerCount(last_options_, BLOOM_FILTER_PREFIX_USEFUL), 3U);
  115. }
  116. } // namespace ROCKSDB_NAMESPACE
  117. int main(int argc, char** argv) {
  118. ::testing::InitGoogleTest(&argc, argv);
  119. return RUN_ALL_TESTS();
  120. }