Files
email-tracker/external/duckdb/test/api/test_config.cpp
2025-10-24 19:21:19 -05:00

118 lines
3.3 KiB
C++

#include "catch.hpp"
#include "test_helpers.hpp"
#include <set>
#include <map>
using namespace duckdb;
using namespace std;
TEST_CASE("Test DB config configuration", "[api]") {
DBConfig config;
auto options = config.GetOptions();
map<string, duckdb::vector<string>> test_options;
test_options["access_mode"] = {"automatic", "read_only", "read_write"};
test_options["default_order"] = {"asc", "desc"};
test_options["default_null_order"] = {"nulls_first", "nulls_last"};
test_options["enable_external_access"] = {"true", "false"};
test_options["max_memory"] = {"-1", "16GB"};
test_options["threads"] = {"1", "4"};
REQUIRE(config.GetOptionByName("unknownoption") == nullptr);
for (auto &option : options) {
auto op = config.GetOptionByName(option.name);
REQUIRE(op);
auto entry = test_options.find(option.name);
if (entry != test_options.end()) {
for (auto &str_val : entry->second) {
Value val(str_val);
REQUIRE_NOTHROW(config.SetOption(option, val));
}
Value invalid_val("___this_is_probably_invalid");
REQUIRE_THROWS(config.SetOption(option, invalid_val));
}
}
}
TEST_CASE("Test allowed options", "[api]") {
case_insensitive_map_t<Value> config_dict;
string option;
SECTION("allowed_directories") {
config_dict.emplace("allowed_directories", Value::LIST({Value("test")}));
option = "allowed_directories";
}
SECTION("allowed_paths") {
config_dict.emplace("allowed_paths", Value::LIST({Value("test")}));
option = "allowed_paths";
}
SECTION("enable_logging") {
config_dict.emplace("enable_logging", Value::BOOLEAN(false));
option = "enable_logging";
}
SECTION("disabled_filesystems") {
config_dict.emplace("disabled_filesystems", Value::BOOLEAN(false));
option = "disabled_filesystems";
}
SECTION("logging_mode") {
config_dict.emplace("logging_mode", Value::BOOLEAN(false));
option = "logging_mode";
}
SECTION("logging_storage") {
config_dict.emplace("logging_storage", Value::BOOLEAN(false));
option = "logging_storage";
}
SECTION("logging_level") {
config_dict.emplace("logging_level", Value::BOOLEAN(false));
option = "logging_level";
}
SECTION("enabled_log_types") {
config_dict.emplace("enabled_log_types", Value::BOOLEAN(false));
option = "enabled_log_types";
}
SECTION("disabled_log_types") {
config_dict.emplace("disabled_log_types", Value::BOOLEAN(false));
option = "disabled_log_types";
}
try {
DBConfig config(config_dict, false);
} catch (std::exception &ex) {
ErrorData error_data(ex);
REQUIRE(error_data.Type() == ExceptionType::INVALID_INPUT);
REQUIRE(error_data.RawMessage() ==
StringUtil::Format("Cannot change/set %s before the database is started", option));
}
}
TEST_CASE("Test user_agent", "[api]") {
{
// Default duckdb_api is cpp
DuckDB db(nullptr);
Connection con(db);
auto res = con.Query("PRAGMA user_agent");
REQUIRE_THAT(res->GetValue(0, 0).ToString(), Catch::Matchers::Matches("duckdb/.*(.*) cpp"));
}
{
// The latest provided duckdb_api is used
DBConfig config;
config.SetOptionByName("duckdb_api", "capi");
config.SetOptionByName("duckdb_api", "go");
DuckDB db("", &config);
Connection con(db);
auto res = con.Query("PRAGMA user_agent");
REQUIRE_THAT(res->GetValue(0, 0).ToString(), Catch::Matchers::Matches("duckdb/.*(.*) go"));
}
}