/* This file is part of DarkFi (https://dark.fi) * * Copyright (C) 2026-2026 Dyne.org foundation * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ //! Simulate the creation of a [`TreeOverlay`] on top of a [`Tree`] //! instance, and perform checkpoints and writes to verify overlay's //! cache checkpoint functionality. use kvdb_overlay::{Database, Result, TreeOverlay}; const TREE: &str = "_tree"; #[test] fn tree_overlay_checkpoint() -> Result<()> { // Initialize database let (db, _folder) = Database::open_temp()?; // Initialize tree and its overlay let tree = db.open_tree_default(TREE)?; let mut overlay = TreeOverlay::new(&tree); // Insert some values to the overlay overlay.insert(b"key_a", b"val_a")?; overlay.insert(b"key_b", b"val_b")?; overlay.insert(b"key_c", b"val_c")?; // Verify they are in the overlay assert_eq!(overlay.get(b"key_a")?, Some(b"val_a".into())); assert_eq!(overlay.get(b"key_b")?, Some(b"val_b".into())); assert_eq!(overlay.get(b"key_c")?, Some(b"val_c".into())); // Verify they are not in the database assert_eq!(tree.get(b"key_a")?, None); assert_eq!(tree.get(b"key_b")?, None); assert_eq!(tree.get(b"key_c")?, None); // Now we create an overlay checkpoint overlay.checkpoint(); // We add some more values to the overlay overlay.insert(b"key_d", b"val_d")?; overlay.insert(b"key_e", b"val_e")?; overlay.insert(b"key_f", b"val_f")?; // Verify they are in the overlay assert_eq!(overlay.get(b"key_d")?, Some(b"val_d".into())); assert_eq!(overlay.get(b"key_e")?, Some(b"val_e".into())); assert_eq!(overlay.get(b"key_f")?, Some(b"val_f".into())); // Verify they are not in the database assert_eq!(tree.get(b"key_d")?, None); assert_eq!(tree.get(b"key_e")?, None); assert_eq!(tree.get(b"key_f")?, None); // We assume something went wrong, so we revert to last checkpoint overlay.revert_to_checkpoint(); // Now we write it to the database db.write_tree_overlays_changes(&[&overlay])?; db.flush_default_mode()?; // Verify database contains pre-checkpoint keys assert_eq!(tree.get(b"key_a")?, Some(b"val_a".into())); assert_eq!(tree.get(b"key_b")?, Some(b"val_b".into())); assert_eq!(tree.get(b"key_c")?, Some(b"val_c".into())); // Verify database doesn't contains keys after checkpoint assert_eq!(tree.get(b"key_d")?, None); assert_eq!(tree.get(b"key_e")?, None); assert_eq!(tree.get(b"key_f")?, None); Ok(()) }