Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9b44532d authored by TianyuJiang's avatar TianyuJiang
Browse files

Create DvrApiTest to load libdvr.so at runtime and get Dvr API.

Bug: 69267804
Test: mma, manually push and run dvr_display-test and
dvr_buffer_queue-test in a rooted 8.1.0 phone
Visually check the screen display red color.

Change-Id: I00934d18e4c9fa8edef0a421c03124a65c98e260
parent 2724b776
Loading
Loading
Loading
Loading
+38 −0
Original line number Original line Diff line number Diff line
#include <dlfcn.h>
#include <dvr/dvr_api.h>

#include <gtest/gtest.h>

#define ASSERT_NOT_NULL(x) ASSERT_TRUE((x) != nullptr)

/** DvrTestBase loads the libdvr.so at runtime and get the Dvr API version 1. */
class DvrApiTest : public ::testing::Test {
 protected:
  void SetUp() override {
    int flags = RTLD_NOW | RTLD_LOCAL;

    // Here we need to ensure that libdvr is loaded with RTLD_NODELETE flag set
    // (so that calls to `dlclose` don't actually unload the library). This is a
    // workaround for an Android NDK bug. See more detail:
    // https://github.com/android-ndk/ndk/issues/360
    flags |= RTLD_NODELETE;
    platform_handle_ = dlopen("libdvr.so", flags);
    ASSERT_NOT_NULL(platform_handle_) << "Dvr shared library missing.";

    auto dvr_get_api = reinterpret_cast<decltype(&dvrGetApi)>(
        dlsym(platform_handle_, "dvrGetApi"));
    ASSERT_NOT_NULL(dvr_get_api) << "Platform library missing dvrGetApi.";

    ASSERT_EQ(dvr_get_api(&api_, sizeof(api_), /*version=*/1), 0)
        << "Unable to find compatible Dvr API.";
  }

  void TearDown() override {
    if (platform_handle_ != nullptr) {
      dlclose(platform_handle_);
    }
  }

  void* platform_handle_ = nullptr;
  DvrApi_v1 api_;
};
+4 −28
Original line number Original line Diff line number Diff line
#include <android/log.h>
#include <android/log.h>
#include <android/native_window.h>
#include <android/native_window.h>
#include <dlfcn.h>
#include <dvr/dvr_api.h>
#include <dvr/dvr_api.h>
#include <dvr/dvr_buffer_queue.h>
#include <dvr/dvr_buffer_queue.h>


@@ -9,14 +8,14 @@
#include <array>
#include <array>
#include <unordered_map>
#include <unordered_map>


#include "dvr_api_test.h"

#define LOG_TAG "dvr_buffer_queue-test"
#define LOG_TAG "dvr_buffer_queue-test"


#ifndef ALOGD
#ifndef ALOGD
#define ALOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
#define ALOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
#endif
#endif


#define ASSERT_NOT_NULL(x) ASSERT_TRUE((x) != nullptr)

#ifndef ALOGD_IF
#ifndef ALOGD_IF
#define ALOGD_IF(cond, ...) \
#define ALOGD_IF(cond, ...) \
  ((__predict_false(cond)) ? ((void)ALOGD(__VA_ARGS__)) : (void)0)
  ((__predict_false(cond)) ? ((void)ALOGD(__VA_ARGS__)) : (void)0)
@@ -31,7 +30,7 @@ static constexpr uint32_t kBufferFormat = AHARDWAREBUFFER_FORMAT_BLOB;
static constexpr uint64_t kBufferUsage = AHARDWAREBUFFER_USAGE_CPU_READ_OFTEN;
static constexpr uint64_t kBufferUsage = AHARDWAREBUFFER_USAGE_CPU_READ_OFTEN;
static constexpr size_t kQueueCapacity = 3;
static constexpr size_t kQueueCapacity = 3;


class DvrBufferQueueTest : public ::testing::Test {
class DvrBufferQueueTest : public DvrApiTest {
 public:
 public:
  static void BufferAvailableCallback(void* context) {
  static void BufferAvailableCallback(void* context) {
    DvrBufferQueueTest* thiz = static_cast<DvrBufferQueueTest*>(context);
    DvrBufferQueueTest* thiz = static_cast<DvrBufferQueueTest*>(context);
@@ -44,33 +43,12 @@ class DvrBufferQueueTest : public ::testing::Test {
  }
  }


 protected:
 protected:
  void SetUp() override {
    int flags = RTLD_NOW | RTLD_LOCAL;

    // Here we need to ensure that libdvr is loaded with RTLD_NODELETE flag set
    // (so that calls to `dlclose` don't actually unload the library). This is a
    // workaround for an Android NDK bug. See more detail:
    // https://github.com/android-ndk/ndk/issues/360
    flags |= RTLD_NODELETE;
    platform_handle_ = dlopen("libdvr.so", flags);
    ASSERT_NOT_NULL(platform_handle_) << "Dvr shared library missing.";

    auto dvr_get_api = reinterpret_cast<decltype(&dvrGetApi)>(
        dlsym(platform_handle_, "dvrGetApi"));
    ASSERT_NOT_NULL(dvr_get_api) << "Platform library missing dvrGetApi.";

    ASSERT_EQ(dvr_get_api(&api_, sizeof(api_), /*version=*/1), 0)
        << "Unable to find compatible Dvr API.";
  }

  void TearDown() override {
  void TearDown() override {
    if (write_queue_ != nullptr) {
    if (write_queue_ != nullptr) {
      api_.WriteBufferQueueDestroy(write_queue_);
      api_.WriteBufferQueueDestroy(write_queue_);
      write_queue_ = nullptr;
      write_queue_ = nullptr;
    }
    }
    if (platform_handle_ != nullptr) {
    DvrApiTest::TearDown();
      dlclose(platform_handle_);
    }
  }
  }


  void HandleBufferAvailable() {
  void HandleBufferAvailable() {
@@ -87,8 +65,6 @@ class DvrBufferQueueTest : public ::testing::Test {
  DvrWriteBufferQueue* write_queue_{nullptr};
  DvrWriteBufferQueue* write_queue_{nullptr};
  int buffer_available_count_{0};
  int buffer_available_count_{0};
  int buffer_removed_count_{0};
  int buffer_removed_count_{0};
  void* platform_handle_{nullptr};
  DvrApi_v1 api_{};
};
};


TEST_F(DvrBufferQueueTest, WriteQueueCreateDestroy) {
TEST_F(DvrBufferQueueTest, WriteQueueCreateDestroy) {
+4 −28
Original line number Original line Diff line number Diff line
#include <android/hardware_buffer.h>
#include <android/hardware_buffer.h>
#include <android/log.h>
#include <android/log.h>
#include <dlfcn.h>
#include <dvr/dvr_api.h>
#include <dvr/dvr_api.h>
#include <dvr/dvr_display_types.h>
#include <dvr/dvr_display_types.h>
#include <dvr/dvr_surface.h>
#include <dvr/dvr_surface.h>


#include <gtest/gtest.h>
#include <gtest/gtest.h>


#include "dvr_api_test.h"

#define LOG_TAG "dvr_display-test"
#define LOG_TAG "dvr_display-test"


#ifndef ALOGD
#ifndef ALOGD
#define ALOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
#define ALOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
#endif
#endif


#define ASSERT_NOT_NULL(x) ASSERT_TRUE((x) != nullptr)
class DvrDisplayTest : public DvrApiTest {

class DvrDisplayTest : public ::testing::Test {
 protected:
 protected:
  void SetUp() override {
    int flags = RTLD_NOW | RTLD_LOCAL;

    // Here we need to ensure that libdvr is loaded with RTLD_NODELETE flag set
    // (so that calls to `dlclose` don't actually unload the library). This is a
    // workaround for an Android NDK bug. See more detail:
    // https://github.com/android-ndk/ndk/issues/360
    flags |= RTLD_NODELETE;
    platform_handle_ = dlopen("libdvr.so", flags);
    ASSERT_NOT_NULL(platform_handle_) << "Dvr shared library missing.";

    auto dvr_get_api = reinterpret_cast<decltype(&dvrGetApi)>(
        dlsym(platform_handle_, "dvrGetApi"));
    ASSERT_NOT_NULL(dvr_get_api) << "Platform library missing dvrGetApi.";

    ASSERT_EQ(dvr_get_api(&api_, sizeof(api_), /*version=*/1), 0)
        << "Unable to find compatible Dvr API.";
  }

  void TearDown() override {
  void TearDown() override {
    if (write_queue_ != nullptr) {
    if (write_queue_ != nullptr) {
      api_.WriteBufferQueueDestroy(write_queue_);
      api_.WriteBufferQueueDestroy(write_queue_);
      write_queue_ = nullptr;
      write_queue_ = nullptr;
    }
    }
    if (platform_handle_ != nullptr) {
    DvrApiTest::TearDown();
      dlclose(platform_handle_);
    }
  }
  }


  void* platform_handle_ = nullptr;
  DvrApi_v1 api_;
  DvrWriteBufferQueue* write_queue_ = nullptr;
  DvrWriteBufferQueue* write_queue_ = nullptr;
};
};