Blame opae-libs/tests/xfpga/test_sysfs_c.cpp

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
}