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