#include #include "libslic3r/Utils.hpp" #ifndef _WIN32 #include // getuid #endif using namespace Slic3r; TEST_CASE("per_user_temp_dir composes a per-user temp root", "[utils]") { const std::string base = "/tmp"; SECTION("an empty id returns base unchanged") { REQUIRE(per_user_temp_dir(base, "") == base); } SECTION("a non-empty id is appended at the top level") { REQUIRE(per_user_temp_dir(base, "1000") == base + "/orcaslicer_1000"); } SECTION("distinct ids produce distinct roots") { REQUIRE(per_user_temp_dir(base, "1000") != per_user_temp_dir(base, "1001")); } } TEST_CASE("per_user_temp_id follows the platform contract", "[utils]") { const std::string id = per_user_temp_id(); SECTION("stable across calls") { REQUIRE(per_user_temp_id() == id); } #ifdef _WIN32 SECTION("empty on Windows (its temp dir is already per-user)") { REQUIRE(id.empty()); } #else SECTION("the current uid on Linux/macOS") { REQUIRE_FALSE(id.empty()); REQUIRE(id == std::to_string(static_cast(::getuid()))); } #endif } // The end-to-end contract callers depend on: the temp root is left alone on // Windows and isolated per user on Linux/macOS. TEST_CASE("per-user temp root is unchanged on Windows, isolated elsewhere", "[utils]") { const std::string base = "/tmp"; const std::string root = per_user_temp_dir(base, per_user_temp_id()); #ifdef _WIN32 REQUIRE(root == base); #else REQUIRE(root != base); REQUIRE_THAT(root, Catch::Matchers::StartsWith(base + "/orcaslicer_")); #endif }