|
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));
|