summaryrefslogtreecommitdiff
path: root/hyprtester/src/tests/shared.cpp
diff options
context:
space:
mode:
authorVirt <41426325+VirtCode@users.noreply.github.com>2026-03-06 21:11:42 +0100
committerGitHub <noreply@github.com>2026-03-06 20:11:42 +0000
commite0c571005912c342d8d812b368bc490cb6f28796 (patch)
tree8591722027f451f2714e982c76421d70fd4b4f24 /hyprtester/src/tests/shared.cpp
parent42f0a6005b7c502b1486f1f3b4d9883035be3dd8 (diff)
layerrules: add dynamically registered rules for plugins (#13331)
* layerrules: add dynamically registered rules for plugins * be gone * layerrules: add layer tests with waybar * fix: use kitty layers instead of waybar
Diffstat (limited to 'hyprtester/src/tests/shared.cpp')
-rw-r--r--hyprtester/src/tests/shared.cpp76
1 files changed, 76 insertions, 0 deletions
diff --git a/hyprtester/src/tests/shared.cpp b/hyprtester/src/tests/shared.cpp
index 8cdd648e..f6e2fce9 100644
--- a/hyprtester/src/tests/shared.cpp
+++ b/hyprtester/src/tests/shared.cpp
@@ -3,6 +3,7 @@
#include <cerrno>
#include <thread>
#include <print>
+#include <fstream>
#include "../shared.hpp"
#include "../hyprctlCompat.hpp"
@@ -39,6 +40,38 @@ CUniquePointer<CProcess> Tests::spawnKitty(const std::string& class_, const std:
return kitty;
}
+CUniquePointer<CProcess> Tests::spawnLayerKitty(const std::string& namespace_, const std::vector<std::string> args) {
+ std::vector<std::string> programArgs = args;
+ if (!namespace_.empty()) {
+ programArgs.insert(programArgs.begin(), "--class");
+ programArgs.insert(programArgs.begin() + 1, namespace_);
+ }
+
+ programArgs.insert(programArgs.begin(), "+kitten");
+ programArgs.insert(programArgs.begin() + 1, "panel");
+
+ CUniquePointer<CProcess> kitty = makeUnique<CProcess>("kitty", programArgs);
+ kitty->addEnv("WAYLAND_DISPLAY", WLDISPLAY);
+ kitty->runAsync();
+
+ std::this_thread::sleep_for(std::chrono::milliseconds(10));
+
+ // wait while the layer spawns
+ int counter = 0;
+ while (processAlive(kitty->pid()) && countOccurrences(getFromSocket("/layers"), std::format("pid: {}", kitty->pid())) == 0) {
+ counter++;
+ std::this_thread::sleep_for(std::chrono::milliseconds(100));
+
+ if (counter > 50)
+ return nullptr;
+ }
+
+ if (!processAlive(kitty->pid()))
+ return nullptr;
+
+ return kitty;
+}
+
bool Tests::processAlive(pid_t pid) {
errno = 0;
int ret = kill(pid, 0);
@@ -96,6 +129,38 @@ void Tests::waitUntilWindowsN(int n) {
}
}
+int Tests::layerCount() {
+ return countOccurrences(getFromSocket("/layers"), "namespace: ");
+}
+
+bool Tests::killAllLayers() {
+ auto str = getFromSocket("/layers");
+ auto pos = str.find("pid: ");
+ while (pos != std::string::npos) {
+ auto pid = stoi(str.substr(pos + 5, str.find('\n', pos)));
+ kill(pid, 15);
+
+ // we need to wait for a bit because for some reason otherwise we'll end up
+ // with layers with pid -1 if they are all removed at the same time
+ std::this_thread::sleep_for(std::chrono::milliseconds(100));
+
+ pos = str.find("pid: ", pos + 5);
+ }
+
+ int counter = 0;
+ while (Tests::layerCount() != 0) {
+ counter++;
+ std::this_thread::sleep_for(std::chrono::milliseconds(100));
+
+ if (counter > 50) {
+ std::println("{}Timed out waiting for layers to close", Colors::RED);
+ return false;
+ }
+ }
+
+ return true;
+}
+
std::string Tests::execAndGet(const std::string& cmd) {
CProcess proc("/bin/sh", {"-c", cmd});
@@ -105,3 +170,14 @@ std::string Tests::execAndGet(const std::string& cmd) {
return proc.stdOut();
}
+
+bool Tests::writeFile(const std::string& name, const std::string& contents) {
+ std::ofstream of(name, std::ios::trunc);
+ if (!of.good())
+ return false;
+
+ of << contents;
+ of.close();
+
+ return true;
+}