|
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 |
|