// This file is part of Substrate. // Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. // SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU 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 General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . //! Test utils use std::collections::HashMap; use sp_core::H256; use crate::{DBValue, ChangeSet, CommitSet, MetaDb, NodeDb}; #[derive(Default, Debug, Clone, PartialEq, Eq)] pub struct TestDb { pub data: HashMap, pub meta: HashMap, DBValue>, } impl MetaDb for TestDb { type Error = (); fn get_meta(&self, key: &[u8]) -> Result, ()> { Ok(self.meta.get(key).cloned()) } } impl NodeDb for TestDb { type Error = (); type Key = H256; fn get(&self, key: &H256) -> Result, ()> { Ok(self.data.get(key).cloned()) } } impl TestDb { pub fn commit(&mut self, commit: &CommitSet) { self.data.extend(commit.data.inserted.iter().cloned()); self.meta.extend(commit.meta.inserted.iter().cloned()); for k in commit.data.deleted.iter() { self.data.remove(k); } self.meta.extend(commit.meta.inserted.iter().cloned()); for k in commit.meta.deleted.iter() { self.meta.remove(k); } } pub fn data_eq(&self, other: &TestDb) -> bool { self.data == other.data } } pub fn make_changeset(inserted: &[u64], deleted: &[u64]) -> ChangeSet { ChangeSet { inserted: inserted .iter() .map(|v| { (H256::from_low_u64_be(*v), H256::from_low_u64_be(*v).as_bytes().to_vec()) }) .collect(), deleted: deleted.iter().map(|v| H256::from_low_u64_be(*v)).collect(), } } pub fn make_commit(inserted: &[u64], deleted: &[u64]) -> CommitSet { CommitSet { data: make_changeset(inserted, deleted), meta: ChangeSet::default(), } } pub fn make_db(inserted: &[u64]) -> TestDb { TestDb { data: inserted .iter() .map(|v| { (H256::from_low_u64_be(*v), H256::from_low_u64_be(*v).as_bytes().to_vec()) }) .collect(), meta: Default::default(), } }