]> git.bitcoin.ninja Git - rust-lightning/commitdiff
Add `test_utils`
authorElias Rohrer <dev@tnull.de>
Fri, 4 Aug 2023 08:09:55 +0000 (10:09 +0200)
committerElias Rohrer <dev@tnull.de>
Thu, 7 Sep 2023 20:49:21 +0000 (22:49 +0200)
We add a utility function needed by upcoming `KVStore` implementation
tests.

lightning-persister/src/lib.rs
lightning-persister/src/test_utils.rs [new file with mode: 0644]

index dc205feba4e822949798d6e2491ecc4da6b38160..0a667e4216f70678cb9edcc4f19526dde1801a59 100644 (file)
@@ -10,6 +10,9 @@
 
 #[cfg(ldk_bench)] extern crate criterion;
 
+#[cfg(test)]
+mod test_utils;
+
 mod util;
 
 extern crate lightning;
diff --git a/lightning-persister/src/test_utils.rs b/lightning-persister/src/test_utils.rs
new file mode 100644 (file)
index 0000000..357a8b2
--- /dev/null
@@ -0,0 +1,50 @@
+use lightning::util::persist::{KVStore, KVSTORE_NAMESPACE_KEY_MAX_LEN};
+
+use std::panic::RefUnwindSafe;
+
+pub(crate) fn do_read_write_remove_list_persist<K: KVStore + RefUnwindSafe>(kv_store: &K) {
+       let data = [42u8; 32];
+
+       let namespace = "testspace";
+       let sub_namespace = "testsubspace";
+       let key = "testkey";
+
+       // Test the basic KVStore operations.
+       kv_store.write(namespace, sub_namespace, key, &data).unwrap();
+
+       // Test empty namespace/sub_namespace is allowed, but not empty namespace and non-empty
+       // sub-namespace, and not empty key.
+       kv_store.write("", "", key, &data).unwrap();
+       let res = std::panic::catch_unwind(|| kv_store.write("", sub_namespace, key, &data));
+       assert!(res.is_err());
+       let res = std::panic::catch_unwind(|| kv_store.write(namespace, sub_namespace, "", &data));
+       assert!(res.is_err());
+
+       let listed_keys = kv_store.list(namespace, sub_namespace).unwrap();
+       assert_eq!(listed_keys.len(), 1);
+       assert_eq!(listed_keys[0], key);
+
+       let read_data = kv_store.read(namespace, sub_namespace, key).unwrap();
+       assert_eq!(data, &*read_data);
+
+       kv_store.remove(namespace, sub_namespace, key, false).unwrap();
+
+       let listed_keys = kv_store.list(namespace, sub_namespace).unwrap();
+       assert_eq!(listed_keys.len(), 0);
+
+       // Ensure we have no issue operating with namespace/sub_namespace/key being KVSTORE_NAMESPACE_KEY_MAX_LEN
+       let max_chars: String = std::iter::repeat('A').take(KVSTORE_NAMESPACE_KEY_MAX_LEN).collect();
+       kv_store.write(&max_chars, &max_chars, &max_chars, &data).unwrap();
+
+       let listed_keys = kv_store.list(&max_chars, &max_chars).unwrap();
+       assert_eq!(listed_keys.len(), 1);
+       assert_eq!(listed_keys[0], max_chars);
+
+       let read_data = kv_store.read(&max_chars, &max_chars, &max_chars).unwrap();
+       assert_eq!(data, &*read_data);
+
+       kv_store.remove(&max_chars, &max_chars, &max_chars, false).unwrap();
+
+       let listed_keys = kv_store.list(&max_chars, &max_chars).unwrap();
+       assert_eq!(listed_keys.len(), 0);
+}