Blame opae-libs/tests/xfpga/test_reconf_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
#include "gtest/gtest.h"
Packit 534379
#include "mock/test_system.h"
Packit 534379
#include "mock/test_utils.h"
Packit 534379
Packit 534379
extern "C" {
Packit 534379
#include <bitstream_int.h>
Packit 534379
#include <opae/access.h>
Packit 534379
#include <opae/enum.h>
Packit 534379
#include <opae/properties.h>
Packit 534379
#include "intel-fpga.h"
Packit 534379
#include "fpga-dfl.h"
Packit 534379
#include "reconf_int.h"
Packit 534379
#include "token_list_int.h"
Packit 534379
#include "xfpga.h"
Packit 534379
#include "sysfs_int.h"
Packit 534379
}
Packit 534379
Packit 534379
extern "C" {
Packit 534379
fpga_result open_accel(fpga_handle handle, fpga_handle *accel);
Packit 534379
fpga_result clear_port_errors(fpga_handle handle);
Packit 534379
fpga_result validate_bitstream(fpga_handle, const uint8_t *bitstream, 
Packit 534379
                               size_t bitstream_len, int *header_len);
Packit 534379
int xfpga_plugin_initialize(void);
Packit 534379
int xfpga_plugin_finalize(void);
Packit 534379
}
Packit 534379
Packit 534379
using namespace opae::testing;
Packit 534379
Packit 534379
class reconf_c : public ::testing::TestWithParam<std::string> {
Packit 534379
 protected:
Packit 534379
  reconf_c()
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
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_, 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_), FPGA_OK);
Packit 534379
Packit 534379
    bitstream_valid_ = system_->assemble_gbs_header(platform_.devices[0]);
Packit 534379
    // Valid bitstream - no clk
Packit 534379
    std::string version = "630";
Packit 534379
Packit 534379
    auto fme_guid = platform_.devices[0].fme_guid;
Packit 534379
    auto afu_guid = platform_.devices[0].afu_guid;
Packit 534379
Packit 534379
    // clang-format off
Packit 534379
    auto bitstream_j = jobject
Packit 534379
    ("version", version)
Packit 534379
    ("afu-image", jobject
Packit 534379
                  ("interface-uuid", fme_guid)
Packit 534379
                  ("magic-no", int32_t(488605312))
Packit 534379
                  ("accelerator-clusters", {
Packit 534379
                                             jobject
Packit 534379
                                             ("total-contexts", int32_t(1))
Packit 534379
                                             ("name", "nlb")
Packit 534379
                                             ("accelerator-type-uuid", afu_guid)
Packit 534379
                                            }
Packit 534379
                  )
Packit 534379
    )
Packit 534379
    ("platform-name", "");
Packit 534379
    // clang-format on
Packit 534379
    bitstream_valid_no_clk_ =
Packit 534379
        system_->assemble_gbs_header(platform_.devices[0], bitstream_j.c_str());
Packit 534379
    bitstream_j.put();
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(xfpga_fpgaDestroyToken(&t), FPGA_OK);
Packit 534379
        t = nullptr;
Packit 534379
      }
Packit 534379
    }
Packit 534379
    xfpga_plugin_finalize();
Packit 534379
    system_->finalize();
Packit 534379
    token_cleanup();
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::vector<uint8_t> bitstream_valid_;
Packit 534379
  std::vector<uint8_t> bitstream_valid_no_clk_;
Packit 534379
};
Packit 534379
Packit 534379
/**
Packit 534379
* @test    set_afu_userclock
Packit 534379
* @brief   Tests: set_afu_userclock
Packit 534379
* @details set_afu_userclock sets afu user clock
Packit 534379
*          Returns FPGA_OK if parameters are valid. Returns
Packit 534379
*          error code if invalid user clock or handle.
Packit 534379
*/
Packit 534379
TEST_P(reconf_c, set_afu_userclock) {
Packit 534379
  fpga_result result;
Packit 534379
Packit 534379
  // Open port device
Packit 534379
  ASSERT_EQ(FPGA_OK, xfpga_fpgaOpen(tokens_[0], &handle_, 0));
Packit 534379
Packit 534379
  // Null handle
Packit 534379
  result = set_afu_userclock(NULL, 0, 0);
Packit 534379
  EXPECT_EQ(result, FPGA_INVALID_PARAM);
Packit 534379
Packit 534379
  // Invalid params
Packit 534379
  result = set_afu_userclock(handle_, 0, 0);
Packit 534379
  EXPECT_EQ(result, FPGA_INVALID_PARAM);
Packit 534379
}
Packit 534379
Packit 534379
/**
Packit 534379
* @test    set_fpga_pwr_threshold_01
Packit 534379
* @brief   Tests: set_fpga_pwr_threshold
Packit 534379
* @details set_fpga_pwr_threshold sets power threshold
Packit 534379
*          Returns FPGA_OK if parameters are valid. Returns
Packit 534379
*          error code if invalid power threshold or handle.
Packit 534379
*/
Packit 534379
TEST_P(reconf_c, set_fpga_pwr_threshold_01) {
Packit 534379
  fpga_result result;
Packit 534379
  bool have_powermgmt;
Packit 534379
  struct stat _st;
Packit 534379
Packit 534379
  // Open port device
Packit 534379
  ASSERT_EQ(FPGA_OK, xfpga_fpgaOpen(tokens_[0], &handle_, 0));
Packit 534379
Packit 534379
  // Check if power attribute exists in sysfs tree
Packit 534379
  struct _fpga_token *token = (struct _fpga_token *)tokens_[0];
Packit 534379
  std::string sysfspath(token->sysfspath);
Packit 534379
  auto power_mgmt = sysfspath + "/power_mgmt";
Packit 534379
  have_powermgmt = stat(power_mgmt.c_str(), &_st) == 0;
Packit 534379
Packit 534379
  // NULL handle
Packit 534379
  result = set_fpga_pwr_threshold(NULL, 0);
Packit 534379
  EXPECT_EQ(result, FPGA_INVALID_PARAM);
Packit 534379
Packit 534379
  // Zero GBS power
Packit 534379
  result = set_fpga_pwr_threshold(handle_, 0);
Packit 534379
  EXPECT_EQ(result, have_powermgmt ? FPGA_OK : FPGA_NOT_FOUND);
Packit 534379
Packit 534379
  // Exceed FPGA_GBS_MAX_POWER
Packit 534379
  result = set_fpga_pwr_threshold(handle_, 65);
Packit 534379
  EXPECT_EQ(result, FPGA_NOT_SUPPORTED);
Packit 534379
Packit 534379
  // Invalid token within handle
Packit 534379
  struct _fpga_handle *handle = (struct _fpga_handle *)handle_;
Packit 534379
Packit 534379
  auto t = handle->token;
Packit 534379
  handle->token = NULL;
Packit 534379
Packit 534379
  result = set_fpga_pwr_threshold(handle_, 60);
Packit 534379
  EXPECT_EQ(result, FPGA_INVALID_PARAM);
Packit 534379
Packit 534379
  handle->token = t;
Packit 534379
}
Packit 534379
Packit 534379
/*
Packit 534379
* @test    set_fpga_pwr_threshold_02
Packit 534379
* @brief   Tests: set_fpga_pwr_threshold
Packit 534379
* @details set_fpga_pwr_threshold sets power threshold
Packit 534379
*          Returns FPGA_OK if parameters are valid.
Packit 534379
*/
Packit 534379
TEST_P(reconf_c, set_fpga_pwr_threshold_02) {
Packit 534379
  fpga_result result;
Packit 534379
  bool have_powermgmt;
Packit 534379
  struct stat _st;
Packit 534379
Packit 534379
  // Open port device
Packit 534379
  ASSERT_EQ(FPGA_OK, xfpga_fpgaOpen(tokens_[0], &handle_, 0));
Packit 534379
Packit 534379
  // Check if power attribute exists in sysfs tree
Packit 534379
  struct _fpga_token *token = (struct _fpga_token *)tokens_[0];
Packit 534379
  std::string sysfspath(token->sysfspath);
Packit 534379
  auto power_mgmt = sysfspath + "/power_mgmt";
Packit 534379
  have_powermgmt = stat(power_mgmt.c_str(), &_st) == 0;
Packit 534379
Packit 534379
  // Valid power threshold
Packit 534379
  result = set_fpga_pwr_threshold(handle_, 60);
Packit 534379
  EXPECT_EQ(result, have_powermgmt ? FPGA_OK : FPGA_NOT_FOUND);
Packit 534379
}
Packit 534379
Packit 534379
/**
Packit 534379
* @test    fpga_reconf_slot
Packit 534379
* @brief   Tests: fpgaReconfigureSlot
Packit 534379
* @details Returns FPGA_OK if bitstream is valid and is able
Packit 534379
*          to reconfigure fpga. Returns error code if
Packit 534379
*          bitstream, handle, or parameters are invalid.
Packit 534379
*/
Packit 534379
TEST_P(reconf_c, fpga_reconf_slot) {
Packit 534379
  fpga_result result;
Packit 534379
  uint8_t bitstream_empty[] = "";
Packit 534379
  uint8_t bitstream_invalid_guid[] =
Packit 534379
      "Xeon\xb7GBSv001\53\02\00\00{\"version\": 640, \"afu-image\": \
Packit 534379
      {\"clock-frequency-high\": 312, \"clock-frequency-low\": 156, \
Packit 534379
      \"power\": 50, \"interface-uuid\": \"1a422218-6dba-448e-b302-425cbcde1406\", \
Packit 534379
      \"magic-no\": 488605312, \"accelerator-clusters\": [{\"total-contexts\": 1,\
Packit 534379
      \"name\": \"nlb_400\", \"accelerator-type-uuid\":\
Packit 534379
      \"d8424dc4-a4a3-c413-f89e-433683f9040b\"}]}, \"platform-name\": \"MCP\"}";
Packit 534379
  uint8_t bitstream_invalid_json[] =
Packit 534379
      "XeonFPGA\xb7GBSv001\53\02{\"version\": \"afu-image\"}";
Packit 534379
  size_t bitstream_valid_len =
Packit 534379
      get_bitstream_header_len(bitstream_valid_.data());
Packit 534379
  uint32_t slot = 0;
Packit 534379
  int flags = 0;
Packit 534379
Packit 534379
  // Open port device
Packit 534379
  ASSERT_EQ(FPGA_OK, xfpga_fpgaOpen(tokens_[0], &handle_, 0));
Packit 534379
Packit 534379
  // Invalid bitstream - null
Packit 534379
  result = xfpga_fpgaReconfigureSlot(handle_, slot, NULL, 0, flags);
Packit 534379
  EXPECT_EQ(result, FPGA_INVALID_PARAM);
Packit 534379
Packit 534379
  // Invalid bitstream - empty
Packit 534379
  result = xfpga_fpgaReconfigureSlot(handle_, slot, bitstream_empty, 0, flags);
Packit 534379
  EXPECT_EQ(result, FPGA_INVALID_PARAM);
Packit 534379
Packit 534379
  // Invalid bitstream - invalid guid
Packit 534379
  result = xfpga_fpgaReconfigureSlot(handle_, slot, bitstream_invalid_guid,
Packit 534379
                                     bitstream_valid_len, flags);
Packit 534379
  EXPECT_EQ(result, FPGA_INVALID_PARAM);
Packit 534379
Packit 534379
  // Invalid bitstream - invalid json
Packit 534379
  result = xfpga_fpgaReconfigureSlot(handle_, slot, bitstream_invalid_json,
Packit 534379
                                     bitstream_valid_len, flags);
Packit 534379
  EXPECT_EQ(result, FPGA_INVALID_PARAM);
Packit 534379
Packit 534379
  // Null handle
Packit 534379
  result = xfpga_fpgaReconfigureSlot(NULL, slot, bitstream_valid_.data(),
Packit 534379
                                     bitstream_valid_.size(), flags);
Packit 534379
  EXPECT_EQ(result, FPGA_INVALID_PARAM);
Packit 534379
Packit 534379
  // Invalid handle file descriptor
Packit 534379
  auto &no_clk_arr = bitstream_valid_no_clk_;
Packit 534379
  struct _fpga_handle *handle = (struct _fpga_handle *)handle_;
Packit 534379
  uint32_t fddev = handle->fddev;
Packit 534379
Packit 534379
  handle->fddev = -1;
Packit 534379
Packit 534379
  result =
Packit 534379
      xfpga_fpgaReconfigureSlot(handle_, slot, no_clk_arr.data(), no_clk_arr.size(), flags);
Packit 534379
  EXPECT_EQ(result, FPGA_INVALID_PARAM);
Packit 534379
Packit 534379
  handle->fddev = fddev;
Packit 534379
}
Packit 534379
Packit 534379
/**
Packit 534379
* @test    open_accel
Packit 534379
* @brief   Tests: open_accel_01
Packit 534379
* @details Returns FPGA_INVALID_PARAM when calling open_accel with
Packit 534379
*          an invalid handle.
Packit 534379
*/
Packit 534379
TEST_P(reconf_c, open_accel_01) {
Packit 534379
  fpga_result result;
Packit 534379
  fpga_handle accel = nullptr;
Packit 534379
Packit 534379
  ASSERT_EQ(FPGA_OK, xfpga_fpgaOpen(tokens_[0], &handle_, 0));
Packit 534379
Packit 534379
  // Null handle
Packit 534379
  result = open_accel(NULL, &accel);
Packit 534379
  EXPECT_EQ(result, FPGA_INVALID_PARAM);
Packit 534379
Packit 534379
  // Valid handle
Packit 534379
  result = open_accel(handle_, &accel);
Packit 534379
  EXPECT_EQ(result, FPGA_OK);
Packit 534379
Packit 534379
  EXPECT_EQ(xfpga_fpgaClose(accel), FPGA_OK);
Packit 534379
Packit 534379
  // Invalid object type
Packit 534379
  struct _fpga_handle *handle = (struct _fpga_handle *)handle_;
Packit 534379
  struct _fpga_token *token = (struct _fpga_token *)&handle->token;
Packit 534379
Packit 534379
  handle->token = NULL;
Packit 534379
Packit 534379
  result = open_accel(handle_, &accel);
Packit 534379
  EXPECT_EQ(result, FPGA_INVALID_PARAM);
Packit 534379
Packit 534379
  handle->token = token;
Packit 534379
}
Packit 534379
Packit 534379
/**
Packit 534379
* @test    open_accel
Packit 534379
* @brief   Tests: open_accel_02
Packit 534379
* @details Returns FPGA_BUSY when calling open_accel with
Packit 534379
*          an opened accel handle.
Packit 534379
*/
Packit 534379
TEST_P(reconf_c, open_accel_02) {
Packit 534379
  fpga_properties filter_accel = nullptr;
Packit 534379
  std::array<fpga_token, 2> tokens_accel = {{nullptr,nullptr}};
Packit 534379
  fpga_handle handle_accel = nullptr;
Packit 534379
  fpga_handle accel = nullptr;
Packit 534379
  uint32_t num_matches_accel;
Packit 534379
Packit 534379
  ASSERT_EQ(FPGA_OK, xfpga_fpgaOpen(tokens_[0], &handle_, 0));
Packit 534379
Packit 534379
  ASSERT_EQ(xfpga_fpgaGetProperties(nullptr, &filter_accel), FPGA_OK);
Packit 534379
  ASSERT_EQ(fpgaPropertiesSetObjectType(filter_accel, FPGA_ACCELERATOR),
Packit 534379
            FPGA_OK);
Packit 534379
  ASSERT_EQ(xfpga_fpgaEnumerate(&filter_accel, 1, tokens_accel.data(),
Packit 534379
                                tokens_accel.size(), &num_matches_accel),
Packit 534379
            FPGA_OK);
Packit 534379
  ASSERT_EQ(FPGA_OK, xfpga_fpgaOpen(tokens_accel[0], &handle_accel, 0));
Packit 534379
Packit 534379
  EXPECT_NE(handle_, nullptr);
Packit 534379
  EXPECT_NE(handle_accel, nullptr);
Packit 534379
  auto result = open_accel(handle_accel, &accel);
Packit 534379
  EXPECT_EQ(result, FPGA_BUSY);
Packit 534379
Packit 534379
  EXPECT_EQ(accel, nullptr);
Packit 534379
  EXPECT_EQ(fpgaDestroyProperties(&filter_accel), FPGA_OK);
Packit 534379
  EXPECT_EQ(xfpga_fpgaClose(handle_accel), FPGA_OK);
Packit 534379
  for (auto &t : tokens_accel) {
Packit 534379
    if (t != nullptr) {
Packit 534379
      EXPECT_EQ(xfpga_fpgaDestroyToken(&t), FPGA_OK);
Packit 534379
      t = nullptr;
Packit 534379
    }
Packit 534379
  }
Packit 534379
}
Packit 534379
Packit 534379
/**
Packit 534379
 * @test validate_bitstream
Packit 534379
 * @brief Tests: validate_bitstream
Packit 534379
 * @details: When validate_bitstream is given an invalid
Packit 534379
 *           bitstream header length, the function returns
Packit 534379
 *           FPGA_EXCEPTION.
Packit 534379
 */
Packit 534379
TEST_P(reconf_c, validate_bitstream) {
Packit 534379
  uint8_t bitstream_invalid_len[] = "XeonFPGA\xb7GBSv001\255\255\255\255";
Packit 534379
  size_t bitstream_len = sizeof(bitstream_invalid_len) / sizeof(uint8_t);
Packit 534379
  int header_len;
Packit 534379
  fpga_result result;
Packit 534379
Packit 534379
  ASSERT_EQ(FPGA_OK, xfpga_fpgaOpen(tokens_[0], &handle_, 0));
Packit 534379
Packit 534379
  result = validate_bitstream(handle_, bitstream_invalid_len,
Packit 534379
                              bitstream_len, &header_len);
Packit 534379
  EXPECT_EQ(FPGA_EXCEPTION, result);
Packit 534379
}
Packit 534379
Packit 534379
INSTANTIATE_TEST_CASE_P(reconf, reconf_c,
Packit 534379
                        ::testing::ValuesIn(test_platform::platforms({})));
Packit 534379
Packit 534379
class reconf_c_mock_p : public ::testing::TestWithParam<std::string> {
Packit 534379
 protected:
Packit 534379
  reconf_c_mock_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_, 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_), FPGA_OK);
Packit 534379
    EXPECT_GT(num_matches_, 0);
Packit 534379
    ASSERT_EQ(FPGA_OK, xfpga_fpgaOpen(tokens_[0], &handle_, 0));
Packit 534379
Packit 534379
    // assemble valid bitstream header
Packit 534379
    auto fme_guid = platform_.devices[0].fme_guid;
Packit 534379
    auto afu_guid = platform_.devices[0].afu_guid;
Packit 534379
Packit 534379
    auto bitstream_j = jobject
Packit 534379
    ("version", "640")
Packit 534379
    ("afu-image", jobject
Packit 534379
                  ("interface-uuid", fme_guid)
Packit 534379
                  ("magic-no", int32_t(488605312))
Packit 534379
                  ("accelerator-clusters", {
Packit 534379
                                             jobject
Packit 534379
                                             ("total-contexts", int32_t(1))
Packit 534379
                                             ("name", "nlb")
Packit 534379
                                             ("accelerator-type-uuid", afu_guid)
Packit 534379
                                            }
Packit 534379
                  )
Packit 534379
    )
Packit 534379
    ("platform-name", "");
Packit 534379
Packit 534379
    bitstream_valid_ =
Packit 534379
          system_->assemble_gbs_header(platform_.devices[0], bitstream_j.c_str());
Packit 534379
    bitstream_j.put();
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(xfpga_fpgaDestroyToken(&t), FPGA_OK);
Packit 534379
        t = nullptr;
Packit 534379
      }
Packit 534379
    }
Packit 534379
    xfpga_plugin_finalize();
Packit 534379
    system_->finalize();
Packit 534379
    token_cleanup();
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::vector<uint8_t> bitstream_valid_;
Packit 534379
};
Packit 534379
Packit 534379
/**
Packit 534379
 * @test    set_afu_userclock
Packit 534379
 * @brief   Tests: set_afu_userclock
Packit 534379
 * @details When given valid parameters, set_afu_userclock
Packit 534379
 *          returns FPGA_NOT_SUPPORTED on mock platforms.
Packit 534379
 */
Packit 534379
TEST_P(reconf_c_mock_p, set_afu_userclock) {
Packit 534379
  EXPECT_EQ(set_afu_userclock(handle_, 312, 156), FPGA_NOT_SUPPORTED);
Packit 534379
}
Packit 534379
Packit 534379
/**
Packit 534379
 * @test    fpga_reconf_slot
Packit 534379
 * @brief   Tests: fpgaReconfigureSlot
Packit 534379
 * @details Returns FPGA_OK if bitstream is valid and is able
Packit 534379
 *          to reconfigure the fpga.
Packit 534379
 */
Packit 534379
TEST_P(reconf_c_mock_p, fpga_reconf_slot) {
Packit 534379
  fpga_result result;
Packit 534379
  uint32_t slot = 0;
Packit 534379
  int flags = 0;
Packit 534379
Packit 534379
  result = xfpga_fpgaReconfigureSlot(handle_, slot, bitstream_valid_.data(),
Packit 534379
                                     bitstream_valid_.size(), flags);
Packit 534379
  EXPECT_EQ(result, FPGA_OK);
Packit 534379
}
Packit 534379
Packit 534379
/**
Packit 534379
 * @test    fpga_reconf_slot_einval
Packit 534379
 * @brief   Tests: fpgaReconfigureSlot
Packit 534379
 * @details Register an ioctl handler that returns -1 and sets
Packit 534379
 *          errno to EINVAL. fpgaReconfigureSlot should return
Packit 534379
 *          FPGA_INVALID_PARAM.
Packit 534379
 */
Packit 534379
TEST_P(reconf_c_mock_p, fpga_reconf_slot_einval) {
Packit 534379
  fpga_result result;
Packit 534379
  uint32_t slot = 0;
Packit 534379
  int flags = 0;
Packit 534379
Packit 534379
  // register an ioctl handler that will return -1 and set errno to EINVAL
Packit 534379
  system_->register_ioctl_handler(FPGA_FME_PORT_PR, dummy_ioctl<-1, EINVAL>);
Packit 534379
  system_->register_ioctl_handler(DFL_FPGA_FME_PORT_PR, dummy_ioctl<-1, EINVAL>);
Packit 534379
  result = xfpga_fpgaReconfigureSlot(handle_, slot, bitstream_valid_.data(),
Packit 534379
                                     bitstream_valid_.size(), flags);
Packit 534379
  EXPECT_EQ(result, FPGA_INVALID_PARAM);
Packit 534379
}
Packit 534379
Packit 534379
/**
Packit 534379
 * @test    fpga_reconf_slot_enotsup
Packit 534379
 * @brief   Tests: fpgaReconfigureSlot
Packit 534379
 * @details Register an ioctl handler that returns -1 and sets
Packit 534379
 *          errno to ENOTSUP. fpgaReconfigureSlot should return
Packit 534379
 *          FPGA_EXCEPTION.
Packit 534379
 */
Packit 534379
TEST_P(reconf_c_mock_p, fpga_reconf_slot_enotsup) {
Packit 534379
  fpga_result result;
Packit 534379
  uint32_t slot = 0;
Packit 534379
  int flags = 0;
Packit 534379
Packit 534379
  // register an ioctl handler that will return -1 and set errno to ENOTSUP
Packit 534379
  system_->register_ioctl_handler(FPGA_FME_PORT_PR, dummy_ioctl<-1, ENOTSUP>);
Packit 534379
  system_->register_ioctl_handler(DFL_FPGA_FME_PORT_PR, dummy_ioctl<-1, ENOTSUP>);
Packit 534379
  result = xfpga_fpgaReconfigureSlot(handle_, slot, bitstream_valid_.data(),
Packit 534379
                                     bitstream_valid_.size(), flags);
Packit 534379
  EXPECT_EQ(result, FPGA_EXCEPTION);
Packit 534379
}
Packit 534379
Packit 534379
INSTANTIATE_TEST_CASE_P(reconf, reconf_c_mock_p,
Packit 534379
                        ::testing::ValuesIn(test_platform::mock_platforms({ "skx-p","dcp-rc" })));
Packit 534379
Packit 534379
class reconf_c_hw_skx_p : public reconf_c {
Packit 534379
  protected:
Packit 534379
    reconf_c_hw_skx_p() {};
Packit 534379
};
Packit 534379
Packit 534379
/**
Packit 534379
 * @test    set_afu_userclock
Packit 534379
 * @brief   Tests: set_afu_userclock
Packit 534379
 * @details Given valid parameters set_afu_userlock returns
Packit 534379
 *          FPGA_OK on mcp hw platforms.
Packit 534379
 */
Packit 534379
TEST_P(reconf_c_hw_skx_p, set_afu_userclock) {
Packit 534379
  ASSERT_EQ(FPGA_OK, xfpga_fpgaOpen(tokens_[0], &handle_, 0));
Packit 534379
  EXPECT_EQ(set_afu_userclock(handle_, 312, 156), FPGA_OK);
Packit 534379
}
Packit 534379
Packit 534379
INSTANTIATE_TEST_CASE_P(reconf, reconf_c_hw_skx_p,
Packit 534379
                        ::testing::ValuesIn(test_platform::hw_platforms({"skx-p"})));
Packit 534379
Packit 534379
class reconf_c_hw_dcp_p : public reconf_c {
Packit 534379
  protected:
Packit 534379
    reconf_c_hw_dcp_p() {};
Packit 534379
};
Packit 534379
Packit 534379
/**
Packit 534379
 * @test    set_afu_userclock
Packit 534379
 * @brief   Tests: set_afu_userclock
Packit 534379
 * @details Given valid parameters set_afu_userlock returns
Packit 534379
 *          FPGA_NOT_SUPPORTED on dcp hw platforms.
Packit 534379
 */
Packit 534379
TEST_P(reconf_c_hw_dcp_p, set_afu_userclock) {
Packit 534379
  ASSERT_EQ(FPGA_OK, xfpga_fpgaOpen(tokens_[0], &handle_, 0));
Packit 534379
  EXPECT_EQ(set_afu_userclock(handle_, 312, 156), FPGA_NOT_SUPPORTED);
Packit 534379
}
Packit 534379
Packit 534379
INSTANTIATE_TEST_CASE_P(reconf, reconf_c_hw_dcp_p,
Packit 534379
                        ::testing::ValuesIn(test_platform::hw_platforms({"dcp-p"})));
Packit 534379
Packit 534379
/**
Packit 534379
* @test    clear_port_errors
Packit 534379
* @brief   Tests: clear_port_errors
Packit 534379
* @details Returns FPGA_OK if handle is valid and
Packit 534379
*          can clear port errors.
Packit 534379
*/
Packit 534379
TEST(reconf, clear_port_errors) {
Packit 534379
  fpga_result result;
Packit 534379
Packit 534379
  // Null handle
Packit 534379
  result = clear_port_errors(NULL);
Packit 534379
  EXPECT_EQ(result, FPGA_INVALID_PARAM);
Packit 534379
}
Packit 534379
Packit 534379
class reconf_c_hw_p : public reconf_c {
Packit 534379
  protected:
Packit 534379
    reconf_c_hw_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
Packit 534379
    ASSERT_EQ(xfpga_fpgaGetProperties(nullptr, &filter_), FPGA_OK);
Packit 534379
    ASSERT_EQ(fpgaPropertiesSetDeviceID(filter_, 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_), FPGA_OK);
Packit 534379
    EXPECT_GT(num_matches_, 0);
Packit 534379
    ASSERT_EQ(FPGA_OK, xfpga_fpgaOpen(tokens_[0], &handle_, 0));
Packit 534379
Packit 534379
    // assemble valid bitstream header
Packit 534379
    auto fme_guid = platform_.devices[0].fme_guid;
Packit 534379
    auto afu_guid = platform_.devices[0].afu_guid;
Packit 534379
Packit 534379
    auto bitstream_j = jobject
Packit 534379
    ("version", "640")
Packit 534379
    ("afu-image", jobject
Packit 534379
                  ("interface-uuid", fme_guid)
Packit 534379
                  ("magic-no", int32_t(488605312))
Packit 534379
                  ("accelerator-clusters", {
Packit 534379
                                             jobject
Packit 534379
                                             ("total-contexts", int32_t(1))
Packit 534379
                                             ("name", "nlb")
Packit 534379
                                             ("accelerator-type-uuid", afu_guid)
Packit 534379
                                            }
Packit 534379
                  )
Packit 534379
    )
Packit 534379
    ("platform-name", "");
Packit 534379
Packit 534379
    bitstream_valid_ =
Packit 534379
          system_->assemble_gbs_header(platform_.devices[0], bitstream_j.c_str());
Packit 534379
    bitstream_j.put();
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(xfpga_fpgaDestroyToken(&t), FPGA_OK);
Packit 534379
        t = nullptr;
Packit 534379
      }
Packit 534379
    }
Packit 534379
    system_->finalize();
Packit 534379
    token_cleanup();
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::vector<uint8_t> bitstream_valid_;
Packit 534379
};
Packit 534379
Packit 534379
/*
Packit 534379
 * @test    fpga_reconf_slot_inv_len
Packit 534379
 *
Packit 534379
 * @details When the bitstream length is invalid, the function
Packit 534379
 *          returns FPGA_INVALID_PARAM.
Packit 534379
 */
Packit 534379
TEST_P(reconf_c_hw_p, fpga_reconf_slot_inv_len) {
Packit 534379
  fpga_result result;
Packit 534379
  uint32_t slot = 0;
Packit 534379
  int flags = 0;
Packit 534379
Packit 534379
  result = xfpga_fpgaReconfigureSlot(handle_, slot, bitstream_valid_.data(),
Packit 534379
                                     -123456789, flags);
Packit 534379
  EXPECT_EQ(result, FPGA_INVALID_PARAM);
Packit 534379
Packit 534379
  result = xfpga_fpgaReconfigureSlot(handle_, slot, bitstream_valid_.data(),
Packit 534379
                                     123456789, flags);
Packit 534379
  EXPECT_EQ(result, FPGA_INVALID_PARAM);
Packit 534379
}
Packit 534379
Packit 534379
INSTANTIATE_TEST_CASE_P(reconf, reconf_c_hw_p,
Packit 534379
	::testing::ValuesIn(test_platform::hw_platforms({ "skx-p", "dcp-rc" })));