Blame opae-libs/tests/opae-c/test_pluginmgr_c.cpp

Packit 534379
// Copyright(c) 2018-2020, Intel Corporation
Packit 534379
//
Packit 534379
// Redistribution  and  use  in source  and  binary  forms,  with  or  without
Packit 534379
// modification, are permitted provided that the following conditions are met:
Packit 534379
//
Packit 534379
// * Redistributions of  source code  must retain the  above copyright notice,
Packit 534379
//   this list of conditions and the following disclaimer.
Packit 534379
// * Redistributions in binary form must reproduce the above copyright notice,
Packit 534379
//   this list of conditions and the following disclaimer in the documentation
Packit 534379
//   and/or other materials provided with the distribution.
Packit 534379
// * Neither the name  of Intel Corporation  nor the names of its contributors
Packit 534379
//   may be used to  endorse or promote  products derived  from this  software
Packit 534379
//   without specific prior written permission.
Packit 534379
//
Packit 534379
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
Packit 534379
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,  BUT NOT LIMITED TO,  THE
Packit 534379
// IMPLIED WARRANTIES OF  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
Packit 534379
// ARE DISCLAIMED.  IN NO EVENT  SHALL THE COPYRIGHT OWNER  OR CONTRIBUTORS BE
Packit 534379
// LIABLE  FOR  ANY  DIRECT,  INDIRECT,  INCIDENTAL,  SPECIAL,  EXEMPLARY,  OR
Packit 534379
// CONSEQUENTIAL  DAMAGES  (INCLUDING,  BUT  NOT LIMITED  TO,  PROCUREMENT  OF
Packit 534379
// SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE,  DATA, OR PROFITS;  OR BUSINESS
Packit 534379
// INTERRUPTION)  HOWEVER CAUSED  AND ON ANY THEORY  OF LIABILITY,  WHETHER IN
Packit 534379
// CONTRACT,  STRICT LIABILITY,  OR TORT  (INCLUDING NEGLIGENCE  OR OTHERWISE)
Packit 534379
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,  EVEN IF ADVISED OF THE
Packit 534379
// POSSIBILITY OF SUCH DAMAGE.
Packit 534379
Packit 534379
extern "C" {
Packit 534379
Packit 534379
#include <json-c/json.h>
Packit 534379
#include <uuid/uuid.h>
Packit 534379
#include <libgen.h>
Packit 534379
#include "opae_int.h"
Packit 534379
#include "pluginmgr.h"
Packit 534379
Packit 534379
int opae_plugin_mgr_initialize_all(void);
Packit 534379
opae_api_adapter_table *opae_plugin_mgr_alloc_adapter(const char *lib_path);
Packit 534379
int opae_plugin_mgr_free_adapter(opae_api_adapter_table *adapter);
Packit 534379
int opae_plugin_mgr_register_adapter(opae_api_adapter_table *adapter);
Packit 534379
int opae_plugin_mgr_for_each_adapter
Packit 534379
	(int (*callback)(const opae_api_adapter_table *, void *), void *context);
Packit 534379
int opae_plugin_mgr_configure_plugin(opae_api_adapter_table *adapter,
Packit 534379
				     const char *config);
Packit 534379
int process_cfg_buffer(const char *buffer, const char *filename);
Packit 534379
extern opae_api_adapter_table *adapter_list;
Packit 534379
int opae_plugin_mgr_finalize_all(void);
Packit 534379
}
Packit 534379
Packit 534379
#include <config.h>
Packit 534379
#include <opae/fpga.h>
Packit 534379
Packit 534379
#include <array>
Packit 534379
#include <cstdlib>
Packit 534379
#include <fstream>
Packit 534379
#include <map>
Packit 534379
#include <memory>
Packit 534379
#include <string>
Packit 534379
#include <vector>
Packit 534379
#include <stack>
Packit 534379
#include "gtest/gtest.h"
Packit 534379
#include "mock/test_system.h"
Packit 534379
Packit 534379
using namespace opae::testing;
Packit 534379
Packit 534379
/**
Packit 534379
 * @test       alloc_adapter01
Packit 534379
 * @brief      Test: opae_plugin_mgr_alloc_adapter
Packit 534379
 * @details    When the given library name is not found,
Packit 534379
 *             opae_plugin_mgr_alloc_adapter returns NULL.
Packit 534379
 */
Packit 534379
TEST(pluginmgr, alloc_adapter01) {
Packit 534379
  EXPECT_EQ(NULL, opae_plugin_mgr_alloc_adapter("libthatdoesntexist.so"));
Packit 534379
}
Packit 534379
Packit 534379
/**
Packit 534379
 * @test       alloc_adapter02
Packit 534379
 * @brief      Test: opae_plugin_mgr_alloc_adapter
Packit 534379
 * @details    When calloc fails,
Packit 534379
 *             opae_plugin_mgr_alloc_adapter returns NULL.
Packit 534379
 */
Packit 534379
TEST(pluginmgr, alloc_adapter02) {
Packit 534379
  test_system::instance()->invalidate_calloc(0, "opae_plugin_mgr_alloc_adapter");
Packit 534379
  EXPECT_EQ(NULL, opae_plugin_mgr_alloc_adapter("libxfpga.so"));
Packit 534379
}
Packit 534379
Packit 534379
/**
Packit 534379
 * @test       free_adapter01
Packit 534379
 * @brief      Test: opae_plugin_mgr_free_adapter
Packit 534379
 * @details    opae_plugin_mgr_free_adapter frees the given adapter table
Packit 534379
 *             and returns 0 on success.
Packit 534379
 */
Packit 534379
TEST(pluginmgr, free_adapter) {
Packit 534379
  opae_api_adapter_table *at;
Packit 534379
  at = opae_plugin_mgr_alloc_adapter("libxfpga.so");
Packit 534379
  ASSERT_NE(nullptr, at);
Packit 534379
  EXPECT_EQ(0, opae_plugin_mgr_free_adapter(at));
Packit 534379
}
Packit 534379
Packit 534379
/**
Packit 534379
 * @test       config_err
Packit 534379
 * @brief      Test: opae_plugin_mgr_configure_plugin
Packit 534379
 * @details    When opae_plugin_mgr_configure_plugin is called on a load library
Packit 534379
 *             that has no opae_plugin_configure symbol,
Packit 534379
 *             then the fn returns non-zero.
Packit 534379
 */
Packit 534379
TEST(pluginmgr, config_err) {
Packit 534379
  opae_api_adapter_table *at;
Packit 534379
  at = opae_plugin_mgr_alloc_adapter("libopae-c.so");
Packit 534379
  ASSERT_NE(nullptr, at);
Packit 534379
  EXPECT_NE(0, opae_plugin_mgr_configure_plugin(at, ""));
Packit 534379
  EXPECT_EQ(0, opae_plugin_mgr_free_adapter(at));
Packit 534379
}
Packit 534379
Packit 534379
extern "C" {
Packit 534379
Packit 534379
static int test_plugin_initialize_called;
Packit 534379
static int test_plugin_initialize(void)
Packit 534379
{
Packit 534379
  ++test_plugin_initialize_called;
Packit 534379
  return 0;
Packit 534379
}
Packit 534379
Packit 534379
static int test_plugin_bad_initialize(void)
Packit 534379
{
Packit 534379
  ++test_plugin_initialize_called;
Packit 534379
  return 1;
Packit 534379
}
Packit 534379
Packit 534379
static int test_plugin_finalize_called;
Packit 534379
static int test_plugin_finalize(void)
Packit 534379
{
Packit 534379
  ++test_plugin_finalize_called;
Packit 534379
  return 0;
Packit 534379
}
Packit 534379
Packit 534379
static int test_plugin_bad_finalize(void)
Packit 534379
{
Packit 534379
  ++test_plugin_finalize_called;
Packit 534379
  return 1;
Packit 534379
}
Packit 534379
Packit 534379
}
Packit 534379
Packit 534379
class pluginmgr_c_p : public ::testing::TestWithParam<std::string> {
Packit 534379
 protected:
Packit 534379
  pluginmgr_c_p() {}
Packit 534379
Packit 534379
  virtual void SetUp() override {
Packit 534379
    ASSERT_TRUE(test_platform::exists(GetParam()));
Packit 534379
    platform_ = test_platform::get(GetParam());
Packit 534379
    system_ = test_system::instance();
Packit 534379
    system_->initialize();
Packit 534379
    system_->prepare_syfs(platform_);
Packit 534379
    invalid_device_ = test_device::unknown();
Packit 534379
Packit 534379
    ASSERT_EQ(fpgaInitialize(NULL), FPGA_OK);
Packit 534379
    // save the global adapter list.
Packit 534379
    adapter_list_ = adapter_list;
Packit 534379
    adapter_list = nullptr;
Packit 534379
Packit 534379
    test_plugin_initialize_called = 0;
Packit 534379
    test_plugin_finalize_called = 0;
Packit 534379
Packit 534379
    faux_adapter0_ = opae_plugin_mgr_alloc_adapter("libxfpga.so");
Packit 534379
    ASSERT_NE(nullptr, faux_adapter0_);
Packit 534379
Packit 534379
    faux_adapter0_->initialize = test_plugin_initialize;
Packit 534379
    faux_adapter0_->finalize = test_plugin_finalize;
Packit 534379
    EXPECT_EQ(0, opae_plugin_mgr_register_adapter(faux_adapter0_));
Packit 534379
Packit 534379
    faux_adapter1_ = opae_plugin_mgr_alloc_adapter("libxfpga.so");
Packit 534379
    ASSERT_NE(nullptr, faux_adapter1_);
Packit 534379
Packit 534379
    faux_adapter1_->initialize = test_plugin_initialize;
Packit 534379
    faux_adapter1_->finalize = test_plugin_finalize;
Packit 534379
    EXPECT_EQ(0, opae_plugin_mgr_register_adapter(faux_adapter1_));
Packit 534379
  }
Packit 534379
Packit 534379
  virtual void TearDown() override {
Packit 534379
    // restore the global adapter list.
Packit 534379
    adapter_list = adapter_list_;
Packit 534379
    fpgaFinalize();
Packit 534379
    system_->finalize();
Packit 534379
  }
Packit 534379
Packit 534379
  opae_api_adapter_table *adapter_list_;
Packit 534379
  opae_api_adapter_table *faux_adapter0_;
Packit 534379
  opae_api_adapter_table *faux_adapter1_;
Packit 534379
  test_platform platform_;
Packit 534379
  test_device invalid_device_;
Packit 534379
  test_system *system_;
Packit 534379
};
Packit 534379
Packit 534379
/**
Packit 534379
 * @test       foreach_err
Packit 534379
 * @brief      Test: opae_plugin_mgr_for_each_adapter
Packit 534379
 * @details    When opae_plugin_mgr_for_each_adapter is passed a NULL callback,
Packit 534379
 *             then the fn returns OPAE_ENUM_STOP.
Packit 534379
 */
Packit 534379
TEST_P(pluginmgr_c_p, foreach_err) {
Packit 534379
  EXPECT_EQ(OPAE_ENUM_STOP, opae_plugin_mgr_for_each_adapter(nullptr, nullptr));
Packit 534379
Packit 534379
  EXPECT_EQ(0, opae_plugin_mgr_finalize_all());
Packit 534379
  EXPECT_EQ(nullptr, adapter_list);
Packit 534379
  EXPECT_EQ(2, test_plugin_finalize_called);
Packit 534379
}
Packit 534379
Packit 534379
/**
Packit 534379
 * @test       bad_init_all
Packit 534379
 * @brief      Test: opae_plugin_mgr_initialize_all
Packit 534379
 * @details    When any of the registered adapters' initialize fn returns non-zero,
Packit 534379
 *             then opae_plugin_mgr_initialize_all returns non-zero.
Packit 534379
 */
Packit 534379
TEST_P(pluginmgr_c_p, bad_init_all) {
Packit 534379
  faux_adapter1_->initialize = test_plugin_bad_initialize;
Packit 534379
  EXPECT_NE(0, opae_plugin_mgr_initialize_all());
Packit 534379
  EXPECT_EQ(2, test_plugin_initialize_called);
Packit 534379
Packit 534379
  EXPECT_EQ(0, opae_plugin_mgr_finalize_all());
Packit 534379
  EXPECT_EQ(nullptr, adapter_list);
Packit 534379
  EXPECT_EQ(2, test_plugin_finalize_called);
Packit 534379
}
Packit 534379
Packit 534379
/**
Packit 534379
 * @test       bad_final_all
Packit 534379
 * @brief      Test: opae_plugin_mgr_finalize_all
Packit 534379
 * @details    When any of the registered adapters' finalize fn returns non-zero,
Packit 534379
 *             then opae_plugin_mgr_finalize_all returns non-zero.
Packit 534379
 */
Packit 534379
TEST_P(pluginmgr_c_p, bad_final_all) {
Packit 534379
  faux_adapter1_->finalize = test_plugin_bad_finalize;
Packit 534379
Packit 534379
  EXPECT_NE(0, opae_plugin_mgr_finalize_all());
Packit 534379
  EXPECT_EQ(nullptr, adapter_list);
Packit 534379
  EXPECT_EQ(2, test_plugin_finalize_called);
Packit 534379
}
Packit 534379
Packit 534379
INSTANTIATE_TEST_CASE_P(pluginmgr_c, pluginmgr_c_p, ::testing::ValuesIn(test_platform::keys(true)));
Packit 534379
Packit 534379
const char *plugin_cfg_1 = R"plug(
Packit 534379
{
Packit 534379
    "configurations": {
Packit 534379
        "plugin1": {
Packit 534379
            "configuration": {
Packit 534379
                "key1a": 10,
Packit 534379
                "key1b": "hello"
Packit 534379
            },
Packit 534379
            "enabled": true,
Packit 534379
            "plugin": "libplugin1.so"
Packit 534379
        },
Packit 534379
        "plugin2": {
Packit 534379
            "configuration": {
Packit 534379
                "key1a": 20,
Packit 534379
                "key1b": "goodbye"
Packit 534379
            },
Packit 534379
            "enabled": false,
Packit 534379
            "plugin": "libplugin2.so"
Packit 534379
        }
Packit 534379
    },
Packit 534379
    "plugins": [
Packit 534379
        "plugin1",
Packit 534379
        "plugin2"
Packit 534379
    ]
Packit 534379
}
Packit 534379
)plug";
Packit 534379
Packit 534379
// missing comma (,) on line 272
Packit 534379
const char *plugin_cfg_2 = R"plug(
Packit 534379
{
Packit 534379
    "configurations": {
Packit 534379
        "plugin1": {
Packit 534379
            "configuration": {
Packit 534379
                "key1a": 10,
Packit 534379
                "key1b": "hello"
Packit 534379
            },
Packit 534379
            "enabled": true,
Packit 534379
            "plugin": "libplugin1.so"
Packit 534379
        }
Packit 534379
        "plugin2": {
Packit 534379
            "configuration": {
Packit 534379
                "key1a": 20,
Packit 534379
                "key1b": "goodbye"
Packit 534379
            },
Packit 534379
            "enabled": false,
Packit 534379
            "plugin": "libplugin2.so"
Packit 534379
        }
Packit 534379
    },
Packit 534379
    "plugins": [
Packit 534379
        "plugin1",
Packit 534379
        "plugin2
Packit 534379
    ]
Packit 534379
}
Packit 534379
)plug";
Packit 534379
Packit 534379
// keyword enabled misspelled on line 298
Packit 534379
const char *plugin_cfg_3 = R"plug(
Packit 534379
{
Packit 534379
    "configurations": {
Packit 534379
        "plugin1": {
Packit 534379
            "configuration": {
Packit 534379
                "key1a": 10,
Packit 534379
                "key1b": "hello"
Packit 534379
            },
Packit 534379
            "enable": true,
Packit 534379
            "plugin": "libplugin1.so"
Packit 534379
        },
Packit 534379
        "plugin2": {
Packit 534379
            "configuration": {
Packit 534379
                "key1a": 20,
Packit 534379
                "key1b": "goodbye"
Packit 534379
            },
Packit 534379
            "enabled": false,
Packit 534379
            "plugin": "libplugin2.so"
Packit 534379
        }
Packit 534379
    },
Packit 534379
    "plugins": [
Packit 534379
        "plugin1",
Packit 534379
        "plugin2"
Packit 534379
    ]
Packit 534379
}
Packit 534379
)plug";
Packit 534379
Packit 534379
// plugin name different on line 321
Packit 534379
const char *plugin_cfg_4 = R"plug(
Packit 534379
{
Packit 534379
    "configurations": {
Packit 534379
        "plugin10": {
Packit 534379
            "configuration": {
Packit 534379
                "key1a": 10,
Packit 534379
                "key1b": "hello"
Packit 534379
            },
Packit 534379
            "enabled": true,
Packit 534379
            "plugin": "libplugin1.so"
Packit 534379
        },
Packit 534379
        "plugin2": {
Packit 534379
            "configuration": {
Packit 534379
                "key1a": 20,
Packit 534379
                "key1b": "goodbye"
Packit 534379
            },
Packit 534379
            "enabled": false,
Packit 534379
            "plugin": "libplugin2.so"
Packit 534379
        }
Packit 534379
    },
Packit 534379
    "plugins": [
Packit 534379
        "plugin1",
Packit 534379
        "plugin2"
Packit 534379
    ]
Packit 534379
}
Packit 534379
)plug";
Packit 534379
Packit 534379
// plugins not array type
Packit 534379
const char *plugin_cfg_5 = R"plug(
Packit 534379
{
Packit 534379
    "configurations": {
Packit 534379
        "plugin1": {
Packit 534379
            "configuration": {
Packit 534379
                "key1a": 10,
Packit 534379
                "key1b": "hello"
Packit 534379
            },
Packit 534379
            "enabled": true,
Packit 534379
            "plugin": "libplugin1.so"
Packit 534379
        },
Packit 534379
        "plugin2": {
Packit 534379
            "configuration": {
Packit 534379
                "key1a": 20,
Packit 534379
                "key1b": "goodbye"
Packit 534379
            },
Packit 534379
            "enabled": false,
Packit 534379
            "plugin": "libplugin2.so"
Packit 534379
        }
Packit 534379
    },
Packit 534379
    "plugins": 0
Packit 534379
}
Packit 534379
)plug";
Packit 534379
Packit 534379
#define HOME_CFG_PATHS 3
Packit 534379
extern "C" {
Packit 534379
  void opae_plugin_mgr_reset_cfg(void);
Packit 534379
  int opae_plugin_mgr_load_cfg_plugins(void);
Packit 534379
  int opae_plugin_mgr_finalize_all(void);
Packit 534379
  extern plugin_cfg *opae_plugin_mgr_config_list;
Packit 534379
  extern int opae_plugin_mgr_plugin_count;
Packit 534379
  const char *_opae_home_configs[HOME_CFG_PATHS] = {
Packit 534379
	"/.local/opae.cfg",
Packit 534379
	"/.local/opae/opae.cfg",
Packit 534379
	"/.config/opae/opae.cfg",
Packit 534379
  };
Packit 534379
}
Packit 534379
Packit 534379
TEST(pluginmgr_c_p, process_cfg_buffer) {
Packit 534379
  opae_plugin_mgr_reset_cfg();
Packit 534379
  EXPECT_EQ(opae_plugin_mgr_plugin_count, 0);
Packit 534379
  ASSERT_EQ(process_cfg_buffer(plugin_cfg_1, "plugin1.json"), 0);
Packit 534379
  EXPECT_EQ(opae_plugin_mgr_plugin_count, 2);
Packit 534379
  auto p1 = opae_plugin_mgr_config_list;
Packit 534379
  ASSERT_NE(p1, nullptr);
Packit 534379
  auto p2 = p1->next;
Packit 534379
  ASSERT_NE(p2, nullptr);
Packit 534379
  EXPECT_TRUE(p1->enabled);
Packit 534379
  EXPECT_FALSE(p2->enabled);
Packit 534379
  ASSERT_EQ(p2->next, nullptr);
Packit 534379
}
Packit 534379
Packit 534379
TEST(pluginmgr_c_p, process_cfg_buffer_err) {
Packit 534379
  opae_plugin_mgr_reset_cfg();
Packit 534379
  EXPECT_EQ(opae_plugin_mgr_plugin_count, 0);
Packit 534379
  ASSERT_NE(process_cfg_buffer(plugin_cfg_2, "plugin2.json"), 0);
Packit 534379
Packit 534379
  opae_plugin_mgr_reset_cfg();
Packit 534379
  EXPECT_EQ(opae_plugin_mgr_plugin_count, 0);
Packit 534379
  ASSERT_NE(process_cfg_buffer(plugin_cfg_3, "plugin3.json"), 0);
Packit 534379
  EXPECT_EQ(opae_plugin_mgr_plugin_count, 1);
Packit 534379
Packit 534379
  opae_plugin_mgr_reset_cfg();
Packit 534379
  EXPECT_EQ(opae_plugin_mgr_plugin_count, 0);
Packit 534379
  ASSERT_NE(process_cfg_buffer(plugin_cfg_4, "plugin4.json"), 0);
Packit 534379
  EXPECT_EQ(opae_plugin_mgr_plugin_count, 1);
Packit 534379
Packit 534379
  opae_plugin_mgr_reset_cfg();
Packit 534379
  EXPECT_EQ(opae_plugin_mgr_plugin_count, 0);
Packit 534379
  ASSERT_NE(process_cfg_buffer(plugin_cfg_5, "plugin5.json"), 0);
Packit 534379
  EXPECT_EQ(opae_plugin_mgr_plugin_count, 0);
Packit 534379
}
Packit 534379
Packit 534379
const char *dummy_cfg = R"plug(
Packit 534379
{
Packit 534379
    "configurations": {
Packit 534379
        "dummy": {
Packit 534379
            "configuration": {
Packit 534379
                "key1": "hello",
Packit 534379
                "key2": "plugin",
Packit 534379
                "fake_tokens": 99
Packit 534379
            },
Packit 534379
            "enabled": true,
Packit 534379
            "plugin": "libdummy_plugin.so"
Packit 534379
        }
Packit 534379
    },
Packit 534379
    "plugins": [
Packit 534379
        "dummy"
Packit 534379
    ]
Packit 534379
}
Packit 534379
)plug";
Packit 534379
Packit 534379
const char *err_contains = "wrapped_handle->adapter_table->fpgaReset is NULL";
Packit 534379
Packit 534379
Packit 534379
TEST_P(pluginmgr_c_p, dummy_plugin) {
Packit 534379
  auto ldl_path = getenv("LD_LIBRARY_PATH");
Packit 534379
  opae_plugin_mgr_reset_cfg();
Packit 534379
  EXPECT_EQ(opae_plugin_mgr_plugin_count, 0);
Packit 534379
  ASSERT_EQ(process_cfg_buffer(dummy_cfg, "dummy.json"), 0);
Packit 534379
  EXPECT_EQ(opae_plugin_mgr_plugin_count, 1);
Packit 534379
  auto p1 = opae_plugin_mgr_config_list;
Packit 534379
  ASSERT_NE(p1, nullptr);
Packit 534379
  auto p2 = p1->next;
Packit 534379
  ASSERT_EQ(p2, nullptr);
Packit 534379
  EXPECT_TRUE(p1->enabled);
Packit 534379
  testing::internal::CaptureStdout();
Packit 534379
  ASSERT_EQ(opae_plugin_mgr_load_cfg_plugins(), 0) << "LD_LIBRARY_PATH: '"
Packit 534379
                                                   << ldl_path << "'";
Packit 534379
  std::string output = testing::internal::GetCapturedStdout();
Packit 534379
  EXPECT_STREQ(output.c_str(), "hello plugin!\n");
Packit 534379
Packit 534379
  uint32_t matches = 0;
Packit 534379
  fpga_properties filter = NULL;
Packit 534379
  uint16_t device_id = 49178;
Packit 534379
  EXPECT_EQ(fpgaGetProperties(nullptr, &filter), FPGA_OK);
Packit 534379
  EXPECT_EQ(fpgaPropertiesSetDeviceID(filter, device_id), FPGA_OK);
Packit 534379
  EXPECT_EQ(fpgaEnumerate(&filter, 1, nullptr, 0, &matches), FPGA_OK);
Packit 534379
  EXPECT_EQ(matches, 99);
Packit 534379
  std::array<fpga_token, 99> tokens = {0};
Packit 534379
  std::array<fpga_handle, 99> handles = {0};
Packit 534379
  EXPECT_EQ(fpgaEnumerate(&filter, 1, tokens.data(), tokens.size(), &matches),
Packit 534379
            FPGA_OK);
Packit 534379
  int i = 0;
Packit 534379
  for (auto t : tokens) {
Packit 534379
    EXPECT_EQ(fpgaOpen(t, &handles[i], i), FPGA_OK);
Packit 534379
    testing::internal::CaptureStderr();
Packit 534379
    EXPECT_EQ(fpgaReset(handles[i]), FPGA_NOT_SUPPORTED);
Packit 534379
    std::string err = testing::internal::GetCapturedStderr();
Packit 534379
    EXPECT_NE(err.find(err_contains), std::string::npos);
Packit 534379
    EXPECT_EQ(fpgaClose(handles[i++]), FPGA_OK);
Packit 534379
    EXPECT_EQ(fpgaDestroyToken(&t), FPGA_OK);
Packit 534379
  }
Packit 534379
Packit 534379
  EXPECT_EQ(fpgaDestroyProperties(&filter), FPGA_OK);
Packit 534379
  unlink("opae_log.log");
Packit 534379
  opae_plugin_mgr_finalize_all();
Packit 534379
  opae_plugin_mgr_reset_cfg(); 
Packit 534379
}
Packit 534379
Packit 534379
TEST_P(pluginmgr_c_p, no_cfg) {
Packit 534379
  opae_plugin_mgr_reset_cfg();
Packit 534379
  EXPECT_EQ(opae_plugin_mgr_plugin_count, 0);
Packit 534379
  ASSERT_EQ(opae_plugin_mgr_initialize(nullptr), 0);
Packit 534379
  EXPECT_EQ(opae_plugin_mgr_plugin_count, 0);
Packit 534379
  auto p1 = opae_plugin_mgr_config_list;
Packit 534379
  ASSERT_EQ(p1, nullptr);
Packit 534379
  opae_plugin_mgr_finalize_all();
Packit 534379
  opae_plugin_mgr_reset_cfg(); 
Packit 534379
}
Packit 534379
Packit 534379
class pluginmgr_cfg_p : public ::testing::TestWithParam<const char*> {
Packit 534379
 protected:
Packit 534379
  pluginmgr_cfg_p() : buffer_ {0} {}
Packit 534379
Packit 534379
  virtual void SetUp() override {
Packit 534379
    // This parameterized test iterates over the possible config file paths
Packit 534379
    // relative to a user's home directory
Packit 534379
Packit 534379
    // let's build the full path by prepending the parameter with $HOME
Packit 534379
    char *home_cstr = getenv("HOME");
Packit 534379
    ASSERT_NE(home_cstr, nullptr) << "No home environment found";
Packit 534379
    std::string home = home_cstr;
Packit 534379
    // the parameter paths start with a '/'
Packit 534379
    cfg_file_ = home + std::string(GetParam());
Packit 534379
    // copy it to a temporary buffer that we can use dirname with
Packit 534379
    std::copy(cfg_file_.begin(), cfg_file_.end(), &buffer_[0]);
Packit 534379
    // get the directory name of the file
Packit 534379
    cfg_dir_ = dirname(buffer_);
Packit 534379
    struct stat st;
Packit 534379
    // if the directory doesn't exist, create the entire path
Packit 534379
    if (stat(cfg_dir_, &st)) {
Packit 534379
      std::string dir = cfg_dir_;
Packit 534379
      // find the first '/' after $HOME
Packit 534379
      size_t pos = dir.find('/', home.size());
Packit 534379
      while (pos != std::string::npos) {
Packit 534379
        std::string sub = dir.substr(0, pos);
Packit 534379
        // sub is $HOME/<dir1>, then $HOME/<dir1>/<dir2>, ...
Packit 534379
        // if this directory doesn't exist, create it
Packit 534379
        if (stat(sub.c_str(), &st) && sub != "") {
Packit 534379
          ASSERT_EQ(mkdir(sub.c_str(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH),
Packit 534379
                    0)
Packit 534379
              << "Error creating subdirectory (" << sub
Packit 534379
              << "}: " << strerror(errno);
Packit 534379
          // keep track of directories created
Packit 534379
          dirs_.push(sub);
Packit 534379
        }
Packit 534379
        pos = pos < dir.size() ? dir.find('/', pos + 1) : std::string::npos;
Packit 534379
      }
Packit 534379
      // finally, we know the entire path didn't exist, create the last
Packit 534379
      // directory
Packit 534379
      ASSERT_EQ(mkdir(cfg_dir_, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH), 0)
Packit 534379
          << "Error creating subdirectory (" << cfg_dir_
Packit 534379
          << "}: " << strerror(errno);
Packit 534379
      dirs_.push(cfg_dir_);
Packit 534379
    }
Packit 534379
Packit 534379
    if (stat(cfg_file_.c_str(), &st) == 0) {
Packit 534379
      unlink(cfg_file_.c_str());
Packit 534379
    }
Packit 534379
Packit 534379
    std::ofstream cfg_stream(cfg_file_);
Packit 534379
    cfg_stream.write(dummy_cfg, strlen(dummy_cfg));
Packit 534379
    cfg_stream.close();
Packit 534379
  }
Packit 534379
Packit 534379
  virtual void TearDown() override {
Packit 534379
    opae_plugin_mgr_finalize_all();
Packit 534379
    unlink(cfg_file_.c_str());
Packit 534379
    // remove any directories we created in SetUp
Packit 534379
    while (!dirs_.empty()) {
Packit 534379
      unlink(dirs_.top().c_str());
Packit 534379
      dirs_.pop();
Packit 534379
    }
Packit 534379
  }
Packit 534379
Packit 534379
  char buffer_[PATH_MAX];
Packit 534379
  std::string cfg_file_;
Packit 534379
  char *cfg_dir_;
Packit 534379
  std::stack<std::string> dirs_;
Packit 534379
};
Packit 534379
Packit 534379
Packit 534379
/**
Packit 534379
 * @test       find_and_parse_cfg
Packit 534379
 * @brief      Test: find_and_parse_cfg
Packit 534379
 * @details    Given a valid configuration with one plugin
Packit 534379
 *             And a configuration file located in one of three possible paths
Packit 534379
 *             in the user's home directory
Packit 534379
 *             When I call opae_plugin_mgr_initialize
Packit 534379
 *             Then the call is successful
Packit 534379
 *             And the number of plugins in the global plugin list is 1
Packit 534379
 */
Packit 534379
TEST_P(pluginmgr_cfg_p, find_and_parse_cfg) {
Packit 534379
  opae_plugin_mgr_reset_cfg();
Packit 534379
  EXPECT_EQ(opae_plugin_mgr_plugin_count, 0);
Packit 534379
  ASSERT_EQ(opae_plugin_mgr_initialize(nullptr), 0);
Packit 534379
  EXPECT_EQ(opae_plugin_mgr_plugin_count, 1);
Packit 534379
  auto p1 = opae_plugin_mgr_config_list;
Packit 534379
  ASSERT_NE(p1, nullptr);
Packit 534379
  ASSERT_EQ(p1->next, nullptr);
Packit 534379
  EXPECT_TRUE(p1->enabled);
Packit 534379
  opae_plugin_mgr_finalize_all();
Packit 534379
  opae_plugin_mgr_reset_cfg(); 
Packit 534379
}
Packit 534379
Packit 534379
INSTANTIATE_TEST_CASE_P(pluginmgr_cfg, pluginmgr_cfg_p,
Packit 534379
                        ::testing::ValuesIn(_opae_home_configs));