Skip to content

Commit 75a48d9

Browse files
committed
f Make TestSyncStore more robust
1 parent 17718a5 commit 75a48d9

File tree

1 file changed

+39
-27
lines changed

1 file changed

+39
-27
lines changed

src/io/test_utils.rs

Lines changed: 39 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ use lightning::{check_added_monitors, check_closed_broadcast, check_closed_event
1515

1616
use std::panic::RefUnwindSafe;
1717
use std::path::PathBuf;
18+
use std::sync::RwLock;
1819

1920
pub(crate) fn do_read_write_remove_list_persist<K: KVStore + RefUnwindSafe>(kv_store: &K) {
2021
let data = [42u8; 32];
@@ -174,13 +175,15 @@ pub(crate) fn do_test_store<K: KVStore>(store_0: &K, store_1: &K) {
174175

175176
// A `KVStore` impl for testing purposes that wraps all our `KVStore`s and asserts their synchronicity.
176177
pub(crate) struct TestSyncStore {
178+
serializer: RwLock<()>,
177179
test_store: TestStore,
178180
fs_store: FilesystemStore,
179181
sqlite_store: SqliteStore,
180182
}
181183

182184
impl TestSyncStore {
183185
pub(crate) fn new(dest_dir: PathBuf) -> Self {
186+
let serializer = RwLock::new(());
184187
let mut fs_dir = dest_dir.clone();
185188
fs_dir.push("fs_store");
186189
let fs_store = FilesystemStore::new(fs_dir);
@@ -193,12 +196,41 @@ impl TestSyncStore {
193196
)
194197
.unwrap();
195198
let test_store = TestStore::new();
196-
Self { fs_store, sqlite_store, test_store }
199+
Self { serializer, fs_store, sqlite_store, test_store }
200+
}
201+
202+
fn do_list(&self, namespace: &str, sub_namespace: &str) -> std::io::Result<Vec<String>> {
203+
let fs_res = self.fs_store.list(namespace, sub_namespace);
204+
let sqlite_res = self.sqlite_store.list(namespace, sub_namespace);
205+
let test_res = self.test_store.list(namespace, sub_namespace);
206+
207+
match fs_res {
208+
Ok(mut list) => {
209+
list.sort();
210+
211+
let mut sqlite_list = sqlite_res.unwrap();
212+
sqlite_list.sort();
213+
assert_eq!(list, sqlite_list);
214+
215+
let mut test_list = test_res.unwrap();
216+
test_list.sort();
217+
assert_eq!(list, test_list);
218+
219+
Ok(list)
220+
}
221+
Err(e) => {
222+
assert!(sqlite_res.is_err());
223+
assert!(test_res.is_err());
224+
Err(e)
225+
}
226+
}
197227
}
198228
}
199229

200230
impl KVStore for TestSyncStore {
201231
fn read(&self, namespace: &str, sub_namespace: &str, key: &str) -> std::io::Result<Vec<u8>> {
232+
let _guard = self.serializer.read().unwrap();
233+
202234
let fs_res = self.fs_store.read(namespace, sub_namespace, key);
203235
let sqlite_res = self.sqlite_store.read(namespace, sub_namespace, key);
204236
let test_res = self.test_store.read(namespace, sub_namespace, key);
@@ -222,11 +254,12 @@ impl KVStore for TestSyncStore {
222254
fn write(
223255
&self, namespace: &str, sub_namespace: &str, key: &str, buf: &[u8],
224256
) -> std::io::Result<()> {
257+
let _guard = self.serializer.write().unwrap();
225258
let fs_res = self.fs_store.write(namespace, sub_namespace, key, buf);
226259
let sqlite_res = self.sqlite_store.write(namespace, sub_namespace, key, buf);
227260
let test_res = self.test_store.write(namespace, sub_namespace, key, buf);
228261

229-
assert!(self.list(namespace, sub_namespace).unwrap().contains(&key.to_string()));
262+
assert!(self.do_list(namespace, sub_namespace).unwrap().contains(&key.to_string()));
230263

231264
match fs_res {
232265
Ok(()) => {
@@ -245,11 +278,12 @@ impl KVStore for TestSyncStore {
245278
fn remove(
246279
&self, namespace: &str, sub_namespace: &str, key: &str, lazy: bool,
247280
) -> std::io::Result<()> {
281+
let _guard = self.serializer.write().unwrap();
248282
let fs_res = self.fs_store.remove(namespace, sub_namespace, key, lazy);
249283
let sqlite_res = self.sqlite_store.remove(namespace, sub_namespace, key, lazy);
250284
let test_res = self.test_store.remove(namespace, sub_namespace, key, lazy);
251285

252-
assert!(!self.list(namespace, sub_namespace).unwrap().contains(&key.to_string()));
286+
assert!(!self.do_list(namespace, sub_namespace).unwrap().contains(&key.to_string()));
253287

254288
match fs_res {
255289
Ok(()) => {
@@ -266,29 +300,7 @@ impl KVStore for TestSyncStore {
266300
}
267301

268302
fn list(&self, namespace: &str, sub_namespace: &str) -> std::io::Result<Vec<String>> {
269-
let fs_res = self.fs_store.list(namespace, sub_namespace);
270-
let sqlite_res = self.sqlite_store.list(namespace, sub_namespace);
271-
let test_res = self.test_store.list(namespace, sub_namespace);
272-
273-
match fs_res {
274-
Ok(mut list) => {
275-
list.sort();
276-
277-
let mut sqlite_list = sqlite_res.unwrap();
278-
sqlite_list.sort();
279-
assert_eq!(list, sqlite_list);
280-
281-
let mut test_list = test_res.unwrap();
282-
test_list.sort();
283-
assert_eq!(list, test_list);
284-
285-
Ok(list)
286-
}
287-
Err(e) => {
288-
assert!(sqlite_res.is_err());
289-
assert!(test_res.is_err());
290-
Err(e)
291-
}
292-
}
303+
let _guard = self.serializer.read().unwrap();
304+
self.do_list(namespace, sub_namespace)
293305
}
294306
}

0 commit comments

Comments
 (0)