Blame tests/fpgaconf/test_fpgaconf_c.cpp

Packit 534379
// Copyright(c) 2018-2019, 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
#include <opae/fpga.h>
Packit 534379
#include <libbitstream/bitstream.h>
Packit 534379
#include "gtest/gtest.h"
Packit 534379
#include "mock/test_system.h"
Packit 534379
#include "mock/test_utils.h"
Packit 534379
extern "C" {
Packit 534379
Packit 534379
#include <json-c/json.h>
Packit 534379
#include <uuid/uuid.h>
Packit 534379
Packit 534379
struct config {
Packit 534379
  unsigned int verbosity;
Packit 534379
  bool dry_run;
Packit 534379
  enum { INTERACTIVE, /* ask if ambiguous */
Packit 534379
         NORMAL,      /* stop if ambiguous */
Packit 534379
         AUTOMATIC    /* choose if ambiguous */
Packit 534379
       } mode;
Packit 534379
  int flags;
Packit 534379
  struct target {
Packit 534379
    int segment;
Packit 534379
    int bus;
Packit 534379
    int device;
Packit 534379
    int function;
Packit 534379
    int socket;
Packit 534379
  } target;
Packit 534379
  char *filename;
Packit 534379
};
Packit 534379
extern struct config config;
Packit 534379
Packit 534379
void help(void);
Packit 534379
Packit 534379
void print_err(const char *s, fpga_result res);
Packit 534379
Packit 534379
void print_msg(unsigned int verbosity, const char *s);
Packit 534379
Packit 534379
int parse_args(int argc, char *argv[]);
Packit 534379
Packit 534379
int print_interface_id(fpga_guid actual_interface_id);
Packit 534379
Packit 534379
int find_fpga(fpga_guid interface_id, fpga_token *fpga);
Packit 534379
Packit 534379
int program_bitstream(fpga_token token, uint32_t slot_num,
Packit 534379
                      opae_bitstream_info *info, int flags);
Packit 534379
Packit 534379
int fpgaconf_main(int argc, char *argv[]);
Packit 534379
Packit 534379
}
Packit 534379
Packit 534379
fpga_guid test_guid = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
Packit 534379
                        0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef };
Packit 534379
Packit 534379
#include <config.h>
Packit 534379
#include <iostream>
Packit 534379
#include <fstream>
Packit 534379
#include <vector>
Packit 534379
#include <cstdio>
Packit 534379
#include <cstdlib>
Packit 534379
#include <cstring>
Packit 534379
#include <errno.h>
Packit 534379
#include <unistd.h>
Packit 534379
using namespace opae::testing;
Packit 534379
Packit 534379
class fpgaconf_c_p : public ::testing::TestWithParam<std::string> {
Packit 534379
 protected:
Packit 534379
  fpgaconf_c_p() {}
Packit 534379
Packit 534379
  virtual void SetUp() override {
Packit 534379
    strcpy(tmp_gbs_, "tmp-XXXXXX.gbs");
Packit 534379
    close(mkstemps(tmp_gbs_, 4));
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
    EXPECT_EQ(fpgaInitialize(NULL), FPGA_OK);
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", int32_t(1))
Packit 534379
    ("afu-image", jobject
Packit 534379
                  ("clock-frequency-high", int32_t(312))
Packit 534379
		  ("clock-frequency-low", int32_t(156))
Packit 534379
		  ("power", int32_t(50))
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", "platformX");
Packit 534379
Packit 534379
    bitstream_valid_ = system_->assemble_gbs_header(platform_.devices[0], bitstream_j.c_str());
Packit 534379
    bitstream_j.put();
Packit 534379
Packit 534379
    std::ofstream gbs;
Packit 534379
    gbs.open(tmp_gbs_, std::ios::out|std::ios::binary);
Packit 534379
    gbs.write((const char *) bitstream_valid_.data(), bitstream_valid_.size());
Packit 534379
    gbs.close();
Packit 534379
Packit 534379
    optind = 0;
Packit 534379
    config_ = config;
Packit 534379
  }
Packit 534379
Packit 534379
  virtual void TearDown() override {
Packit 534379
    config = config_;
Packit 534379
    fpgaFinalize();
Packit 534379
    system_->finalize();
Packit 534379
    if (!::testing::Test::HasFatalFailure() &&
Packit 534379
        !::testing::Test::HasNonfatalFailure()) {
Packit 534379
      unlink(tmp_gbs_);
Packit 534379
    }
Packit 534379
  }
Packit 534379
Packit 534379
  void copy_bitstream(std::string path) {
Packit 534379
    copy_gbs_ = path;
Packit 534379
    std::ifstream src(tmp_gbs_, std::ios::binary);
Packit 534379
    std::ofstream dst(copy_gbs_, std::ios::binary);
Packit 534379
  
Packit 534379
    dst << src.rdbuf(); 
Packit 534379
  }
Packit 534379
Packit 534379
  char tmp_gbs_[20];
Packit 534379
  std::string copy_gbs_;
Packit 534379
  std::vector<uint8_t> bitstream_valid_;
Packit 534379
  struct config config_;
Packit 534379
  test_platform platform_;
Packit 534379
  test_system *system_;
Packit 534379
};
Packit 534379
Packit 534379
/**
Packit 534379
 * @test       help
Packit 534379
 * @brief      Test: help
Packit 534379
 * @details    help displays the application help message.
Packit 534379
 */
Packit 534379
TEST_P(fpgaconf_c_p, help) {
Packit 534379
  help();
Packit 534379
}
Packit 534379
Packit 534379
/**
Packit 534379
 * @test       print_err
Packit 534379
 * @brief      Test: print_err
Packit 534379
 * @details    print_err sends the given string and a decoding of the fpga_result
Packit 534379
 *             to stderr.
Packit 534379
 */
Packit 534379
TEST_P(fpgaconf_c_p, print_err) {
Packit 534379
  print_err("msg", FPGA_OK);
Packit 534379
}
Packit 534379
Packit 534379
/**
Packit 534379
 * @test       print_msg
Packit 534379
 * @brief      Test: print_msg
Packit 534379
 * @details    print_msg sends the given string to stdout
Packit 534379
 *             if the given verbosity is less than or equal config.verbosity.
Packit 534379
 */
Packit 534379
TEST_P(fpgaconf_c_p, print_msg) {
Packit 534379
  print_msg(0, "msg");
Packit 534379
}
Packit 534379
Packit 534379
/**
Packit 534379
 * @test       parse_args0
Packit 534379
 * @brief      Test: parse_args
Packit 534379
 * @details    When given an invalid command option,
Packit 534379
 *             parse_args returns a negative value.
Packit 534379
 */
Packit 534379
TEST_P(fpgaconf_c_p, parse_args0) {
Packit 534379
  char zero[20];
Packit 534379
  char one[20];
Packit 534379
  strcpy(zero, "fpgaconf");
Packit 534379
  strcpy(one, "-Y");
Packit 534379
Packit 534379
  char *argv[] = { zero, one };
Packit 534379
Packit 534379
  EXPECT_LT(parse_args(2, argv), 0);
Packit 534379
}
Packit 534379
Packit 534379
/**
Packit 534379
 * @test       parse_args1
Packit 534379
 * @brief      Test: parse_args
Packit 534379
 * @details    When given valid command options,
Packit 534379
 *             parse_args populates the global config struct
Packit 534379
 *             and the fn returns 0.
Packit 534379
 */
Packit 534379
TEST_P(fpgaconf_c_p, parse_args1) {
Packit 534379
  char tmpfilename[] = "tmp-empty-XXXXXX.gbs";
Packit 534379
  close(mkstemps(tmpfilename, 4));
Packit 534379
  char zero[20];
Packit 534379
  char one[20];
Packit 534379
  char two[20];
Packit 534379
  char three[20];
Packit 534379
  char four[20];
Packit 534379
  char five[20];
Packit 534379
  char six[20];
Packit 534379
  char seven[20];
Packit 534379
  char eight[20];
Packit 534379
  char nine[20];
Packit 534379
  char ten[20];
Packit 534379
  char eleven[20];
Packit 534379
  char twelve[20];
Packit 534379
  char thirteen[20];
Packit 534379
  char fourteen[20];
Packit 534379
  char fifteen[20];
Packit 534379
  char sixteen[30];
Packit 534379
  strcpy(zero, "fpgaconf");
Packit 534379
  strcpy(one, "-V");
Packit 534379
  strcpy(two, "-n");
Packit 534379
  strcpy(three, "--force");
Packit 534379
  strcpy(four, "--segment");
Packit 534379
  strcpy(five, "0x1234");
Packit 534379
  strcpy(six, "-B");
Packit 534379
  strcpy(seven, "0x5e");
Packit 534379
  strcpy(eight, "-D");
Packit 534379
  strcpy(nine, "0xab");
Packit 534379
  strcpy(ten, "-F");
Packit 534379
  strcpy(eleven, "3");
Packit 534379
  strcpy(twelve, "-S");
Packit 534379
  strcpy(thirteen, "2");
Packit 534379
  strcpy(fourteen, "-A");
Packit 534379
  strcpy(fifteen, "-I");
Packit 534379
  strcpy(sixteen, tmpfilename);
Packit 534379
Packit 534379
  char *argv[] = { zero, one, two, three, four,
Packit 534379
                   five, six, seven, eight, nine,
Packit 534379
                   ten, eleven, twelve, thirteen, fourteen,
Packit 534379
                   fifteen, sixteen };
Packit 534379
Packit 534379
  EXPECT_EQ(parse_args(17, argv), 0);
Packit 534379
  EXPECT_EQ(config.verbosity, 1);
Packit 534379
  EXPECT_NE(config.dry_run, 0);
Packit 534379
  EXPECT_NE(config.flags & FPGA_RECONF_FORCE, 0);
Packit 534379
  EXPECT_EQ(config.target.segment, 0x1234);
Packit 534379
  EXPECT_EQ(config.target.bus, 0x5e);
Packit 534379
  EXPECT_EQ(config.target.device, 0xab);
Packit 534379
  EXPECT_EQ(config.target.function, 3);
Packit 534379
  EXPECT_EQ(config.target.socket, 2);
Packit 534379
  EXPECT_EQ(config.mode, 0);
Packit 534379
  ASSERT_NE(config.filename, nullptr);
Packit 534379
  EXPECT_STREQ(basename(config.filename), tmpfilename);
Packit 534379
  free(config.filename);
Packit 534379
  unlink(tmpfilename);
Packit 534379
}
Packit 534379
Packit 534379
/**
Packit 534379
 * @test       parse_args2
Packit 534379
 * @brief      Test: parse_args
Packit 534379
 * @details    When given "-h",
Packit 534379
 *             parse_args prints the help message and returns a negative value.
Packit 534379
 */
Packit 534379
TEST_P(fpgaconf_c_p, parse_args2) {
Packit 534379
  char zero[20];
Packit 534379
  char one[20];
Packit 534379
  strcpy(zero, "fpgaconf");
Packit 534379
  strcpy(one, "-h");
Packit 534379
Packit 534379
  char *argv[] = { zero, one };
Packit 534379
Packit 534379
  EXPECT_LT(parse_args(2, argv), 0);
Packit 534379
}
Packit 534379
Packit 534379
/**
Packit 534379
 * @test       invalid_parse_args1
Packit 534379
 * @brief      Test: parse_args
Packit 534379
 * @details    When given an invalid command options,
Packit 534379
 *             parse_args populates the global config struct
Packit 534379
 *             and the fn returns -1.
Packit 534379
 */
Packit 534379
TEST_P(fpgaconf_c_p, invalid_parse_args1) {
Packit 534379
  char zero[32];
Packit 534379
  char one[32];
Packit 534379
  char two[32];
Packit 534379
  char three[36];
Packit 534379
  char four[32];
Packit 534379
  char five[32];
Packit 534379
  char six[32];
Packit 534379
  char seven[32];
Packit 534379
  char eight[32];
Packit 534379
  char nine[32];
Packit 534379
  char ten[48];
Packit 534379
  char eleven[32];
Packit 534379
  char twelve[32];
Packit 534379
  char thirteen[32];
Packit 534379
  strcpy(zero, " fpgaconf Q&%^#;'kk/");
Packit 534379
  strcpy(one, "-verbosesss \n\t\b\e\a\?");
Packit 534379
  strcpy(two, "--n");
Packit 534379
  strcpy(three, "--f123 23ksfa;.'/'l|hrce");
Packit 534379
  strcpy(four, "--se!gmentt  lsdfhskfa");
Packit 534379
  strcpy(five, "0x1234");
Packit 534379
  strcpy(six, "-bussssss");
Packit 534379
  strcpy(seven, "0x5e");
Packit 534379
  strcpy(eight, "-Devic\xF0\x90sss \t\n\b\a\e\v");
Packit 534379
  strcpy(nine, "0xab");
Packit 534379
  strcpy(ten, " =====%34 -Function \x09\x0B\x0D");
Packit 534379
  strcpy(eleven, "3");
Packit 534379
  strcpy(twelve, "-Socket__ \xF1-\xF3 \x8F");
Packit 534379
  strcpy(thirteen, "2");
Packit 534379
Packit 534379
  char *argv[] = { zero, one, two, three, four,
Packit 534379
                   five, six, seven, eight, nine,
Packit 534379
                   ten, eleven, twelve, thirteen };
Packit 534379
Packit 534379
  EXPECT_LT(parse_args(14, argv), 0);
Packit 534379
}
Packit 534379
Packit 534379
/**
Packit 534379
 * @test       invalid_parse_args2
Packit 534379
 * @brief      Test: parse_args
Packit 534379
 * @details    When given an invalid command options,
Packit 534379
 *             parse_args populates the global config struct
Packit 534379
 *             and the fn returns -1.
Packit 534379
 */
Packit 534379
TEST_P(fpgaconf_c_p, invalid_parse_args2) {
Packit 534379
  char zero[20];
Packit 534379
  char one[20];
Packit 534379
  char two[20];
Packit 534379
  char three[20];
Packit 534379
  char four[20];
Packit 534379
  char five[20];
Packit 534379
  char six[20];
Packit 534379
  char seven[20];
Packit 534379
  char eight[20];
Packit 534379
  char nine[20];
Packit 534379
  char ten[20];
Packit 534379
  char eleven[20];
Packit 534379
  char twelve[20];
Packit 534379
  char thirteen[20];
Packit 534379
  char fourteen[20];
Packit 534379
  strcpy(zero, "        ");
Packit 534379
  strcpy(one, "-v");
Packit 534379
  strcpy(two, "-n");
Packit 534379
  strcpy(three, "--force");
Packit 534379
  strcpy(four, "--segment");
Packit 534379
  strcpy(five, "0xffff1234");
Packit 534379
  strcpy(six, "-B");
Packit 534379
  strcpy(seven, "0x5eeeeeeeee");
Packit 534379
  strcpy(eight, "-D");
Packit 534379
  strcpy(nine, "0xab124 \xF1 0");
Packit 534379
  strcpy(ten, "-F");
Packit 534379
  strcpy(eleven, "-33492\t000");
Packit 534379
  strcpy(twelve, "-S");
Packit 534379
  strcpy(thirteen, "\000 00000000");
Packit 534379
  strcpy(fourteen, "-A");
Packit 534379
Packit 534379
  char *argv[] = { zero, one, two, three,
Packit 534379
                   ten, eleven, twelve, thirteen, fourteen,
Packit 534379
                   four, five, six, seven, eight, nine};
Packit 534379
Packit 534379
  EXPECT_LT(parse_args(15, argv), 0);
Packit 534379
} 
Packit 534379
Packit 534379
/*
Packit 534379
 * @test       parse_args3
Packit 534379
 * @brief      Test: parse_args
Packit 534379
 * @details    When given a gbs file that does not exist
Packit 534379
 *             parse_args fails at parsing the command line
Packit 534379
 *             and the fn returns non-zero value
Packit 534379
 */
Packit 534379
TEST_P(fpgaconf_c_p, parse_args3) {
Packit 534379
  const char *argv[] = { "fpgaconf", "no-file.gbs" };
Packit 534379
  EXPECT_NE(parse_args(2, (char**)argv), 0);
Packit 534379
}
Packit 534379
Packit 534379
/**
Packit 534379
 * @test       ifc_id1
Packit 534379
 * @brief      Test: print_interface_id
Packit 534379
 * @details    When the given config.target settings match no device,
Packit 534379
 *             print_interface_id returns 0.
Packit 534379
 */
Packit 534379
TEST_P(fpgaconf_c_p, ifc_id1) {
Packit 534379
  config.target.bus = 0xff;
Packit 534379
  EXPECT_EQ(print_interface_id(test_guid), 0);
Packit 534379
}
Packit 534379
Packit 534379
/**
Packit 534379
 * @test       find_fpga0
Packit 534379
 * @brief      Test: find_fpga
Packit 534379
 * @details    When the given config.target settings match no device,
Packit 534379
 *             find_fpga returns 0.
Packit 534379
 */
Packit 534379
TEST_P(fpgaconf_c_p, find_fpga0) {
Packit 534379
  config.target.bus = 0xff;
Packit 534379
  fpga_token tok = nullptr;
Packit 534379
  EXPECT_EQ(find_fpga(test_guid, &tok), 0);
Packit 534379
  EXPECT_EQ(tok, nullptr);
Packit 534379
}
Packit 534379
Packit 534379
/**
Packit 534379
 * @test       main0
Packit 534379
 * @brief      Test: fpgaconf_main
Packit 534379
 * @details    When the command params are invalid,
Packit 534379
 *             fpgaconf_main returns 1.
Packit 534379
 */
Packit 534379
TEST_P(fpgaconf_c_p, main0) {
Packit 534379
  char zero[20];
Packit 534379
  char one[20];
Packit 534379
  strcpy(zero, "fpgaconf");
Packit 534379
  strcpy(one, "-Y");
Packit 534379
Packit 534379
  char *argv[] = { zero, one };
Packit 534379
Packit 534379
  EXPECT_EQ(fpgaconf_main(2, argv), 1);
Packit 534379
}
Packit 534379
Packit 534379
/**
Packit 534379
 * @test       main1
Packit 534379
 * @brief      Test: fpgaconf_main
Packit 534379
 * @details    When the command params are valid,
Packit 534379
 *             and they identify a valid accelerator device,
Packit 534379
 *             fpgaconf_main loads the bitstream, finds the device,
Packit 534379
 *             and PR's it, returning 0.
Packit 534379
 */
Packit 534379
TEST_P(fpgaconf_c_p, main1) {
Packit 534379
  char zero[20];
Packit 534379
  char one[20];
Packit 534379
  char two[20];
Packit 534379
  char three[20];
Packit 534379
  char four[20];
Packit 534379
  char five[20];
Packit 534379
  char six[20];
Packit 534379
  char seven[20];
Packit 534379
  char eight[20];
Packit 534379
  char nine[20];
Packit 534379
  char ten[20];
Packit 534379
  strcpy(zero, "fpgaconf");
Packit 534379
  strcpy(one, "-n");
Packit 534379
  strcpy(two, "--segment");
Packit 534379
  sprintf(three, "%d", platform_.devices[0].segment);
Packit 534379
  strcpy(four, "-B");
Packit 534379
  sprintf(five, "%d", platform_.devices[0].bus);
Packit 534379
  strcpy(six, "-D");
Packit 534379
  sprintf(seven, "%d", platform_.devices[0].device);
Packit 534379
  strcpy(eight, "-F");
Packit 534379
  sprintf(nine, "%d", platform_.devices[0].function);
Packit 534379
  strcpy(ten, tmp_gbs_);
Packit 534379
Packit 534379
  char *argv[] = { zero, one, two, three, four,
Packit 534379
                   five, six, seven, eight, nine,
Packit 534379
		   ten };
Packit 534379
Packit 534379
  EXPECT_EQ(fpgaconf_main(11, argv), 0);
Packit 534379
}
Packit 534379
Packit 534379
/**
Packit 534379
 * @test       main2
Packit 534379
 * @brief      Test: fpgaconf_main
Packit 534379
 * @details    When the command params are valid,
Packit 534379
 *             but no valid accelerator device can be found,
Packit 534379
 *             fpgaconf_main displays an error and returns non-zero.
Packit 534379
 */
Packit 534379
TEST_P(fpgaconf_c_p, main2) {
Packit 534379
  char zero[20];
Packit 534379
  char one[20];
Packit 534379
  char two[20];
Packit 534379
  char three[20];
Packit 534379
  char four[20];
Packit 534379
  char five[20];
Packit 534379
  strcpy(zero, "fpgaconf");
Packit 534379
  strcpy(one, "-v");
Packit 534379
  strcpy(two, "-n");
Packit 534379
  strcpy(three, "-B");
Packit 534379
  strcpy(four, "0xff");
Packit 534379
  strcpy(five, tmp_gbs_);
Packit 534379
Packit 534379
  char *argv[] = { zero, one, two, three, four,
Packit 534379
                   five };
Packit 534379
Packit 534379
  EXPECT_NE(fpgaconf_main(6, argv), 0);
Packit 534379
}
Packit 534379
Packit 534379
/**
Packit 534379
 * @test       main_seg_neg
Packit 534379
 * @brief      Test: fpgaconf_main
Packit 534379
 * @details    When the command params for sement are invalid,
Packit 534379
 *             fpgaconf_main displays an error and returns non-zero.
Packit 534379
 */
Packit 534379
TEST_P(fpgaconf_c_p, main_seg_neg) {
Packit 534379
  char zero[20];
Packit 534379
  char one[20];
Packit 534379
  char two[20];
Packit 534379
  strcpy(zero, "fpgaconf");
Packit 534379
  strcpy(one, "--segment");
Packit 534379
  strcpy(two, "k");
Packit 534379
Packit 534379
  char *argv[] = { zero, one, two };
Packit 534379
Packit 534379
  EXPECT_NE(fpgaconf_main(3, argv), 0);
Packit 534379
}
Packit 534379
Packit 534379
/**
Packit 534379
 * @test       main_bus_neg
Packit 534379
 * @brief      Test: fpgaconf_main
Packit 534379
 * @details    When the command params for bus are invalid,
Packit 534379
 *             fpgaconf_main displays an error and returns non-zero.
Packit 534379
 */
Packit 534379
TEST_P(fpgaconf_c_p, main_bus_neg) {
Packit 534379
  char zero[20];
Packit 534379
  char one[20];
Packit 534379
  char two[20];
Packit 534379
  strcpy(zero, "fpgaconf");
Packit 534379
  strcpy(one, "-B");
Packit 534379
  strcpy(two, "k");
Packit 534379
Packit 534379
  char *argv[] = { zero, one, two };
Packit 534379
Packit 534379
  EXPECT_NE(fpgaconf_main(3, argv), 0);
Packit 534379
}
Packit 534379
Packit 534379
/**
Packit 534379
 * @test       main_dev_neg
Packit 534379
 * @brief      Test: fpgaconf_main
Packit 534379
 * @details    When the command params for device are invalid,
Packit 534379
 *             fpgaconf_main displays an error and returns non-zero.
Packit 534379
 */
Packit 534379
TEST_P(fpgaconf_c_p, main_dev_neg) {
Packit 534379
  char zero[20];
Packit 534379
  char one[20];
Packit 534379
  char two[20];
Packit 534379
  strcpy(zero, "fpgaconf");
Packit 534379
  strcpy(one, "-D");
Packit 534379
  strcpy(two, "k");
Packit 534379
Packit 534379
  char *argv[] = { zero, one, two };
Packit 534379
Packit 534379
  EXPECT_NE(fpgaconf_main(3, argv), 0);
Packit 534379
}
Packit 534379
Packit 534379
/**
Packit 534379
 * @test       main_soc_neg
Packit 534379
 * @brief      Test: fpgaconf_main
Packit 534379
 * @details    When the command params for socket are invalid,
Packit 534379
 *             fpgaconf_main displays an error and returns non-zero.
Packit 534379
 */
Packit 534379
TEST_P(fpgaconf_c_p, main_soc_neg) {
Packit 534379
  char zero[20];
Packit 534379
  char one[20];
Packit 534379
  char two[20];
Packit 534379
  strcpy(zero, "fpgaconf");
Packit 534379
  strcpy(one, "-S");
Packit 534379
  strcpy(two, "k");
Packit 534379
Packit 534379
  char *argv[] = { zero, one, two };
Packit 534379
Packit 534379
  EXPECT_NE(fpgaconf_main(3, argv), 0);
Packit 534379
}
Packit 534379
Packit 534379
/**
Packit 534379
 * @test       main_missing_arg
Packit 534379
 * @brief      Test: fpgaconf_main
Packit 534379
 * @details    When the command params is missing an argument,
Packit 534379
 *             fpgaconf_main displays an error and returns non-zero.
Packit 534379
 */
Packit 534379
TEST_P(fpgaconf_c_p, main_missing_arg) {
Packit 534379
  char zero[20];
Packit 534379
  char one[20];
Packit 534379
  strcpy(zero, "fpgaconf");
Packit 534379
  strcpy(one, "-S");
Packit 534379
Packit 534379
  char *argv[] = { zero, one };
Packit 534379
Packit 534379
  EXPECT_NE(fpgaconf_main(2, argv), 0);
Packit 534379
}
Packit 534379
Packit 534379
/**
Packit 534379
 * @test       main_missing_gbs
Packit 534379
 * @brief      Test: fpgaconf_main
Packit 534379
 * @details    When the command params is missing the gbs param,
Packit 534379
 *             fpgaconf_main displays an error and returns non-zero.
Packit 534379
 */
Packit 534379
TEST_P(fpgaconf_c_p, main_missing_gbs) {
Packit 534379
  char zero[20];
Packit 534379
  strcpy(zero, "fpgaconf");
Packit 534379
Packit 534379
  char *argv[] = { zero };
Packit 534379
Packit 534379
  EXPECT_NE(fpgaconf_main(1, argv), 0);
Packit 534379
}
Packit 534379
Packit 534379
/**
Packit 534379
 * @test       embed_nullchar
Packit 534379
 * @brief      Test: fpgaconf_main
Packit 534379
 * @details    When the command params contains nullbyte,
Packit 534379
 *             fpgaconf_main displays an error and returns non-zero.
Packit 534379
 */
Packit 534379
TEST_P(fpgaconf_c_p, embed_nullchar1) {
Packit 534379
  copy_bitstream("copy_bitstream.gbs");
Packit 534379
  const char *argv[] = { "fpgaconf", "-B", "0x5e", "copy_bitstream\0.gbs"};
Packit 534379
Packit 534379
  EXPECT_NE(fpgaconf_main(4, (char**)argv), 0);
Packit 534379
  unlink(copy_gbs_.c_str());
Packit 534379
}
Packit 534379
Packit 534379
TEST_P(fpgaconf_c_p, embed_nullchar2) {
Packit 534379
  copy_bitstream("copy_bitstream.gbs");
Packit 534379
  const char *argv[] = { "fpgaconf", "-B", "0x5e", "\0 copy_bitstream.gbs"};
Packit 534379
Packit 534379
  EXPECT_NE(fpgaconf_main(4, (char**)argv), 0);
Packit 534379
  unlink(copy_gbs_.c_str());
Packit 534379
}
Packit 534379
Packit 534379
/**
Packit 534379
 * @test       encoding_path
Packit 534379
 * @brief      Test: fpgaconf_main
Packit 534379
 * @details    When command param is encoding path,
Packit 534379
 *             fpgaconf_main displays file error and returns non-zero.
Packit 534379
 */
Packit 534379
TEST_P(fpgaconf_c_p, encoding_path) {
Packit 534379
  copy_bitstream("copy_bitstream.gbs");
Packit 534379
  char zero[32];
Packit 534379
  char one[32];
Packit 534379
  char two[32];
Packit 534379
  char three[40];
Packit 534379
  strcpy(zero, "fpgaconf");
Packit 534379
  strcpy(one, "-B");
Packit 534379
  strcpy(two, "0x5e");
Packit 534379
Packit 534379
  char *argv[] = { zero, one, two, three};
Packit 534379
Packit 534379
  // File not found
Packit 534379
  strcpy(three, "copy_bitstream%2egbs");
Packit 534379
  EXPECT_NE(fpgaconf_main(4, argv), 0);
Packit 534379
Packit 534379
  // File not found
Packit 534379
  memset(three, 0, sizeof(three));
Packit 534379
  strcpy(three, "copy_bitstream..gbs");
Packit 534379
  EXPECT_NE(fpgaconf_main(4, argv), 0);
Packit 534379
  
Packit 534379
  // File not found
Packit 534379
  memset(three, 0, sizeof(three));
Packit 534379
  strcpy(three, "....copy_bitstream.gbs");
Packit 534379
  EXPECT_NE(fpgaconf_main(4, argv), 0);
Packit 534379
Packit 534379
  // File not found
Packit 534379
  memset(three, 0, sizeof(three));
Packit 534379
  strcpy(three, "%252E%252E%252Fcopy_bitstream.gbs");
Packit 534379
  EXPECT_NE(fpgaconf_main(4, argv), 0);
Packit 534379
Packit 534379
  unlink(copy_gbs_.c_str());
Packit 534379
}
Packit 534379
Packit 534379
/**
Packit 534379
 * @test       relative_path
Packit 534379
 * @brief      Test: fpgaconf_main
Packit 534379
 * @details    When gbs file locates in parent directory and command params
Packit 534379
 *             contains path traversal. On success, fpgaconf_main loads bitstream
Packit 534379
 *             and returns zero. Otherwise, it displays file error and returns non-zero.
Packit 534379
 */
Packit 534379
TEST_P(fpgaconf_c_p, relative_path) {
Packit 534379
  copy_bitstream("../copy_bitstream.gbs");
Packit 534379
  char zero[32];
Packit 534379
  char one[32];
Packit 534379
  char two[32];
Packit 534379
  char three[32];
Packit 534379
  char four[32];
Packit 534379
  strcpy(zero, "fpgaconf");
Packit 534379
  strcpy(one, "-n");
Packit 534379
  strcpy(two, "-B");
Packit 534379
  strcpy(three, "0x5e");
Packit 534379
Packit 534379
  char *argv[] = { zero, one, two, three, four};
Packit 534379
Packit 534379
  strcpy(four, "../copy_bitstream.gbs");
Packit 534379
  EXPECT_EQ(fpgaconf_main(5, argv), 0);
Packit 534379
Packit 534379
  // Fail not found
Packit 534379
  memset(four, 0, sizeof(four));
Packit 534379
  strcpy(four, "../..../copy_bitstream.gbs");
Packit 534379
  EXPECT_NE(fpgaconf_main(5, argv), 0);
Packit 534379
Packit 534379
  // Fail not found
Packit 534379
  memset(four, 0, sizeof(four));
Packit 534379
  strcpy(four, "..%2fcopy_bitstream.gbs");
Packit 534379
  EXPECT_NE(fpgaconf_main(5, argv), 0);
Packit 534379
Packit 534379
  // Fail not found
Packit 534379
  memset(four, 0, sizeof(four));
Packit 534379
  strcpy(four, "%2e%2e/copy_bitstream.gbs");
Packit 534379
  EXPECT_NE(fpgaconf_main(5, argv), 0);
Packit 534379
Packit 534379
  // Fail not found
Packit 534379
  memset(four, 0, sizeof(four));
Packit 534379
  strcpy(four, "%2e%2e%2fcopy_bitstream.gbs");
Packit 534379
  EXPECT_NE(fpgaconf_main(5, argv), 0);
Packit 534379
Packit 534379
  unlink(copy_gbs_.c_str());
Packit 534379
}
Packit 534379
Packit 534379
/**
Packit 534379
 * @test       absolute_path_pos 
Packit 534379
 * @brief      Test: fpgaconf_main
Packit 534379
 * @details    When the command params are valid with absolute gbs path,
Packit 534379
 *             fpgaconf_main loads in bitstream and returns 0.
Packit 534379
 */
Packit 534379
TEST_P(fpgaconf_c_p, absolute_path_pos) {
Packit 534379
  copy_bitstream("copy_bitstream.gbs");
Packit 534379
  char zero[32];
Packit 534379
  char one[32];
Packit 534379
  char two[32];
Packit 534379
  char three[32];
Packit 534379
  char four[128];
Packit 534379
  strcpy(zero, "fpgaconf");
Packit 534379
  strcpy(one, "-n");
Packit 534379
  strcpy(two, "-B");
Packit 534379
  strcpy(three, "0x5e");
Packit 534379
Packit 534379
  char *argv[] = { zero, one, two, three, four};
Packit 534379
  char *current_path = get_current_dir_name();
Packit 534379
  std::string bitstream_path = (std::string)current_path + "/copy_bitstream.gbs";
Packit 534379
Packit 534379
  strcpy(four, bitstream_path.c_str());
Packit 534379
  EXPECT_EQ(fpgaconf_main(5, argv), 0);
Packit 534379
Packit 534379
  free(current_path);
Packit 534379
  unlink(copy_gbs_.c_str());
Packit 534379
}
Packit 534379
Packit 534379
/**
Packit 534379
 * @test       absolute_path_neg 
Packit 534379
 * @brief      Test: fpgaconf_main
Packit 534379
 * @details    When the command params are valid but bitstream data is,
Packit 534379
 *             invalid, fpgaconf_main loads in bitstream and fails to 
Packit 534379
 *             set userclock, it returns none-zero.
Packit 534379
 */
Packit 534379
TEST_P(fpgaconf_c_p, absolute_path_neg) {
Packit 534379
  bitstream_valid_ = system_->assemble_gbs_header(platform_.devices[0]);
Packit 534379
  std::ofstream gbs;
Packit 534379
  gbs.open(tmp_gbs_, std::ios::out|std::ios::binary);
Packit 534379
  gbs.write((const char *) bitstream_valid_.data(), bitstream_valid_.size());
Packit 534379
  gbs.close();
Packit 534379
Packit 534379
  copy_bitstream("copy_bitstream.gbs");
Packit 534379
  char zero[32];
Packit 534379
  char one[32];
Packit 534379
  char two[32];
Packit 534379
  char three[128];
Packit 534379
  strcpy(zero, "fpgaconf");
Packit 534379
  strcpy(one, "-B");
Packit 534379
  strcpy(two, "0x5e");
Packit 534379
Packit 534379
  char *argv[] = { zero, one, two, three};
Packit 534379
  char *current_path = get_current_dir_name();
Packit 534379
  std::string bitstream_path = (std::string)current_path + "/copy_bitstream.gbs";
Packit 534379
Packit 534379
  strcpy(three, bitstream_path.c_str());
Packit 534379
  EXPECT_NE(fpgaconf_main(4, argv), 0);
Packit 534379
Packit 534379
  free(current_path);
Packit 534379
  unlink(copy_gbs_.c_str());
Packit 534379
}
Packit 534379
Packit 534379
/**
Packit 534379
 * @test       read_symlink_bs
Packit 534379
 * @brief      Test: 
Packit 534379
 * @details    Tests for symlink on gbs file. When successful,
Packit 534379
 *             fpgaconf_main loads the bitstream into the gbs_data field
Packit 534379
 *             and the fn returns 0. When file doesn't exist, fpgaconf_main
Packit 534379
 *             displays error and returns -1.
Packit 534379
 */
Packit 534379
TEST_P(fpgaconf_c_p, main_symlink_bs) {
Packit 534379
  copy_bitstream("copy_bitstream.gbs"); 
Packit 534379
  const std::string symlink_gbs = "bits_symlink";
Packit 534379
  char zero[20];
Packit 534379
  char one[20];
Packit 534379
  char two[20];
Packit 534379
  char three[20];
Packit 534379
  char four[20];
Packit 534379
  char five[20];
Packit 534379
  strcpy(zero, "fpgaconf");
Packit 534379
  strcpy(one, "-V");
Packit 534379
  strcpy(two, "-n");
Packit 534379
  strcpy(three, "-B");
Packit 534379
  strcpy(four, "0x5e");
Packit 534379
Packit 534379
  char *argv[] = { zero, one, two, three, four,
Packit 534379
                   five };
Packit 534379
Packit 534379
  auto ret = symlink(copy_gbs_.c_str(), symlink_gbs.c_str());
Packit 534379
  EXPECT_EQ(ret, 0);
Packit 534379
  // Success case
Packit 534379
  strcpy(five, symlink_gbs.c_str());
Packit 534379
  EXPECT_EQ(fpgaconf_main(6, argv), 0);
Packit 534379
Packit 534379
  // remove bitstream file
Packit 534379
  unlink(copy_gbs_.c_str());
Packit 534379
Packit 534379
  // Fail case
Packit 534379
  EXPECT_NE(fpgaconf_main(6, argv), 0);
Packit 534379
  unlink(symlink_gbs.c_str());
Packit 534379
}
Packit 534379
Packit 534379
/**
Packit 534379
 * @test       circular_symlink
Packit 534379
 * @brief      Test: fpgaconf_c_p
Packit 534379
 * @details    Tests for circular symlink on gbs file. 
Packit 534379
 *             fpgaconf_c_p displays error and returns -1.
Packit 534379
 */
Packit 534379
TEST_P(fpgaconf_c_p, circular_symlink) {
Packit 534379
  const std::string symlink_A = "./link1/bits_symlink_A";
Packit 534379
  const std::string symlink_B = "./link2/bits_symlink_B";
Packit 534379
  char zero[20];
Packit 534379
  char one[20];
Packit 534379
  char two[20];
Packit 534379
  char three[20];
Packit 534379
  char four[20];
Packit 534379
  char five[32];
Packit 534379
  strcpy(zero, "fpgaconf");
Packit 534379
  strcpy(one, "-v");
Packit 534379
  strcpy(two, "-n");
Packit 534379
  strcpy(three, "-B");
Packit 534379
  strcpy(four, "0x5e");
Packit 534379
Packit 534379
  char *argv[] = { zero, one, two, three, four,
Packit 534379
                   five };
Packit 534379
Packit 534379
  // Create link directories
Packit 534379
  auto ret = mkdir("./link1", S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH);
Packit 534379
  EXPECT_EQ(ret, 0);
Packit 534379
  ret = mkdir("./link2", S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH);
Packit 534379
  EXPECT_EQ(ret, 0);
Packit 534379
Packit 534379
  // Create circular symlinks
Packit 534379
  ret = symlink("link1", symlink_B.c_str());
Packit 534379
  EXPECT_EQ(ret, 0);
Packit 534379
  ret = symlink("link2", symlink_A.c_str());
Packit 534379
  EXPECT_EQ(ret, 0);
Packit 534379
Packit 534379
  strcpy(five, symlink_A.c_str());
Packit 534379
  EXPECT_NE(fpgaconf_main(6, argv), 0);
Packit 534379
Packit 534379
  memset(five, 0, sizeof(five));
Packit 534379
  strcpy(five, symlink_B.c_str());
Packit 534379
  EXPECT_NE(fpgaconf_main(6, argv), 0);
Packit 534379
  
Packit 534379
  // Clean up
Packit 534379
  unlink(symlink_A.c_str());
Packit 534379
  unlink(symlink_B.c_str());
Packit 534379
  remove("link1");
Packit 534379
  remove("link2");
Packit 534379
}
Packit 534379
Packit 534379
INSTANTIATE_TEST_CASE_P(fpgaconf_c, fpgaconf_c_p,
Packit 534379
                        ::testing::ValuesIn(test_platform::platforms({"skx-p"})));
Packit 534379
Packit 534379
Packit 534379
class fpgaconf_c_mock_p : public fpgaconf_c_p{
Packit 534379
  protected:
Packit 534379
    fpgaconf_c_mock_p(){}
Packit 534379
};
Packit 534379
Packit 534379
/**
Packit 534379
 * @test       ifc_id0
Packit 534379
 * @brief      Test: print_interface_id
Packit 534379
 * @details    When the config.target struct is populated with
Packit 534379
 *             bus, device, function, and socket,
Packit 534379
 *             print_interface_id uses those settings for enumeration,
Packit 534379
 *             returning the number of matches found.
Packit 534379
 */
Packit 534379
TEST_P(fpgaconf_c_mock_p, ifc_id0) {
Packit 534379
  config.target.segment = platform_.devices[0].segment;
Packit 534379
  config.target.bus = platform_.devices[0].bus;
Packit 534379
  config.target.device = platform_.devices[0].device;
Packit 534379
  config.target.function = platform_.devices[0].function;
Packit 534379
  config.target.socket = platform_.devices[0].socket_id;
Packit 534379
  EXPECT_EQ(print_interface_id(test_guid), 1);
Packit 534379
}
Packit 534379
Packit 534379
/**
Packit 534379
 * @test       find_fpga1
Packit 534379
 * @brief      Test: find_fpga
Packit 534379
 * @details    When the config.target struct is populated with
Packit 534379
 *             bus, device, function, and socket,
Packit 534379
 *             find_fpga uses those settings in conjunction with the
Packit 534379
 *             given PR interface ID for enumeration,
Packit 534379
 *             returning the number of matches found.
Packit 534379
 */
Packit 534379
TEST_P(fpgaconf_c_mock_p, find_fpga1) {
Packit 534379
  config.target.segment = platform_.devices[0].segment;
Packit 534379
  config.target.bus = platform_.devices[0].bus;
Packit 534379
  config.target.device = platform_.devices[0].device;
Packit 534379
  config.target.function = platform_.devices[0].function;
Packit 534379
  config.target.socket = platform_.devices[0].socket_id;
Packit 534379
Packit 534379
  fpga_guid pr_ifc_id;
Packit 534379
  ASSERT_EQ(uuid_parse(platform_.devices[0].fme_guid, pr_ifc_id), 0);
Packit 534379
Packit 534379
  fpga_token tok = nullptr;
Packit 534379
  EXPECT_EQ(find_fpga(pr_ifc_id, &tok), 1);
Packit 534379
  ASSERT_NE(tok, nullptr);
Packit 534379
  EXPECT_EQ(fpgaDestroyToken(&tok), FPGA_OK);
Packit 534379
}
Packit 534379
Packit 534379
/**
Packit 534379
 * @test       prog_bs0
Packit 534379
 * @brief      Test: program_bitstream
Packit 534379
 * @details    When config.dry_run is set to true,
Packit 534379
 *             program_bitstream skips the PR step,
Packit 534379
 *             and the fn returns 1.
Packit 534379
 */
Packit 534379
TEST_P(fpgaconf_c_mock_p, prog_bs0) {
Packit 534379
  config.target.segment = platform_.devices[0].segment;
Packit 534379
  config.target.bus = platform_.devices[0].bus;
Packit 534379
  config.target.device = platform_.devices[0].device;
Packit 534379
  config.target.function = platform_.devices[0].function;
Packit 534379
  config.target.socket = platform_.devices[0].socket_id;
Packit 534379
Packit 534379
  config.dry_run = true;
Packit 534379
Packit 534379
  fpga_guid pr_ifc_id;
Packit 534379
  ASSERT_EQ(uuid_parse(platform_.devices[0].fme_guid, pr_ifc_id), 0);
Packit 534379
Packit 534379
  opae_bitstream_info info;
Packit 534379
  ASSERT_EQ(opae_load_bitstream(tmp_gbs_, &info), FPGA_OK);
Packit 534379
Packit 534379
  fpga_token tok = nullptr;
Packit 534379
  EXPECT_EQ(find_fpga(pr_ifc_id, &tok), 1);
Packit 534379
  ASSERT_NE(tok, nullptr);
Packit 534379
Packit 534379
  EXPECT_EQ(program_bitstream(tok, 0, &info, 0), 1);
Packit 534379
Packit 534379
  EXPECT_EQ(opae_unload_bitstream(&info), FPGA_OK);
Packit 534379
  EXPECT_EQ(fpgaDestroyToken(&tok), FPGA_OK);
Packit 534379
}
Packit 534379
Packit 534379
/**
Packit 534379
 * @test       prog_bs1
Packit 534379
 * @brief      Test: program_bitstream
Packit 534379
 * @details    When config.dry_run is set to false,
Packit 534379
 *             program_bitstream attempts the PR,
Packit 534379
 *             but fails to set user clocks,
Packit 534379
 *             causing the function to return -1.
Packit 534379
 */
Packit 534379
TEST_P(fpgaconf_c_mock_p, prog_bs1) {
Packit 534379
  config.target.segment = platform_.devices[0].segment;
Packit 534379
  config.target.bus = platform_.devices[0].bus;
Packit 534379
  config.target.device = platform_.devices[0].device;
Packit 534379
  config.target.function = platform_.devices[0].function;
Packit 534379
  config.target.socket = platform_.devices[0].socket_id;
Packit 534379
Packit 534379
  ASSERT_EQ(config.dry_run, false);
Packit 534379
Packit 534379
  fpga_guid pr_ifc_id;
Packit 534379
  ASSERT_EQ(uuid_parse(platform_.devices[0].fme_guid, pr_ifc_id), 0);
Packit 534379
Packit 534379
  opae_bitstream_info info;
Packit 534379
  ASSERT_EQ(opae_load_bitstream(tmp_gbs_, &info), FPGA_OK);
Packit 534379
Packit 534379
  fpga_token tok = nullptr;
Packit 534379
  EXPECT_EQ(find_fpga(pr_ifc_id, &tok), 1);
Packit 534379
  ASSERT_NE(tok, nullptr);
Packit 534379
Packit 534379
  EXPECT_EQ(program_bitstream(tok, 0, &info, 0), -1);
Packit 534379
Packit 534379
  EXPECT_EQ(opae_unload_bitstream(&info), FPGA_OK);
Packit 534379
  EXPECT_EQ(fpgaDestroyToken(&tok), FPGA_OK);
Packit 534379
}
Packit 534379
Packit 534379
/**
Packit 534379
 * @test       prog_bs2
Packit 534379
 * @brief      Test: program_bitstream
Packit 534379
 * @details    When config.dry_run is set to false,
Packit 534379
 *             program_bitstream attempts the PR,
Packit 534379
 *             which fails when given an invalid bitstream,
Packit 534379
 *             causing the function to return -1.
Packit 534379
 */
Packit 534379
TEST_P(fpgaconf_c_mock_p, prog_bs2) {
Packit 534379
  bitstream_valid_ = system_->assemble_gbs_header(platform_.devices[0]);
Packit 534379
  std::ofstream gbs;
Packit 534379
  gbs.open(tmp_gbs_, std::ios::out|std::ios::binary);
Packit 534379
  gbs.write((const char *) bitstream_valid_.data(), bitstream_valid_.size());
Packit 534379
  gbs.close();
Packit 534379
Packit 534379
  config.target.segment = platform_.devices[0].segment;
Packit 534379
  config.target.bus = platform_.devices[0].bus;
Packit 534379
  config.target.device = platform_.devices[0].device;
Packit 534379
  config.target.function = platform_.devices[0].function;
Packit 534379
  config.target.socket = platform_.devices[0].socket_id;
Packit 534379
Packit 534379
  ASSERT_EQ(config.dry_run, false);
Packit 534379
Packit 534379
  fpga_guid pr_ifc_id;
Packit 534379
  ASSERT_EQ(uuid_parse(platform_.devices[0].fme_guid, pr_ifc_id), 0);
Packit 534379
Packit 534379
  opae_bitstream_info info;
Packit 534379
  ASSERT_EQ(opae_load_bitstream(tmp_gbs_, &info), FPGA_OK);
Packit 534379
Packit 534379
  fpga_token tok = nullptr;
Packit 534379
  EXPECT_EQ(find_fpga(pr_ifc_id, &tok), 1);
Packit 534379
  ASSERT_NE(tok, nullptr);
Packit 534379
Packit 534379
  EXPECT_EQ(program_bitstream(tok, 0, &info, 0), -1);
Packit 534379
Packit 534379
  EXPECT_EQ(opae_unload_bitstream(&info), FPGA_OK);
Packit 534379
  EXPECT_EQ(fpgaDestroyToken(&tok), FPGA_OK);
Packit 534379
}
Packit 534379
Packit 534379
INSTANTIATE_TEST_CASE_P(fpgaconf_c, fpgaconf_c_mock_p,
Packit 534379
                        ::testing::ValuesIn(test_platform::mock_platforms({"skx-p"})));
Packit 534379