Blame opae-libs/tests/xfpga/test_events_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 <opae/fpga.h>
Packit 534379
Packit 534379
extern "C" {
Packit 534379
fpga_result send_fme_event_request(fpga_handle, fpga_event_handle, int);
Packit 534379
fpga_result send_port_event_request(fpga_handle, fpga_event_handle, int);
Packit 534379
fpga_result send_uafu_event_request(fpga_handle, fpga_event_handle, uint32_t, int);
Packit 534379
fpga_result check_interrupts_supported(fpga_handle, fpga_objtype*);
Packit 534379
fpga_result driver_register_event(fpga_handle, fpga_event_type, fpga_event_handle, uint32_t);
Packit 534379
fpga_result driver_unregister_event(fpga_handle, fpga_event_type, fpga_event_handle);
Packit 534379
int xfpga_plugin_initialize(void);
Packit 534379
int xfpga_plugin_finalize(void);
Packit 534379
}
Packit 534379
Packit 534379
#include "intel-fpga.h"
Packit 534379
#include <stdlib.h>
Packit 534379
#include <unistd.h>
Packit 534379
#include <chrono>
Packit 534379
#include <thread>
Packit 534379
#include <string>
Packit 534379
#include <cstring>
Packit 534379
#include "types_int.h"
Packit 534379
#include "gtest/gtest.h"
Packit 534379
#include "mock/test_system.h"
Packit 534379
#include "mock/fpgad_control.h"
Packit 534379
Packit 534379
#include "error_int.h"
Packit 534379
#include "xfpga.h"
Packit 534379
#include <opae/enum.h>
Packit 534379
#include <opae/properties.h>
Packit 534379
#include <opae/access.h>
Packit 534379
#include <linux/ioctl.h>
Packit 534379
#include <poll.h>
Packit 534379
#include <dlfcn.h>
Packit 534379
Packit 534379
#undef FPGA_MSG
Packit 534379
#define FPGA_MSG(fmt, ...) \
Packit 534379
	printf("MOCK " fmt "\n", ## __VA_ARGS__)
Packit 534379
Packit 534379
#undef FPGA_ERR
Packit 534379
#define FPGA_ERR(fmt, ...) \
Packit 534379
	printf("MOCK ERROR " fmt "\n", ## __VA_ARGS__)
Packit 534379
Packit 534379
using namespace opae::testing;
Packit 534379
Packit 534379
static std::string sysfs_fme = "/sys/class/fpga/intel-fpga-dev.0/intel-fpga-fme.0";
Packit 534379
static std::string dev_fme = "/dev/intel-fpga-fme.0";
Packit 534379
static std::string sysfs_port = "/sys/class/fpga/intel-fpga-dev.0/intel-fpga-port.0";
Packit 534379
static std::string dev_port = "/dev/intel-fpga-port.0";
Packit 534379
static bool gEnableIRQ = false;
Packit 534379
Packit 534379
static void get_path(const std::string object_type, fpga_handle handle){
Packit 534379
  auto h = (struct _fpga_handle*)handle; 
Packit 534379
  auto tok = (struct _fpga_token*)h->token; 
Packit 534379
  if (object_type.compare("fme") == 0)
Packit 534379
  {
Packit 534379
     sysfs_fme = tok->sysfspath;
Packit 534379
     dev_fme = tok->devpath;
Packit 534379
  }   
Packit 534379
  else if (object_type.compare("port") == 0)
Packit 534379
  {
Packit 534379
     sysfs_port = tok->sysfspath;
Packit 534379
     dev_port = tok->devpath;
Packit 534379
  }
Packit 534379
}
Packit 534379
Packit 534379
int port_info(mock_object * m, int request, va_list argp){
Packit 534379
  int retval = -1;
Packit 534379
  errno = EINVAL;
Packit 534379
  UNUSED_PARAM(m);
Packit 534379
  UNUSED_PARAM(request);
Packit 534379
  struct fpga_port_info *pinfo = va_arg(argp, struct fpga_port_info *);
Packit 534379
  if (!pinfo) {
Packit 534379
  	FPGA_MSG("pinfo is NULL");
Packit 534379
  	goto out_EINVAL;
Packit 534379
  }
Packit 534379
  if (pinfo->argsz != sizeof(*pinfo)) {
Packit 534379
  	FPGA_MSG("wrong structure size");
Packit 534379
  	goto out_EINVAL;
Packit 534379
  }
Packit 534379
  pinfo->flags = 0;
Packit 534379
  pinfo->num_regions = 1;
Packit 534379
  pinfo->num_umsgs = 8;
Packit 534379
  if (gEnableIRQ) {
Packit 534379
  	pinfo->capability = FPGA_PORT_CAP_ERR_IRQ | FPGA_PORT_CAP_UAFU_IRQ;
Packit 534379
  	pinfo->num_uafu_irqs = 1;
Packit 534379
  } else {
Packit 534379
  	pinfo->capability = 0;
Packit 534379
  	pinfo->num_uafu_irqs = 0;
Packit 534379
  }
Packit 534379
  retval = 0;
Packit 534379
  errno = 0;
Packit 534379
out:
Packit 534379
  va_end(argp);
Packit 534379
  return retval;
Packit 534379
Packit 534379
out_EINVAL:
Packit 534379
  retval = -1;
Packit 534379
  errno = EINVAL;
Packit 534379
  goto out;
Packit 534379
}
Packit 534379
Packit 534379
int fme_info(mock_object * m, int request, va_list argp){
Packit 534379
  int retval = -1;
Packit 534379
  errno = EINVAL;
Packit 534379
  UNUSED_PARAM(m);
Packit 534379
  UNUSED_PARAM(request);
Packit 534379
  struct fpga_fme_info *fme_info = va_arg(argp, struct fpga_fme_info *);
Packit 534379
  if (!fme_info) {
Packit 534379
  	FPGA_MSG("fme_info is NULL");
Packit 534379
  	goto out_EINVAL;
Packit 534379
  }
Packit 534379
  if (fme_info->argsz != sizeof(*fme_info)) {
Packit 534379
  	FPGA_MSG("wrong structure size");
Packit 534379
  	goto out_EINVAL;
Packit 534379
  }
Packit 534379
  if (fme_info->flags != 0) {
Packit 534379
  	FPGA_MSG("unexpected flags %u", fme_info->flags);
Packit 534379
  	goto out_EINVAL;
Packit 534379
  }
Packit 534379
  if (fme_info->capability != 0) {
Packit 534379
  	FPGA_MSG("unexpected capability %u", fme_info->capability);
Packit 534379
  	goto out_EINVAL;
Packit 534379
  }
Packit 534379
  fme_info->capability = gEnableIRQ ? FPGA_FME_CAP_ERR_IRQ : 0;
Packit 534379
  retval = 0;
Packit 534379
  errno = 0;
Packit 534379
out:
Packit 534379
  va_end(argp);
Packit 534379
  return retval;
Packit 534379
Packit 534379
out_EINVAL:
Packit 534379
  retval = -1;
Packit 534379
  errno = EINVAL;
Packit 534379
  goto out;
Packit 534379
}
Packit 534379
Packit 534379
int set_port_irq(mock_object * m, int request, va_list argp){
Packit 534379
  int retval = -1;
Packit 534379
  errno = EINVAL;
Packit 534379
  UNUSED_PARAM(m);
Packit 534379
  UNUSED_PARAM(request);
Packit 534379
  struct fpga_port_err_irq_set *port_irq = va_arg(argp, struct fpga_port_err_irq_set *);
Packit 534379
  if (!port_irq) {
Packit 534379
  	FPGA_MSG("port_irq is NULL");
Packit 534379
  	goto out_EINVAL;
Packit 534379
  }
Packit 534379
  if (port_irq->argsz != sizeof(*port_irq)) {
Packit 534379
  	FPGA_MSG("wrong structure size");
Packit 534379
  	goto out_EINVAL;
Packit 534379
  }
Packit 534379
  if (port_irq->flags != 0) {
Packit 534379
  	FPGA_MSG("unexpected flags %u", port_irq->flags);
Packit 534379
  	goto out_EINVAL;
Packit 534379
  }
Packit 534379
  if (gEnableIRQ && port_irq->evtfd >= 0) {
Packit 534379
  	uint64_t data = 1;
Packit 534379
  	// Write to the eventfd to signal one IRQ event.
Packit 534379
  	if (write(port_irq->evtfd, &data, sizeof(data)) != sizeof(data)) {
Packit 534379
  		FPGA_ERR("IRQ write < 8 bytes");
Packit 534379
  	}
Packit 534379
  }
Packit 534379
  retval = 0;
Packit 534379
  errno = 0; 
Packit 534379
out:
Packit 534379
  va_end(argp);
Packit 534379
  return retval;
Packit 534379
Packit 534379
out_EINVAL:
Packit 534379
  retval = -1;
Packit 534379
  errno = EINVAL;
Packit 534379
  goto out;
Packit 534379
}
Packit 534379
Packit 534379
int set_fme_irq(mock_object * m, int request, va_list argp){
Packit 534379
  int retval = -1;
Packit 534379
  errno = EINVAL;
Packit 534379
  UNUSED_PARAM(m);
Packit 534379
  UNUSED_PARAM(request);
Packit 534379
  struct fpga_fme_err_irq_set *fme_irq = va_arg(argp, struct fpga_fme_err_irq_set *);
Packit 534379
  if (!fme_irq) {
Packit 534379
  	FPGA_MSG("fme_irq is NULL");
Packit 534379
  	goto out_EINVAL;
Packit 534379
  }
Packit 534379
  if (fme_irq->argsz != sizeof(*fme_irq)) {
Packit 534379
  	FPGA_MSG("wrong structure size");
Packit 534379
  	goto out_EINVAL;
Packit 534379
  }
Packit 534379
  if (fme_irq->flags != 0) {
Packit 534379
  	FPGA_MSG("unexpected flags %u", fme_irq->flags);
Packit 534379
  	goto out_EINVAL;
Packit 534379
  }
Packit 534379
  if (gEnableIRQ && fme_irq->evtfd >= 0) {
Packit 534379
  	uint64_t data = 1;
Packit 534379
  	// Write to the eventfd to signal one IRQ event.
Packit 534379
  	if (write(fme_irq->evtfd, &data, sizeof(data)) != sizeof(data)) {
Packit 534379
  		FPGA_ERR("IRQ write < 8 bytes");
Packit 534379
  	}
Packit 534379
  }
Packit 534379
  retval = 0;
Packit 534379
  errno = 0;
Packit 534379
out:
Packit 534379
  va_end(argp);
Packit 534379
  return retval;
Packit 534379
Packit 534379
out_EINVAL:
Packit 534379
  retval = -1;
Packit 534379
  errno = EINVAL;
Packit 534379
  goto out;
Packit 534379
}
Packit 534379
Packit 534379
int set_uport_irq(mock_object * m, int request, va_list argp){
Packit 534379
  int retval = -1;
Packit 534379
  errno = EINVAL;
Packit 534379
  UNUSED_PARAM(m);
Packit 534379
  UNUSED_PARAM(request);
Packit 534379
  struct fpga_port_uafu_irq_set *uafu_irq =
Packit 534379
  	va_arg(argp, struct fpga_port_uafu_irq_set *);
Packit 534379
  if (!uafu_irq) {
Packit 534379
  	FPGA_MSG("uafu_irq is NULL");
Packit 534379
  	goto out_EINVAL;
Packit 534379
  }
Packit 534379
  if (uafu_irq->argsz < sizeof(*uafu_irq)) {
Packit 534379
  	FPGA_MSG("wrong structure size");
Packit 534379
  	goto out_EINVAL;
Packit 534379
  }
Packit 534379
  if (uafu_irq->flags != 0) {
Packit 534379
  	FPGA_MSG("unexpected flags %u", uafu_irq->flags);
Packit 534379
  	goto out_EINVAL;
Packit 534379
  }
Packit 534379
  if (gEnableIRQ) {
Packit 534379
  	uint32_t i;
Packit 534379
  	uint64_t data = 1;
Packit 534379
  	// Write to each eventfd to signal one IRQ event.
Packit 534379
  	for (i = 0 ; i < uafu_irq->count ; ++i) {
Packit 534379
  		if (uafu_irq->evtfd[i] >= 0)
Packit 534379
  			if (write(uafu_irq->evtfd[i], &data, sizeof(data)) !=
Packit 534379
  					sizeof(data)) {
Packit 534379
  				FPGA_ERR("IRQ write < 8 bytes");
Packit 534379
  			}
Packit 534379
  	}
Packit 534379
  }
Packit 534379
  retval = 0;
Packit 534379
  errno = 0;
Packit 534379
out:
Packit 534379
  va_end(argp);
Packit 534379
  return retval;
Packit 534379
Packit 534379
out_EINVAL:
Packit 534379
  retval = -1;
Packit 534379
  errno = EINVAL;
Packit 534379
  goto out;
Packit 534379
}
Packit 534379
Packit 534379
class events_p : public ::testing::TestWithParam<std::string>,
Packit 534379
                 public fpgad_control {
Packit 534379
 protected:
Packit 534379
  events_p()
Packit 534379
      : tokens_dev_{{nullptr, nullptr}},
Packit 534379
        tokens_accel_{{nullptr, nullptr}},
Packit 534379
        handle_dev_(nullptr),
Packit 534379
        handle_accel_(nullptr) {}
Packit 534379
Packit 534379
  virtual void SetUp() override {
Packit 534379
    std::string platform_key = GetParam();
Packit 534379
    ASSERT_TRUE(test_platform::exists(platform_key));
Packit 534379
    platform_ = test_platform::get(platform_key);
Packit 534379
    system_ = test_system::instance();
Packit 534379
    system_->initialize();
Packit 534379
    system_->prepare_syfs(platform_);
Packit 534379
Packit 534379
    ASSERT_EQ(FPGA_OK, xfpga_plugin_initialize());
Packit 534379
Packit 534379
    ASSERT_EQ(xfpga_fpgaGetProperties(nullptr, &filter_dev_), FPGA_OK);
Packit 534379
    ASSERT_EQ(fpgaPropertiesSetDeviceID(filter_dev_, 
Packit 534379
                                        platform_.devices[0].device_id), FPGA_OK);
Packit 534379
    ASSERT_EQ(fpgaPropertiesSetObjectType(filter_dev_, FPGA_DEVICE), FPGA_OK);
Packit 534379
    ASSERT_EQ(xfpga_fpgaEnumerate(&filter_dev_, 1, tokens_dev_.data(), tokens_dev_.size(),
Packit 534379
                            &num_matches_dev_), FPGA_OK);
Packit 534379
    ASSERT_GT(num_matches_dev_, 0);
Packit 534379
Packit 534379
    ASSERT_EQ(xfpga_fpgaGetProperties(nullptr, &filter_accel_), FPGA_OK);
Packit 534379
    ASSERT_EQ(fpgaPropertiesSetDeviceID(filter_accel_, 
Packit 534379
                                        platform_.devices[0].device_id), FPGA_OK);
Packit 534379
    ASSERT_EQ(fpgaPropertiesSetObjectType(filter_accel_, FPGA_ACCELERATOR), FPGA_OK);
Packit 534379
    ASSERT_EQ(xfpga_fpgaEnumerate(&filter_accel_, 1, tokens_accel_.data(),
Packit 534379
                            tokens_accel_.size(), &num_matches_), FPGA_OK);
Packit 534379
    ASSERT_GT(num_matches_, 0);
Packit 534379
    ASSERT_EQ(xfpga_fpgaOpen(tokens_dev_[0], &handle_dev_, 0), FPGA_OK);
Packit 534379
    ASSERT_EQ(xfpga_fpgaOpen(tokens_accel_[0], &handle_accel_, 0), FPGA_OK);
Packit 534379
Packit 534379
    get_path("fme", handle_dev_);
Packit 534379
    get_path("port", handle_accel_);
Packit 534379
Packit 534379
    ASSERT_EQ(xfpga_fpgaCreateEventHandle(&eh_), FPGA_OK);
Packit 534379
Packit 534379
    fpgad_start();
Packit 534379
Packit 534379
    uint32_t i;
Packit 534379
    for (i = 0 ; i < num_matches_dev_ ; ++i) {
Packit 534379
      fpgad_watch(tokens_dev_[i]);
Packit 534379
    }
Packit 534379
    for (i = 0 ; i < num_matches_ ; ++i) {
Packit 534379
      fpgad_watch(tokens_accel_[i]);
Packit 534379
    }
Packit 534379
  }
Packit 534379
Packit 534379
  virtual void TearDown() override {
Packit 534379
    fpgad_stop();
Packit 534379
Packit 534379
    EXPECT_EQ(xfpga_fpgaDestroyEventHandle(&eh_), FPGA_OK);
Packit 534379
Packit 534379
    EXPECT_EQ(fpgaDestroyProperties(&filter_dev_), FPGA_OK);
Packit 534379
    EXPECT_EQ(fpgaDestroyProperties(&filter_accel_), FPGA_OK);
Packit 534379
Packit 534379
    if (handle_dev_) { 
Packit 534379
        EXPECT_EQ(xfpga_fpgaClose(handle_dev_), FPGA_OK); 
Packit 534379
        handle_dev_ = nullptr;
Packit 534379
    }
Packit 534379
Packit 534379
    if (handle_accel_) { 
Packit 534379
        EXPECT_EQ(xfpga_fpgaClose(handle_accel_), FPGA_OK); 
Packit 534379
        handle_accel_ = nullptr;
Packit 534379
    }
Packit 534379
 
Packit 534379
    for (auto &t : tokens_dev_) {
Packit 534379
      if (t) {
Packit 534379
        EXPECT_EQ(FPGA_OK, xfpga_fpgaDestroyToken(&t);;
Packit 534379
        t = nullptr;
Packit 534379
      }
Packit 534379
    }
Packit 534379
Packit 534379
    for (auto &t : tokens_accel_) {
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
  fpga_properties filter_dev_;
Packit 534379
  fpga_properties filter_accel_;
Packit 534379
  std::array<fpga_token, 2> tokens_dev_;
Packit 534379
  std::array<fpga_token, 2> tokens_accel_;
Packit 534379
  fpga_handle handle_dev_;
Packit 534379
  fpga_handle handle_accel_;
Packit 534379
  uint32_t num_matches_dev_;
Packit 534379
  uint32_t num_matches_;
Packit 534379
  test_platform platform_;
Packit 534379
  test_system *system_;
Packit 534379
  fpga_event_handle eh_;
Packit 534379
};
Packit 534379
Packit 534379
/*
Packit 534379
 * @test       event_01
Packit 534379
 *
Packit 534379
 * @brief      When the fpga_event_handle pointer to
Packit 534379
 *             fpgaCreateEventHandle() is NULL, the function returns
Packit 534379
 *             FPGA_INVALID_PARAM.
Packit 534379
 *
Packit 534379
 */
Packit 534379
TEST(events, event_01) {
Packit 534379
  EXPECT_EQ(FPGA_INVALID_PARAM, xfpga_fpgaCreateEventHandle(NULL));
Packit 534379
}
Packit 534379
Packit 534379
/**
Packit 534379
 * @test       event_02
Packit 534379
 *
Packit 534379
 * @brief      When the fpga_event_handle pointer to
Packit 534379
 *             fpgaDestroyEventHandle() is NULL, the function returns
Packit 534379
 *             FPGA_INVALID_PARAM.
Packit 534379
 *
Packit 534379
 */
Packit 534379
TEST(events, event_02) {
Packit 534379
  EXPECT_EQ(FPGA_INVALID_PARAM, xfpga_fpgaDestroyEventHandle(NULL));
Packit 534379
}
Packit 534379
Packit 534379
/**
Packit 534379
 * @test       event_03
Packit 534379
 *
Packit 534379
 * @brief      Tests fpgaRegisterEvent()'s ability to detect invalid
Packit 534379
 *             arguments. When the handle is NULL or otherwise invalid,
Packit 534379
 *             FPGA_INVALID_PARAM. When the handle has an invalid token,
Packit 534379
 *             FPGA_INVALID_PARAM. When the handle's token describes a
Packit 534379
 *             device for which the given event does't apply,
Packit 534379
 *             FPGA_INVALID_PARAM.
Packit 534379
 *
Packit 534379
 */
Packit 534379
TEST(events, event_03) {
Packit 534379
  fpga_event_type e = FPGA_EVENT_ERROR;
Packit 534379
  fpga_event_handle eh;
Packit 534379
Packit 534379
  EXPECT_EQ(FPGA_OK, xfpga_fpgaCreateEventHandle(&eh));
Packit 534379
Packit 534379
  // NULL handle.
Packit 534379
  EXPECT_EQ(FPGA_INVALID_PARAM, xfpga_fpgaRegisterEvent(NULL, e, eh, 0));
Packit 534379
Packit 534379
  // handle with bad magic.
Packit 534379
  struct _fpga_handle _h;
Packit 534379
  struct _fpga_token _t;
Packit 534379
Packit 534379
  // token setup
Packit 534379
  strncpy(_t.sysfspath, sysfs_port.c_str(), sysfs_port.size() + 1);
Packit 534379
  strncpy(_t.devpath, dev_port.c_str(), dev_port.size() + 1);
Packit 534379
  _t.magic = FPGA_TOKEN_MAGIC;
Packit 534379
  _t.errors = nullptr;
Packit 534379
  std::string errpath = sysfs_port + "/errors";
Packit 534379
  build_error_list(errpath.c_str(), &_t.errors);
Packit 534379
Packit 534379
  memset(&_h, 0, sizeof(_h));
Packit 534379
  _h.token = &_;;
Packit 534379
  _h.magic = FPGA_INVALID_MAGIC;
Packit 534379
  EXPECT_EQ(FPGA_INVALID_PARAM, xfpga_fpgaRegisterEvent(&_h, e, eh, 0));
Packit 534379
Packit 534379
  // handle with bad token.
Packit 534379
  _t.magic = FPGA_INVALID_MAGIC;
Packit 534379
  _h.magic = FPGA_HANDLE_MAGIC;
Packit 534379
  EXPECT_EQ(FPGA_INVALID_PARAM, xfpga_fpgaRegisterEvent(&_h, e, eh, 0));
Packit 534379
Packit 534379
  // token/event mismatch.
Packit 534379
  strncpy(_t.sysfspath, sysfs_fme.c_str(), sysfs_fme.size() + 1);
Packit 534379
  strncpy(_t.devpath, dev_fme.c_str(), dev_fme.size() + 1);
Packit 534379
  _t.magic = FPGA_TOKEN_MAGIC;
Packit 534379
  _t.errors = nullptr;
Packit 534379
  errpath = sysfs_fme + "/errors";
Packit 534379
  build_error_list(errpath.c_str(), &_t.errors);
Packit 534379
Packit 534379
  EXPECT_EQ(FPGA_INVALID_PARAM,
Packit 534379
            xfpga_fpgaRegisterEvent(&_h, FPGA_EVENT_INTERRUPT, eh, 0));
Packit 534379
Packit 534379
  EXPECT_EQ(FPGA_OK, xfpga_fpgaDestroyEventHandle(&eh));
Packit 534379
}
Packit 534379
Packit 534379
/**
Packit 534379
 * @test       event_04
Packit 534379
 *
Packit 534379
 * @brief      Tests fpgaUnregisterEvent()'s ability to detect invalid
Packit 534379
 *             arguments. When the handle is NULL or otherwise invalid,
Packit 534379
 *             FPGA_INVALID_PARAM. When the handle has an invalid token,
Packit 534379
 *             FPGA_INVALID_PARAM. When the handle's token describes a
Packit 534379
 *             device for which the given event does't apply,
Packit 534379
 *             FPGA_INVALID_PARAM.
Packit 534379
 *
Packit 534379
 */
Packit 534379
TEST(events, event_04) {
Packit 534379
  fpga_event_type e = FPGA_EVENT_ERROR;
Packit 534379
  fpga_event_handle eh;
Packit 534379
Packit 534379
  EXPECT_EQ(FPGA_OK, xfpga_fpgaCreateEventHandle(&eh));
Packit 534379
Packit 534379
  // NULL handle.
Packit 534379
  EXPECT_EQ(FPGA_INVALID_PARAM, xfpga_fpgaUnregisterEvent(NULL, e, eh));
Packit 534379
Packit 534379
  // handle with bad magic.
Packit 534379
  struct _fpga_handle _h;
Packit 534379
  struct _fpga_token _t;
Packit 534379
Packit 534379
  // token setup
Packit 534379
  strncpy(_t.sysfspath, sysfs_port.c_str(), sysfs_port.size() + 1);
Packit 534379
  strncpy(_t.devpath, dev_port.c_str(), dev_port.size() + 1);
Packit 534379
  _t.magic = FPGA_TOKEN_MAGIC;
Packit 534379
  _t.errors = nullptr;
Packit 534379
  std::string errpath = sysfs_port + "/errors";
Packit 534379
  build_error_list(errpath.c_str(), &_t.errors);
Packit 534379
Packit 534379
  memset(&_h, 0, sizeof(_h));
Packit 534379
  _h.token = &_;;
Packit 534379
  _h.magic = FPGA_INVALID_MAGIC;
Packit 534379
  EXPECT_EQ(FPGA_INVALID_PARAM, xfpga_fpgaUnregisterEvent(&_h, e, eh));
Packit 534379
Packit 534379
  // handle with bad token.
Packit 534379
  _t.magic = FPGA_INVALID_MAGIC;
Packit 534379
  _h.magic = FPGA_HANDLE_MAGIC;
Packit 534379
  EXPECT_EQ(FPGA_INVALID_PARAM, xfpga_fpgaUnregisterEvent(&_h, e, eh));
Packit 534379
Packit 534379
  // token/event mismatch.
Packit 534379
  strncpy(_t.sysfspath, sysfs_fme.c_str(), sysfs_fme.size() + 1);
Packit 534379
  strncpy(_t.devpath, dev_fme.c_str(), dev_fme.size() + 1);
Packit 534379
  _t.magic = FPGA_TOKEN_MAGIC;
Packit 534379
  _t.errors = nullptr;
Packit 534379
  errpath = sysfs_fme + "/errors";
Packit 534379
  build_error_list(errpath.c_str(), &_t.errors);
Packit 534379
Packit 534379
  EXPECT_EQ(FPGA_INVALID_PARAM,
Packit 534379
            xfpga_fpgaUnregisterEvent(&_h, FPGA_EVENT_INTERRUPT, eh));
Packit 534379
Packit 534379
  EXPECT_EQ(FPGA_OK, xfpga_fpgaDestroyEventHandle(&eh));
Packit 534379
}
Packit 534379
Packit 534379
/**
Packit 534379
 * @test       event_drv_08
Packit 534379
 *
Packit 534379
 * @brief      When passed an event handle with an invalid magic
Packit 534379
 *             fpgaDestroyEventHandle() returns FPGA_INVALID_PARAM.
Packit 534379
 *
Packit 534379
 */
Packit 534379
TEST(events, event_drv_08) {
Packit 534379
  fpga_event_handle bad_handle;
Packit 534379
  EXPECT_EQ(FPGA_OK, xfpga_fpgaCreateEventHandle(&bad_handle));
Packit 534379
  struct _fpga_event_handle *h = (struct _fpga_event_handle *) bad_handle;
Packit 534379
Packit 534379
  // Invalid Event Handle magic
Packit 534379
  h->magic=0x0;
Packit 534379
  EXPECT_EQ(FPGA_INVALID_PARAM, xfpga_fpgaDestroyEventHandle(&bad_handle));
Packit 534379
Packit 534379
  // reset event handle magic and destroy
Packit 534379
  h->magic=FPGA_EVENT_HANDLE_MAGIC;
Packit 534379
  EXPECT_EQ(FPGA_OK, xfpga_fpgaDestroyEventHandle(&bad_handle));
Packit 534379
}
Packit 534379
Packit 534379
/**
Packit 534379
 * @test       event_drv_09
Packit 534379
 *
Packit 534379
 * @brief      When passed an event handle with an invalid fd
Packit 534379
 *             fpgaDestroyEventHandle() returns FPGA_INVALID_PARAM.
Packit 534379
 *
Packit 534379
 */
Packit 534379
TEST(events, event_drv_09) {
Packit 534379
  fpga_event_handle bad_handle;
Packit 534379
  EXPECT_EQ(FPGA_OK, xfpga_fpgaCreateEventHandle(&bad_handle));
Packit 534379
  struct _fpga_event_handle *h = (struct _fpga_event_handle *) bad_handle;
Packit 534379
Packit 534379
  // Invalid fd
Packit 534379
  auto fddev = h->fd;
Packit 534379
  h->fd = -1;
Packit 534379
  EXPECT_EQ(FPGA_INVALID_PARAM, xfpga_fpgaDestroyEventHandle(&bad_handle));
Packit 534379
Packit 534379
  // Reset fd to destroy event handle
Packit 534379
  h->fd = fddev;
Packit 534379
  EXPECT_EQ(FPGA_OK, xfpga_fpgaDestroyEventHandle(&bad_handle));
Packit 534379
}
Packit 534379
Packit 534379
/**
Packit 534379
 * @test       event_drv_10
Packit 534379
 *
Packit 534379
 * @brief      When passed an event handle with an invalid magic
Packit 534379
 *             fpgaGetOSObjectFromEventHandle() returns FPGA_INVALID_PARAM.
Packit 534379
 *
Packit 534379
 */
Packit 534379
TEST(events, event_drv_10) {
Packit 534379
  fpga_event_handle bad_handle;
Packit 534379
  int fd;
Packit 534379
  EXPECT_EQ(FPGA_OK, xfpga_fpgaCreateEventHandle(&bad_handle));
Packit 534379
  struct _fpga_event_handle *h = (struct _fpga_event_handle *) bad_handle;
Packit 534379
Packit 534379
  // Invalid event handle magic
Packit 534379
  h->magic=0x0;
Packit 534379
  EXPECT_EQ(FPGA_INVALID_PARAM, xfpga_fpgaGetOSObjectFromEventHandle(bad_handle, &fd));
Packit 534379
Packit 534379
  // Reset event handle magic
Packit 534379
  h->magic=FPGA_EVENT_HANDLE_MAGIC;
Packit 534379
  EXPECT_EQ(FPGA_OK, xfpga_fpgaGetOSObjectFromEventHandle(bad_handle, &fd));
Packit 534379
  EXPECT_EQ(FPGA_OK, xfpga_fpgaDestroyEventHandle(&bad_handle));
Packit 534379
}
Packit 534379
Packit 534379
/**
Packit 534379
 * @test       register_event
Packit 534379
 *
Packit 534379
 * @brief      When a valid fpga_event_handle and event types
Packit 534379
 *             are passed to fpgaRegisterEvent and fpgaUnregisterEvent.
Packit 534379
 *             both API calls return FPGA_OK.
Packit 534379
 */
Packit 534379
TEST_P(events_p, register_event) {
Packit 534379
  fpga_result res;
Packit 534379
  gEnableIRQ = true;
Packit 534379
  system_->register_ioctl_handler(FPGA_FME_GET_INFO, fme_info);
Packit 534379
 
Packit 534379
  ASSERT_EQ(res = xfpga_fpgaRegisterEvent(handle_dev_, FPGA_EVENT_ERROR, eh_, 0), FPGA_OK)
Packit 534379
      << "\tEVENT TYPE: ERROR, RESULT: " << fpgaErrStr(res);
Packit 534379
  EXPECT_EQ(res = xfpga_fpgaUnregisterEvent(handle_dev_, FPGA_EVENT_ERROR, eh_), FPGA_OK)
Packit 534379
      << "\tRESULT: " << fpgaErrStr(res);
Packit 534379
}
Packit 534379
Packit 534379
/**
Packit 534379
 * @test       event_drv_11
Packit 534379
 *
Packit 534379
 * @brief      When passed an event handle with an invalid magic
Packit 534379
 *             xfpga_fpgaUnregisterEvent() returns FPGA_INVALID_PARAM.
Packit 534379
 *
Packit 534379
 */
Packit 534379
TEST_P(events_p, event_drv_11) {
Packit 534379
  fpga_event_handle bad_handle = nullptr;
Packit 534379
  EXPECT_EQ(FPGA_OK, xfpga_fpgaCreateEventHandle(&bad_handle));
Packit 534379
  struct _fpga_event_handle *h = (struct _fpga_event_handle *) bad_handle;
Packit 534379
  // Invalid event handle magic
Packit 534379
  auto valid_magic = h->magic;
Packit 534379
  h->magic = 0x0;
Packit 534379
  EXPECT_EQ(FPGA_INVALID_PARAM, xfpga_fpgaUnregisterEvent(handle_accel_, FPGA_EVENT_INTERRUPT, bad_handle));
Packit 534379
Packit 534379
  h->magic = valid_magic;
Packit 534379
  EXPECT_EQ(xfpga_fpgaDestroyEventHandle(&bad_handle), FPGA_OK);
Packit 534379
}
Packit 534379
Packit 534379
/**
Packit 534379
 * @test       event_drv_12
Packit 534379
 *
Packit 534379
 * @brief      When passed an event handle with an invalid magic
Packit 534379
 *             xfpga_fpgaRegisterEvent() returns FPGA_INVALID_PARAM.
Packit 534379
 *
Packit 534379
 */
Packit 534379
TEST_P(events_p, event_drv_12) {
Packit 534379
  fpga_event_handle bad_handle = nullptr;
Packit 534379
  EXPECT_EQ(FPGA_OK, xfpga_fpgaCreateEventHandle(&bad_handle));
Packit 534379
  struct _fpga_event_handle *h = (struct _fpga_event_handle *) bad_handle;
Packit 534379
Packit 534379
  auto valid_magic = h->magic;
Packit 534379
  // Invalid event handle magic
Packit 534379
  h->magic = 0x0;
Packit 534379
  EXPECT_EQ(FPGA_INVALID_PARAM, xfpga_fpgaRegisterEvent(handle_accel_, FPGA_EVENT_INTERRUPT, bad_handle, 0));
Packit 534379
  h->magic = valid_magic;
Packit 534379
  EXPECT_EQ(xfpga_fpgaDestroyEventHandle(&bad_handle), FPGA_OK);
Packit 534379
}
Packit 534379
Packit 534379
/**
Packit 534379
 * @test       create_destory_invalid
Packit 534379
 * @brief      Given a malloc failure, fpgaCreateEventHandle returns 
Packit 534379
 *             FPGA_NO_MEMORY.
Packit 534379
 */
Packit 534379
TEST_P(events_p, create_destroy_invalid) {
Packit 534379
  // fail malloc to check edge case
Packit 534379
  EXPECT_EQ(xfpga_fpgaDestroyEventHandle(&eh_), FPGA_OK);
Packit 534379
  test_system::instance()->invalidate_malloc();
Packit 534379
Packit 534379
  auto res = xfpga_fpgaCreateEventHandle(&eh_);
Packit 534379
  EXPECT_EQ(FPGA_NO_MEMORY,res);
Packit 534379
  ASSERT_EQ(xfpga_fpgaCreateEventHandle(&eh_), FPGA_OK);
Packit 534379
}
Packit 534379
Packit 534379
/**
Packit 534379
 * @test       irq_event_04
Packit 534379
 *
Packit 534379
 * @brief      Given a driver with IRQ support
Packit 534379
 *             when fpgaRegisterEvent is called with
Packit 534379
 *             an invalid handle
Packit 534379
 *             then the call fails with FPGA_INVALID_PARAM.
Packit 534379
 *             Repeat for fpgaUnregisterEvent.
Packit 534379
 *
Packit 534379
 */
Packit 534379
TEST_P(events_p, irq_event_04) {
Packit 534379
  EXPECT_EQ(FPGA_INVALID_PARAM, xfpga_fpgaRegisterEvent(NULL, FPGA_EVENT_INTERRUPT,
Packit 534379
                                       eh_, 0));
Packit 534379
  EXPECT_EQ(FPGA_INVALID_PARAM, xfpga_fpgaUnregisterEvent(NULL, FPGA_EVENT_INTERRUPT,
Packit 534379
                                       eh_));
Packit 534379
}
Packit 534379
Packit 534379
/**
Packit 534379
 * @test       irq_event_05
Packit 534379
 *
Packit 534379
 * @brief      Given a driver with IRQ support
Packit 534379
 *             when fpgaRegisterEvent is called with
Packit 534379
 *             an invalid event handle
Packit 534379
 *             then the call fails with FPGA_INVALID_PARAM.
Packit 534379
 *             Repeat for fpgaUnregisterEvent.
Packit 534379
 *             Repeat for fpgaDestroyEventHandle.
Packit 534379
 *
Packit 534379
 */
Packit 534379
TEST_P(events_p, irq_event_05) {
Packit 534379
  EXPECT_EQ(FPGA_INVALID_PARAM, xfpga_fpgaRegisterEvent(handle_accel_, FPGA_EVENT_INTERRUPT,
Packit 534379
                                       NULL, 0));
Packit 534379
  EXPECT_EQ(FPGA_INVALID_PARAM, xfpga_fpgaUnregisterEvent(handle_accel_, FPGA_EVENT_INTERRUPT,
Packit 534379
                                         NULL));
Packit 534379
  EXPECT_EQ(FPGA_INVALID_PARAM, xfpga_fpgaDestroyEventHandle(NULL));
Packit 534379
}
Packit 534379
Packit 534379
/**
Packit 534379
 * @test       irq_event_06
Packit 534379
 *
Packit 534379
 * @brief      Given a driver with IRQ support
Packit 534379
 *             when fpgaRegisterEvent is called for
Packit 534379
 *             an FPGA_DEVICE and FPGA_EVENT_INTERRUPT
Packit 534379
 *             then the call fails with FPGA_INVALID_PARAM.
Packit 534379
 *             Repeat for fpgaUnregisterEvent.
Packit 534379
 */
Packit 534379
TEST_P(events_p, irq_event_06) {
Packit 534379
  EXPECT_EQ(FPGA_INVALID_PARAM, xfpga_fpgaRegisterEvent(handle_dev_, FPGA_EVENT_INTERRUPT,
Packit 534379
                                       eh_, 0));
Packit 534379
  EXPECT_EQ(FPGA_INVALID_PARAM, xfpga_fpgaUnregisterEvent(handle_dev_, FPGA_EVENT_INTERRUPT,
Packit 534379
                                       eh_));
Packit 534379
}
Packit 534379
Packit 534379
INSTANTIATE_TEST_CASE_P(events, events_p,
Packit 534379
                        ::testing::ValuesIn(test_platform::platforms({ "skx-p","dcp-rc" })));
Packit 534379
Packit 534379
Packit 534379
class events_dcp_p : public events_p {};
Packit 534379
Packit 534379
/**
Packit 534379
 * @test       send_port_event_request
Packit 534379
 * @brief      When passed a valid event handle, handle and flag.
Packit 534379
 *             It returns FPGA_OK for dcp only.
Packit 534379
 */
Packit 534379
TEST_P(events_dcp_p, invalid_port_event_request){
Packit 534379
  int port_op = FPGA_IRQ_ASSIGN;
Packit 534379
  auto res = send_port_event_request(handle_accel_,eh_,port_op);
Packit 534379
  EXPECT_EQ(FPGA_OK, res) << "\t result is " << res;
Packit 534379
Packit 534379
  gEnableIRQ = false;
Packit 534379
  system_->register_ioctl_handler(FPGA_PORT_GET_INFO, port_info);
Packit 534379
  res = send_port_event_request(handle_accel_,eh_,port_op);
Packit 534379
  EXPECT_EQ(FPGA_OK, res);
Packit 534379
}
Packit 534379
Packit 534379
/**
Packit 534379
 * @test       send_fme_event_request
Packit 534379
 * @brief      When passed a valid event handle, handle and flag.
Packit 534379
 *             It returns FPGA_OK for dcp only.
Packit 534379
 */
Packit 534379
TEST_P(events_dcp_p, invalid_fme_event_request){
Packit 534379
  int fme_op = FPGA_IRQ_ASSIGN;
Packit 534379
  auto res = send_fme_event_request(handle_dev_,eh_,fme_op);
Packit 534379
  EXPECT_EQ(FPGA_OK, res) << "\t result is " << res;
Packit 534379
Packit 534379
  gEnableIRQ = false;
Packit 534379
  system_->register_ioctl_handler(FPGA_FME_GET_INFO, fme_info);
Packit 534379
  res = send_fme_event_request(handle_dev_,eh_,fme_op);
Packit 534379
  EXPECT_EQ(FPGA_OK, res);
Packit 534379
}
Packit 534379
Packit 534379
INSTANTIATE_TEST_CASE_P(events, events_dcp_p,
Packit 534379
                        ::testing::ValuesIn(test_platform::hw_platforms({"dcp-rc" })));
Packit 534379
Packit 534379
Packit 534379
class events_mcp_p : public events_p {};
Packit 534379
Packit 534379
/**
Packit 534379
 * @test       send_port_event_request
Packit 534379
 * @brief      When passed a valid event handle, handle and flag.
Packit 534379
 *             It returns FPGA_NOT_SUPPORTED if interrupt is not
Packit 534379
 *             supported or ioctl fails.
Packit 534379
 */
Packit 534379
TEST_P(events_mcp_p, invalid_port_event_request){
Packit 534379
  int port_op = FPGA_IRQ_ASSIGN;
Packit 534379
  auto res = send_port_event_request(handle_accel_,eh_,port_op);
Packit 534379
  EXPECT_EQ(FPGA_NOT_SUPPORTED, res) << "\t result is " << res;
Packit 534379
Packit 534379
  gEnableIRQ = false;
Packit 534379
  system_->register_ioctl_handler(FPGA_PORT_GET_INFO, port_info);
Packit 534379
  res = send_port_event_request(handle_accel_,eh_,port_op);
Packit 534379
  EXPECT_EQ(FPGA_NOT_SUPPORTED, res);
Packit 534379
}
Packit 534379
Packit 534379
/**
Packit 534379
 * @test       send_fme_event_request
Packit 534379
 * @brief      When passed a valid event handle, handle and flag.
Packit 534379
 *             It returns FPGA_NOT_SUPPORTED if interrupt is not
Packit 534379
 *             supported or ioctl fails.
Packit 534379
 */
Packit 534379
TEST_P(events_mcp_p, invalid_fme_event_request){
Packit 534379
  int fme_op = FPGA_IRQ_ASSIGN;
Packit 534379
  auto res = send_fme_event_request(handle_dev_,eh_,fme_op);
Packit 534379
  EXPECT_EQ(FPGA_NOT_SUPPORTED,res) << "\t result is " << res;
Packit 534379
Packit 534379
  gEnableIRQ = false;
Packit 534379
  system_->register_ioctl_handler(FPGA_FME_GET_INFO, fme_info);
Packit 534379
  res = send_fme_event_request(handle_dev_,eh_,fme_op);
Packit 534379
  EXPECT_EQ(FPGA_NOT_SUPPORTED,res);
Packit 534379
}
Packit 534379
Packit 534379
INSTANTIATE_TEST_CASE_P(events, events_mcp_p,
Packit 534379
                        ::testing::ValuesIn(test_platform::platforms({"skx-p" })));
Packit 534379
Packit 534379
Packit 534379
class events_mock_p : public events_p {
Packit 534379
};
Packit 534379
Packit 534379
/**
Packit 534379
 * @test       register_event_02
Packit 534379
 *
Packit 534379
 * @brief      When a valid fpga_event_handle and event types
Packit 534379
 *             are passed to fpgaRegisterEvent and fpgaUnregisterEvent.
Packit 534379
 *             both API calls return FPGA_OK.
Packit 534379
 */
Packit 534379
TEST_P(events_mock_p, register_event_02) {
Packit 534379
  fpga_result res;
Packit 534379
  ASSERT_EQ(res = xfpga_fpgaRegisterEvent(handle_dev_, FPGA_EVENT_POWER_THERMAL, eh_, 0),
Packit 534379
            FPGA_OK)
Packit 534379
      << "\tEVENT TYPE: ERROR, RESULT: " << fpgaErrStr(res);
Packit 534379
  EXPECT_EQ(res = xfpga_fpgaUnregisterEvent(handle_dev_, FPGA_EVENT_POWER_THERMAL, eh_),
Packit 534379
            FPGA_OK)
Packit 534379
      << "\tRESULT: " << fpgaErrStr(res);
Packit 534379
}
Packit 534379
Packit 534379
/**
Packit 534379
 * @test       send_fme_event_request
Packit 534379
 *
Packit 534379
 * @brief      When passed a valid event handle, handle
Packit 534379
 *             with FPGA_IRQ_ASSIGN flag.
Packit 534379
 *             The function return FPGA_OK.
Packit 534379
 *
Packit 534379
 */
Packit 534379
TEST_P(events_mock_p, valid_fme_event_request){
Packit 534379
  int fme_op = FPGA_IRQ_ASSIGN;
Packit 534379
Packit 534379
  gEnableIRQ = true;
Packit 534379
  system_->register_ioctl_handler(FPGA_FME_GET_INFO, fme_info);
Packit 534379
  auto res = send_fme_event_request(handle_dev_,eh_,fme_op);
Packit 534379
  EXPECT_EQ(FPGA_OK,res);
Packit 534379
}
Packit 534379
Packit 534379
/**
Packit 534379
 * @test       send_port_event_request
Packit 534379
 * @brief      When passed a valid event handle and handle
Packit 534379
 *             with FPGA_IRQ_ASSIGN flag. The function 
Packit 534379
 *             returns FPGA_OK.
Packit 534379
 */
Packit 534379
TEST_P(events_mock_p, valid_port_event_request){
Packit 534379
  int port_op = FPGA_IRQ_ASSIGN;
Packit 534379
Packit 534379
  gEnableIRQ = true;
Packit 534379
  system_->register_ioctl_handler(FPGA_PORT_GET_INFO, port_info);
Packit 534379
  auto res = send_port_event_request(handle_accel_,eh_,port_op);
Packit 534379
  EXPECT_EQ(FPGA_OK,res);
Packit 534379
}
Packit 534379
Packit 534379
/**
Packit 534379
 * @test       send_port_event_request
Packit 534379
 * @brief      When passed a valid event handle and handle
Packit 534379
 *             with FPGA_IRQ_DEASSIGN flag. The function 
Packit 534379
 *             returns FPGA_OK.
Packit 534379
 */
Packit 534379
TEST_P(events_mock_p, valid_port_event_request_01){
Packit 534379
  int port_op = FPGA_IRQ_DEASSIGN;
Packit 534379
Packit 534379
  gEnableIRQ = true;
Packit 534379
  system_->register_ioctl_handler(FPGA_PORT_GET_INFO, port_info);
Packit 534379
  auto res = send_port_event_request(handle_accel_,eh_,port_op);
Packit 534379
  EXPECT_EQ(FPGA_OK,res);
Packit 534379
}
Packit 534379
Packit 534379
/**
Packit 534379
 * @test       send_fme_event_request
Packit 534379
 *
Packit 534379
 * @brief      When passed a valid event handle and handle
Packit 534379
 *             with FPGA_IRQ_DEASSIGN flag. The function 
Packit 534379
 *             returns FPGA_OK.
Packit 534379
 *
Packit 534379
 */
Packit 534379
TEST_P(events_mock_p, valid_fme_event_request_01){
Packit 534379
  int fme_op = FPGA_IRQ_DEASSIGN;
Packit 534379
Packit 534379
  gEnableIRQ = true;
Packit 534379
  system_->register_ioctl_handler(FPGA_FME_GET_INFO, fme_info);
Packit 534379
  auto res = send_fme_event_request(handle_dev_,eh_,fme_op);
Packit 534379
  EXPECT_EQ(FPGA_OK,res);
Packit 534379
}
Packit 534379
Packit 534379
/**
Packit 534379
 * @test       send_uafu_event_request
Packit 534379
 * @brief      When passed a valid event handle and handle
Packit 534379
 *             with FPGA_IRQ_ASSIGN flag. The function 
Packit 534379
 *             returns FPGA_OK.
Packit 534379
 */
Packit 534379
TEST_P(events_mock_p, valid_uafu_event_request){
Packit 534379
  int port_op = FPGA_IRQ_ASSIGN;
Packit 534379
Packit 534379
  gEnableIRQ = true;
Packit 534379
  system_->register_ioctl_handler(FPGA_PORT_GET_INFO, port_info);
Packit 534379
  auto res = send_uafu_event_request(handle_dev_,eh_,0,port_op);
Packit 534379
  EXPECT_EQ(FPGA_OK,res);
Packit 534379
}
Packit 534379
Packit 534379
/**
Packit 534379
 * @test       send_uafu_event_request
Packit 534379
 * @brief      When passed a valid event handle and handle
Packit 534379
 *             with FPGA_IRQ_DEASSIGN flag. The function
Packit 534379
 *             returns FPGA_OK.
Packit 534379
 */
Packit 534379
TEST_P(events_mock_p, valid_uafu_event_request_01){
Packit 534379
  int port_op = FPGA_IRQ_DEASSIGN;
Packit 534379
Packit 534379
  gEnableIRQ = true;
Packit 534379
  system_->register_ioctl_handler(FPGA_PORT_GET_INFO, port_info);
Packit 534379
  auto res = send_uafu_event_request(handle_dev_,eh_,0,port_op);
Packit 534379
  EXPECT_EQ(FPGA_OK,res);
Packit 534379
}
Packit 534379
Packit 534379
/**
Packit 534379
 * @test       send_uafu_event_request
Packit 534379
 * @brief      When passed a valid event handle, handle and port params
Packit 534379
 *             but an invalid interrupt num. It returns FPGA_INVALID_PARAM.
Packit 534379
 */
Packit 534379
TEST_P(events_mock_p, invalid_uafu_event_request_03){
Packit 534379
  int port_op = FPGA_IRQ_ASSIGN;
Packit 534379
  gEnableIRQ = true;
Packit 534379
Packit 534379
  system_->register_ioctl_handler(FPGA_PORT_GET_INFO, port_info);
Packit 534379
  auto res = send_uafu_event_request(handle_dev_,eh_,2,port_op);
Packit 534379
  EXPECT_EQ(FPGA_INVALID_PARAM,res);
Packit 534379
}
Packit 534379
Packit 534379
/**
Packit 534379
 * @test       afu_driver_register_event
Packit 534379
 * @brief      Given invalid flags to driver_register_event, it
Packit 534379
 *             returns FPGA_INVALID_PARAM. FPGA_EVENT_POWER_THERMAL 
Packit 534379
 *             is not supported. 
Packit 534379
 */
Packit 534379
TEST_P(events_mock_p, afu_driver_register_event){
Packit 534379
  int port_op = FPGA_IRQ_ASSIGN;
Packit 534379
Packit 534379
  // Valid params
Packit 534379
  gEnableIRQ = true;
Packit 534379
  system_->register_ioctl_handler(FPGA_PORT_GET_INFO, port_info);
Packit 534379
  auto res = driver_register_event(handle_accel_, FPGA_EVENT_ERROR, eh_, 0);
Packit 534379
  EXPECT_EQ(FPGA_OK,res);
Packit 534379
Packit 534379
  // Invalid num_uafu_irqs
Packit 534379
  system_->register_ioctl_handler(FPGA_PORT_GET_INFO, port_info);
Packit 534379
  res = driver_register_event(handle_accel_, FPGA_EVENT_INTERRUPT, eh_, port_op);
Packit 534379
  EXPECT_EQ(FPGA_INVALID_PARAM,res);
Packit 534379
Packit 534379
  // Not supported event type
Packit 534379
  res = driver_register_event(handle_accel_, FPGA_EVENT_POWER_THERMAL, eh_, 0);
Packit 534379
  EXPECT_EQ(FPGA_NOT_SUPPORTED,res);
Packit 534379
}
Packit 534379
Packit 534379
/**
Packit 534379
 * @test       fme_driver_register_event
Packit 534379
 * @brief      Given invalid flags to driver_register_event, it
Packit 534379
 *             returns FPGA_INVALID_PARAM. 
Packit 534379
 */
Packit 534379
TEST_P(events_mock_p, fme_driver_register_event){
Packit 534379
  // Invalid ioctl
Packit 534379
  gEnableIRQ = true;
Packit 534379
  system_->register_ioctl_handler(FPGA_FME_GET_INFO, fme_info);
Packit 534379
  auto res = driver_register_event(handle_dev_, FPGA_EVENT_ERROR, eh_, 0);
Packit 534379
  EXPECT_EQ(FPGA_OK,res);
Packit 534379
Packit 534379
  res = driver_register_event(handle_dev_, FPGA_EVENT_INTERRUPT, eh_, 0);
Packit 534379
  EXPECT_EQ(FPGA_INVALID_PARAM,res);
Packit 534379
}
Packit 534379
Packit 534379
/**
Packit 534379
 * @test       fme_driver_unregister_event
Packit 534379
 * @brief      Given invalid event type to fme, driver_unregister_event
Packit 534379
 *             returns FPGA_INVALID_PARAM.
Packit 534379
 */
Packit 534379
TEST_P(events_mock_p, fme_driver_unregister_event){
Packit 534379
  gEnableIRQ = true;
Packit 534379
  system_->register_ioctl_handler(FPGA_FME_GET_INFO, fme_info);
Packit 534379
  auto res = driver_unregister_event(handle_dev_, FPGA_EVENT_ERROR, eh_);
Packit 534379
  EXPECT_EQ(FPGA_OK,res);
Packit 534379
Packit 534379
  // Not supported event_type
Packit 534379
  res = driver_unregister_event(handle_dev_, FPGA_EVENT_INTERRUPT, eh_);
Packit 534379
  EXPECT_EQ(FPGA_INVALID_PARAM,res);
Packit 534379
}
Packit 534379
Packit 534379
/**
Packit 534379
 * @test       event_drv_13
Packit 534379
 *
Packit 534379
 * @brief      When register a valid event handle, FPGA_EVENT_INTERRUPT
Packit 534379
 *             xfpga_fpgaRegisterEvent() returns FPGA_OK.
Packit 534379
 *
Packit 534379
 */
Packit 534379
TEST_P(events_mock_p, event_drv_13) {
Packit 534379
  fpga_event_handle bad_handle;
Packit 534379
  EXPECT_EQ(FPGA_OK, xfpga_fpgaCreateEventHandle(&bad_handle));
Packit 534379
Packit 534379
  // Reset event handle magic
Packit 534379
  EXPECT_EQ(FPGA_OK, xfpga_fpgaRegisterEvent(handle_accel_, FPGA_EVENT_INTERRUPT, bad_handle, 0));
Packit 534379
Packit 534379
  // Destroy event handle
Packit 534379
  auto res = xfpga_fpgaDestroyEventHandle(&bad_handle);
Packit 534379
  EXPECT_EQ(FPGA_OK, res);
Packit 534379
}
Packit 534379
Packit 534379
/**
Packit 534379
 * @test       event_drv_14
Packit 534379
 *
Packit 534379
 * @brief      When passed an event handle with an invalid magic
Packit 534379
 *             xfpga_fpgaUnregisterEvent() returns FPGA_INVALID_PARAM.
Packit 534379
 *
Packit 534379
 */
Packit 534379
TEST_P(events_mock_p, event_drv_14) {
Packit 534379
  fpga_event_handle bad_handle;
Packit 534379
  EXPECT_EQ(FPGA_OK, xfpga_fpgaCreateEventHandle(&bad_handle));
Packit 534379
Packit 534379
  // Valid magic and ioctl
Packit 534379
  gEnableIRQ = true;
Packit 534379
  system_->register_ioctl_handler(FPGA_PORT_GET_INFO, port_info);
Packit 534379
  EXPECT_EQ(FPGA_OK, xfpga_fpgaUnregisterEvent(handle_accel_, FPGA_EVENT_INTERRUPT, bad_handle));
Packit 534379
Packit 534379
  // Destory event handle
Packit 534379
  auto res = xfpga_fpgaDestroyEventHandle(&bad_handle);
Packit 534379
  EXPECT_EQ(FPGA_OK, res);
Packit 534379
}
Packit 534379
Packit 534379
/**
Packit 534379
 * @test       send_fme_event_request
Packit 534379
 * @brief      When passed a valid event handle but invalid fme params.
Packit 534379
 *             It returns FPGA_INVALID_PARAM
Packit 534379
 */
Packit 534379
TEST_P(events_mock_p, invalid_fme_event_request_01){
Packit 534379
  int fme_op = 0;
Packit 534379
  auto res = send_fme_event_request(handle_dev_,eh_,fme_op);
Packit 534379
  EXPECT_EQ(FPGA_INVALID_PARAM,res);
Packit 534379
Packit 534379
  fme_op = FPGA_IRQ_ASSIGN;
Packit 534379
  system_->register_ioctl_handler(FPGA_FME_GET_INFO, dummy_ioctl<-1,EINVAL>);
Packit 534379
Packit 534379
  res = send_fme_event_request(handle_dev_,eh_,fme_op);
Packit 534379
  EXPECT_EQ(FPGA_INVALID_PARAM,res);
Packit 534379
Packit 534379
  gEnableIRQ = true;
Packit 534379
  system_->register_ioctl_handler(FPGA_FME_GET_INFO, fme_info);
Packit 534379
  system_->register_ioctl_handler(FPGA_FME_ERR_SET_IRQ, dummy_ioctl<-1,EINVAL>);
Packit 534379
  res = send_fme_event_request(handle_dev_,eh_,fme_op);
Packit 534379
  EXPECT_EQ(FPGA_INVALID_PARAM,res);
Packit 534379
}
Packit 534379
Packit 534379
/**
Packit 534379
 * @test       send_port_event_request
Packit 534379
 *
Packit 534379
 * @brief      When passed a valid event handle but invalid port params.
Packit 534379
 *             It returns FPGA_INVALID_PARAM
Packit 534379
 *
Packit 534379
 */
Packit 534379
TEST_P(events_mock_p, invalid_port_event_request_01){
Packit 534379
  int port_op = 0;
Packit 534379
  auto res = send_port_event_request(handle_dev_,eh_,port_op);
Packit 534379
  EXPECT_EQ(FPGA_INVALID_PARAM,res);
Packit 534379
Packit 534379
  port_op = FPGA_IRQ_ASSIGN;
Packit 534379
  system_->register_ioctl_handler(FPGA_PORT_GET_INFO, dummy_ioctl<-1,EINVAL>);
Packit 534379
Packit 534379
  res = send_port_event_request(handle_dev_,eh_,port_op);
Packit 534379
  EXPECT_EQ(FPGA_INVALID_PARAM,res);
Packit 534379
Packit 534379
  gEnableIRQ = true;
Packit 534379
  system_->register_ioctl_handler(FPGA_PORT_GET_INFO, port_info);
Packit 534379
  system_->register_ioctl_handler(FPGA_PORT_ERR_SET_IRQ, dummy_ioctl<-1,EINVAL>);
Packit 534379
  res = send_port_event_request(handle_dev_,eh_,port_op);
Packit 534379
  EXPECT_EQ(FPGA_INVALID_PARAM,res);
Packit 534379
}
Packit 534379
Packit 534379
/**
Packit 534379
 * @test       send_uafu_event_request
Packit 534379
 * @brief      When passed a valid event handle but invalid port params.
Packit 534379
 *             It returns FPGA_INVALID_PARAM. When ioctl fails,
Packit 534379
 *             it returns FPGA_EXCEPTION.
Packit 534379
 */
Packit 534379
TEST_P(events_mock_p, invalid_uafu_event_request_01){
Packit 534379
  // invalid port operation
Packit 534379
  int port_op = 0;
Packit 534379
  auto res = send_uafu_event_request(handle_dev_,eh_,0,port_op);
Packit 534379
  EXPECT_EQ(FPGA_INVALID_PARAM,res);
Packit 534379
Packit 534379
  // Invalid ioctl
Packit 534379
  port_op = FPGA_IRQ_ASSIGN;
Packit 534379
  system_->register_ioctl_handler(FPGA_PORT_GET_INFO, dummy_ioctl<-1,EINVAL>);
Packit 534379
  res = send_uafu_event_request(handle_dev_,eh_,0,port_op);
Packit 534379
  EXPECT_EQ(FPGA_INVALID_PARAM,res);
Packit 534379
}
Packit 534379
Packit 534379
/**
Packit 534379
 * @test       send_uafu_event_request
Packit 534379
 * @brief      When passed a valid event handle, handle and port params.
Packit 534379
 *             It returns FPGA_EXCEPTION when ioctl fails.
Packit 534379
 */
Packit 534379
TEST_P(events_mock_p, invalid_uafu_event_request_02){
Packit 534379
  int port_op = FPGA_IRQ_ASSIGN;
Packit 534379
  auto res = send_uafu_event_request(handle_dev_,eh_,0,port_op);
Packit 534379
  EXPECT_EQ(FPGA_NOT_SUPPORTED,res) << "\t result is " << res;
Packit 534379
Packit 534379
  gEnableIRQ = false;
Packit 534379
  system_->register_ioctl_handler(FPGA_PORT_GET_INFO, port_info);
Packit 534379
  res = send_uafu_event_request(handle_dev_,eh_,0,port_op);
Packit 534379
  EXPECT_EQ(FPGA_NOT_SUPPORTED,res);
Packit 534379
Packit 534379
  gEnableIRQ = true;
Packit 534379
  system_->register_ioctl_handler(FPGA_PORT_GET_INFO, port_info);
Packit 534379
  system_->register_ioctl_handler(FPGA_PORT_UAFU_SET_IRQ, dummy_ioctl<-1,EINVAL>);
Packit 534379
  res = send_uafu_event_request(handle_dev_,eh_,0,port_op);
Packit 534379
  EXPECT_EQ(FPGA_EXCEPTION,res);
Packit 534379
}
Packit 534379
Packit 534379
/**
Packit 534379
 * @test       fme_interrupts_check
Packit 534379
 * @brief      When irq is not supported and register invalid ioctl,
Packit 534379
 *             check_interrupts_supported returns FPGA_NOT_SUPPORTED 
Packit 534379
 *             or FPGA_EXCEPTION.
Packit 534379
 */
Packit 534379
TEST_P(events_mock_p, fme_interrupts_check){
Packit 534379
  fpga_objtype obj;
Packit 534379
  auto h = (struct _fpga_handle*)handle_dev_;
Packit 534379
  auto t = (struct _fpga_token*)h->token;
Packit 534379
Packit 534379
  // no fme_info capability
Packit 534379
  gEnableIRQ = false;
Packit 534379
  system_->register_ioctl_handler(FPGA_FME_GET_INFO, fme_info);
Packit 534379
  auto res = check_interrupts_supported(handle_dev_,&obj);
Packit 534379
  EXPECT_EQ(FPGA_NOT_SUPPORTED,res);
Packit 534379
Packit 534379
  // Value input
Packit 534379
  gEnableIRQ = true;
Packit 534379
  system_->register_ioctl_handler(FPGA_FME_GET_INFO, fme_info);
Packit 534379
  res = check_interrupts_supported(handle_dev_,&obj);
Packit 534379
  EXPECT_EQ(FPGA_OK,res);
Packit 534379
Packit 534379
  // interrupt ioctl
Packit 534379
  system_->register_ioctl_handler(FPGA_FME_GET_INFO, dummy_ioctl<-1,EINVAL>);
Packit 534379
  res = check_interrupts_supported(handle_dev_,&obj);
Packit 534379
  EXPECT_EQ(FPGA_EXCEPTION,res);
Packit 534379
Packit 534379
  // change sysfspath
Packit 534379
  strncpy(t->sysfspath, "null" , 5);
Packit 534379
  res = check_interrupts_supported(handle_dev_,&obj);
Packit 534379
  EXPECT_NE(FPGA_OK,res);
Packit 534379
}
Packit 534379
Packit 534379
/**
Packit 534379
 * @test       afu_interrupts_check
Packit 534379
 * @brief      When irq is not supported and register invalid ioctl,
Packit 534379
 *             check_interrupts_supported returns FPGA_NOT_SUPPORTED 
Packit 534379
 *             or FPGA_EXCEPTION.
Packit 534379
 */
Packit 534379
TEST_P(events_mock_p, afu_interrupts_check){
Packit 534379
  fpga_objtype obj;
Packit 534379
  auto h = (struct _fpga_handle*)handle_accel_;
Packit 534379
  auto t = (struct _fpga_token*)h->token;
Packit 534379
Packit 534379
  // no fme_info capability
Packit 534379
  gEnableIRQ = false;
Packit 534379
  system_->register_ioctl_handler(FPGA_PORT_GET_INFO, port_info);
Packit 534379
  auto res = check_interrupts_supported(handle_accel_,&obj);
Packit 534379
  EXPECT_EQ(FPGA_NOT_SUPPORTED,res);
Packit 534379
Packit 534379
  // Value input
Packit 534379
  gEnableIRQ = true;
Packit 534379
  system_->register_ioctl_handler(FPGA_PORT_GET_INFO, port_info);
Packit 534379
  res = check_interrupts_supported(handle_accel_,&obj);
Packit 534379
  EXPECT_EQ(FPGA_OK,res);
Packit 534379
Packit 534379
  // interrupt ioctl
Packit 534379
  system_->register_ioctl_handler(FPGA_PORT_GET_INFO, dummy_ioctl<-1,EINVAL>);
Packit 534379
  res = check_interrupts_supported(handle_accel_,&obj);
Packit 534379
  EXPECT_EQ(FPGA_INVALID_PARAM,res);
Packit 534379
Packit 534379
  // change sysfspath
Packit 534379
  strncpy(t->sysfspath, "null", 5);
Packit 534379
  res = check_interrupts_supported(handle_accel_,&obj);
Packit 534379
  EXPECT_NE(FPGA_OK,res);
Packit 534379
}
Packit 534379
Packit 534379
/**
Packit 534379
 * @test       afu_driver_unregister_event
Packit 534379
 * @brief      Given invalid ioctls, driver_unregister_event returns
Packit 534379
 *             FPGA_INVALID_PARAM.
Packit 534379
 */
Packit 534379
TEST_P(events_mock_p, afu_driver_unregister_event){
Packit 534379
  // Invalid ioctl
Packit 534379
  gEnableIRQ = true;
Packit 534379
  system_->register_ioctl_handler(FPGA_PORT_GET_INFO, port_info);
Packit 534379
  system_->register_ioctl_handler(FPGA_PORT_ERR_SET_IRQ, dummy_ioctl<-1,EINVAL>);
Packit 534379
  auto res = driver_unregister_event(handle_accel_, FPGA_EVENT_ERROR, eh_);
Packit 534379
  EXPECT_EQ(FPGA_INVALID_PARAM,res);
Packit 534379
Packit 534379
  system_->register_ioctl_handler(FPGA_PORT_UAFU_SET_IRQ, dummy_ioctl<-1,EINVAL>);
Packit 534379
  res = driver_unregister_event(handle_accel_, FPGA_EVENT_INTERRUPT, eh_);
Packit 534379
  EXPECT_EQ(FPGA_EXCEPTION,res);
Packit 534379
Packit 534379
  // Not supported event_type
Packit 534379
  res = driver_unregister_event(handle_accel_, FPGA_EVENT_POWER_THERMAL, eh_);
Packit 534379
  EXPECT_EQ(FPGA_NOT_SUPPORTED,res);
Packit 534379
}
Packit 534379
Packit 534379
/**
Packit 534379
 * @test       irq_event_01
Packit 534379
 *
Packit 534379
 * @brief      Given a driver with IRQ support
Packit 534379
 *             when fpgaRegisterEvent is called for
Packit 534379
 *             an FPGA_DEVICE and FPGA_EVENT_ERROR
Packit 534379
 *             then the call is successful and
Packit 534379
 *             we can receive interrupt events on
Packit 534379
 *             the OS-specific object from the event handle.
Packit 534379
 */
Packit 534379
TEST_P(events_mock_p, irq_event_01) {
Packit 534379
  gEnableIRQ = true;
Packit 534379
  system_->register_ioctl_handler(FPGA_FME_GET_INFO, fme_info);
Packit 534379
  system_->register_ioctl_handler(FPGA_FME_ERR_SET_IRQ, set_fme_irq);
Packit 534379
 
Packit 534379
  ASSERT_EQ(FPGA_OK, xfpga_fpgaRegisterEvent(handle_dev_, FPGA_EVENT_ERROR,
Packit 534379
                                       eh_, 0));
Packit 534379
  int res;
Packit 534379
  int fd = -1;
Packit 534379
Packit 534379
  EXPECT_EQ(FPGA_OK, xfpga_fpgaGetOSObjectFromEventHandle(eh_, &fd));
Packit 534379
  EXPECT_GE(fd, 0);
Packit 534379
Packit 534379
  struct pollfd poll_fd;
Packit 534379
  int maxpolls = 20;
Packit 534379
Packit 534379
  poll_fd.fd      = fd;
Packit 534379
  poll_fd.events  = POLLIN | POLLPRI;
Packit 534379
  poll_fd.revents = 0;
Packit 534379
Packit 534379
  do
Packit 534379
  {
Packit 534379
    res = poll(&poll_fd, 1, 1000);
Packit 534379
    ASSERT_GE(res, 0);
Packit 534379
    --maxpolls;
Packit 534379
    ASSERT_GT(maxpolls, 0);
Packit 534379
  } while(res == 0);
Packit 534379
Packit 534379
  EXPECT_EQ(res, 1);
Packit 534379
  EXPECT_NE(poll_fd.revents, 0);
Packit 534379
Packit 534379
  EXPECT_EQ(FPGA_OK, xfpga_fpgaUnregisterEvent(handle_dev_, FPGA_EVENT_ERROR,
Packit 534379
                                         eh_));
Packit 534379
}
Packit 534379
Packit 534379
/**
Packit 534379
 * @test       irq_event_02
Packit 534379
 *
Packit 534379
 * @brief      Given a driver with IRQ support
Packit 534379
 *             when fpgaRegisterEvent is called for
Packit 534379
 *             an FPGA_ACCELERATOR and FPGA_EVENT_ERROR
Packit 534379
 *             then the call is successful and
Packit 534379
 *             we can receive interrupt events on
Packit 534379
 *             the OS-specific object from the event handle.
Packit 534379
 *
Packit 534379
 */
Packit 534379
TEST_P(events_mock_p, irq_event_02) {
Packit 534379
  gEnableIRQ = true;
Packit 534379
  system_->register_ioctl_handler(FPGA_PORT_GET_INFO, port_info);
Packit 534379
  system_->register_ioctl_handler(FPGA_PORT_ERR_SET_IRQ, set_port_irq);
Packit 534379
 
Packit 534379
  ASSERT_EQ(FPGA_OK, xfpga_fpgaRegisterEvent(handle_accel_, FPGA_EVENT_ERROR, eh_, 0));
Packit 534379
Packit 534379
  int res;
Packit 534379
  int fd = -1;
Packit 534379
Packit 534379
  EXPECT_EQ(FPGA_OK, xfpga_fpgaGetOSObjectFromEventHandle(eh_, &fd));
Packit 534379
  EXPECT_GE(fd, 0);
Packit 534379
Packit 534379
  struct pollfd poll_fd;
Packit 534379
  int maxpolls = 20;
Packit 534379
Packit 534379
  poll_fd.fd      = fd;
Packit 534379
  poll_fd.events  = POLLIN | POLLPRI;
Packit 534379
  poll_fd.revents = 0;
Packit 534379
Packit 534379
  do
Packit 534379
  {
Packit 534379
    res = poll(&poll_fd, 1, 1000);
Packit 534379
    ASSERT_GE(res, 0);
Packit 534379
    --maxpolls;
Packit 534379
    ASSERT_GT(maxpolls, 0);
Packit 534379
  } while(res == 0);
Packit 534379
Packit 534379
  EXPECT_EQ(res, 1);
Packit 534379
  EXPECT_NE(poll_fd.revents, 0);
Packit 534379
Packit 534379
  EXPECT_EQ(FPGA_OK, xfpga_fpgaUnregisterEvent(handle_accel_, FPGA_EVENT_ERROR, eh_));
Packit 534379
}
Packit 534379
Packit 534379
/**
Packit 534379
 * @test       irq_event_03
Packit 534379
 *
Packit 534379
 * @brief      Given a driver with IRQ support
Packit 534379
 *             when fpgaRegisterEvent is called for
Packit 534379
 *             an FPGA_ACCELERATOR and FPGA_EVENT_INTERRUPT
Packit 534379
 *             then the call is successful and
Packit 534379
 *             we can receive interrupt events on
Packit 534379
 *             the OS-specific object from the event handle.
Packit 534379
 *
Packit 534379
 */
Packit 534379
TEST_P(events_mock_p, irq_event_03) {
Packit 534379
  gEnableIRQ = true;
Packit 534379
  system_->register_ioctl_handler(FPGA_PORT_GET_INFO, port_info);
Packit 534379
  system_->register_ioctl_handler(FPGA_PORT_UAFU_SET_IRQ, set_uport_irq);
Packit 534379
 
Packit 534379
  ASSERT_EQ(FPGA_OK, xfpga_fpgaRegisterEvent(handle_accel_, FPGA_EVENT_INTERRUPT,
Packit 534379
                                       eh_, 0));
Packit 534379
Packit 534379
  int res;
Packit 534379
  int fd = -1;
Packit 534379
Packit 534379
  EXPECT_EQ(FPGA_OK, xfpga_fpgaGetOSObjectFromEventHandle(eh_, &fd));
Packit 534379
  EXPECT_GE(fd, 0);
Packit 534379
Packit 534379
  struct pollfd poll_fd;
Packit 534379
  int maxpolls = 20;
Packit 534379
Packit 534379
  poll_fd.fd      = fd;
Packit 534379
  poll_fd.events  = POLLIN | POLLPRI;
Packit 534379
  poll_fd.revents = 0;
Packit 534379
Packit 534379
  do
Packit 534379
  {
Packit 534379
    res = poll(&poll_fd, 1, 1000);
Packit 534379
    ASSERT_GE(res, 0);
Packit 534379
    --maxpolls;
Packit 534379
    ASSERT_GT(maxpolls, 0);
Packit 534379
  } while(res == 0);
Packit 534379
Packit 534379
  EXPECT_EQ(res, 1);
Packit 534379
  EXPECT_NE(poll_fd.revents, 0);
Packit 534379
Packit 534379
  EXPECT_EQ(FPGA_OK, xfpga_fpgaUnregisterEvent(handle_accel_, FPGA_EVENT_INTERRUPT,
Packit 534379
                                         eh_));
Packit 534379
}
Packit 534379
Packit 534379
INSTANTIATE_TEST_CASE_P(events, events_mock_p,
Packit 534379
                        ::testing::ValuesIn(test_platform::mock_platforms({ "skx-p","dcp-rc" })));