Skip to content

Commit

Permalink
Start updating tests
Browse files Browse the repository at this point in the history
  • Loading branch information
tgoyne committed Feb 1, 2024
1 parent 0f8d039 commit 07f0ac9
Show file tree
Hide file tree
Showing 21 changed files with 197 additions and 229 deletions.
2 changes: 1 addition & 1 deletion src/realm/object-store/sync/app.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -459,7 +459,7 @@ class App : public std::enable_shared_from_this<App>,
// (e.g. "https://us-east-1.aws.realm.mongodb.com/api/client/v2.0/app/<app_id>/auth")
std::string m_auth_route GUARDED_BY(m_route_mutex);
// If false, the location info will be updated upon the next AppServices request
bool m_location_updated GUARDED_BY(m_route_mutex);
bool m_location_updated GUARDED_BY(m_route_mutex) = false;
// Storage for the location info returned by the base URL location endpoint
// Base hostname for AppServices HTTP requests
std::string m_host_url GUARDED_BY(m_route_mutex);
Expand Down
1 change: 1 addition & 0 deletions src/realm/object-store/sync/app_user.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ UserIdentity::UserIdentity(const std::string& id, const std::string& provider_ty
User::User(Private, std::shared_ptr<app::App> app, std::string_view user_id)
: SyncUser(app->user_provider(), app->sync_manager(), app->config().app_id, user_id)
{
m_provider->register_sync_user(*this);
}

void User::update_backing_data(std::pair<SyncUserData, UserData>&& data)
Expand Down
4 changes: 0 additions & 4 deletions src/realm/object-store/sync/app_user.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,6 @@
#include <realm/object-store/sync/sync_user.hpp>
#include <realm/object-store/sync/subscribable.hpp>

#include <realm/util/bson/bson.hpp>
#include <realm/util/checked_mutex.hpp>
#include <realm/util/optional.hpp>

#include <memory>
#include <string>
#include <vector>
Expand Down
49 changes: 29 additions & 20 deletions src/realm/object-store/sync/sync_user.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,6 @@ SyncUser::SyncUser(std::shared_ptr<UserProvider> provider, std::shared_ptr<SyncM
, m_app_id(app_id)
, m_user_id(user_id)
{
provider->register_sync_user(*this);
}

SyncUser::~SyncUser()
Expand Down Expand Up @@ -126,6 +125,17 @@ void SyncUser::detach_and_tear_down()
}
}

void SyncUser::update_data_for_testing(util::FunctionRef<void(SyncUserData&)> fn) REQUIRES(!m_mutex)
{
SyncUserData data;
{
util::CheckedLockGuard lock(m_mutex);
data = m_data;
}
fn(data);
update_backing_data(std::move(data));
}

void SyncUser::update_backing_data(SyncUserData&& data)
{
if (data.state == UserState::Removed) {
Expand Down Expand Up @@ -200,53 +210,52 @@ bool SyncUser::access_token_refresh_required() const
return !m_data.access_token.token.empty() && m_data.access_token.expires_at < static_cast<int64_t>(threshold);
}

void SyncUser::request_log_out(util::UniqueFunction<void(util::Optional<app::AppError>)>&& completion)
std::shared_ptr<UserProvider> SyncUser::provider()
{
// FIXME: probably unsafe to call all these under lock
util::CheckedLockGuard lock(m_mutex);
if (m_provider) {
m_provider->request_log_out(m_user_id, std::move(completion));
return m_provider;
}

void SyncUser::request_log_out(util::UniqueFunction<void(util::Optional<app::AppError>)>&& completion)
{
if (auto provider = this->provider()) {
provider->request_log_out(m_user_id, std::move(completion));
}
}

void SyncUser::request_refresh_user(util::UniqueFunction<void(util::Optional<app::AppError>)>&& completion)
{
util::CheckedLockGuard lock(m_mutex);
if (m_provider) {
m_provider->request_refresh_user(m_user_id, std::move(completion));
if (auto provider = this->provider()) {
provider->request_refresh_user(m_user_id, std::move(completion));
}
}

void SyncUser::request_refresh_location(util::UniqueFunction<void(util::Optional<app::AppError>)>&& completion)
{
util::CheckedLockGuard lock(m_mutex);
if (m_provider) {
m_provider->request_refresh_location(m_user_id, std::move(completion));
if (auto provider = this->provider()) {
provider->request_refresh_location(m_user_id, std::move(completion));
}
}

void SyncUser::request_access_token(util::UniqueFunction<void(util::Optional<app::AppError>)>&& completion)
{
util::CheckedLockGuard lock(m_mutex);
if (m_provider) {
m_provider->request_access_token(m_user_id, std::move(completion));
if (auto provider = this->provider()) {
provider->request_access_token(m_user_id, std::move(completion));
}
}

void SyncUser::track_realm(std::string_view path)
{
util::CheckedLockGuard lock(m_mutex);
if (m_provider) {
m_provider->realm_opened(m_user_id, path);
if (auto provider = this->provider()) {
provider->realm_opened(m_user_id, path);
}
}

void SyncUser::create_file_action(SyncFileAction action, std::string_view original_path,
std::string_view recovery_path, std::string_view partition_value)
{
util::CheckedLockGuard lock(m_mutex);
if (m_provider) {
m_provider->create_file_action(m_user_id, action, original_path, recovery_path, partition_value);
if (auto provider = this->provider()) {
provider->create_file_action(m_user_id, action, original_path, recovery_path, partition_value);
}
}
} // namespace realm
5 changes: 5 additions & 0 deletions src/realm/object-store/sync/sync_user.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
#include <realm/object-store/sync/user_provider.hpp>
#include <realm/util/bson/bson.hpp>
#include <realm/util/checked_mutex.hpp>
#include <realm/util/function_ref.hpp>
#include <realm/util/optional.hpp>

#include <memory>
Expand Down Expand Up @@ -116,6 +117,8 @@ class SyncUser {
m_seconds_to_adjust_time_for_testing.store(seconds);
}

void update_data_for_testing(util::FunctionRef<void(SyncUserData&)>) REQUIRES(!m_mutex);

void detach_and_tear_down() REQUIRES(!m_mutex);

std::shared_ptr<SyncManager> sync_manager() REQUIRES(!m_mutex)
Expand All @@ -141,6 +144,8 @@ class SyncUser {
const std::string m_user_id;
SyncUserData m_data GUARDED_BY(m_mutex);
std::atomic<int> m_seconds_to_adjust_time_for_testing = 0;

std::shared_ptr<UserProvider> provider() REQUIRES(!m_mutex);
};

} // namespace realm
Expand Down
32 changes: 16 additions & 16 deletions test/object-store/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -56,26 +56,26 @@ if(REALM_ENABLE_SYNC)
)
list(APPEND SOURCES
bson.cpp
sync/app.cpp
sync/client_reset.cpp
sync/file.cpp
sync/flx_migration.cpp
sync/flx_schema_migration.cpp
sync/flx_sync.cpp
sync/metadata.cpp
sync/migration_store_test.cpp
sync/remote_mongo_tests.cpp
sync/session/connection_change_notifications.cpp
sync/session/progress_notifications.cpp
sync/session/session.cpp
sync/session/wait_for_completion.cpp
sync/sync_manager.cpp
sync/user.cpp
# sync/app.cpp
# sync/client_reset.cpp
# sync/file.cpp
# sync/flx_migration.cpp
# sync/flx_schema_migration.cpp
# sync/flx_sync.cpp
# sync/metadata.cpp
# sync/migration_store_test.cpp
# sync/remote_mongo_tests.cpp
# sync/session/connection_change_notifications.cpp
# sync/session/progress_notifications.cpp
# sync/session/session.cpp
# sync/session/wait_for_completion.cpp
# sync/sync_manager.cpp
# sync/user.cpp
util/sync/sync_test_utils.cpp
util/unit_test_transport.cpp
)
if(APPLE)
list(APPEND SOURCES audit.cpp)
# list(APPEND SOURCES audit.cpp)
endif()
endif()

Expand Down
4 changes: 2 additions & 2 deletions test/object-store/benchmarks/client_reset.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -192,13 +192,13 @@ TEST_CASE("client reset", "[sync][pbs][benchmark][client reset]") {
};

TestSyncManager init_sync_manager;
SyncTestFile config(init_sync_manager.app(), "default");
SyncTestFile config(init_sync_manager, "default");
config.cache = false;
config.automatic_change_notifications = false;
config.schema = schema;
ClientResyncMode reset_mode = GENERATE(ClientResyncMode::DiscardLocal, ClientResyncMode::Recover);
config.sync_config->client_resync_mode = reset_mode;
SyncTestFile config2(init_sync_manager.app(), "default");
SyncTestFile config2(init_sync_manager, "default");

auto populate_objects = [&](SharedRealm realm, size_t num_objects) {
TableRef table = get_table(*realm, "object");
Expand Down
36 changes: 21 additions & 15 deletions test/object-store/c_api/c_api.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -594,11 +594,10 @@ TEST_CASE("C API (non-database)", "[c_api]") {
auto guard = util::make_scope_exit([&temp_dir]() noexcept {
util::try_remove_dir_recursive(temp_dir);
});
auto sync_client_config = cptr(realm_sync_client_config_new());
realm_sync_client_config_set_base_file_path(sync_client_config.get(), temp_dir.c_str());
realm_sync_client_config_set_metadata_mode(sync_client_config.get(), RLM_SYNC_CLIENT_METADATA_MODE_DISABLED);
realm_app_config_set_base_file_path(app_config.get(), temp_dir.c_str());
realm_app_config_set_metadata_mode(app_config.get(), RLM_SYNC_CLIENT_METADATA_MODE_DISABLED);

auto test_app = cptr(realm_app_create(app_config.get(), sync_client_config.get()));
auto test_app = cptr(realm_app_create(app_config.get()));
realm_user_t* sync_user;
auto user_data_free = [](realm_userdata_t) {};

Expand All @@ -621,7 +620,7 @@ TEST_CASE("C API (non-database)", "[c_api]") {
auto token =
realm_sync_user_on_state_change_register_callback(sync_user, user_state, nullptr, user_data_free);

auto check_base_url = [&](std::string expected) {
auto check_base_url = [&](const std::string& expected) {
CHECK(transport->get_location_called());
auto app_base_url = realm_app_get_base_url(test_app.get());
CHECK(app_base_url == expected);
Expand Down Expand Up @@ -5250,7 +5249,7 @@ static void sync_error_handler(void* p, realm_sync_session_t*, const realm_sync_

TEST_CASE("C API - async_open", "[sync][pbs][c_api]") {
TestSyncManager init_sync_manager;
SyncTestFile test_config(init_sync_manager.app(), "default");
SyncTestFile test_config(init_sync_manager, "default");
test_config.cache = false;
ObjectSchema object_schema = {"object",
{
Expand All @@ -5262,7 +5261,7 @@ TEST_CASE("C API - async_open", "[sync][pbs][c_api]") {
SECTION("can open synced Realms that don't already exist") {
realm_config_t* config = realm_config_new();
config->schema = Schema{object_schema};
realm_user user(init_sync_manager.app()->current_user());
realm_user user(std::static_pointer_cast<app::User>(init_sync_manager.fake_user())); // FIXME
realm_sync_config_t* sync_config = realm_sync_config_new(&user, "default");
realm_sync_config_set_initial_subscription_handler(sync_config, task_init_subscription, false, nullptr,
nullptr);
Expand Down Expand Up @@ -5298,16 +5297,26 @@ TEST_CASE("C API - async_open", "[sync][pbs][c_api]") {
std::string encoded_body;
encoded_body.resize(util::base64_encoded_size(unencoded_body.size()));
util::base64_encode(unencoded_body.data(), unencoded_body.size(), &encoded_body[0], encoded_body.size());
auto invalid_token = "." + encoded_body + ".";
RealmJWT invalid_token("." + encoded_body + ".");

struct TestProvider : DummyUserProvider {
void request_access_token(std::string_view, CompletionHandler&& completion) override
{
completion(app::AppError(ErrorCodes::HTTPError, "403 error", "", 403));
}
};
init_sync_manager.user_provider = std::make_shared<TestProvider>();

realm_config_t* config = realm_config_new();
config->schema = Schema{object_schema};
realm_user user(init_sync_manager.app()->current_user());
realm_user user(std::static_pointer_cast<app::User>(init_sync_manager.fake_user())); // FIXME
realm_sync_config_t* sync_config = realm_sync_config_new(&user, "realm");
realm_sync_config_set_initial_subscription_handler(sync_config, task_init_subscription, false, nullptr,
nullptr);
sync_config->user->log_in(invalid_token, invalid_token);
user->update_data_for_testing([&](auto& data) {
data.access_token = invalid_token;
data.refresh_token = invalid_token;
});

realm_config_set_path(config, test_config.path.c_str());
realm_config_set_schema_version(config, 1);
Expand All @@ -5318,15 +5327,14 @@ TEST_CASE("C API - async_open", "[sync][pbs][c_api]") {
realm_async_open_task_t* task = realm_open_synchronized(config);
REQUIRE(task);
realm_async_open_task_start(task, task_completion_func, &userdata, nullptr);
init_sync_manager.network_callback(app::Response{403});
util::EventLoop::main().run_until([&] {
return userdata.called.load();
});
REQUIRE(userdata.called);
REQUIRE(!userdata.realm_ref);
REQUIRE(userdata.error.error == RLM_ERR_AUTH_ERROR);
REQUIRE(userdata.error_message ==
"Unable to refresh the user access token: http error code considered fatal. Client Error: 403");
"Unable to refresh the user access token: 403 error. Client Error: 403");
realm_release(task);
realm_release(config);
realm_release(sync_config);
Expand Down Expand Up @@ -5833,8 +5841,7 @@ TEST_CASE("C API app: link_user integration w/c_api transport", "[sync][app][c_a
CHECK(realm_equals(sync_user_1, current_user));
realm_release(current_user);

realm_user_t* sync_user_2;
realm_app_switch_user(&app, sync_user_1, &sync_user_2);
realm_app_switch_user(&app, sync_user_1);
size_t out_n = 0;

realm_app_get_all_users(&app, nullptr, 0, &out_n);
Expand All @@ -5849,7 +5856,6 @@ TEST_CASE("C API app: link_user integration w/c_api transport", "[sync][app][c_a
for (size_t i = 0; i < out_n; ++i)
realm_release(out_users[i]);
realm_release(sync_user_1);
realm_release(sync_user_2);
}
SECTION("realm_app_user_apikey_provider_client_fetch_apikeys") {
SECTION("Failure") {
Expand Down
4 changes: 2 additions & 2 deletions test/object-store/list.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1842,15 +1842,15 @@ TEST_CASE("list with unresolved links", "[list]") {
TestSyncManager init_sync_manager({}, {false});
auto& server = init_sync_manager.sync_server();

SyncTestFile config1(init_sync_manager.app(), "shared");
SyncTestFile config1(init_sync_manager, "shared");
config1.schema = Schema{
{"origin",
{{"_id", PropertyType::Int, Property::IsPrimary(true)},
{"array", PropertyType::Array | PropertyType::Object, "target"}}},
{"target", {{"_id", PropertyType::Int, Property::IsPrimary(true)}, {"value", PropertyType::Int}}},
};

SyncTestFile config2(init_sync_manager.app(), "shared");
SyncTestFile config2(init_sync_manager, "shared");

auto r1 = Realm::get_shared_realm(config1);
auto r2 = Realm::get_shared_realm(config2);
Expand Down
4 changes: 2 additions & 2 deletions test/object-store/object.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1982,9 +1982,9 @@ TEST_CASE("object") {
SECTION("defaults do not override values explicitly passed to create()") {
TestSyncManager init_sync_manager({}, {false});
auto& server = init_sync_manager.sync_server();
SyncTestFile config1(init_sync_manager.app(), "shared");
SyncTestFile config1(init_sync_manager, "shared");
config1.schema = config.schema;
SyncTestFile config2(init_sync_manager.app(), "shared");
SyncTestFile config2(init_sync_manager, "shared");
config2.schema = config.schema;

AnyDict v1{
Expand Down
Loading

0 comments on commit 07f0ac9

Please sign in to comment.