aboutsummaryrefslogtreecommitdiff
path: root/source/tests/lib/system
diff options
context:
space:
mode:
Diffstat (limited to 'source/tests/lib/system')
-rw-r--r--source/tests/lib/system/CMakeLists.txt11
-rw-r--r--source/tests/lib/system/src/xdg.cpp171
2 files changed, 182 insertions, 0 deletions
diff --git a/source/tests/lib/system/CMakeLists.txt b/source/tests/lib/system/CMakeLists.txt
new file mode 100644
index 0000000..ba0ff1a
--- /dev/null
+++ b/source/tests/lib/system/CMakeLists.txt
@@ -0,0 +1,11 @@
+add_executable("wanda-tests-system"
+ "src/xdg.cpp"
+)
+
+target_link_libraries("wanda-tests-system"
+ "wanda::system"
+
+ "Catch2::Catch2WithMain"
+)
+
+catch_discover_tests("wanda-tests-system") \ No newline at end of file
diff --git a/source/tests/lib/system/src/xdg.cpp b/source/tests/lib/system/src/xdg.cpp
new file mode 100644
index 0000000..5872dc6
--- /dev/null
+++ b/source/tests/lib/system/src/xdg.cpp
@@ -0,0 +1,171 @@
+#include "wanda/system/xdg.hpp"
+
+#include "wanda/system/environment.hpp"
+
+#include <catch2/catch_all.hpp>
+#include <unistd.h>
+
+#include <filesystem>
+#include <string>
+#include <utility>
+
+using namespace std::string_literals;
+
+namespace wanda::system::test
+{
+
+ TEST_CASE("XDG variable names match the specification", "[system][xdg][spec]")
+ {
+ REQUIRE(xdg_variable(xdg_directory::data_home) == "XDG_DATA_HOME");
+ REQUIRE(xdg_variable(xdg_directory::config_home) == "XDG_CONFIG_HOME");
+ REQUIRE(xdg_variable(xdg_directory::cache_home) == "XDG_CACHE_HOME");
+ REQUIRE(xdg_variable(xdg_directory::runtime_dir) == "XDG_RUNTIME_DIR");
+ }
+
+ SCENARIO("The values of the XDG variables depend on the environment", "[system][xdg][spec]")
+ {
+ auto const home_directory = std::filesystem::path{"/home/test"};
+ auto const run_directory = std::filesystem::path{"/run/user"};
+ auto const uid = std::to_string(::getuid());
+
+ GIVEN("An environment that only contains HOME")
+ {
+ auto home = "HOME="s + home_directory.native();
+ char const * env_data[] = {home.c_str(), nullptr};
+ auto env = environment{env_data};
+
+ THEN("the data home is '<home_directory>/.local/share")
+ {
+ REQUIRE(xdg_path_for(xdg_directory::data_home, env) == home_directory / ".local/share");
+ }
+
+ THEN("the config home is '<home_directory>/.config")
+ {
+ REQUIRE(xdg_path_for(xdg_directory::config_home, env) == home_directory / ".config");
+ }
+
+ THEN("the cache home is '<home_directory>/.cache")
+ {
+ REQUIRE(xdg_path_for(xdg_directory::cache_home, env) == home_directory / ".cache");
+ }
+
+ THEN("the runtime directory is '<run_directory>/<uid>'")
+ {
+ REQUIRE(xdg_path_for(xdg_directory::runtime_dir, env) == run_directory / uid);
+ }
+ }
+
+ GIVEN("An environment that only contains HOME and XDG_DATA_HOME")
+ {
+ auto home = "HOME="s + home_directory.native();
+ auto data_home = "XDG_DATA_HOME=/home/test/xdg_data_home"s;
+ char const * env_data[] = {home.c_str(), data_home.c_str(), nullptr};
+ auto env = environment{env_data};
+
+ THEN("the data home is '$XDG_DATA_HOME")
+ {
+ REQUIRE(xdg_path_for(xdg_directory::data_home, env) == env["XDG_DATA_HOME"]);
+ }
+
+ THEN("the config home is '<home_directory>/.config")
+ {
+ REQUIRE(xdg_path_for(xdg_directory::config_home, env) == home_directory / ".config");
+ }
+
+ THEN("the cache home is '<home_directory>/.cache")
+ {
+ REQUIRE(xdg_path_for(xdg_directory::cache_home, env) == home_directory / ".cache");
+ }
+
+ THEN("the runtime directory is '<run_directory>/<uid>'")
+ {
+ REQUIRE(xdg_path_for(xdg_directory::runtime_dir, env) == run_directory / uid);
+ }
+ }
+
+ GIVEN("An environment that only contains HOME and XDG_CONFIG_HOME")
+ {
+ auto home = "HOME="s + home_directory.native();
+ auto config_home = "XDG_CONFIG_HOME=/home/test/xdg_config_home"s;
+ char const * env_data[] = {home.c_str(), config_home.c_str(), nullptr};
+ auto env = environment{env_data};
+
+ THEN("the data home is '<home_directory>/.local/share")
+ {
+ REQUIRE(xdg_path_for(xdg_directory::data_home, env) == home_directory / ".local/share");
+ }
+
+ THEN("the config home is '$XDG_CONFIG_HOME")
+ {
+ REQUIRE(xdg_path_for(xdg_directory::config_home, env) == env["XDG_CONFIG_HOME"]);
+ }
+
+ THEN("the cache home is '<home_directory>/.cache")
+ {
+ REQUIRE(xdg_path_for(xdg_directory::cache_home, env) == home_directory / ".cache");
+ }
+
+ THEN("the runtime directory is '<run_directory>/<uid>'")
+ {
+ REQUIRE(xdg_path_for(xdg_directory::runtime_dir, env) == run_directory / uid);
+ }
+ }
+
+ GIVEN("An environment that only contains HOME and XDG_CACHE_HOME")
+ {
+ auto home = "HOME="s + home_directory.native();
+ auto cache_home = "XDG_CACHE_HOME=/home/test/xdg_cache_home"s;
+ char const * env_data[] = {home.c_str(), cache_home.c_str(), nullptr};
+ auto env = environment{env_data};
+
+ THEN("the data home is '<home_directory>/.local/share")
+ {
+ REQUIRE(xdg_path_for(xdg_directory::data_home, env) == home_directory / ".local/share");
+ }
+
+ THEN("the cache home is '<home_directory>/.config")
+ {
+ REQUIRE(xdg_path_for(xdg_directory::config_home, env) == home_directory / ".config");
+ }
+
+ THEN("the config home is '$XDG_CACHE_HOME")
+ {
+ REQUIRE(xdg_path_for(xdg_directory::cache_home, env) == env["XDG_CACHE_HOME"]);
+ }
+
+ THEN("the runtime directory is '<run_directory>/<uid>'")
+ {
+ REQUIRE(xdg_path_for(xdg_directory::runtime_dir, env) == run_directory / uid);
+ }
+ }
+
+ GIVEN("An environment that only contains HOME and XDG_RUNTIME_DIR")
+ {
+ auto home = "HOME="s + home_directory.native();
+ auto runtime_dir = "XDG_RUNTIME_DIR=/home/test/xdg_runtime_dir"s;
+ char const * env_data[] = {home.c_str(), runtime_dir.c_str(), nullptr};
+ auto env = environment{env_data};
+
+ THEN("the data home is '<home_directory>/.local/share")
+ {
+ REQUIRE(xdg_path_for(xdg_directory::data_home, env) == home_directory / ".local/share");
+ }
+
+ THEN("the config home is '<home_directory>/.config")
+ {
+ REQUIRE(xdg_path_for(xdg_directory::config_home, env) == home_directory / ".config");
+ }
+
+ THEN("the cache home is '<home_directory>/.cache")
+ {
+ REQUIRE(xdg_path_for(xdg_directory::cache_home, env) == home_directory / ".cache");
+ }
+
+ THEN("the runtime directory is '$XDG_RUNTIME_DIR'")
+ {
+ REQUIRE(xdg_path_for(xdg_directory::runtime_dir, env) == env["XDG_RUNTIME_DIR"]);
+ }
+ }
+ }
+
+} // namespace wanda::system::test \ No newline at end of file