summaryrefslogtreecommitdiff
path: root/test/ipc/unixsocket.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'test/ipc/unixsocket.cpp')
-rw-r--r--test/ipc/unixsocket.cpp66
1 files changed, 38 insertions, 28 deletions
diff --git a/test/ipc/unixsocket.cpp b/test/ipc/unixsocket.cpp
index f53042b8..f39bd986 100644
--- a/test/ipc/unixsocket.cpp
+++ b/test/ipc/unixsocket.cpp
@@ -2,10 +2,11 @@
/*
* Copyright (C) 2019, Google Inc.
*
- * unixsocket.cpp - Unix socket IPC test
+ * Unix socket IPC test
*/
#include <algorithm>
+#include <array>
#include <fcntl.h>
#include <iostream>
#include <stdlib.h>
@@ -14,14 +15,15 @@
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
+#include <vector>
-#include <libcamera/event_dispatcher.h>
-#include <libcamera/timer.h>
+#include <libcamera/base/event_dispatcher.h>
+#include <libcamera/base/thread.h>
+#include <libcamera/base/timer.h>
+
+#include "libcamera/internal/ipc_unixsocket.h"
-#include "ipc_unixsocket.h"
#include "test.h"
-#include "thread.h"
-#include "utils.h"
#define CMD_CLOSE 0
#define CMD_REVERSE 1
@@ -29,8 +31,11 @@
#define CMD_LEN_CMP 3
#define CMD_JOIN 4
-using namespace std;
using namespace libcamera;
+using namespace std;
+using namespace std::chrono_literals;
+
+namespace {
int calculateLength(int fd)
{
@@ -41,6 +46,8 @@ int calculateLength(int fd)
return size;
}
+} /* namespace */
+
class UnixSocketTestSlave
{
public:
@@ -51,9 +58,9 @@ public:
ipc_.readyRead.connect(this, &UnixSocketTestSlave::readyRead);
}
- int run(int fd)
+ int run(UniqueFD fd)
{
- if (ipc_.bind(fd)) {
+ if (ipc_.bind(std::move(fd))) {
cerr << "Failed to connect to IPC channel" << endl;
return EXIT_FAILURE;
}
@@ -67,12 +74,12 @@ public:
}
private:
- void readyRead(IPCUnixSocket *ipc)
+ void readyRead()
{
IPCUnixSocket::Payload message, response;
int ret;
- ret = ipc->receive(&message);
+ ret = ipc_.receive(&message);
if (ret) {
cerr << "Receive message failed: " << ret << endl;
return;
@@ -145,6 +152,7 @@ private:
if (num < 0) {
cerr << "Read failed" << endl;
+ close(outfd);
stop(-EIO);
return;
} else if (!num)
@@ -152,6 +160,7 @@ private:
if (write(outfd, buf, num) < 0) {
cerr << "Write failed" << endl;
+ close(outfd);
stop(-EIO);
return;
}
@@ -206,8 +215,7 @@ protected:
if (!pid_) {
std::string arg = std::to_string(fd);
- execl("/proc/self/exe", "/proc/self/exe",
- arg.c_str(), nullptr);
+ execl(self().c_str(), self().c_str(), arg.c_str(), nullptr);
/* Only get here if exec fails. */
exit(TestFail);
@@ -309,7 +317,7 @@ protected:
};
int fds[2];
- for (unsigned int i = 0; i < ARRAY_SIZE(strings); i++) {
+ for (unsigned int i = 0; i < std::size(strings); i++) {
unsigned int len = strlen(strings[i]);
fds[i] = open("/tmp", O_TMPFILE | O_RDWR,
@@ -331,16 +339,16 @@ protected:
if (ret)
return ret;
- for (unsigned int i = 0; i < ARRAY_SIZE(strings); i++) {
+ for (unsigned int i = 0; i < std::size(strings); i++) {
unsigned int len = strlen(strings[i]);
- char buf[len];
+ std::vector<char> buf(len);
close(fds[i]);
- if (read(response.fds[0], &buf, len) <= 0)
+ if (read(response.fds[0], buf.data(), len) <= 0)
return TestFail;
- if (memcmp(buf, strings[i], len))
+ if (memcmp(buf.data(), strings[i], len))
return TestFail;
}
@@ -357,11 +365,11 @@ protected:
int run()
{
- int slavefd = ipc_.create();
- if (slavefd < 0)
+ UniqueFD slavefd = ipc_.create();
+ if (!slavefd.isValid())
return TestFail;
- if (slaveStart(slavefd)) {
+ if (slaveStart(slavefd.release())) {
cerr << "Failed to start slave" << endl;
return TestFail;
}
@@ -428,7 +436,7 @@ private:
if (ret)
return ret;
- timeout.start(200);
+ timeout.start(2s);
while (!callDone_) {
if (!timeout.isRunning()) {
cerr << "Call timeout!" << endl;
@@ -444,14 +452,14 @@ private:
return 0;
}
- void readyRead(IPCUnixSocket *ipc)
+ void readyRead()
{
if (!callResponse_) {
cerr << "Read ready without expecting data, fail." << endl;
return;
}
- if (ipc->receive(callResponse_)) {
+ if (ipc_.receive(callResponse_)) {
cerr << "Receive message failed" << endl;
return;
}
@@ -461,7 +469,7 @@ private:
int prepareFDs(IPCUnixSocket::Payload *message, unsigned int num)
{
- int fd = open("/proc/self/exe", O_RDONLY);
+ int fd = open(self().c_str(), O_RDONLY);
if (fd < 0)
return fd;
@@ -493,10 +501,12 @@ private:
int main(int argc, char **argv)
{
if (argc == 2) {
- int ipcfd = std::stoi(argv[1]);
+ UniqueFD ipcfd = UniqueFD(std::stoi(argv[1]));
UnixSocketTestSlave slave;
- return slave.run(ipcfd);
+ return slave.run(std::move(ipcfd));
}
- return UnixSocketTest().execute();
+ UnixSocketTest test;
+ test.setArgs(argc, argv);
+ return test.execute();
}