Skip to content

Commit 66f708b

Browse files
author
Shubham
committed
add pre-check for sync client ptr not null
1 parent 7be070b commit 66f708b

File tree

2 files changed

+51
-0
lines changed

2 files changed

+51
-0
lines changed

objectbox/sync.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,12 @@ def close_sync_client():
166166

167167
return close_sync_client
168168

169+
def __check_sync_ptr_not_null(self):
170+
if self.__c_sync_client_ptr is None:
171+
raise ValueError('SyncClient already closed')
172+
169173
def set_credentials(self, credentials: SyncCredentials):
174+
self.__check_sync_ptr_not_null()
170175
self.__credentials = credentials
171176
if isinstance(credentials, SyncCredentialsNone):
172177
c.obx_sync_credentials(self.__c_sync_client_ptr, credentials.type, None, 0)
@@ -181,6 +186,7 @@ def set_credentials(self, credentials: SyncCredentials):
181186
len(credentials.secret))
182187

183188
def set_multiple_credentials(self, credentials_list: list[SyncCredentials]):
189+
self.__check_sync_ptr_not_null()
184190
if len(credentials_list) == 0:
185191
raise ValueError("Provide at least one credential")
186192

@@ -207,6 +213,7 @@ def set_multiple_credentials(self, credentials_list: list[SyncCredentials]):
207213

208214

209215
def set_request_updates_mode(self, mode: SyncRequestUpdatesMode):
216+
self.__check_sync_ptr_not_null()
210217
if mode == SyncRequestUpdatesMode.MANUAL:
211218
c_mode = c.RequestUpdatesMode.MANUAL
212219
elif mode == SyncRequestUpdatesMode.AUTO:
@@ -218,6 +225,7 @@ def set_request_updates_mode(self, mode: SyncRequestUpdatesMode):
218225
c.obx_sync_request_updates_mode(self.__c_sync_client_ptr, c_mode)
219226

220227
def get_sync_state(self) -> SyncState:
228+
self.__check_sync_ptr_not_null()
221229
c_state = c.obx_sync_state(self.__c_sync_client_ptr)
222230
if c_state == c.SyncState.CREATED:
223231
return SyncState.CREATED
@@ -237,18 +245,23 @@ def get_sync_state(self) -> SyncState:
237245
return SyncState.UNKNOWN
238246

239247
def start(self):
248+
self.__check_sync_ptr_not_null()
240249
c.obx_sync_start(self.__c_sync_client_ptr)
241250

242251
def stop(self):
252+
self.__check_sync_ptr_not_null()
243253
c.obx_sync_stop(self.__c_sync_client_ptr)
244254

245255
def trigger_reconnect(self) -> bool:
256+
self.__check_sync_ptr_not_null()
246257
return c.check_obx_success(c.obx_sync_trigger_reconnect(self.__c_sync_client_ptr))
247258

248259
def request_updates(self, subscribe_for_future_pushes: bool) -> bool:
260+
self.__check_sync_ptr_not_null()
249261
return c.check_obx_success(c.obx_sync_updates_request(self.__c_sync_client_ptr, subscribe_for_future_pushes))
250262

251263
def cancel_updates(self) -> bool:
264+
self.__check_sync_ptr_not_null()
252265
return c.check_obx_success(c.obx_sync_updates_cancel(self.__c_sync_client_ptr))
253266

254267
@staticmethod
@@ -266,6 +279,7 @@ def is_closed(self) -> bool:
266279
return self.__c_sync_client_ptr is None
267280

268281
def set_login_listener(self, login_listener: SyncLoginListener):
282+
self.__check_sync_ptr_not_null()
269283
self.__c_login_listener = c.OBX_sync_listener_login(lambda arg: login_listener.on_logged_in())
270284
self.__c_login_failure_listener = c.OBX_sync_listener_login_failure(
271285
lambda arg, sync_login_code: login_listener.on_login_failed(sync_login_code))
@@ -281,6 +295,7 @@ def set_login_listener(self, login_listener: SyncLoginListener):
281295
)
282296

283297
def set_connection_listener(self, connection_listener: SyncConnectionListener):
298+
self.__check_sync_ptr_not_null()
284299
self.__c_connect_listener = c.OBX_sync_listener_connect(lambda arg: connection_listener.on_connected())
285300
self.__c_disconnect_listener = c.OBX_sync_listener_disconnect(lambda arg: connection_listener.on_disconnected())
286301
c.obx_sync_listener_connect(
@@ -295,6 +310,7 @@ def set_connection_listener(self, connection_listener: SyncConnectionListener):
295310
)
296311

297312
def set_error_listener(self, error_listener: SyncErrorListener):
313+
self.__check_sync_ptr_not_null()
298314
self.__c_error_listener = c.OBX_sync_listener_error(
299315
lambda arg, sync_error_code: error_listener.on_error(sync_error_code))
300316
c.obx_sync_listener_error(
@@ -304,18 +320,23 @@ def set_error_listener(self, error_listener: SyncErrorListener):
304320
)
305321

306322
def wait_for_logged_in_state(self, timeout_millis: int):
323+
self.__check_sync_ptr_not_null()
307324
c.obx_sync_wait_for_logged_in_state(self.__c_sync_client_ptr, timeout_millis)
308325

309326
def add_filter_variable(self, name: str, value: str):
327+
self.__check_sync_ptr_not_null()
310328
c.obx_sync_filter_variables_put(self.__c_sync_client_ptr, name.encode('utf-8'), value.encode('utf-8'))
311329

312330
def remove_filter_variable(self, name: str):
331+
self.__check_sync_ptr_not_null()
313332
c.obx_sync_filter_variables_remove(self.__c_sync_client_ptr, name.encode('utf-8'))
314333

315334
def remove_all_filter_variables(self):
335+
self.__check_sync_ptr_not_null()
316336
c.obx_sync_filter_variables_remove_all(self.__c_sync_client_ptr)
317337

318338
def get_outgoing_message_count(self, limit: int = 0) -> int:
339+
self.__check_sync_ptr_not_null()
319340
outgoing_message_count = ctypes.c_uint64(0)
320341
c.obx_sync_outgoing_message_count(self.__c_sync_client_ptr, limit, ctypes.byref(outgoing_message_count))
321342
return outgoing_message_count.value

tests/test_sync.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from collections.abc import Callable
12
from time import sleep
23

34
import pytest
@@ -104,3 +105,32 @@ def test_client_closed_when_store_closed(test_store):
104105
assert not client.is_closed()
105106
test_store.close()
106107
assert client.is_closed()
108+
109+
110+
def assert_raises_value_error(fn: Callable[[], object | None], message: str | None = None):
111+
with pytest.raises(ValueError, match=message):
112+
fn()
113+
114+
115+
def test_client_access_after_close_throws_error(test_store):
116+
server_urls = ["ws://localhost:9999"]
117+
client = SyncClient(test_store, server_urls)
118+
client.close()
119+
120+
assert client.is_closed()
121+
122+
match_error = "SyncClient already closed"
123+
124+
assert_raises_value_error(message=match_error, fn=lambda: client.start())
125+
assert_raises_value_error(message=match_error, fn=lambda: client.stop())
126+
assert_raises_value_error(message=match_error, fn=lambda: client.get_sync_state())
127+
assert_raises_value_error(message=match_error, fn=lambda: client.get_outgoing_message_count())
128+
assert_raises_value_error(message=match_error, fn=lambda: client.set_credentials(SyncCredentials.none()))
129+
assert_raises_value_error(message=match_error,
130+
fn=lambda: client.set_credentials(SyncCredentials.google_auth("token_google")))
131+
assert_raises_value_error(message=match_error, fn=lambda: client.set_multiple_credentials([
132+
SyncCredentials.google_auth("token_google"),
133+
SyncCredentials.user_and_password("user1", "password")
134+
]))
135+
assert_raises_value_error(message=match_error,
136+
fn=lambda: client.set_request_updates_mode(SyncRequestUpdatesMode.AUTO))

0 commit comments

Comments
 (0)