// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "src/media/audio/lib/effects_loader/effects_loader_test_base.h"

#include <dlfcn.h>

#include "src/lib/fxl/logging.h"
#include "src/media/audio/effects/test_effects/test_effects.h"
#include "src/media/audio/lib/effects_loader/effects_processor.h"

namespace media::audio::test {

std::shared_ptr<test_effects_module_ext> OpenTestEffectsExt() {
  void* lib = dlopen(kTestEffectsModuleName, RTLD_GLOBAL | RTLD_LAZY);
  if (!lib) {
    return nullptr;
  }
  void* sym = dlsym(lib, "test_effects_module_ext_instance");
  if (!sym) {
    return nullptr;
  }
  // Since the pointer is owned by the loaded module; we don't free() the pointer but instead just
  // dlclose the shared lib that owns the pointer.
  return std::shared_ptr<test_effects_module_ext>(reinterpret_cast<test_effects_module_ext*>(sym),
                                                  [lib](auto* ptr) { dlclose(lib); });
}

void EffectsLoaderTestBase::SetUp() {
  testing::Test::SetUp();
  ASSERT_EQ(effects_loader_.LoadLibrary(), ZX_OK);
  test_effects_ = OpenTestEffectsExt();
  ASSERT_TRUE(test_effects_ != nullptr);
}

void EffectsLoaderTestBase::TearDown() {
  ASSERT_TRUE(test_effects_ != nullptr);
  ASSERT_EQ(0u, test_effects_->num_instances());
  ASSERT_EQ(ZX_OK, test_effects_->clear_effects());
  testing::Test::TearDown();
}

}  // namespace media::audio::test
