19b44532d648d88732c6f17820cf6418c025aecaeTianyuJiang#include <dlfcn.h> 29b44532d648d88732c6f17820cf6418c025aecaeTianyuJiang#include <dvr/dvr_api.h> 39b44532d648d88732c6f17820cf6418c025aecaeTianyuJiang 49b44532d648d88732c6f17820cf6418c025aecaeTianyuJiang#include <gtest/gtest.h> 59b44532d648d88732c6f17820cf6418c025aecaeTianyuJiang 69b44532d648d88732c6f17820cf6418c025aecaeTianyuJiang/** DvrTestBase loads the libdvr.so at runtime and get the Dvr API version 1. */ 79b44532d648d88732c6f17820cf6418c025aecaeTianyuJiangclass DvrApiTest : public ::testing::Test { 89b44532d648d88732c6f17820cf6418c025aecaeTianyuJiang protected: 99b44532d648d88732c6f17820cf6418c025aecaeTianyuJiang void SetUp() override { 109b44532d648d88732c6f17820cf6418c025aecaeTianyuJiang int flags = RTLD_NOW | RTLD_LOCAL; 119b44532d648d88732c6f17820cf6418c025aecaeTianyuJiang 129b44532d648d88732c6f17820cf6418c025aecaeTianyuJiang // Here we need to ensure that libdvr is loaded with RTLD_NODELETE flag set 139b44532d648d88732c6f17820cf6418c025aecaeTianyuJiang // (so that calls to `dlclose` don't actually unload the library). This is a 149b44532d648d88732c6f17820cf6418c025aecaeTianyuJiang // workaround for an Android NDK bug. See more detail: 159b44532d648d88732c6f17820cf6418c025aecaeTianyuJiang // https://github.com/android-ndk/ndk/issues/360 169b44532d648d88732c6f17820cf6418c025aecaeTianyuJiang flags |= RTLD_NODELETE; 179b44532d648d88732c6f17820cf6418c025aecaeTianyuJiang platform_handle_ = dlopen("libdvr.so", flags); 182cbf96ca84097b36a7ae58c494b9145877bf956dTianyuJiang ASSERT_NE(nullptr, platform_handle_) << "Dvr shared library missing."; 199b44532d648d88732c6f17820cf6418c025aecaeTianyuJiang 209b44532d648d88732c6f17820cf6418c025aecaeTianyuJiang auto dvr_get_api = reinterpret_cast<decltype(&dvrGetApi)>( 219b44532d648d88732c6f17820cf6418c025aecaeTianyuJiang dlsym(platform_handle_, "dvrGetApi")); 222cbf96ca84097b36a7ae58c494b9145877bf956dTianyuJiang ASSERT_NE(nullptr, dvr_get_api) << "Platform library missing dvrGetApi."; 239b44532d648d88732c6f17820cf6418c025aecaeTianyuJiang 249b44532d648d88732c6f17820cf6418c025aecaeTianyuJiang ASSERT_EQ(dvr_get_api(&api_, sizeof(api_), /*version=*/1), 0) 259b44532d648d88732c6f17820cf6418c025aecaeTianyuJiang << "Unable to find compatible Dvr API."; 269b44532d648d88732c6f17820cf6418c025aecaeTianyuJiang } 279b44532d648d88732c6f17820cf6418c025aecaeTianyuJiang 289b44532d648d88732c6f17820cf6418c025aecaeTianyuJiang void TearDown() override { 299b44532d648d88732c6f17820cf6418c025aecaeTianyuJiang if (platform_handle_ != nullptr) { 309b44532d648d88732c6f17820cf6418c025aecaeTianyuJiang dlclose(platform_handle_); 319b44532d648d88732c6f17820cf6418c025aecaeTianyuJiang } 329b44532d648d88732c6f17820cf6418c025aecaeTianyuJiang } 339b44532d648d88732c6f17820cf6418c025aecaeTianyuJiang 349b44532d648d88732c6f17820cf6418c025aecaeTianyuJiang void* platform_handle_ = nullptr; 359b44532d648d88732c6f17820cf6418c025aecaeTianyuJiang DvrApi_v1 api_; 369b44532d648d88732c6f17820cf6418c025aecaeTianyuJiang}; 37