object_registry_test.cc 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. // Copyright (c) 2016-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. #ifndef ROCKSDB_LITE
  6. #include "rocksdb/utilities/object_registry.h"
  7. #include "test_util/testharness.h"
  8. namespace ROCKSDB_NAMESPACE {
  9. class EnvRegistryTest : public testing::Test {
  10. public:
  11. static int num_a, num_b;
  12. };
  13. int EnvRegistryTest::num_a = 0;
  14. int EnvRegistryTest::num_b = 0;
  15. static FactoryFunc<Env> test_reg_a = ObjectLibrary::Default()->Register<Env>(
  16. "a://.*",
  17. [](const std::string& /*uri*/, std::unique_ptr<Env>* /*env_guard*/,
  18. std::string* /* errmsg */) {
  19. ++EnvRegistryTest::num_a;
  20. return Env::Default();
  21. });
  22. static FactoryFunc<Env> test_reg_b = ObjectLibrary::Default()->Register<Env>(
  23. "b://.*", [](const std::string& /*uri*/, std::unique_ptr<Env>* env_guard,
  24. std::string* /* errmsg */) {
  25. ++EnvRegistryTest::num_b;
  26. // Env::Default() is a singleton so we can't grant ownership directly to
  27. // the caller - we must wrap it first.
  28. env_guard->reset(new EnvWrapper(Env::Default()));
  29. return env_guard->get();
  30. });
  31. TEST_F(EnvRegistryTest, Basics) {
  32. std::string msg;
  33. std::unique_ptr<Env> env_guard;
  34. auto registry = ObjectRegistry::NewInstance();
  35. auto res = registry->NewObject<Env>("a://test", &env_guard, &msg);
  36. ASSERT_NE(res, nullptr);
  37. ASSERT_EQ(env_guard, nullptr);
  38. ASSERT_EQ(1, num_a);
  39. ASSERT_EQ(0, num_b);
  40. res = registry->NewObject<Env>("b://test", &env_guard, &msg);
  41. ASSERT_NE(res, nullptr);
  42. ASSERT_NE(env_guard, nullptr);
  43. ASSERT_EQ(1, num_a);
  44. ASSERT_EQ(1, num_b);
  45. res = registry->NewObject<Env>("c://test", &env_guard, &msg);
  46. ASSERT_EQ(res, nullptr);
  47. ASSERT_EQ(env_guard, nullptr);
  48. ASSERT_EQ(1, num_a);
  49. ASSERT_EQ(1, num_b);
  50. }
  51. TEST_F(EnvRegistryTest, LocalRegistry) {
  52. std::string msg;
  53. std::unique_ptr<Env> guard;
  54. auto registry = ObjectRegistry::NewInstance();
  55. std::shared_ptr<ObjectLibrary> library = std::make_shared<ObjectLibrary>();
  56. registry->AddLibrary(library);
  57. library->Register<Env>(
  58. "test-local",
  59. [](const std::string& /*uri*/, std::unique_ptr<Env>* /*guard */,
  60. std::string* /* errmsg */) { return Env::Default(); });
  61. ObjectLibrary::Default()->Register<Env>(
  62. "test-global",
  63. [](const std::string& /*uri*/, std::unique_ptr<Env>* /*guard */,
  64. std::string* /* errmsg */) { return Env::Default(); });
  65. ASSERT_EQ(
  66. ObjectRegistry::NewInstance()->NewObject<Env>("test-local", &guard, &msg),
  67. nullptr);
  68. ASSERT_NE(
  69. ObjectRegistry::NewInstance()->NewObject("test-global", &guard, &msg),
  70. nullptr);
  71. ASSERT_NE(registry->NewObject<Env>("test-local", &guard, &msg), nullptr);
  72. ASSERT_NE(registry->NewObject<Env>("test-global", &guard, &msg), nullptr);
  73. }
  74. TEST_F(EnvRegistryTest, CheckShared) {
  75. std::shared_ptr<Env> shared;
  76. std::shared_ptr<ObjectRegistry> registry = ObjectRegistry::NewInstance();
  77. std::shared_ptr<ObjectLibrary> library = std::make_shared<ObjectLibrary>();
  78. registry->AddLibrary(library);
  79. library->Register<Env>(
  80. "unguarded",
  81. [](const std::string& /*uri*/, std::unique_ptr<Env>* /*guard */,
  82. std::string* /* errmsg */) { return Env::Default(); });
  83. library->Register<Env>(
  84. "guarded", [](const std::string& /*uri*/, std::unique_ptr<Env>* guard,
  85. std::string* /* errmsg */) {
  86. guard->reset(new EnvWrapper(Env::Default()));
  87. return guard->get();
  88. });
  89. ASSERT_OK(registry->NewSharedObject<Env>("guarded", &shared));
  90. ASSERT_NE(shared, nullptr);
  91. shared.reset();
  92. ASSERT_NOK(registry->NewSharedObject<Env>("unguarded", &shared));
  93. ASSERT_EQ(shared, nullptr);
  94. }
  95. TEST_F(EnvRegistryTest, CheckStatic) {
  96. Env* env = nullptr;
  97. std::shared_ptr<ObjectRegistry> registry = ObjectRegistry::NewInstance();
  98. std::shared_ptr<ObjectLibrary> library = std::make_shared<ObjectLibrary>();
  99. registry->AddLibrary(library);
  100. library->Register<Env>(
  101. "unguarded",
  102. [](const std::string& /*uri*/, std::unique_ptr<Env>* /*guard */,
  103. std::string* /* errmsg */) { return Env::Default(); });
  104. library->Register<Env>(
  105. "guarded", [](const std::string& /*uri*/, std::unique_ptr<Env>* guard,
  106. std::string* /* errmsg */) {
  107. guard->reset(new EnvWrapper(Env::Default()));
  108. return guard->get();
  109. });
  110. ASSERT_NOK(registry->NewStaticObject<Env>("guarded", &env));
  111. ASSERT_EQ(env, nullptr);
  112. env = nullptr;
  113. ASSERT_OK(registry->NewStaticObject<Env>("unguarded", &env));
  114. ASSERT_NE(env, nullptr);
  115. }
  116. TEST_F(EnvRegistryTest, CheckUnique) {
  117. std::unique_ptr<Env> unique;
  118. std::shared_ptr<ObjectRegistry> registry = ObjectRegistry::NewInstance();
  119. std::shared_ptr<ObjectLibrary> library = std::make_shared<ObjectLibrary>();
  120. registry->AddLibrary(library);
  121. library->Register<Env>(
  122. "unguarded",
  123. [](const std::string& /*uri*/, std::unique_ptr<Env>* /*guard */,
  124. std::string* /* errmsg */) { return Env::Default(); });
  125. library->Register<Env>(
  126. "guarded", [](const std::string& /*uri*/, std::unique_ptr<Env>* guard,
  127. std::string* /* errmsg */) {
  128. guard->reset(new EnvWrapper(Env::Default()));
  129. return guard->get();
  130. });
  131. ASSERT_OK(registry->NewUniqueObject<Env>("guarded", &unique));
  132. ASSERT_NE(unique, nullptr);
  133. unique.reset();
  134. ASSERT_NOK(registry->NewUniqueObject<Env>("unguarded", &unique));
  135. ASSERT_EQ(unique, nullptr);
  136. }
  137. } // namespace ROCKSDB_NAMESPACE
  138. int main(int argc, char** argv) {
  139. ::testing::InitGoogleTest(&argc, argv);
  140. return RUN_ALL_TESTS();
  141. }
  142. #else // ROCKSDB_LITE
  143. #include <stdio.h>
  144. int main(int /*argc*/, char** /*argv*/) {
  145. fprintf(stderr, "SKIPPED as EnvRegistry is not supported in ROCKSDB_LITE\n");
  146. return 0;
  147. }
  148. #endif // ROCKSDB_LITE