|
Packit |
534379 |
// Copyright(c) 2017-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 |
#include <opae/utils.h>
|
|
Packit |
534379 |
#include "sysfs_int.h"
|
|
Packit |
534379 |
#include "types_int.h"
|
|
Packit |
534379 |
fpga_result cat_token_sysfs_path(char *, fpga_token, const char *);
|
|
Packit |
534379 |
fpga_result get_port_sysfs(fpga_handle, char *);
|
|
Packit |
534379 |
fpga_result sysfs_get_socket_id(int, int, fpga_guid);
|
|
Packit |
534379 |
fpga_result sysfs_get_afu_id(int, int, fpga_guid);
|
|
Packit |
534379 |
fpga_result sysfs_get_pr_id(int, int, fpga_guid);
|
|
Packit |
534379 |
fpga_result sysfs_get_slots(int, int, uint32_t *);
|
|
Packit |
534379 |
fpga_result sysfs_get_bitstream_id(int, int, uint64_t *);
|
|
Packit |
534379 |
fpga_result sysfs_sbdf_from_path(const char *, int *, int *, int *, int *);
|
|
Packit |
534379 |
fpga_result opae_glob_path(char *, size_t );
|
|
Packit |
534379 |
fpga_result opae_glob_paths(const char *path, size_t found_max,
|
|
Packit |
534379 |
char *found[], size_t *num_found);
|
|
Packit |
534379 |
fpga_result make_sysfs_group(char *, const char *, fpga_object *, int,
|
|
Packit |
534379 |
fpga_handle);
|
|
Packit |
534379 |
ssize_t eintr_write(int, void *, size_t);
|
|
Packit |
534379 |
char* cstr_dup(const char *str);
|
|
Packit |
534379 |
int parse_pcie_info(sysfs_fpga_device *device, char *buffer);
|
|
Packit |
534379 |
fpga_result sysfs_get_interface_id(fpga_token token, fpga_guid guid);
|
|
Packit |
534379 |
sysfs_fpga_region* make_region(sysfs_fpga_device*, char*, int, fpga_objtype);
|
|
Packit |
534379 |
int xfpga_plugin_initialize(void);
|
|
Packit |
534379 |
int xfpga_plugin_finalize(void);
|
|
Packit |
534379 |
fpga_result re_match_region(const char *fmt, char *inpstr, char type[], size_t,
|
|
Packit |
534379 |
int *num);
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
#include <fstream>
|
|
Packit |
534379 |
#include <opae/enum.h>
|
|
Packit |
534379 |
#include <opae/fpga.h>
|
|
Packit |
534379 |
#include <opae/properties.h>
|
|
Packit |
534379 |
#include <sys/types.h>
|
|
Packit |
534379 |
#include <uuid/uuid.h>
|
|
Packit |
534379 |
#include <string>
|
|
Packit |
534379 |
#include <vector>
|
|
Packit |
534379 |
#include "xfpga.h"
|
|
Packit |
534379 |
#include <fcntl.h>
|
|
Packit |
534379 |
#include "gtest/gtest.h"
|
|
Packit |
534379 |
#include "mock/test_system.h"
|
|
Packit |
534379 |
|
|
Packit |
534379 |
const std::string single_sysfs_fme =
|
|
Packit |
534379 |
"/sys/class/fpga/intel-fpga-dev.0/intel-fpga-fme.0";
|
|
Packit |
534379 |
const std::string single_sysfs_port =
|
|
Packit |
534379 |
"/sys/class/fpga/intel-fpga-dev.0/intel-fpga-port.0";
|
|
Packit |
534379 |
const std::string single_dev_fme = "/dev/intel-fpga-fme.0";
|
|
Packit |
534379 |
const std::string single_dev_port = "/dev/intel-fpga-port.0";
|
|
Packit |
534379 |
|
|
Packit |
534379 |
using namespace opae::testing;
|
|
Packit |
534379 |
|
|
Packit |
534379 |
|
|
Packit |
534379 |
class sysfsinit_c_p : public ::testing::TestWithParam<std::string> {
|
|
Packit |
534379 |
protected:
|
|
Packit |
534379 |
sysfsinit_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 |
ASSERT_EQ(xfpga_plugin_initialize(), FPGA_OK);
|
|
Packit |
534379 |
ASSERT_GT(sysfs_device_count(), 0);
|
|
Packit |
534379 |
sysfs_fpga_region *fme = nullptr;
|
|
Packit |
534379 |
sysfs_fpga_region *port = nullptr;
|
|
Packit |
534379 |
for (int i = 0; i < sysfs_device_count(); ++i) {
|
|
Packit |
534379 |
fme = (fme == nullptr) ? sysfs_get_device(i)->fme : fme;
|
|
Packit |
534379 |
port = (port == nullptr) ? sysfs_get_device(i)->port : port;
|
|
Packit |
534379 |
if (fme && port) break;
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
ASSERT_NE(fme, nullptr);
|
|
Packit |
534379 |
ASSERT_NE(port, nullptr);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
sysfs_fme = std::string(fme->sysfs_path);
|
|
Packit |
534379 |
dev_fme = std::string("/dev/") + std::string(fme->sysfs_name);
|
|
Packit |
534379 |
sysfs_port = std::string(port->sysfs_path);
|
|
Packit |
534379 |
dev_port = std::string("/dev/") + std::string(port->sysfs_name);
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
virtual void TearDown() override {
|
|
Packit |
534379 |
xfpga_plugin_finalize();
|
|
Packit |
534379 |
system_->finalize();
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
int GetNumFpgas() {
|
|
Packit |
534379 |
if (platform_.mock_sysfs != nullptr) {
|
|
Packit |
534379 |
return platform_.devices.size();
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
int value;
|
|
Packit |
534379 |
std::string cmd =
|
|
Packit |
534379 |
"(ls -l /sys/class/fpga*/*/*fme*/dev || "
|
|
Packit |
534379 |
"ls -l /sys/class/fpga*/*intel*) | (wc -l)";
|
|
Packit |
534379 |
|
|
Packit |
534379 |
ExecuteCmd(cmd, value);
|
|
Packit |
534379 |
return value;
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
int GetNumMatchedFpga() {
|
|
Packit |
534379 |
if (platform_.mock_sysfs != nullptr) {
|
|
Packit |
534379 |
return platform_.devices.size();
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
std::stringstream ss;
|
|
Packit |
534379 |
ss << std::setw(4) << std::hex << platform_.devices[0].device_id;
|
|
Packit |
534379 |
std::string deviceid (ss.str());
|
|
Packit |
534379 |
|
|
Packit |
534379 |
std::string cmd = "lspci | grep " + deviceid + " | wc -l";
|
|
Packit |
534379 |
|
|
Packit |
534379 |
int value;
|
|
Packit |
534379 |
ExecuteCmd(cmd, value);
|
|
Packit |
534379 |
return value;
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
void ExecuteCmd(std::string cmd, int &value) {
|
|
Packit |
534379 |
std::string line;
|
|
Packit |
534379 |
std::string command = cmd + " > output.txt";
|
|
Packit |
534379 |
|
|
Packit |
534379 |
EXPECT_EQ(std::system(command.c_str()), 0);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
std::ifstream file("output.txt");
|
|
Packit |
534379 |
|
|
Packit |
534379 |
ASSERT_TRUE(file.is_open());
|
|
Packit |
534379 |
EXPECT_TRUE(std::getline(file, line));
|
|
Packit |
534379 |
file.close();
|
|
Packit |
534379 |
|
|
Packit |
534379 |
EXPECT_EQ(std::system("rm output.txt"), 0);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
value = std::stoi(line);
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
test_platform platform_;
|
|
Packit |
534379 |
test_system *system_;
|
|
Packit |
534379 |
std::string sysfs_fme;
|
|
Packit |
534379 |
std::string dev_fme;
|
|
Packit |
534379 |
std::string sysfs_port;
|
|
Packit |
534379 |
std::string dev_port;
|
|
Packit |
534379 |
};
|
|
Packit |
534379 |
|
|
Packit |
534379 |
// convert segment, bus, device, function to a 32 bit number
|
|
Packit |
534379 |
uint32_t to_uint32(uint16_t segment, uint8_t bus, uint8_t device,
|
|
Packit |
534379 |
uint8_t function) {
|
|
Packit |
534379 |
return (segment << 16) | (bus << 8) | (device << 5) | (function & 7);
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
TEST_P(sysfsinit_c_p, sysfs_initialize) {
|
|
Packit |
534379 |
std::map<uint64_t, test_device> devices;
|
|
Packit |
534379 |
|
|
Packit |
534379 |
// define a callback to be used with sysfs_foreach_device
|
|
Packit |
534379 |
// this callback is given a map of devices using the sbdf as the key
|
|
Packit |
534379 |
// (as a 32-bit number);
|
|
Packit |
534379 |
auto cb = [](const sysfs_fpga_device *r, void* data) -> fpga_result {
|
|
Packit |
534379 |
auto& devs = *reinterpret_cast<std::map<uint64_t, test_device>*>(data);
|
|
Packit |
534379 |
auto id = to_uint32(r->segment, r->bus, r->device, r->function);
|
|
Packit |
534379 |
auto it = devs.find(id);
|
|
Packit |
534379 |
if (it != devs.end()) {
|
|
Packit |
534379 |
if (it->second.device_id == r->device_id &&
|
|
Packit |
534379 |
it->second.vendor_id == r->vendor_id) {
|
|
Packit |
534379 |
devs.erase(id);
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
return FPGA_OK;
|
|
Packit |
534379 |
};
|
|
Packit |
534379 |
|
|
Packit |
534379 |
// build a map of tests devices where the key is the sbdf as a 32-bit number
|
|
Packit |
534379 |
for (const auto &d : platform_.devices) {
|
|
Packit |
534379 |
devices[to_uint32(d.segment, d.bus, d.device, d.function)] = d;
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
if (platform_.devices[0].num_vfs) {
|
|
Packit |
534379 |
auto d = platform_.devices[0];
|
|
Packit |
534379 |
d.function = 1;
|
|
Packit |
534379 |
d.device_id++;
|
|
Packit |
534379 |
devices[to_uint32(d.segment, d.bus, d.device, 1)] = d;
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
auto num_vfs = platform_.devices[0].num_vfs;
|
|
Packit |
534379 |
// the size of this map should be equal to the number of devices in our
|
|
Packit |
534379 |
// platform
|
|
Packit |
534379 |
ASSERT_EQ(devices.size(), platform_.devices.size() + num_vfs);
|
|
Packit |
534379 |
EXPECT_EQ(GetNumFpgas(), sysfs_device_count() - num_vfs);
|
|
Packit |
534379 |
// call sysfs_foreach_device with our callback, cb
|
|
Packit |
534379 |
sysfs_foreach_device(cb, &devices);
|
|
Packit |
534379 |
// our devices map should be empty after this call as this callback removes
|
|
Packit |
534379 |
// entries if the device structure matches a device object in the map
|
|
Packit |
534379 |
EXPECT_EQ(devices.size(), 0);
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
TEST_P(sysfsinit_c_p, sysfs_get_device) {
|
|
Packit |
534379 |
std::map<uint64_t, test_device> devices;
|
|
Packit |
534379 |
|
|
Packit |
534379 |
// build a map of tests devices where the key is the sbdf as a 32-bit number
|
|
Packit |
534379 |
for (const auto &d : platform_.devices) {
|
|
Packit |
534379 |
devices[to_uint32(d.segment, d.bus, d.device, d.function)] = d;
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
// the size of this map should be equal to the number of devices in our
|
|
Packit |
534379 |
// platform
|
|
Packit |
534379 |
ASSERT_EQ(devices.size(), platform_.devices.size());
|
|
Packit |
534379 |
auto num_vfs = platform_.devices[0].num_vfs;
|
|
Packit |
534379 |
EXPECT_EQ(GetNumFpgas(), sysfs_device_count() - num_vfs);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
// use sysfs_get_device API to count how many devices match our devices map
|
|
Packit |
534379 |
for (int i = 0; i < sysfs_device_count(); ++i) {
|
|
Packit |
534379 |
auto device = sysfs_get_device(i);
|
|
Packit |
534379 |
ASSERT_NE(device, nullptr);
|
|
Packit |
534379 |
auto id = to_uint32(device->segment, device->bus, device->device, device->function);
|
|
Packit |
534379 |
auto it = devices.find(id);
|
|
Packit |
534379 |
if (it != devices.end() && it->second.device_id == device->device_id &&
|
|
Packit |
534379 |
it->second.vendor_id == device->vendor_id) {
|
|
Packit |
534379 |
devices.erase(id);
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
// our devices map should be empty after the loop above
|
|
Packit |
534379 |
EXPECT_EQ(devices.size(), 0);
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
/**
|
|
Packit |
534379 |
* @test get_interface_id
|
|
Packit |
534379 |
* @details Given a valid token
|
|
Packit |
534379 |
When I call sysfs_get_interface_id with that token
|
|
Packit |
534379 |
* I get the expected interface_id
|
|
Packit |
534379 |
*/
|
|
Packit |
534379 |
TEST_P(sysfsinit_c_p, get_interface_id) {
|
|
Packit |
534379 |
fpga_guid guid;
|
|
Packit |
534379 |
fpga_properties props;
|
|
Packit |
534379 |
fpga_token fme;
|
|
Packit |
534379 |
uint32_t matches = 0;
|
|
Packit |
534379 |
fpga_guid parsed_guid;
|
|
Packit |
534379 |
ASSERT_EQ(fpgaGetProperties(nullptr, &props), FPGA_OK);
|
|
Packit |
534379 |
ASSERT_EQ(fpgaPropertiesSetDeviceID(props,platform_.devices[0].device_id), FPGA_OK);
|
|
Packit |
534379 |
ASSERT_EQ(fpgaPropertiesSetVendorID(props,platform_.devices[0].vendor_id), FPGA_OK);
|
|
Packit |
534379 |
ASSERT_EQ(fpgaPropertiesSetObjectType(props, FPGA_DEVICE), FPGA_OK);
|
|
Packit |
534379 |
ASSERT_EQ(xfpga_fpgaEnumerate(&props, 1, &fme, 1, &matches), FPGA_OK);
|
|
Packit |
534379 |
EXPECT_EQ(matches, GetNumMatchedFpga());
|
|
Packit |
534379 |
ASSERT_EQ(sysfs_get_interface_id(fme, guid), 0);
|
|
Packit |
534379 |
EXPECT_EQ(uuid_parse(platform_.devices[0].fme_guid, parsed_guid), 0);
|
|
Packit |
534379 |
EXPECT_EQ(uuid_compare(parsed_guid, guid), 0);
|
|
Packit |
534379 |
EXPECT_EQ(xfpga_fpgaDestroyToken(&fme), FPGA_OK);
|
|
Packit |
534379 |
EXPECT_EQ(fpgaDestroyProperties(&props), FPGA_OK);
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
TEST(sysfsinit_c_p, sysfs_parse_pcie) {
|
|
Packit |
534379 |
sysfs_fpga_device device;
|
|
Packit |
534379 |
char buffer1[] = "../../devices/pci0000:00/0000:00:02.0/0f0f:05:04.3/fpga/intel-fpga-dev.0";
|
|
Packit |
534379 |
char buffer2[] = "../../devices/pci0000:5e/a0a0:5e:02.1/fpga_device/device0";
|
|
Packit |
534379 |
auto res = parse_pcie_info(&device, buffer1);
|
|
Packit |
534379 |
EXPECT_EQ(res, 0);
|
|
Packit |
534379 |
EXPECT_EQ(device.segment, 0x0f0f);
|
|
Packit |
534379 |
EXPECT_EQ(device.bus, 0x05);
|
|
Packit |
534379 |
EXPECT_EQ(device.device, 0x04);
|
|
Packit |
534379 |
EXPECT_EQ(device.function, 0x03);
|
|
Packit |
534379 |
res = parse_pcie_info(&device, buffer2);
|
|
Packit |
534379 |
EXPECT_EQ(res, 0);
|
|
Packit |
534379 |
EXPECT_EQ(device.segment, 0xa0a0);
|
|
Packit |
534379 |
EXPECT_EQ(device.bus, 0x5e);
|
|
Packit |
534379 |
EXPECT_EQ(device.device, 0x02);
|
|
Packit |
534379 |
EXPECT_EQ(device.function, 0x01);
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
INSTANTIATE_TEST_CASE_P(sysfsinit_c, sysfsinit_c_p,
|
|
Packit |
534379 |
::testing::ValuesIn(test_platform::platforms()));
|
|
Packit |
534379 |
|
|
Packit |
534379 |
class sysfs_c_p : public ::testing::TestWithParam<std::string> {
|
|
Packit |
534379 |
protected:
|
|
Packit |
534379 |
sysfs_c_p()
|
|
Packit |
534379 |
: tokens_{{nullptr, nullptr}},
|
|
Packit |
534379 |
handle_(nullptr){}
|
|
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 |
ASSERT_EQ(xfpga_plugin_initialize(), FPGA_OK);
|
|
Packit |
534379 |
ASSERT_EQ(xfpga_fpgaGetProperties(nullptr, &filter_), FPGA_OK);
|
|
Packit |
534379 |
ASSERT_EQ(fpgaPropertiesSetDeviceID(filter_,
|
|
Packit |
534379 |
platform_.devices[0].device_id), FPGA_OK);
|
|
Packit |
534379 |
ASSERT_EQ(fpgaPropertiesSetObjectType(filter_, FPGA_DEVICE), FPGA_OK);
|
|
Packit |
534379 |
ASSERT_EQ(xfpga_fpgaEnumerate(&filter_, 1, tokens_.data(), tokens_.size(),
|
|
Packit |
534379 |
&num_matches_),
|
|
Packit |
534379 |
FPGA_OK);
|
|
Packit |
534379 |
ASSERT_EQ(xfpga_fpgaOpen(tokens_[0], &handle_, 0), FPGA_OK);
|
|
Packit |
534379 |
sysfs_fpga_region *fme = nullptr;
|
|
Packit |
534379 |
sysfs_fpga_region *port = nullptr;
|
|
Packit |
534379 |
if (sysfs_device_count() > 0) {
|
|
Packit |
534379 |
for (int i = 0; i < sysfs_device_count(); ++i) {
|
|
Packit |
534379 |
fme = fme == nullptr ? sysfs_get_device(i)->fme : fme;
|
|
Packit |
534379 |
port = port == nullptr ? sysfs_get_device(i)->port : port;
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
ASSERT_NE(fme, nullptr);
|
|
Packit |
534379 |
ASSERT_NE(port, nullptr);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
sysfs_fme = std::string(fme->sysfs_path);
|
|
Packit |
534379 |
dev_fme = std::string("/dev/") + std::string(fme->sysfs_name);
|
|
Packit |
534379 |
sysfs_port = std::string(port->sysfs_path);
|
|
Packit |
534379 |
dev_port = std::string("/dev/") + std::string(port->sysfs_name);
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
virtual void TearDown() override {
|
|
Packit |
534379 |
EXPECT_EQ(fpgaDestroyProperties(&filter_), FPGA_OK);
|
|
Packit |
534379 |
if (handle_) {
|
|
Packit |
534379 |
EXPECT_EQ(xfpga_fpgaClose(handle_), FPGA_OK);
|
|
Packit |
534379 |
handle_ = nullptr;
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
for (auto &t : tokens_) {
|
|
Packit |
534379 |
if (t) {
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_OK, xfpga_fpgaDestroyToken(&t);;
|
|
Packit |
534379 |
t = nullptr;
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
xfpga_plugin_finalize();
|
|
Packit |
534379 |
system_->finalize();
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
std::array<fpga_token, 2> tokens_;
|
|
Packit |
534379 |
fpga_handle handle_;
|
|
Packit |
534379 |
fpga_properties filter_;
|
|
Packit |
534379 |
uint32_t num_matches_;
|
|
Packit |
534379 |
test_platform platform_;
|
|
Packit |
534379 |
test_system *system_;
|
|
Packit |
534379 |
std::string sysfs_fme;
|
|
Packit |
534379 |
std::string dev_fme;
|
|
Packit |
534379 |
std::string sysfs_port;
|
|
Packit |
534379 |
std::string dev_port;
|
|
Packit |
534379 |
};
|
|
Packit |
534379 |
|
|
Packit |
534379 |
|
|
Packit |
534379 |
|
|
Packit |
534379 |
/**
|
|
Packit |
534379 |
* @test eintr_write_tests
|
|
Packit |
534379 |
* @details Given a valid fd but invalid buffer, eintr_writes
|
|
Packit |
534379 |
* returns -1 on error.
|
|
Packit |
534379 |
*/
|
|
Packit |
534379 |
TEST(sysfs_c, eintr_write_tests) {
|
|
Packit |
534379 |
void * data = nullptr;
|
|
Packit |
534379 |
std::string filename = "empty_file.txt";
|
|
Packit |
534379 |
EXPECT_EQ(std::system("touch empty_file.txt"), 0);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
int fd = open(filename.c_str(), O_RDWR);
|
|
Packit |
534379 |
EXPECT_NE(fd, -1);
|
|
Packit |
534379 |
size_t count = 1024;
|
|
Packit |
534379 |
EXPECT_EQ(-1, eintr_write(fd, data, count));
|
|
Packit |
534379 |
EXPECT_EQ(close(fd), 0);
|
|
Packit |
534379 |
EXPECT_EQ(std::system("rm empty_file.txt"), 0);
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
|
|
Packit |
534379 |
/**
|
|
Packit |
534379 |
* @test sysfs_invalid_tests
|
|
Packit |
534379 |
* @details When calling get_port_sysfs with invalid params
|
|
Packit |
534379 |
* the functino returns FPGA_INVALID_PARAM
|
|
Packit |
534379 |
*/
|
|
Packit |
534379 |
TEST_P(sysfs_c_p, sysfs_invalid_tests) {
|
|
Packit |
534379 |
const std::string sysfs_fme = "/sys/class/fpga/intel-fpga-dev/intel-fpga-fme";
|
|
Packit |
534379 |
auto h = (struct _fpga_handle *)handle_;
|
|
Packit |
534379 |
auto t = (struct _fpga_token *)h->token;
|
|
Packit |
534379 |
|
|
Packit |
534379 |
char spath[SYSFS_PATH_MAX];
|
|
Packit |
534379 |
fpga_result res;
|
|
Packit |
534379 |
|
|
Packit |
534379 |
char invalid_string[] = "...";
|
|
Packit |
534379 |
strncpy(t->sysfspath, invalid_string, 4);
|
|
Packit |
534379 |
res = get_port_sysfs(handle_, spath);
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_INVALID_PARAM, res);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
h->token = NULL;
|
|
Packit |
534379 |
res = get_port_sysfs(handle_, spath);
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_INVALID_PARAM, res);
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
/**
|
|
Packit |
534379 |
* @test hw_type_invalid_test
|
|
Packit |
534379 |
* @details
|
|
Packit |
534379 |
*/
|
|
Packit |
534379 |
TEST_P(sysfs_c_p, hw_type_invalid_tests) {
|
|
Packit |
534379 |
auto h = (struct _fpga_handle *)handle_;
|
|
Packit |
534379 |
enum fpga_hw_type hw_type = FPGA_HW_UNKNOWN;
|
|
Packit |
534379 |
fpga_token tok;
|
|
Packit |
534379 |
|
|
Packit |
534379 |
auto res = get_fpga_hw_type(handle_, NULL);
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_INVALID_PARAM, res);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
tok = h->token;
|
|
Packit |
534379 |
h->token = NULL;
|
|
Packit |
534379 |
res = get_fpga_hw_type(handle_, &hw_type);
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_INVALID_PARAM, res);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
h->token = tok;
|
|
Packit |
534379 |
res = get_fpga_hw_type(handle_, &hw_type);
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_OK, res);
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
/**
|
|
Packit |
534379 |
* @test glob_test
|
|
Packit |
534379 |
* @details
|
|
Packit |
534379 |
*/
|
|
Packit |
534379 |
TEST_P(sysfs_c_p, glob_tests) {
|
|
Packit |
534379 |
std::string invalid_filename = "opae";
|
|
Packit |
534379 |
|
|
Packit |
534379 |
auto res = opae_glob_path(nullptr, 0);
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_EXCEPTION, res);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
res = opae_glob_path(const_cast<char *>(invalid_filename.c_str()),
|
|
Packit |
534379 |
invalid_filename.length() - 1);
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_NOT_FOUND, res);
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
TEST_P(sysfs_c_p, glob_paths) {
|
|
Packit |
534379 |
char *paths[16];
|
|
Packit |
534379 |
auto bitstream_glob = sysfs_fme + "/bitstream*";
|
|
Packit |
534379 |
size_t found = 0;
|
|
Packit |
534379 |
ASSERT_EQ(opae_glob_paths(bitstream_glob.c_str(), 16, paths, &found),
|
|
Packit |
534379 |
FPGA_OK);
|
|
Packit |
534379 |
EXPECT_EQ(found, 2);
|
|
Packit |
534379 |
// opae_glob_paths allocates memory for each path found
|
|
Packit |
534379 |
// let's free it here since we don't need it any longer
|
|
Packit |
534379 |
for (int i = 0; i < found; ++i) {
|
|
Packit |
534379 |
free(paths[i]);
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
/**
|
|
Packit |
534379 |
* @test cat_sysfs_path_errors
|
|
Packit |
534379 |
* @details
|
|
Packit |
534379 |
*/
|
|
Packit |
534379 |
TEST(sysfs_c, cat_sysfs_path_errors) {
|
|
Packit |
534379 |
std::vector<char> buffer(256);
|
|
Packit |
534379 |
std::string emptystring = "";
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_OK, cat_sysfs_path(buffer.data(), single_sysfs_port.c_str()));
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_INVALID_PARAM, cat_sysfs_path(buffer.data(), nullptr));
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_INVALID_PARAM,
|
|
Packit |
534379 |
cat_sysfs_path(nullptr, single_sysfs_port.c_str()));
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_INVALID_PARAM, cat_sysfs_path(nullptr, nullptr));
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
/**
|
|
Packit |
534379 |
* @test cat_token_sysfs_path
|
|
Packit |
534379 |
* @details
|
|
Packit |
534379 |
*/
|
|
Packit |
534379 |
TEST(sysfs_c, cat_token_sysfs_path) {
|
|
Packit |
534379 |
_fpga_token tok;
|
|
Packit |
534379 |
std::copy(single_sysfs_fme.begin(), single_sysfs_fme.end(),
|
|
Packit |
534379 |
&tok.sysfspath[0]);
|
|
Packit |
534379 |
tok.sysfspath[single_sysfs_fme.size()] = '\0';
|
|
Packit |
534379 |
std::copy(single_dev_fme.begin(), single_dev_fme.end(), &tok.devpath[0]);
|
|
Packit |
534379 |
tok.devpath[single_dev_fme.size()] = '\0';
|
|
Packit |
534379 |
std::vector<char> buffer(256);
|
|
Packit |
534379 |
EXPECT_EQ(cat_token_sysfs_path(buffer.data(), &tok, "bitstream_id"), FPGA_OK);
|
|
Packit |
534379 |
EXPECT_STREQ(buffer.data(),
|
|
Packit |
534379 |
std::string(single_sysfs_fme + "/bitstream_id").c_str());
|
|
Packit |
534379 |
|
|
Packit |
534379 |
// null destination
|
|
Packit |
534379 |
EXPECT_EQ(cat_token_sysfs_path(nullptr, &tok, "bitstream_id"),
|
|
Packit |
534379 |
FPGA_EXCEPTION);
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
/**
|
|
Packit |
534379 |
* @test cat_handle_sysfs_path
|
|
Packit |
534379 |
* @details
|
|
Packit |
534379 |
*/
|
|
Packit |
534379 |
TEST(sysfs_c, cat_handle_sysfs_path) {
|
|
Packit |
534379 |
_fpga_token tok;
|
|
Packit |
534379 |
_fpga_handle hnd;
|
|
Packit |
534379 |
std::copy(single_sysfs_fme.begin(), single_sysfs_fme.end(),
|
|
Packit |
534379 |
&tok.sysfspath[0]);
|
|
Packit |
534379 |
tok.sysfspath[single_sysfs_fme.size()] = '\0';
|
|
Packit |
534379 |
std::copy(single_dev_fme.begin(), single_dev_fme.end(), &tok.devpath[0]);
|
|
Packit |
534379 |
tok.devpath[single_dev_fme.size()] = '\0';
|
|
Packit |
534379 |
hnd.token = &tok;
|
|
Packit |
534379 |
std::vector<char> buffer(256);
|
|
Packit |
534379 |
EXPECT_EQ(cat_handle_sysfs_path(buffer.data(), &hnd, "bitstream_id"),
|
|
Packit |
534379 |
FPGA_OK);
|
|
Packit |
534379 |
EXPECT_STREQ(buffer.data(),
|
|
Packit |
534379 |
std::string(single_sysfs_fme + "/bitstream_id").c_str());
|
|
Packit |
534379 |
|
|
Packit |
534379 |
// null destination
|
|
Packit |
534379 |
EXPECT_EQ(cat_handle_sysfs_path(nullptr, &hnd, "bitstream_id"),
|
|
Packit |
534379 |
FPGA_EXCEPTION);
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
/**
|
|
Packit |
534379 |
* @test make_object
|
|
Packit |
534379 |
* @details
|
|
Packit |
534379 |
*/
|
|
Packit |
534379 |
TEST_P(sysfs_c_p, make_object) {
|
|
Packit |
534379 |
_fpga_token *tok = static_cast<_fpga_token *>(tokens_[0]);
|
|
Packit |
534379 |
fpga_object object;
|
|
Packit |
534379 |
// errors is a sysfs directory - this should call make_sysfs_group()
|
|
Packit |
534379 |
ASSERT_EQ(make_sysfs_object(tok->sysfspath, "errors", &object, 0, 0),
|
|
Packit |
534379 |
FPGA_OK);
|
|
Packit |
534379 |
EXPECT_EQ(xfpga_fpgaDestroyObject(&object), FPGA_OK);
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
|
|
Packit |
534379 |
/**
|
|
Packit |
534379 |
* @test sysfs_sbdf_invalid_tests
|
|
Packit |
534379 |
* @details When calling sysfs_sbdf_from path with invalid params
|
|
Packit |
534379 |
* the function returns FPGA_NO_DRIVER
|
|
Packit |
534379 |
*/
|
|
Packit |
534379 |
TEST(sysfs_c, sysfs_sbdf_invalid_tests) {
|
|
Packit |
534379 |
std::string sysfs_dev =
|
|
Packit |
534379 |
"/sys/devices/pci0000:5e/0000:5e:00.0/fpga/intel-fpga-dev.0";
|
|
Packit |
534379 |
|
|
Packit |
534379 |
int s = 0, b = 0, d = 0, f = 0;
|
|
Packit |
534379 |
auto res = sysfs_sbdf_from_path(sysfs_dev.c_str(), &s, &b, &d, &f);
|
|
Packit |
534379 |
EXPECT_EQ(FPGA_NO_DRIVER, res);
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
/**
|
|
Packit |
534379 |
* @test hw_type
|
|
Packit |
534379 |
* @details get_fpga_hw_type given valid parameters
|
|
Packit |
534379 |
* returns FPGA_OK
|
|
Packit |
534379 |
*/
|
|
Packit |
534379 |
TEST_P(sysfs_c_p, hw_type) {
|
|
Packit |
534379 |
enum fpga_hw_type hw_type = FPGA_HW_UNKNOWN;
|
|
Packit |
534379 |
uint64_t real_vendorid = platform_.devices[0].vendor_id;
|
|
Packit |
534379 |
uint64_t real_deviceid = platform_.devices[0].device_id;
|
|
Packit |
534379 |
|
|
Packit |
534379 |
auto res = get_fpga_hw_type(handle_, &hw_type);
|
|
Packit |
534379 |
EXPECT_EQ(res, FPGA_OK);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
EXPECT_EQ(hw_type, opae_id_to_hw_type(real_vendorid, real_deviceid));
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
/**
|
|
Packit |
534379 |
* @test cstr_dup
|
|
Packit |
534379 |
* @details Duplicate an input string
|
|
Packit |
534379 |
*/
|
|
Packit |
534379 |
TEST_P(sysfs_c_p, cstr_dup) {
|
|
Packit |
534379 |
std::string inp("this is an input string");
|
|
Packit |
534379 |
char *dup = cstr_dup(inp.c_str());
|
|
Packit |
534379 |
EXPECT_STREQ(dup, inp.c_str());
|
|
Packit |
534379 |
free(dup);
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
/**
|
|
Packit |
534379 |
* @test cstr_dup
|
|
Packit |
534379 |
* @details Invalidate malloc call
|
|
Packit |
534379 |
*/
|
|
Packit |
534379 |
TEST_P(sysfs_c_p, cstr_dup_1) {
|
|
Packit |
534379 |
std::string inp("this is an input string");
|
|
Packit |
534379 |
test_system::instance()->invalidate_malloc();
|
|
Packit |
534379 |
char *dup = cstr_dup(inp.c_str());
|
|
Packit |
534379 |
EXPECT_EQ(dup, nullptr);
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
/**
|
|
Packit |
534379 |
* @test get_fme_path
|
|
Packit |
534379 |
* @details Given a valid sysfs path to a port node
|
|
Packit |
534379 |
* When I call sysfs_get_fme_path with the path
|
|
Packit |
534379 |
* Then the return value is FPGA_OK
|
|
Packit |
534379 |
* And I get a sysfs path to the fme node
|
|
Packit |
534379 |
* And its realpath is equal to the realpath of the SUT
|
|
Packit |
534379 |
*/
|
|
Packit |
534379 |
TEST_P(sysfs_c_p, get_fme_path) {
|
|
Packit |
534379 |
char found_fme[PATH_MAX];
|
|
Packit |
534379 |
char rpath1[PATH_MAX];
|
|
Packit |
534379 |
char rpath2[PATH_MAX];
|
|
Packit |
534379 |
ASSERT_EQ(sysfs_get_fme_path(sysfs_port.c_str(), found_fme), FPGA_OK);
|
|
Packit |
534379 |
ASSERT_NE(realpath(sysfs_fme.c_str(), rpath1), nullptr);
|
|
Packit |
534379 |
ASSERT_NE(realpath(found_fme, rpath2), nullptr);
|
|
Packit |
534379 |
ASSERT_STREQ(rpath1, rpath2);
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
/**
|
|
Packit |
534379 |
* @test get_fme_path_neg
|
|
Packit |
534379 |
* @details Given an invalid sysfs path to a port node
|
|
Packit |
534379 |
* When I call sysfs_get_fme_path with the path
|
|
Packit |
534379 |
* Then the return value is not FPGA_OK
|
|
Packit |
534379 |
*/
|
|
Packit |
534379 |
TEST_P(sysfs_c_p, get_fme_path_neg) {
|
|
Packit |
534379 |
char found_fme[PATH_MAX];
|
|
Packit |
534379 |
ASSERT_NE(sysfs_get_fme_path("/a/b/c", found_fme), FPGA_OK);
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
INSTANTIATE_TEST_CASE_P(sysfs_c, sysfs_c_p,
|
|
Packit |
534379 |
::testing::ValuesIn(test_platform::platforms({})));
|
|
Packit |
534379 |
|
|
Packit |
534379 |
class sysfs_c_hw_p : public sysfs_c_p {
|
|
Packit |
534379 |
protected:
|
|
Packit |
534379 |
sysfs_c_hw_p() {}
|
|
Packit |
534379 |
};
|
|
Packit |
534379 |
|
|
Packit |
534379 |
/**
|
|
Packit |
534379 |
* @test make_sysfs_group
|
|
Packit |
534379 |
* @details
|
|
Packit |
534379 |
*/
|
|
Packit |
534379 |
TEST_P(sysfs_c_hw_p, make_sysfs) {
|
|
Packit |
534379 |
const std::string invalid_path =
|
|
Packit |
534379 |
"/sys/class/fpga/intel-fpga-dev.0/intel-fpga-fme";
|
|
Packit |
534379 |
_fpga_token *tok = static_cast<_fpga_token *>(tokens_[0]);
|
|
Packit |
534379 |
fpga_object obj;
|
|
Packit |
534379 |
auto res = make_sysfs_group(tok->sysfspath, "errors", &obj, 0, handle_);
|
|
Packit |
534379 |
EXPECT_EQ(res, FPGA_OK);
|
|
Packit |
534379 |
EXPECT_EQ(xfpga_fpgaDestroyObject(&obj), FPGA_OK);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
res = make_sysfs_group(tok->sysfspath, "errors", &obj, FPGA_OBJECT_GLOB,
|
|
Packit |
534379 |
handle_);
|
|
Packit |
534379 |
EXPECT_EQ(res, FPGA_OK);
|
|
Packit |
534379 |
EXPECT_EQ(xfpga_fpgaDestroyObject(&obj), FPGA_OK);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
res = make_sysfs_group(const_cast<char *>(invalid_path.c_str()), "errors",
|
|
Packit |
534379 |
&obj, 0, handle_);
|
|
Packit |
534379 |
EXPECT_EQ(res, FPGA_NOT_FOUND);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
res = make_sysfs_group(tok->sysfspath, "errors", &obj,
|
|
Packit |
534379 |
FPGA_OBJECT_RECURSE_ONE, handle_);
|
|
Packit |
534379 |
EXPECT_EQ(res, FPGA_OK);
|
|
Packit |
534379 |
EXPECT_EQ(xfpga_fpgaDestroyObject(&obj), FPGA_OK);
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
/**
|
|
Packit |
534379 |
* @test make_object_glob
|
|
Packit |
534379 |
* @details
|
|
Packit |
534379 |
*/
|
|
Packit |
534379 |
TEST_P(sysfs_c_hw_p, make_object_glob) {
|
|
Packit |
534379 |
_fpga_token *tok = static_cast<_fpga_token *>(tokens_[0]);
|
|
Packit |
534379 |
fpga_object object;
|
|
Packit |
534379 |
// errors is a sysfs directory - this should call make_sysfs_group()
|
|
Packit |
534379 |
ASSERT_EQ(make_sysfs_object(tok->sysfspath, "errors", &object,
|
|
Packit |
534379 |
FPGA_OBJECT_GLOB, 0),
|
|
Packit |
534379 |
FPGA_OK);
|
|
Packit |
534379 |
EXPECT_EQ(xfpga_fpgaDestroyObject(&object), FPGA_OK);
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
INSTANTIATE_TEST_CASE_P(sysfs_c, sysfs_c_hw_p,
|
|
Packit |
534379 |
::testing::ValuesIn(test_platform::hw_platforms({ "skx-p","dcp-rc","dcp-vc" })));
|
|
Packit |
534379 |
|
|
Packit |
534379 |
class sysfs_c_mock_p : public sysfs_c_p {
|
|
Packit |
534379 |
protected:
|
|
Packit |
534379 |
sysfs_c_mock_p() {}
|
|
Packit |
534379 |
};
|
|
Packit |
534379 |
|
|
Packit |
534379 |
/**
|
|
Packit |
534379 |
* @test make_sysfs_group
|
|
Packit |
534379 |
* @details
|
|
Packit |
534379 |
*/
|
|
Packit |
534379 |
TEST_P(sysfs_c_mock_p, make_sysfs) {
|
|
Packit |
534379 |
const std::string invalid_path =
|
|
Packit |
534379 |
"/sys/class/fpga/intel-fpga-dev.0/intel-fpga-fme";
|
|
Packit |
534379 |
_fpga_token *tok = static_cast<_fpga_token *>(tokens_[0]);
|
|
Packit |
534379 |
fpga_object obj;
|
|
Packit |
534379 |
|
|
Packit |
534379 |
auto res = make_sysfs_group(tok->sysfspath, "errors", &obj, 0, handle_);
|
|
Packit |
534379 |
EXPECT_EQ(res, FPGA_OK);
|
|
Packit |
534379 |
EXPECT_EQ(xfpga_fpgaDestroyObject(&obj), FPGA_OK);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
res = make_sysfs_group(tok->sysfspath, "errors", &obj, FPGA_OBJECT_GLOB,
|
|
Packit |
534379 |
handle_);
|
|
Packit |
534379 |
EXPECT_EQ(res, FPGA_OK);
|
|
Packit |
534379 |
EXPECT_EQ(xfpga_fpgaDestroyObject(&obj), FPGA_OK);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
res = make_sysfs_group(const_cast<char *>(invalid_path.c_str()), "errors",
|
|
Packit |
534379 |
&obj, 0, handle_);
|
|
Packit |
534379 |
EXPECT_EQ(res, FPGA_NOT_FOUND);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
res = make_sysfs_group(tok->sysfspath, "errors", &obj,
|
|
Packit |
534379 |
FPGA_OBJECT_RECURSE_ONE, handle_);
|
|
Packit |
534379 |
EXPECT_EQ(res, FPGA_OK);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
EXPECT_EQ(xfpga_fpgaDestroyObject(&obj), FPGA_OK);
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
/**
|
|
Packit |
534379 |
* @test make_object_glob
|
|
Packit |
534379 |
* @details
|
|
Packit |
534379 |
*/
|
|
Packit |
534379 |
TEST_P(sysfs_c_mock_p, make_object_glob) {
|
|
Packit |
534379 |
_fpga_token *tok = static_cast<_fpga_token *>(tokens_[0]);
|
|
Packit |
534379 |
fpga_object object;
|
|
Packit |
534379 |
// errors is a sysfs directory - this should call make_sysfs_group()
|
|
Packit |
534379 |
ASSERT_EQ(make_sysfs_object(tok->sysfspath, "errors", &object,
|
|
Packit |
534379 |
FPGA_OBJECT_GLOB, 0),
|
|
Packit |
534379 |
FPGA_OK);
|
|
Packit |
534379 |
EXPECT_EQ(xfpga_fpgaDestroyObject(&object), FPGA_OK);
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
TEST_P(sysfs_c_mock_p, glob_bitstream_objs) {
|
|
Packit |
534379 |
fpga_object container, bitstream1, bitstream2;
|
|
Packit |
534379 |
ASSERT_EQ(xfpga_fpgaTokenGetObject(tokens_[0], "bitstream*", &container,
|
|
Packit |
534379 |
FPGA_OBJECT_GLOB),
|
|
Packit |
534379 |
FPGA_OK);
|
|
Packit |
534379 |
enum fpga_sysobject_type type;
|
|
Packit |
534379 |
EXPECT_EQ(xfpga_fpgaObjectGetType(container, &type), FPGA_OK);
|
|
Packit |
534379 |
EXPECT_EQ(type, FPGA_OBJECT_CONTAINER);
|
|
Packit |
534379 |
uint32_t sz = 0;
|
|
Packit |
534379 |
EXPECT_EQ(xfpga_fpgaObjectGetSize(container, &sz, 0), FPGA_OK);
|
|
Packit |
534379 |
EXPECT_EQ(sz, 2);
|
|
Packit |
534379 |
EXPECT_EQ(xfpga_fpgaObjectGetObjectAt(container, 0, &bitstream1), FPGA_OK);
|
|
Packit |
534379 |
EXPECT_EQ(xfpga_fpgaObjectGetObjectAt(container, 1, &bitstream2), FPGA_OK);
|
|
Packit |
534379 |
char name1[64] = {'\0'};
|
|
Packit |
534379 |
char name2[64] = {'\0'};
|
|
Packit |
534379 |
EXPECT_EQ(xfpga_fpgaObjectGetName(bitstream1, name1, sizeof(name1)), FPGA_OK);
|
|
Packit |
534379 |
EXPECT_EQ(xfpga_fpgaObjectGetName(bitstream2, name2, sizeof(name2)), FPGA_OK);
|
|
Packit |
534379 |
EXPECT_EQ(xfpga_fpgaDestroyObject(&bitstream1), FPGA_OK);
|
|
Packit |
534379 |
EXPECT_EQ(xfpga_fpgaDestroyObject(&bitstream2), FPGA_OK);
|
|
Packit |
534379 |
EXPECT_EQ(xfpga_fpgaDestroyObject(&container), FPGA_OK);
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
/**
|
|
Packit |
534379 |
* @test fpga_sysfs_02
|
|
Packit |
534379 |
* sysfs_write_u64
|
|
Packit |
534379 |
*/
|
|
Packit |
534379 |
TEST_P(sysfs_c_mock_p, fpga_sysfs_02) {
|
|
Packit |
534379 |
fpga_result result;
|
|
Packit |
534379 |
std::string str = sysfs_fme.c_str() + std::string("/socket_id");
|
|
Packit |
534379 |
// valid path
|
|
Packit |
534379 |
result = sysfs_write_u64(str.c_str(), 0);
|
|
Packit |
534379 |
EXPECT_EQ(result, FPGA_OK);
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
/**
|
|
Packit |
534379 |
* @test fpga_sysfs_02
|
|
Packit |
534379 |
* sysfs_write_u64_decimal
|
|
Packit |
534379 |
*/
|
|
Packit |
534379 |
|
|
Packit |
534379 |
TEST_P(sysfs_c_mock_p, fpga_sysfs_03) {
|
|
Packit |
534379 |
fpga_result result;
|
|
Packit |
534379 |
std::string str = sysfs_fme.c_str() + std::string("/socket_id");
|
|
Packit |
534379 |
// valid path
|
|
Packit |
534379 |
result = sysfs_write_u64_decimal(str.c_str(), 0x100);
|
|
Packit |
534379 |
EXPECT_EQ(result, FPGA_OK);
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
/*
|
|
Packit |
534379 |
* @test sysfs
|
|
Packit |
534379 |
* @brief Tests: sysfs_get_port_error_path
|
|
Packit |
534379 |
@details When passed with valid argument return 0
|
|
Packit |
534379 |
* and port error sysfs path
|
|
Packit |
534379 |
* When passed with invalid argument return
|
|
Packit |
534379 |
* FPGA_INVALID_PARAM
|
|
Packit |
534379 |
*/
|
|
Packit |
534379 |
TEST_P(sysfs_c_mock_p, fpga_sysfs_04) {
|
|
Packit |
534379 |
fpga_result result;
|
|
Packit |
534379 |
char sysfs_path[SYSFS_PATH_MAX] = { 0 };
|
|
Packit |
534379 |
|
|
Packit |
534379 |
result = sysfs_get_port_error_path(handle_, sysfs_path);
|
|
Packit |
534379 |
EXPECT_EQ(result, FPGA_OK);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
result = sysfs_get_port_error_path(handle_, NULL);
|
|
Packit |
534379 |
EXPECT_EQ(result, FPGA_INVALID_PARAM);
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
/*
|
|
Packit |
534379 |
* @test sysfs
|
|
Packit |
534379 |
* @brief Tests: sysfs_get_port_error_clear_path
|
|
Packit |
534379 |
@details When passed with valid argument return 0
|
|
Packit |
534379 |
* and port error clear sysfs path
|
|
Packit |
534379 |
* When passed with invalid argument return
|
|
Packit |
534379 |
* FPGA_INVALID_PARAM
|
|
Packit |
534379 |
*/
|
|
Packit |
534379 |
TEST_P(sysfs_c_mock_p, fpga_sysfs_05) {
|
|
Packit |
534379 |
fpga_result result;
|
|
Packit |
534379 |
char sysfs_path[SYSFS_PATH_MAX] = { 0 };
|
|
Packit |
534379 |
|
|
Packit |
534379 |
result = sysfs_get_port_error_clear_path(handle_, sysfs_path);
|
|
Packit |
534379 |
EXPECT_EQ(result, FPGA_OK);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
result = sysfs_get_port_error_clear_path(handle_, NULL);
|
|
Packit |
534379 |
EXPECT_EQ(result, FPGA_INVALID_PARAM);
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
|
|
Packit |
534379 |
/*
|
|
Packit |
534379 |
* @test sysfs
|
|
Packit |
534379 |
* @brief Tests: sysfs_get_fme_temp_path
|
|
Packit |
534379 |
@details When passed with valid argument return 0
|
|
Packit |
534379 |
* and fme temp sysfs path
|
|
Packit |
534379 |
* When passed with invalid argument return
|
|
Packit |
534379 |
* FPGA_INVALID_PARAM
|
|
Packit |
534379 |
*/
|
|
Packit |
534379 |
TEST_P(sysfs_c_mock_p, fpga_sysfs_06) {
|
|
Packit |
534379 |
fpga_result result;
|
|
Packit |
534379 |
char sysfs_path[SYSFS_PATH_MAX] = { 0 };
|
|
Packit |
534379 |
|
|
Packit |
534379 |
result = sysfs_get_fme_temp_path(tokens_[0], sysfs_path);
|
|
Packit |
534379 |
EXPECT_EQ(result, FPGA_OK);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
result = sysfs_get_fme_temp_path(tokens_[0], NULL);
|
|
Packit |
534379 |
EXPECT_EQ(result, FPGA_INVALID_PARAM);
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
/*
|
|
Packit |
534379 |
* @test sysfs
|
|
Packit |
534379 |
* @brief Tests: sysfs_get_fme_perf_path
|
|
Packit |
534379 |
@details When passed with valid argument return 0
|
|
Packit |
534379 |
* and fme perf sysfs path
|
|
Packit |
534379 |
* When passed with invalid argument return
|
|
Packit |
534379 |
* FPGA_INVALID_PARAM
|
|
Packit |
534379 |
*/
|
|
Packit |
534379 |
TEST_P(sysfs_c_mock_p, fpga_sysfs_07) {
|
|
Packit |
534379 |
fpga_result result;
|
|
Packit |
534379 |
char sysfs_path[SYSFS_PATH_MAX] = { 0 };
|
|
Packit |
534379 |
|
|
Packit |
534379 |
result = sysfs_get_fme_perf_path(tokens_[0], sysfs_path);
|
|
Packit |
534379 |
EXPECT_EQ(result, FPGA_OK);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
result = sysfs_get_fme_perf_path(tokens_[0], NULL);
|
|
Packit |
534379 |
EXPECT_EQ(result, FPGA_INVALID_PARAM);
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
INSTANTIATE_TEST_CASE_P(sysfs_c, sysfs_c_mock_p,
|
|
Packit |
534379 |
::testing::ValuesIn(test_platform::mock_platforms({ "skx-p","dcp-rc", "dcp-vc" })));
|
|
Packit |
534379 |
|
|
Packit |
534379 |
|
|
Packit |
534379 |
class sysfs_dfl_c_mock_p : public sysfs_c_mock_p { };
|
|
Packit |
534379 |
/*
|
|
Packit |
534379 |
* @test sysfs
|
|
Packit |
534379 |
* @brief Tests: sysfs_get_fme_perf_path
|
|
Packit |
534379 |
@details When passed with valid argument return 0
|
|
Packit |
534379 |
* and fme perf sysfs path
|
|
Packit |
534379 |
* When passed with invalid argument returns
|
|
Packit |
534379 |
* FPGA_INVALID_PARAM
|
|
Packit |
534379 |
* When passed with valid argument on
|
|
Packit |
534379 |
* unsupported plaform returns
|
|
Packit |
534379 |
* FPGA_NOT_FOUND
|
|
Packit |
534379 |
*/
|
|
Packit |
534379 |
TEST_P(sysfs_dfl_c_mock_p, fpga_sysfs_08) {
|
|
Packit |
534379 |
fpga_result result;
|
|
Packit |
534379 |
char sysfs_path[SYSFS_PATH_MAX] = { 0 };
|
|
Packit |
534379 |
|
|
Packit |
534379 |
result = sysfs_get_fme_perf_path(tokens_[0], sysfs_path);
|
|
Packit |
534379 |
EXPECT_EQ(result, FPGA_NOT_FOUND);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
result = sysfs_get_fme_perf_path(tokens_[0], NULL);
|
|
Packit |
534379 |
EXPECT_EQ(result, FPGA_INVALID_PARAM);
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
INSTANTIATE_TEST_CASE_P(sysfs_c, sysfs_dfl_c_mock_p,
|
|
Packit |
534379 |
::testing::ValuesIn(test_platform::mock_platforms({ "skx-p-dfl0_patchset2" })));
|
|
Packit |
534379 |
|
|
Packit |
534379 |
class sysfs_power_mock_p : public sysfs_c_mock_p { };
|
|
Packit |
534379 |
/*
|
|
Packit |
534379 |
* @test sysfs
|
|
Packit |
534379 |
* @brief Tests: sysfs_get_fme_pwr_path
|
|
Packit |
534379 |
@details When passed with valid argument return 0
|
|
Packit |
534379 |
* and fme power sysfs path
|
|
Packit |
534379 |
* When passed with invalid argument returns
|
|
Packit |
534379 |
* FPGA_INVALID_PARAM
|
|
Packit |
534379 |
* When passed with valid argument on
|
|
Packit |
534379 |
* unsupported plaform returns
|
|
Packit |
534379 |
* FPGA_NOT_FOUND
|
|
Packit |
534379 |
*/
|
|
Packit |
534379 |
TEST_P(sysfs_power_mock_p, fpga_sysfs_09) {
|
|
Packit |
534379 |
fpga_result result;
|
|
Packit |
534379 |
char sysfs_path[SYSFS_PATH_MAX] = { 0 };
|
|
Packit |
534379 |
|
|
Packit |
534379 |
result = sysfs_get_fme_pwr_path(tokens_[0], sysfs_path);
|
|
Packit |
534379 |
EXPECT_EQ(result, FPGA_NOT_FOUND);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
result = sysfs_get_fme_pwr_path(tokens_[0], NULL);
|
|
Packit |
534379 |
EXPECT_EQ(result, FPGA_INVALID_PARAM);
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
INSTANTIATE_TEST_CASE_P(sysfs_c, sysfs_power_mock_p,
|
|
Packit |
534379 |
::testing::ValuesIn(test_platform::mock_platforms({ "dcp-rc", "dcp-vc" })));
|
|
Packit |
534379 |
|
|
Packit |
534379 |
|
|
Packit |
534379 |
class sysfs_bmc_mock_p : public sysfs_c_mock_p { };
|
|
Packit |
534379 |
/*
|
|
Packit |
534379 |
* @test sysfs
|
|
Packit |
534379 |
* @brief Tests: sysfs_get_bmc_path
|
|
Packit |
534379 |
@details When passed with valid argument return 0
|
|
Packit |
534379 |
* and bmc sysfs path
|
|
Packit |
534379 |
* When passed with invalid argument return
|
|
Packit |
534379 |
* FPGA_INVALID_PARAM
|
|
Packit |
534379 |
*/
|
|
Packit |
534379 |
TEST_P(sysfs_bmc_mock_p, fpga_sysfs_10) {
|
|
Packit |
534379 |
fpga_result result;
|
|
Packit |
534379 |
char sysfs_path[SYSFS_PATH_MAX] = { 0 };
|
|
Packit |
534379 |
|
|
Packit |
534379 |
result = sysfs_get_bmc_path(tokens_[0], sysfs_path);
|
|
Packit |
534379 |
EXPECT_EQ(result, FPGA_OK);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
result = sysfs_get_bmc_path(tokens_[0], NULL);
|
|
Packit |
534379 |
EXPECT_EQ(result, FPGA_INVALID_PARAM);
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
INSTANTIATE_TEST_CASE_P(sysfs_c, sysfs_bmc_mock_p,
|
|
Packit |
534379 |
::testing::ValuesIn(test_platform::mock_platforms({ "dcp-rc" })));
|
|
Packit |
534379 |
|
|
Packit |
534379 |
|
|
Packit |
534379 |
class sysfs_max10_mock_p : public sysfs_c_mock_p { };
|
|
Packit |
534379 |
/*
|
|
Packit |
534379 |
* @test sysfs
|
|
Packit |
534379 |
* @brief Tests: sysfs_get_max10_path
|
|
Packit |
534379 |
@details When passed with valid argument return 0
|
|
Packit |
534379 |
* and max10 sysfs path
|
|
Packit |
534379 |
* When passed with invalid argument return
|
|
Packit |
534379 |
* FPGA_INVALID_PARAM
|
|
Packit |
534379 |
*/
|
|
Packit |
534379 |
TEST_P(sysfs_max10_mock_p, fpga_sysfs_11) {
|
|
Packit |
534379 |
fpga_result result;
|
|
Packit |
534379 |
char sysfs_path[SYSFS_PATH_MAX] = { 0 };
|
|
Packit |
534379 |
|
|
Packit |
534379 |
result = sysfs_get_max10_path(tokens_[0], sysfs_path);
|
|
Packit |
534379 |
EXPECT_EQ(result, FPGA_OK);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
result = sysfs_get_max10_path(tokens_[0], NULL);
|
|
Packit |
534379 |
EXPECT_EQ(result, FPGA_INVALID_PARAM);
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
INSTANTIATE_TEST_CASE_P(sysfs_c, sysfs_max10_mock_p,
|
|
Packit |
534379 |
::testing::ValuesIn(test_platform::mock_platforms({ "dcp-vc" })));
|
|
Packit |
534379 |
|
|
Packit |
534379 |
|
|
Packit |
534379 |
class sysfs_c_mock_no_drv_p : public ::testing::TestWithParam<std::string> {
|
|
Packit |
534379 |
protected:
|
|
Packit |
534379 |
sysfs_c_mock_no_drv_p() {}
|
|
Packit |
534379 |
};
|
|
Packit |
534379 |
|
|
Packit |
534379 |
/**
|
|
Packit |
534379 |
* @test sysfs_get_pr_id
|
|
Packit |
534379 |
* @details sysfs_get_pr_id given invalid path parameters.
|
|
Packit |
534379 |
* It returns FPGA_NOT_FOUND.
|
|
Packit |
534379 |
*/
|
|
Packit |
534379 |
TEST_P(sysfs_c_mock_no_drv_p, sysfs_get_pr_id) {
|
|
Packit |
534379 |
int dev = 0;
|
|
Packit |
534379 |
int subdev = 0;
|
|
Packit |
534379 |
fpga_guid guid;
|
|
Packit |
534379 |
auto res = sysfs_get_pr_id(dev, subdev, guid);
|
|
Packit |
534379 |
EXPECT_EQ(res, FPGA_NOT_FOUND);
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
/**
|
|
Packit |
534379 |
* @test sysfs_get_afu_id
|
|
Packit |
534379 |
* @details sysfs_get_afu_id given invalid path parameters.
|
|
Packit |
534379 |
* It returns FPGA_NOT_FOUND.
|
|
Packit |
534379 |
*/
|
|
Packit |
534379 |
|
|
Packit |
534379 |
TEST_P(sysfs_c_mock_no_drv_p, sysfs_get_afu_id) {
|
|
Packit |
534379 |
int dev = 0;
|
|
Packit |
534379 |
int subdev = 0;
|
|
Packit |
534379 |
fpga_guid guid;
|
|
Packit |
534379 |
auto res = sysfs_get_afu_id(dev, subdev, guid);
|
|
Packit |
534379 |
EXPECT_EQ(res, FPGA_NOT_FOUND);
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
/**
|
|
Packit |
534379 |
* @test sysfs_get_socket_id
|
|
Packit |
534379 |
* @details sysfs_get_socket_id given invalid parameters.
|
|
Packit |
534379 |
* It returns FPGA_NOT_FOUND.
|
|
Packit |
534379 |
*/
|
|
Packit |
534379 |
TEST_P(sysfs_c_mock_no_drv_p, sysfs_get_socket_id) {
|
|
Packit |
534379 |
int dev = 0;
|
|
Packit |
534379 |
int subdev = 0;
|
|
Packit |
534379 |
uint8_t socket_id;
|
|
Packit |
534379 |
auto res = sysfs_get_socket_id(dev, subdev, &socket_id);
|
|
Packit |
534379 |
EXPECT_EQ(res, FPGA_NOT_FOUND);
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
/**
|
|
Packit |
534379 |
* @test sysfs_get_slots
|
|
Packit |
534379 |
* @details sysfs_get_slots given a valid parameters
|
|
Packit |
534379 |
* return FPGA_NOT_FOUND from sysfs_read_u32
|
|
Packit |
534379 |
*/
|
|
Packit |
534379 |
TEST_P(sysfs_c_mock_no_drv_p, sysfs_get_slots) {
|
|
Packit |
534379 |
int dev = 0;
|
|
Packit |
534379 |
int subdev = 0;
|
|
Packit |
534379 |
uint32_t u32;
|
|
Packit |
534379 |
auto res = sysfs_get_slots(dev, subdev, &u32);
|
|
Packit |
534379 |
EXPECT_NE(res, FPGA_OK);
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
/**
|
|
Packit |
534379 |
* @test sysfs_get_bitstream_id
|
|
Packit |
534379 |
* @details sysfs_get_bitstream_id given a valid parameters
|
|
Packit |
534379 |
* return FPGA_NOT_FOUND from sysfs_read_u64
|
|
Packit |
534379 |
*/
|
|
Packit |
534379 |
TEST_P(sysfs_c_mock_no_drv_p, sysfs_get_bitstream_id) {
|
|
Packit |
534379 |
int dev = 0;
|
|
Packit |
534379 |
int subdev = 0;
|
|
Packit |
534379 |
uint64_t u64;
|
|
Packit |
534379 |
auto res = sysfs_get_bitstream_id(dev, subdev, &u64);
|
|
Packit |
534379 |
EXPECT_NE(res, FPGA_OK);
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
INSTANTIATE_TEST_CASE_P(sysfs_c, sysfs_c_mock_no_drv_p,
|
|
Packit |
534379 |
::testing::ValuesIn(test_platform::mock_platforms()));
|
|
Packit |
534379 |
|
|
Packit |
534379 |
class sysfs_sockid_c_mock_p : public sysfs_c_mock_p { };
|
|
Packit |
534379 |
/**
|
|
Packit |
534379 |
* @test fpga_sysfs_02
|
|
Packit |
534379 |
* sysfs_write_u64
|
|
Packit |
534379 |
*/
|
|
Packit |
534379 |
TEST_P(sysfs_sockid_c_mock_p, fpga_sysfs_02) {
|
|
Packit |
534379 |
fpga_result result;
|
|
Packit |
534379 |
std::string str = sysfs_fme.c_str() + std::string("/socket_id");
|
|
Packit |
534379 |
// valid path
|
|
Packit |
534379 |
result = sysfs_write_u64(str.c_str(), 0);
|
|
Packit |
534379 |
EXPECT_EQ(result, FPGA_OK);
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
INSTANTIATE_TEST_CASE_P(sysfs_c, sysfs_sockid_c_mock_p,
|
|
Packit |
534379 |
::testing::ValuesIn(test_platform::mock_platforms({ "skx-p","dcp-rc","dcp-vc" })));
|
|
Packit |
534379 |
|
|
Packit |
534379 |
|
|
Packit |
534379 |
class sysfs_sockid_c_p : public sysfs_c_p { };
|
|
Packit |
534379 |
|
|
Packit |
534379 |
/**
|
|
Packit |
534379 |
* @test fpga_sysfs_02
|
|
Packit |
534379 |
* @brief Tests: sysfs_read_int,sysfs_read_u32
|
|
Packit |
534379 |
* sysfs_read_u32_pair,sysfs_read_u64
|
|
Packit |
534379 |
* sysfs_read_u64,sysfs_write_u64
|
|
Packit |
534379 |
*..........get_port_sysfs,sysfs_read_guid
|
|
Packit |
534379 |
*/
|
|
Packit |
534379 |
TEST_P(sysfs_sockid_c_p, fpga_sysfs_02) {
|
|
Packit |
534379 |
fpga_result result;
|
|
Packit |
534379 |
int i;
|
|
Packit |
534379 |
uint32_t u32;
|
|
Packit |
534379 |
uint32_t u1;
|
|
Packit |
534379 |
uint32_t u2;
|
|
Packit |
534379 |
uint64_t u64;
|
|
Packit |
534379 |
|
|
Packit |
534379 |
// Empty input path string
|
|
Packit |
534379 |
result = sysfs_read_int("", NULL);
|
|
Packit |
534379 |
EXPECT_NE(result, FPGA_OK);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
// NULL input parameters
|
|
Packit |
534379 |
result = sysfs_read_int(NULL, NULL);
|
|
Packit |
534379 |
EXPECT_NE(result, FPGA_OK);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
// Invalid input path
|
|
Packit |
534379 |
result = sysfs_read_int("/sys/class/fpga/intel-fpga-dev.0/intel-fpga-fme.10",
|
|
Packit |
534379 |
NULL);
|
|
Packit |
534379 |
EXPECT_NE(result, FPGA_OK);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
result = sysfs_read_int(sysfs_fme.c_str(), NULL);
|
|
Packit |
534379 |
EXPECT_NE(result, FPGA_OK);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
// Valid input path
|
|
Packit |
534379 |
std::string str = sysfs_fme.c_str() + std::string("/socket_id");
|
|
Packit |
534379 |
result = sysfs_read_int(str.c_str(), &i);
|
|
Packit |
534379 |
EXPECT_EQ(result, FPGA_OK);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
// Empty input path string
|
|
Packit |
534379 |
result = sysfs_read_int("", NULL);
|
|
Packit |
534379 |
EXPECT_NE(result, FPGA_OK);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
// Invalid input parameters
|
|
Packit |
534379 |
result = sysfs_read_u32(NULL, NULL);
|
|
Packit |
534379 |
EXPECT_NE(result, FPGA_OK);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
// Invalid input path
|
|
Packit |
534379 |
result = sysfs_read_u32("/sys/class/fpga/intel-fpga-dev.0/intel-fpga-fme.10",
|
|
Packit |
534379 |
NULL);
|
|
Packit |
534379 |
EXPECT_NE(result, FPGA_OK);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
result = sysfs_read_u32(sysfs_fme.c_str(), NULL);
|
|
Packit |
534379 |
EXPECT_NE(result, FPGA_OK);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
// Valid input path
|
|
Packit |
534379 |
result = sysfs_read_u32(str.c_str(), &u32);
|
|
Packit |
534379 |
EXPECT_EQ(result, FPGA_OK);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
// Invalid input parameters
|
|
Packit |
534379 |
result = sysfs_read_u32_pair(NULL, NULL, NULL, '\0');
|
|
Packit |
534379 |
EXPECT_NE(result, FPGA_OK);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
// Invalid input parameters
|
|
Packit |
534379 |
result = sysfs_read_u32_pair(NULL, NULL, NULL, 'a');
|
|
Packit |
534379 |
EXPECT_NE(result, FPGA_OK);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
// Invalid input 'sep' character
|
|
Packit |
534379 |
result = sysfs_read_u32_pair(str.c_str(), &u1, &u2, '\0');
|
|
Packit |
534379 |
EXPECT_NE(result, FPGA_OK);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
// Invalid input path value
|
|
Packit |
534379 |
result = sysfs_read_u32_pair(str.c_str(), &u1, &u2, 'a');
|
|
Packit |
534379 |
EXPECT_NE(result, FPGA_OK);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
// Invalid input path type
|
|
Packit |
534379 |
result = sysfs_read_u32_pair(sysfs_fme.c_str(), &u1, &u2, 'a');
|
|
Packit |
534379 |
EXPECT_NE(result, FPGA_OK);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
// Invalid input path
|
|
Packit |
534379 |
result = sysfs_read_u32_pair(
|
|
Packit |
534379 |
"/sys/class/fpga/intel-fpga-dev.0/intel-fpga-fme.10", &u1, &u2, 'a');
|
|
Packit |
534379 |
EXPECT_NE(result, FPGA_OK);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
// Empty input path string
|
|
Packit |
534379 |
result = sysfs_read_u64("", NULL);
|
|
Packit |
534379 |
EXPECT_NE(result, FPGA_OK);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
// NULL input parameters
|
|
Packit |
534379 |
result = sysfs_read_u64(NULL, NULL);
|
|
Packit |
534379 |
EXPECT_NE(result, FPGA_OK);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
// Invalid input path
|
|
Packit |
534379 |
result = sysfs_read_u64("/sys/class/fpga/intel-fpga-dev.0/intel-fpga-fme.10",
|
|
Packit |
534379 |
NULL);
|
|
Packit |
534379 |
EXPECT_NE(result, FPGA_OK);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
// Valid input path
|
|
Packit |
534379 |
result = sysfs_read_u64(str.c_str(), &u64);
|
|
Packit |
534379 |
EXPECT_EQ(result, FPGA_OK);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
// Invalid input parameters
|
|
Packit |
534379 |
result = sysfs_write_u64(NULL, 0);
|
|
Packit |
534379 |
EXPECT_NE(result, FPGA_OK);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
result = sysfs_write_u64(sysfs_fme.c_str(), 0x100);
|
|
Packit |
534379 |
EXPECT_NE(result, FPGA_OK);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
result = sysfs_write_u64_decimal(NULL, 0);
|
|
Packit |
534379 |
EXPECT_NE(result, FPGA_OK);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
result = sysfs_write_u64_decimal(sysfs_fme.c_str(), 0x100);
|
|
Packit |
534379 |
EXPECT_NE(result, FPGA_OK);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
// Invalid input parameters
|
|
Packit |
534379 |
fpga_guid guid;
|
|
Packit |
534379 |
result = sysfs_read_guid(NULL, NULL);
|
|
Packit |
534379 |
EXPECT_NE(result, FPGA_OK);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
result = sysfs_read_guid(
|
|
Packit |
534379 |
"/sys/class/fpga/intel-fpga-dev.0/intel-fpga-fme.10/", guid);
|
|
Packit |
534379 |
EXPECT_NE(result, FPGA_OK);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
// NULL input parameters
|
|
Packit |
534379 |
result = get_port_sysfs(NULL, NULL);
|
|
Packit |
534379 |
EXPECT_NE(result, FPGA_OK);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
// NULL handle
|
|
Packit |
534379 |
result = get_port_sysfs(NULL, (char *)str.c_str());
|
|
Packit |
534379 |
EXPECT_NE(result, FPGA_OK);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
// NULL handle
|
|
Packit |
534379 |
result = get_fpga_hw_type(NULL, NULL);
|
|
Packit |
534379 |
EXPECT_NE(result, FPGA_OK);
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
/**
|
|
Packit |
534379 |
* @test make_region
|
|
Packit |
534379 |
* @details Given valid parameters to make_regions but failed on malloc,
|
|
Packit |
534379 |
* it returns nullptr for sysfs_fpga_region.
|
|
Packit |
534379 |
*/
|
|
Packit |
534379 |
TEST_P(sysfs_sockid_c_p, make_regions) {
|
|
Packit |
534379 |
sysfs_fpga_region *fpga_region;
|
|
Packit |
534379 |
sysfs_fpga_device device;
|
|
Packit |
534379 |
std::string name = "fme";
|
|
Packit |
534379 |
int num = 1;
|
|
Packit |
534379 |
fpga_objtype type = FPGA_DEVICE;
|
|
Packit |
534379 |
test_system::instance()->invalidate_malloc();
|
|
Packit |
534379 |
fpga_region = make_region(&device, const_cast<char*>(name.c_str()), num, type);
|
|
Packit |
534379 |
EXPECT_EQ(fpga_region, nullptr);
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
/**
|
|
Packit |
534379 |
* @test sysfs_get_guid
|
|
Packit |
534379 |
* @details Given invalid parameters to sysfs_get_guid.
|
|
Packit |
534379 |
* it returns FPGA_EXCEPTION. When an invalid path is
|
|
Packit |
534379 |
* passed in, it returns FPGA_NOT_FOUND.
|
|
Packit |
534379 |
*/
|
|
Packit |
534379 |
TEST_P(sysfs_sockid_c_p, sysfs_get_guid_neg) {
|
|
Packit |
534379 |
fpga_guid guid;
|
|
Packit |
534379 |
_fpga_token *tok = static_cast<_fpga_token *>(tokens_[0]);
|
|
Packit |
534379 |
std::string sysfspath = tok->sysfspath;
|
|
Packit |
534379 |
|
|
Packit |
534379 |
EXPECT_EQ(sysfs_get_guid(nullptr, nullptr, guid),FPGA_EXCEPTION);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
EXPECT_EQ(sysfs_get_guid(tokens_[0], nullptr, guid),FPGA_EXCEPTION);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
EXPECT_EQ(sysfs_get_guid(nullptr, const_cast<char*>(sysfspath.c_str()), guid),FPGA_EXCEPTION);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
sysfspath = "";
|
|
Packit |
534379 |
EXPECT_EQ(sysfs_get_guid(tokens_[0], const_cast<char*>(sysfspath.c_str()), guid),FPGA_NOT_FOUND);
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
/**
|
|
Packit |
534379 |
* @test sysfs_path_is_valid
|
|
Packit |
534379 |
* @details Given invalid parameters to sysfs_path_is_valid.
|
|
Packit |
534379 |
* it returns FPGA_NOT_FOUND.
|
|
Packit |
534379 |
*/
|
|
Packit |
534379 |
TEST_P(sysfs_sockid_c_p, sysfs_path_is_valid) {
|
|
Packit |
534379 |
EXPECT_EQ(sysfs_path_is_valid(nullptr, nullptr), FPGA_INVALID_PARAM);
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
/**
|
|
Packit |
534379 |
* @test get_port_sysfspath
|
|
Packit |
534379 |
* @details When token's sysfs is invalid for get_port_sysfspath.
|
|
Packit |
534379 |
* it returns FPGA_INVALID_PARAM.
|
|
Packit |
534379 |
*/
|
|
Packit |
534379 |
TEST_P(sysfs_sockid_c_p, get_port_sysfs) {
|
|
Packit |
534379 |
_fpga_handle *h = static_cast<_fpga_handle *>(handle_);
|
|
Packit |
534379 |
_fpga_token *tok = static_cast<_fpga_token *>(h->token);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
EXPECT_EQ(get_port_sysfs(handle_, tok->sysfspath), FPGA_OK);
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
INSTANTIATE_TEST_CASE_P(sysfs_c, sysfs_sockid_c_p,
|
|
Packit |
534379 |
::testing::ValuesIn(test_platform::platforms({"skx-p","dcp-rc","dcp-vc"})));
|
|
Packit |
534379 |
|
|
Packit |
534379 |
/**
|
|
Packit |
534379 |
* @test match_region
|
|
Packit |
534379 |
* @details Given an input string that matches the format used
|
|
Packit |
534379 |
* by the kernel driver when making region (platform) devices.
|
|
Packit |
534379 |
* When I call re_match_region with the input string
|
|
Packit |
534379 |
* Then the return code is FPGA_OK
|
|
Packit |
534379 |
* And the output parameters match the "fme" string portion
|
|
Packit |
534379 |
* and the number portion.
|
|
Packit |
534379 |
*/
|
|
Packit |
534379 |
TEST(sysfs_regex, match_region)
|
|
Packit |
534379 |
{
|
|
Packit |
534379 |
const char *fmt = "intel-fpga-(fme|port)\\.([0-9]+)";
|
|
Packit |
534379 |
char buffer[8];
|
|
Packit |
534379 |
int num = -1;
|
|
Packit |
534379 |
char inpstr[] = "intel-fpga-fme.9";
|
|
Packit |
534379 |
EXPECT_EQ(re_match_region(fmt, inpstr, buffer, sizeof(buffer), &num),
|
|
Packit |
534379 |
FPGA_OK);
|
|
Packit |
534379 |
EXPECT_STREQ(buffer, "fme");
|
|
Packit |
534379 |
EXPECT_EQ(num, 9);
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
/**
|
|
Packit |
534379 |
* @test match_region_neg
|
|
Packit |
534379 |
* @details Given an input string that does not match the format used
|
|
Packit |
534379 |
* by the kernel driver when making region (platform) devices.
|
|
Packit |
534379 |
* When I call re_match_region with the input string or an invalid
|
|
Packit |
534379 |
* parameter
|
|
Packit |
534379 |
* Then the return code is either FPGA_NOT_FOUND or FPGA_INVALID_PARAM
|
|
Packit |
534379 |
*/
|
|
Packit |
534379 |
TEST(sysfs_regex, match_region_neg)
|
|
Packit |
534379 |
{
|
|
Packit |
534379 |
const char *fmt = "intel-fpga-(fme|port)\\.([0-9]+)";
|
|
Packit |
534379 |
char buffer[8];
|
|
Packit |
534379 |
int num = -1;
|
|
Packit |
534379 |
char badstr[] = "intel-fpga-abc.0";
|
|
Packit |
534379 |
EXPECT_EQ(re_match_region(fmt, badstr, buffer, sizeof(buffer), &num),
|
|
Packit |
534379 |
FPGA_NOT_FOUND);
|
|
Packit |
534379 |
EXPECT_EQ(re_match_region(nullptr, badstr, buffer, sizeof(buffer), &num),
|
|
Packit |
534379 |
FPGA_INVALID_PARAM);
|
|
Packit |
534379 |
EXPECT_EQ(re_match_region(fmt, nullptr, buffer, sizeof(buffer), &num),
|
|
Packit |
534379 |
FPGA_INVALID_PARAM);
|
|
Packit |
534379 |
EXPECT_EQ(re_match_region(fmt, badstr, nullptr, 0, &num), FPGA_INVALID_PARAM);
|
|
Packit |
534379 |
EXPECT_EQ(re_match_region(fmt, badstr, buffer, sizeof(buffer), nullptr),
|
|
Packit |
534379 |
FPGA_INVALID_PARAM);
|
|
Packit |
534379 |
}
|