blob: 8e7fa2508b5187c302149a87eccddf62fbce4b7a [file] [log] [blame] [edit]
#include "test_base.hpp"
BaseTest::BaseTest(const char* clientDevicePath, const char* serverDevicePath,
const char* serviceName)
{
std::string socatCmd = std::format(
"socat -x -v -d -d pty,link={},rawer,echo=0,parenb,{} pty,link={},rawer,echo=0,parenb,{} & echo $!",
serverDevicePath, strBaudeRate, clientDevicePath, strBaudeRate);
// Start socat in the background and capture its PID
FILE* fp = popen(socatCmd.c_str(), "r");
EXPECT_NE(fp, nullptr) << "Failed to start socat: " << strerror(errno);
EXPECT_GT(fscanf(fp, "%d", &socatPid), 0);
pclose(fp);
// Wait for socat to start up
sleep(1);
fdClient = open(clientDevicePath, O_RDWR | O_NOCTTY | O_NONBLOCK);
EXPECT_NE(fdClient, -1) << "Failed to open serial port " << clientDevicePath
<< " with error: " << strerror(errno);
fdServer = open(serverDevicePath, O_RDWR | O_NOCTTY | O_NONBLOCK);
EXPECT_NE(fdServer, -1) << "Failed to open serial port " << serverDevicePath
<< " with error: " << strerror(errno);
ctx.request_name(serviceName);
serverTester = std::make_unique<TestIntf::ServerTester>(ctx, fdServer);
}
BaseTest::~BaseTest() noexcept
{
if (fdClient != -1)
{
close(fdClient);
fdClient = -1;
}
if (fdServer != -1)
{
close(fdServer);
fdServer = -1;
}
kill(socatPid, SIGTERM);
}
void BaseTest::SetUp()
{
serverThread = std::thread(&BaseTest::ServerRequestHandler, this);
}
void BaseTest::TearDown()
{
exitThread.store(true);
if (serverThread.joinable())
{
serverThread.join();
}
}
void BaseTest::ServerRequestHandler()
{
while (!exitThread.load())
{
serverTester->processRequests();
}
}