summaryrefslogtreecommitdiff
path: root/hyprtester/src/tests/clients/pointer-warp.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'hyprtester/src/tests/clients/pointer-warp.cpp')
-rw-r--r--hyprtester/src/tests/clients/pointer-warp.cpp129
1 files changed, 62 insertions, 67 deletions
diff --git a/hyprtester/src/tests/clients/pointer-warp.cpp b/hyprtester/src/tests/clients/pointer-warp.cpp
index fa6334d3..e13e03f6 100644
--- a/hyprtester/src/tests/clients/pointer-warp.cpp
+++ b/hyprtester/src/tests/clients/pointer-warp.cpp
@@ -1,4 +1,3 @@
-#include "../../shared.hpp"
#include "../../hyprctlCompat.hpp"
#include "../shared.hpp"
#include "tests.hpp"
@@ -7,6 +6,7 @@
#include <hyprutils/os/FileDescriptor.hpp>
#include <hyprutils/os/Process.hpp>
+#include <optional>
#include <sys/poll.h>
#include <unistd.h>
#include <csignal>
@@ -17,102 +17,105 @@ using namespace Hyprutils::Memory;
#define SP CSharedPointer
-struct SClient {
- SP<CProcess> proc;
- std::array<char, 1024> readBuf;
- CFileDescriptor readFd, writeFd;
- struct pollfd fds;
-};
-
-static int ret = 0;
+namespace {
+ class CClient {
+ SP<CProcess> proc;
+ std::array<char, 1024> readBuf;
+ CFileDescriptor readFd, writeFd;
+ struct pollfd fds;
+
+ public:
+ CClient();
+ ~CClient();
+ bool sendWarp(int x, int y);
+ };
+}
-static bool startClient(SClient& client) {
- client.proc = makeShared<CProcess>(binaryDir + "/pointer-warp", std::vector<std::string>{});
+CClient::CClient() {
+ this->proc = makeShared<CProcess>(binaryDir + "/pointer-warp", std::vector<std::string>{});
- client.proc->addEnv("WAYLAND_DISPLAY", WLDISPLAY);
+ this->proc->addEnv("WAYLAND_DISPLAY", WLDISPLAY);
int pipeFds1[2], pipeFds2[2];
if (pipe(pipeFds1) != 0 || pipe(pipeFds2) != 0) {
NLog::log("{}Unable to open pipe to client", Colors::RED);
- return false;
+ throw std::exception();
}
- client.writeFd = CFileDescriptor(pipeFds1[1]);
- client.proc->setStdinFD(pipeFds1[0]);
+ this->writeFd = CFileDescriptor(pipeFds1[1]);
+ this->proc->setStdinFD(pipeFds1[0]);
- client.readFd = CFileDescriptor(pipeFds2[0]);
- client.proc->setStdoutFD(pipeFds2[1]);
+ this->readFd = CFileDescriptor(pipeFds2[0]);
+ this->proc->setStdoutFD(pipeFds2[1]);
const int COUNT_BEFORE = Tests::windowCount();
- client.proc->runAsync();
+ this->proc->runAsync();
close(pipeFds1[0]);
close(pipeFds2[1]);
- client.fds = {.fd = client.readFd.get(), .events = POLLIN};
- if (poll(&client.fds, 1, 1000) != 1 || !(client.fds.revents & POLLIN))
- return false;
+ this->fds = {.fd = this->readFd.get(), .events = POLLIN};
+ if (poll(&this->fds, 1, 1000) != 1 || !(this->fds.revents & POLLIN))
+ throw std::exception();
- client.readBuf.fill(0);
- if (read(client.readFd.get(), client.readBuf.data(), client.readBuf.size() - 1) == -1)
- return false;
+ this->readBuf.fill(0);
+ if (read(this->readFd.get(), this->readBuf.data(), this->readBuf.size() - 1) == -1)
+ throw std::exception();
- std::string ret = std::string{client.readBuf.data()};
+ std::string ret = std::string{this->readBuf.data()};
if (ret.find("started") == std::string::npos) {
NLog::log("{}Failed to start pointer-warp client, read {}", Colors::RED, ret);
- return false;
+ throw std::exception();
}
// wait for window to appear
int counter = 0;
- while (Tests::processAlive(client.proc->pid()) && Tests::windowCount() == COUNT_BEFORE) {
+ while (Tests::processAlive(this->proc->pid()) && Tests::windowCount() == COUNT_BEFORE) {
counter++;
std::this_thread::sleep_for(std::chrono::milliseconds(100));
if (counter > 100) {
NLog::log("{}pointer-warp client took too long to open, continuing", Colors::YELLOW);
- break;
+ throw std::exception();
}
}
- if (getFromSocket(std::format("/dispatch hl.dsp.window.set_prop({{ window = 'pid:{}', prop = 'no_anim', value = '1' }})", client.proc->pid())) != "ok") {
+ if (getFromSocket(std::format("/dispatch hl.dsp.window.set_prop({{ window = 'pid:{}', prop = 'no_anim', value = '1' }})", this->proc->pid())) != "ok") {
NLog::log("{}Failed to disable animations for client window", Colors::RED, ret);
- return false;
+ throw std::exception();
}
- if (getFromSocket(std::format("/dispatch hl.dsp.focus({{ window = 'pid:{}' }})", client.proc->pid())) != "ok") {
+ if (getFromSocket(std::format("/dispatch hl.dsp.focus({{ window = 'pid:{}' }})", this->proc->pid())) != "ok") {
NLog::log("{}Failed to focus pointer-warp client", Colors::RED, ret);
- return false;
+ throw std::exception();
}
NLog::log("{}Started pointer-warp client", Colors::YELLOW);
-
- return true;
}
-static void stopClient(SClient& client) {
+CClient::~CClient() {
std::string cmd = "exit\n";
- write(client.writeFd.get(), cmd.c_str(), cmd.length());
+ write(this->writeFd.get(), cmd.c_str(), cmd.length());
- kill(client.proc->pid(), SIGKILL);
- client.proc.reset();
+ kill(this->proc->pid(), SIGKILL);
+ this->proc.reset();
}
// format is like below
// "warp 20 20\n" would ask to warp cursor to x=20,y=20 in surface local coords
-static bool sendWarp(SClient& client, int x, int y) {
+bool CClient::sendWarp(int x, int y) {
std::string cmd = std::format("warp {} {}\n", x, y);
- if ((size_t)write(client.writeFd.get(), cmd.c_str(), cmd.length()) != cmd.length())
+ if ((size_t)write(this->writeFd.get(), cmd.c_str(), cmd.length()) != cmd.length())
return false;
- if (poll(&client.fds, 1, 1500) != 1 || !(client.fds.revents & POLLIN))
+ if (poll(&this->fds, 1, 1500) != 1 || !(this->fds.revents & POLLIN))
return false;
- ssize_t bytesRead = read(client.fds.fd, client.readBuf.data(), 1023);
+ ssize_t bytesRead = read(this->fds.fd, this->readBuf.data(), 1023);
if (bytesRead == -1)
return false;
- client.readBuf[bytesRead] = 0;
- std::string recieved = std::string{client.readBuf.data()};
+ this->readBuf[bytesRead] = 0;
+ std::string recieved = std::string{this->readBuf.data()};
recieved.pop_back();
return true;
@@ -147,48 +150,40 @@ static bool isCursorPos(int x, int y) {
return clientX == x && clientY == y;
}
-static bool test() {
- SClient client;
+TEST_CASE(pointerWarp) {
+ std::optional<CClient> client;
- if (!startClient(client))
- return false;
+ try {
+ client.emplace();
+ } catch (...) { FAIL_TEST("Couldn't start the client"); }
- EXPECT(sendWarp(client, 100, 100), true);
+ EXPECT(client->sendWarp(100, 100), true);
EXPECT(isCursorPos(100, 100), true);
- EXPECT(sendWarp(client, 0, 0), true);
+ EXPECT(client->sendWarp(0, 0), true);
EXPECT(isCursorPos(0, 0), true);
- EXPECT(sendWarp(client, 200, 200), true);
+ EXPECT(client->sendWarp(200, 200), true);
EXPECT(isCursorPos(200, 200), true);
- EXPECT(sendWarp(client, 100, -100), true);
+ EXPECT(client->sendWarp(100, -100), true);
EXPECT(isCursorPos(200, 200), true);
- EXPECT(sendWarp(client, 234, 345), true);
+ EXPECT(client->sendWarp(234, 345), true);
EXPECT(isCursorPos(234, 345), true);
- EXPECT(sendWarp(client, -1, -1), true);
+ EXPECT(client->sendWarp(-1, -1), true);
EXPECT(isCursorPos(234, 345), true);
- EXPECT(sendWarp(client, 1, -1), true);
+ EXPECT(client->sendWarp(1, -1), true);
EXPECT(isCursorPos(234, 345), true);
- EXPECT(sendWarp(client, 13, 37), true);
+ EXPECT(client->sendWarp(13, 37), true);
EXPECT(isCursorPos(13, 37), true);
- EXPECT(sendWarp(client, -100, 100), true);
+ EXPECT(client->sendWarp(-100, 100), true);
EXPECT(isCursorPos(13, 37), true);
- EXPECT(sendWarp(client, -1, 1), true);
+ EXPECT(client->sendWarp(-1, 1), true);
EXPECT(isCursorPos(13, 37), true);
-
- stopClient(client);
-
- NLog::log("{}Reloading the config", Colors::YELLOW);
- OK(getFromSocket("/reload"));
-
- return !ret;
}
-
-REGISTER_CLIENT_TEST_FN(test);