| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174 | // Copyright (c) 2016-present, Facebook, Inc.  All rights reserved.//  This source code is licensed under both the GPLv2 (found in the//  COPYING file in the root directory) and Apache 2.0 License//  (found in the LICENSE.Apache file in the root directory).#ifndef ROCKSDB_LITE#include "rocksdb/utilities/object_registry.h"#include "test_util/testharness.h"namespace ROCKSDB_NAMESPACE {class EnvRegistryTest : public testing::Test { public:  static int num_a, num_b;};int EnvRegistryTest::num_a = 0;int EnvRegistryTest::num_b = 0;static FactoryFunc<Env> test_reg_a = ObjectLibrary::Default()->Register<Env>(    "a://.*",    [](const std::string& /*uri*/, std::unique_ptr<Env>* /*env_guard*/,       std::string* /* errmsg */) {      ++EnvRegistryTest::num_a;      return Env::Default();    });static FactoryFunc<Env> test_reg_b = ObjectLibrary::Default()->Register<Env>(    "b://.*", [](const std::string& /*uri*/, std::unique_ptr<Env>* env_guard,                 std::string* /* errmsg */) {      ++EnvRegistryTest::num_b;      // Env::Default() is a singleton so we can't grant ownership directly to      // the caller - we must wrap it first.      env_guard->reset(new EnvWrapper(Env::Default()));      return env_guard->get();    });TEST_F(EnvRegistryTest, Basics) {  std::string msg;  std::unique_ptr<Env> env_guard;  auto registry = ObjectRegistry::NewInstance();  auto res = registry->NewObject<Env>("a://test", &env_guard, &msg);  ASSERT_NE(res, nullptr);  ASSERT_EQ(env_guard, nullptr);  ASSERT_EQ(1, num_a);  ASSERT_EQ(0, num_b);  res = registry->NewObject<Env>("b://test", &env_guard, &msg);  ASSERT_NE(res, nullptr);  ASSERT_NE(env_guard, nullptr);  ASSERT_EQ(1, num_a);  ASSERT_EQ(1, num_b);  res = registry->NewObject<Env>("c://test", &env_guard, &msg);  ASSERT_EQ(res, nullptr);  ASSERT_EQ(env_guard, nullptr);  ASSERT_EQ(1, num_a);  ASSERT_EQ(1, num_b);}TEST_F(EnvRegistryTest, LocalRegistry) {  std::string msg;  std::unique_ptr<Env> guard;  auto registry = ObjectRegistry::NewInstance();  std::shared_ptr<ObjectLibrary> library = std::make_shared<ObjectLibrary>();  registry->AddLibrary(library);  library->Register<Env>(      "test-local",      [](const std::string& /*uri*/, std::unique_ptr<Env>* /*guard */,         std::string* /* errmsg */) { return Env::Default(); });  ObjectLibrary::Default()->Register<Env>(      "test-global",      [](const std::string& /*uri*/, std::unique_ptr<Env>* /*guard */,         std::string* /* errmsg */) { return Env::Default(); });  ASSERT_EQ(      ObjectRegistry::NewInstance()->NewObject<Env>("test-local", &guard, &msg),      nullptr);  ASSERT_NE(      ObjectRegistry::NewInstance()->NewObject("test-global", &guard, &msg),      nullptr);  ASSERT_NE(registry->NewObject<Env>("test-local", &guard, &msg), nullptr);  ASSERT_NE(registry->NewObject<Env>("test-global", &guard, &msg), nullptr);}TEST_F(EnvRegistryTest, CheckShared) {  std::shared_ptr<Env> shared;  std::shared_ptr<ObjectRegistry> registry = ObjectRegistry::NewInstance();  std::shared_ptr<ObjectLibrary> library = std::make_shared<ObjectLibrary>();  registry->AddLibrary(library);  library->Register<Env>(      "unguarded",      [](const std::string& /*uri*/, std::unique_ptr<Env>* /*guard */,         std::string* /* errmsg */) { return Env::Default(); });  library->Register<Env>(      "guarded", [](const std::string& /*uri*/, std::unique_ptr<Env>* guard,                    std::string* /* errmsg */) {        guard->reset(new EnvWrapper(Env::Default()));        return guard->get();      });  ASSERT_OK(registry->NewSharedObject<Env>("guarded", &shared));  ASSERT_NE(shared, nullptr);  shared.reset();  ASSERT_NOK(registry->NewSharedObject<Env>("unguarded", &shared));  ASSERT_EQ(shared, nullptr);}TEST_F(EnvRegistryTest, CheckStatic) {  Env* env = nullptr;  std::shared_ptr<ObjectRegistry> registry = ObjectRegistry::NewInstance();  std::shared_ptr<ObjectLibrary> library = std::make_shared<ObjectLibrary>();  registry->AddLibrary(library);  library->Register<Env>(      "unguarded",      [](const std::string& /*uri*/, std::unique_ptr<Env>* /*guard */,         std::string* /* errmsg */) { return Env::Default(); });  library->Register<Env>(      "guarded", [](const std::string& /*uri*/, std::unique_ptr<Env>* guard,                    std::string* /* errmsg */) {        guard->reset(new EnvWrapper(Env::Default()));        return guard->get();      });  ASSERT_NOK(registry->NewStaticObject<Env>("guarded", &env));  ASSERT_EQ(env, nullptr);  env = nullptr;  ASSERT_OK(registry->NewStaticObject<Env>("unguarded", &env));  ASSERT_NE(env, nullptr);}TEST_F(EnvRegistryTest, CheckUnique) {  std::unique_ptr<Env> unique;  std::shared_ptr<ObjectRegistry> registry = ObjectRegistry::NewInstance();  std::shared_ptr<ObjectLibrary> library = std::make_shared<ObjectLibrary>();  registry->AddLibrary(library);  library->Register<Env>(      "unguarded",      [](const std::string& /*uri*/, std::unique_ptr<Env>* /*guard */,         std::string* /* errmsg */) { return Env::Default(); });  library->Register<Env>(      "guarded", [](const std::string& /*uri*/, std::unique_ptr<Env>* guard,                    std::string* /* errmsg */) {        guard->reset(new EnvWrapper(Env::Default()));        return guard->get();      });  ASSERT_OK(registry->NewUniqueObject<Env>("guarded", &unique));  ASSERT_NE(unique, nullptr);  unique.reset();  ASSERT_NOK(registry->NewUniqueObject<Env>("unguarded", &unique));  ASSERT_EQ(unique, nullptr);}}  // namespace ROCKSDB_NAMESPACEint main(int argc, char** argv) {  ::testing::InitGoogleTest(&argc, argv);  return RUN_ALL_TESTS();}#else  // ROCKSDB_LITE#include <stdio.h>int main(int /*argc*/, char** /*argv*/) {  fprintf(stderr, "SKIPPED as EnvRegistry is not supported in ROCKSDB_LITE\n");  return 0;}#endif  // ROCKSDB_LITE
 |