Singleton_test.cpp 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. /*
  2. * Copyright (C) 2017 The Android Open Source Project
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. #define LOG_TAG "Singleton_test"
  17. #include <dlfcn.h>
  18. #include <android-base/file.h>
  19. #include <android-base/stringprintf.h>
  20. #include <utils/Singleton.h>
  21. #include <gtest/gtest.h>
  22. #include "Singleton_test.h"
  23. namespace android {
  24. TEST(SingletonTest, bug35674422) {
  25. std::string path = android::base::GetExecutableDirectory();
  26. // libutils_test_singleton1.so contains the ANDROID_SINGLETON_STATIC_INSTANCE
  27. // definition of SingletonTestData, load it first.
  28. std::string lib = android::base::StringPrintf("%s/libutils_test_singleton1.so", path.c_str());
  29. void* handle1 = dlopen(lib.c_str(), RTLD_NOW);
  30. ASSERT_TRUE(handle1 != nullptr) << dlerror();
  31. // libutils_test_singleton2.so references SingletonTestData but should not
  32. // have a definition
  33. lib = android::base::StringPrintf("%s/libutils_test_singleton2.so", path.c_str());
  34. void* handle2 = dlopen(lib.c_str(), RTLD_NOW);
  35. ASSERT_TRUE(handle2 != nullptr) << dlerror();
  36. using has_fn_t = decltype(&singletonHasInstance);
  37. using get_fn_t = decltype(&singletonGetInstanceContents);
  38. using set_fn_t = decltype(&singletonSetInstanceContents);
  39. has_fn_t has1 = reinterpret_cast<has_fn_t>(dlsym(handle1, "singletonHasInstance"));
  40. ASSERT_TRUE(has1 != nullptr) << dlerror();
  41. has_fn_t has2 = reinterpret_cast<has_fn_t>(dlsym(handle2, "singletonHasInstance"));
  42. ASSERT_TRUE(has2 != nullptr) << dlerror();
  43. get_fn_t get1 = reinterpret_cast<get_fn_t>(dlsym(handle1, "singletonGetInstanceContents"));
  44. ASSERT_TRUE(get1 != nullptr) << dlerror();
  45. get_fn_t get2 = reinterpret_cast<get_fn_t>(dlsym(handle2, "singletonGetInstanceContents"));
  46. ASSERT_TRUE(get2 != nullptr) << dlerror();
  47. set_fn_t set1 = reinterpret_cast<set_fn_t>(dlsym(handle2, "singletonSetInstanceContents"));
  48. ASSERT_TRUE(set1 != nullptr) << dlerror();
  49. EXPECT_FALSE(has1());
  50. EXPECT_FALSE(has2());
  51. set1(12345678U);
  52. EXPECT_TRUE(has1());
  53. EXPECT_TRUE(has2());
  54. EXPECT_EQ(12345678U, get1());
  55. EXPECT_EQ(12345678U, get2());
  56. }
  57. }