Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add class RestProfile for local maintenance of users' REST parameters. #5463

Open
wants to merge 11 commits into
base: main
Choose a base branch
from
Prev Previous commit
Next Next commit
Address comment.
bekadavis9 committed Feb 24, 2025
commit c6aca03ffd2ea345801d6b2db809907938fc475d
34 changes: 21 additions & 13 deletions tiledb/sm/rest/test/unit_rest_profile.cc
Original file line number Diff line number Diff line change
@@ -53,11 +53,13 @@ struct expected_values_t {

struct RestProfileFx {
public:
std::string homedir_; // The temporary in-test $HOME directory.
std::string cloudpath_; // The in-test path to the cloud.json file.
TemporaryLocalDirectory tempdir_; // A temporary working directory.
std::string homedir_; // The temporary in-test $HOME directory.
std::string cloudpath_; // The in-test path to the cloud.json file.

RestProfileFx()
: homedir_(TemporaryLocalDirectory("unit_rest_profile").path())
: tempdir_(TemporaryLocalDirectory("unit_rest_profile"))
, homedir_(tempdir_.path())
, cloudpath_(homedir_ + ".tiledb/cloud.json") {
// Fstream cannot create directories, only files, so create the .tiledb dir.
std::filesystem::create_directories(homedir_ + ".tiledb");
@@ -79,6 +81,12 @@ struct RestProfileFx {

~RestProfileFx() = default;

/** Returns a new RestProfile with the given name, at the in-test $HOME. */
RestProfile create_profile(
const std::string& name = RestProfile::DEFAULT_NAME) {
return RestProfile(name, homedir_);
}

/** Returns true iff the profile's parameter values match the expected. */
bool is_valid(RestProfile p, expected_values_t e) {
if (p.name() == e.name && p.get("rest.password") == e.password &&
@@ -113,7 +121,7 @@ TEST_CASE_METHOD(
std::filesystem::remove(cloudpath_);

// Create and validate a default RestProfile.
RestProfile profile(RestProfile::DEFAULT_NAME, homedir_);
RestProfile profile(create_profile());
profile.save();

// Set the expected token value; expected_values_t uses cloudtoken_ by
@@ -128,7 +136,7 @@ TEST_CASE_METHOD(
"REST Profile: Default profile inherited from cloudpath",
"[rest_profile][default][inherited]") {
// Create and validate a default RestProfile.
RestProfile profile(RestProfile::DEFAULT_NAME, homedir_);
RestProfile profile(create_profile());
profile.save();
expected_values_t expected;
CHECK(is_valid(profile, expected));
@@ -139,7 +147,7 @@ TEST_CASE_METHOD(
"REST Profile: Save/Remove",
"[rest_profile][save][remove]") {
// Create a default RestProfile.
RestProfile p(RestProfile::DEFAULT_NAME, homedir_);
RestProfile p(create_profile());
std::string filepath = homedir_ + ".tiledb/profiles.json";
CHECK(profile_from_file_to_json(filepath, p.name()).empty());

@@ -167,7 +175,7 @@ TEST_CASE_METHOD(
"username"};

// Set and validate non-default parameters.
RestProfile p(e.name, homedir_);
RestProfile p(create_profile(e.name));
p.set("rest.password", e.password);
p.set("rest.payer_namespace", e.payer_namespace);
p.set("rest.token", e.token);
@@ -180,7 +188,7 @@ TEST_CASE_METHOD(
TEST_CASE_METHOD(
RestProfileFx, "REST Profile: to_json", "[rest_profile][to_json]") {
// Create a default RestProfile.
RestProfile p(RestProfile::DEFAULT_NAME, homedir_);
RestProfile p(create_profile());
p.save();

// Validate.
@@ -197,7 +205,7 @@ TEST_CASE_METHOD(
RestProfileFx,
"REST Profile: Get/Set invalid parameters",
"[rest_profile][get_set_invalid]") {
RestProfile p(RestProfile::DEFAULT_NAME, homedir_);
RestProfile p(create_profile());

// Try to get a parameter with an invalid name.
REQUIRE_THROWS_WITH(
@@ -234,15 +242,15 @@ TEST_CASE_METHOD(
std::string token = "token";

// Create and validate a RestProfile with default name.
RestProfile p(RestProfile::DEFAULT_NAME, homedir_);
RestProfile p(create_profile());
p.set("rest.payer_namespace", payer_namespace);
p.save();
expected_values_t e;
e.payer_namespace = payer_namespace;
CHECK(is_valid(p, e));

// Create a second profile, ensuring the payer_namespace is inherited.
RestProfile p2(RestProfile::DEFAULT_NAME, homedir_);
RestProfile p2(create_profile());
CHECK(p2.get("rest.payer_namespace") == payer_namespace);

// Set a non-default token on the second profile.
@@ -263,7 +271,7 @@ TEST_CASE_METHOD(
std::string payer_namespace = "payer_namespace";

// Create and validate a RestProfile with default name.
RestProfile p(RestProfile::DEFAULT_NAME, homedir_);
RestProfile p(create_profile());
p.set("rest.payer_namespace", payer_namespace);
p.save();
expected_values_t e;
@@ -272,7 +280,7 @@ TEST_CASE_METHOD(

// Create a second profile with non-default name and ensure the
// payer_namespace and cloudtoken_ are NOT inherited.
RestProfile p2(name, homedir_);
RestProfile p2(create_profile(name));
CHECK(p2.get("rest.payer_namespace") != payer_namespace);
p2.save();
e.name = name;