mirror of
https://github.com/baketnk/frame-yap.git
synced 2026-10-06 01:00:04 +02:00
65 lines
2.9 KiB
C++
65 lines
2.9 KiB
C++
#include "companion_apps.hpp"
|
|
#include <cassert>
|
|
#include <chrono>
|
|
#include <cstdlib>
|
|
#include <filesystem>
|
|
#include <fstream>
|
|
#include <string>
|
|
#include <thread>
|
|
#include <sys/stat.h>
|
|
#include <unistd.h>
|
|
|
|
namespace fs = std::filesystem;
|
|
int main() {
|
|
char name[] = "/tmp/frameyap-companions-XXXXXX";
|
|
const auto root = fs::path(::mkdtemp(name));
|
|
const auto home = root / "home", local = home / ".local/bin", path_dir = root / "path";
|
|
fs::create_directories(local); fs::create_directories(path_dir);
|
|
::setenv("HOME", home.c_str(), 1);
|
|
::setenv("PATH", path_dir.c_str(), 1);
|
|
assert(!frameyap::find_companion("tnkplan"));
|
|
assert(!frameyap::find_companion("tnkboard"));
|
|
assert(!frameyap::find_companion("tnkdraw"));
|
|
assert(!frameyap::find_companion("other"));
|
|
const auto plan = local / "tnkplan", keyboard = path_dir / "tnkboard", draw = local / "tnkdraw";
|
|
std::ofstream(plan) << "#!/bin/sh\nexit 0\n";
|
|
std::ofstream(keyboard) << "#!/bin/sh\nexit 0\n";
|
|
std::ofstream(draw) << "#!/bin/sh\nexit 0\n";
|
|
assert(!frameyap::find_companion("tnkplan")); // a file is not yet executable
|
|
assert(!frameyap::find_companion("tnkdraw"));
|
|
::chmod(plan.c_str(), 0700);
|
|
::chmod(keyboard.c_str(), 0700);
|
|
::chmod(draw.c_str(), 0700);
|
|
assert(frameyap::find_companion("tnkplan") == plan);
|
|
assert(frameyap::find_companion("tnkboard") == keyboard);
|
|
assert(frameyap::find_companion("tnkdraw") == draw);
|
|
::setenv("PATH", (":" + path_dir.string()).c_str(), 1);
|
|
assert(frameyap::find_companion("tnkboard") == keyboard);
|
|
const auto marker = root / "launched";
|
|
std::ofstream(plan) << "#!/bin/sh\nprintf launched > '" << marker.string() << "'\n";
|
|
assert(frameyap::launch_companion(plan));
|
|
for (int i = 0; i < 100 && !fs::exists(marker); ++i)
|
|
std::this_thread::sleep_for(std::chrono::milliseconds(10));
|
|
assert(fs::exists(marker));
|
|
const auto argv_marker = root / "argv";
|
|
std::ofstream(keyboard) << "#!/bin/sh\nprintf '%s\\n' \"$#\" \"$1\" > '" << argv_marker.string() << "'\n";
|
|
const auto expect_argv = [&](frameyap::CompanionCommand command, const std::string& expected) {
|
|
fs::remove(argv_marker);
|
|
assert(frameyap::launch_companion(keyboard, command));
|
|
std::string count, argument;
|
|
for (int i = 0; i < 100; ++i) {
|
|
std::ifstream in(argv_marker);
|
|
if (std::getline(in, count) && std::getline(in, argument)) break;
|
|
std::this_thread::sleep_for(std::chrono::milliseconds(10));
|
|
}
|
|
assert(count == (expected.empty() ? "0" : "1"));
|
|
assert(argument == expected);
|
|
};
|
|
expect_argv(frameyap::CompanionCommand::Default, "");
|
|
expect_argv(frameyap::CompanionCommand::Show, "--show");
|
|
expect_argv(frameyap::CompanionCommand::Recenter, "--recenter");
|
|
fs::remove(plan);
|
|
assert(!frameyap::launch_companion(plan));
|
|
fs::remove_all(root);
|
|
}
|