Skip to content

Commit fd05f55

Browse files
committed
Improve the Sync_MultipleSyncAgentsNotAllowed test
1 parent 21ed9fe commit fd05f55

File tree

4 files changed

+48
-48
lines changed

4 files changed

+48
-48
lines changed

src/realm/sync/network/default_socket.cpp

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -543,24 +543,6 @@ void DefaultSocketProvider::start()
543543
state_wait_for(lock, State::Running);
544544
}
545545

546-
void DefaultSocketProvider::OnlyForTesting::run_event_loop_on_current_thread(DefaultSocketProvider* provider)
547-
{
548-
{
549-
util::CheckedLockGuard lk(provider->m_mutex);
550-
REALM_ASSERT(provider->m_state == State::Stopped);
551-
provider->do_state_update(State::Starting);
552-
}
553-
554-
provider->event_loop();
555-
}
556-
557-
void DefaultSocketProvider::OnlyForTesting::prep_event_loop_for_restart(DefaultSocketProvider* provider)
558-
{
559-
util::CheckedLockGuard lk(provider->m_mutex);
560-
REALM_ASSERT(provider->m_state == State::Stopped);
561-
provider->m_service.reset();
562-
}
563-
564546
void DefaultSocketProvider::event_loop()
565547
{
566548
m_logger_ptr->trace("Default event loop: thread running");

src/realm/sync/network/default_socket.hpp

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -76,14 +76,6 @@ class DefaultSocketProvider : public SyncSocketProvider {
7676
return std::unique_ptr<Timer>(new DefaultSocketProvider::Timer(m_service, delay, std::move(handler)));
7777
}
7878

79-
struct OnlyForTesting {
80-
// Runs the event loop as though start() was called on the current thread so that the caller
81-
// can catch and handle any thrown exceptions in tests.
82-
static void run_event_loop_on_current_thread(DefaultSocketProvider* provider);
83-
84-
static void prep_event_loop_for_restart(DefaultSocketProvider* provider);
85-
};
86-
8779
private:
8880
enum class State { Starting, Running, Stopping, Stopped };
8981

test/sync_fixtures.hpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -464,6 +464,8 @@ class MultiClientServerFixture {
464464
std::set<file_ident_type> server_disable_download_for;
465465

466466
std::function<Server::SessionBootstrapCallback> server_session_bootstrap_callback;
467+
468+
std::shared_ptr<BindingCallbackThreadObserver> socket_provider_observer;
467469
};
468470

469471

@@ -541,7 +543,8 @@ class MultiClientServerFixture {
541543
Client::Config config_2;
542544

543545
m_client_socket_providers.push_back(std::make_shared<websocket::DefaultSocketProvider>(
544-
m_client_loggers[i], "", nullptr, websocket::DefaultSocketProvider::AutoStart{false}));
546+
m_client_loggers[i], "", config.socket_provider_observer,
547+
websocket::DefaultSocketProvider::AutoStart{false}));
545548
config_2.socket_provider = m_client_socket_providers.back();
546549
config_2.logger = m_client_loggers[i];
547550
config_2.reconnect_mode = ReconnectMode::testing;

test/test_sync.cpp

Lines changed: 44 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -3804,30 +3804,53 @@ TEST(Sync_MultipleSyncAgentsNotAllowed)
38043804
// particular session participant over the "temporally overlapping access"
38053805
// relation.
38063806

3807+
TEST_DIR(server_dir);
38073808
TEST_CLIENT_DB(db);
3808-
Client::Config config;
3809-
config.logger = test_context.logger;
3810-
auto socket_provider = std::make_shared<websocket::DefaultSocketProvider>(
3811-
config.logger, "", nullptr, websocket::DefaultSocketProvider::AutoStart{false});
3812-
config.socket_provider = socket_provider;
3813-
config.reconnect_mode = ReconnectMode::testing;
3814-
Client client{config};
3815-
{
3816-
Session::Config config_1;
3817-
config_1.realm_identifier = "blablabla";
3818-
Session::Config config_2;
3819-
config_2.realm_identifier = config_1.realm_identifier;
3820-
Session session_1{client, db, nullptr, nullptr, std::move(config_1)};
3821-
Session session_2{client, db, nullptr, nullptr, std::move(config_2)};
3822-
session_1.bind();
3823-
session_2.bind();
3824-
CHECK_THROW(
3825-
websocket::DefaultSocketProvider::OnlyForTesting::run_event_loop_on_current_thread(socket_provider.get()),
3826-
MultipleSyncAgents);
3827-
websocket::DefaultSocketProvider::OnlyForTesting::prep_event_loop_for_restart(socket_provider.get());
3809+
3810+
auto pf = util::make_promise_future<void>();
3811+
struct Observer : BindingCallbackThreadObserver {
3812+
unit_test::TestContext& test_context;
3813+
util::Promise<void>& got_error;
3814+
Observer(unit_test::TestContext& test_context, util::Promise<void>& got_error)
3815+
: test_context(test_context)
3816+
, got_error(got_error)
3817+
{
3818+
}
3819+
3820+
bool has_handle_error() override
3821+
{
3822+
return true;
3823+
}
3824+
bool handle_error(const std::exception& e) override
3825+
{
3826+
CHECK(dynamic_cast<const MultipleSyncAgents*>(&e));
3827+
got_error.emplace_value();
3828+
return true;
3829+
}
3830+
};
3831+
3832+
auto observer = std::make_shared<Observer>(test_context, pf.promise);
3833+
ClientServerFixture::Config config;
3834+
config.socket_provider_observer = observer;
3835+
ClientServerFixture fixture(server_dir, test_context, std::move(config));
3836+
fixture.start();
3837+
3838+
{
3839+
Session session = fixture.make_session(db, "/test");
3840+
session.bind();
3841+
Session session2 = fixture.make_session(db, "/test");
3842+
session2.bind();
3843+
pf.future.get();
3844+
3845+
// The exception caused the event loop to stop so we need to restart it
3846+
fixture.start_client(0);
38283847
}
38293848

3830-
socket_provider->start();
3849+
// Verify that after the error occurs (and is ignored) things are still
3850+
// in a functional state
3851+
Session session = fixture.make_session(db, "/test");
3852+
session.bind();
3853+
session.wait_for_upload_complete_or_client_stopped();
38313854
}
38323855

38333856
TEST(Sync_CancelReconnectDelay)

0 commit comments

Comments
 (0)