mirror of
https://github.com/baketnk/frame-yap.git
synced 2026-10-06 00:00:05 +02:00
31 lines
1.2 KiB
C++
31 lines
1.2 KiB
C++
#include "instance_lock.hpp"
|
|
#include <iostream>
|
|
#include <memory>
|
|
int main() {
|
|
char pattern[] = "/tmp/frameyap-lock-test-XXXXXX";
|
|
char* dir = mkdtemp(pattern);
|
|
if (!dir) return 1;
|
|
setenv("FRAMEYAP_INSTALL_ROOT", dir, 1);
|
|
try {
|
|
auto first = std::make_unique<frameyap::InstanceLock>();
|
|
bool rejected = false;
|
|
try { frameyap::InstanceLock second; } catch (const std::runtime_error&) { rejected = true; }
|
|
if (!rejected) throw std::runtime_error("second instance acquired lock");
|
|
first.reset();
|
|
{ frameyap::InstanceLock next; }
|
|
auto lock = std::filesystem::path(dir) / ".lock";
|
|
std::filesystem::remove(lock);
|
|
std::filesystem::create_symlink("foreign", lock);
|
|
rejected = false;
|
|
try { frameyap::InstanceLock unsafe; } catch (const std::runtime_error&) { rejected = true; }
|
|
if (!rejected) throw std::runtime_error("followed unsafe lock symlink");
|
|
std::filesystem::remove(lock);
|
|
std::filesystem::remove(dir);
|
|
std::cout << "instance lock checks passed\n";
|
|
} catch (const std::exception& e) {
|
|
std::cerr << e.what() << '\n';
|
|
std::filesystem::remove_all(dir);
|
|
return 1;
|
|
}
|
|
}
|