migrate tests to new migration framework
This commit is contained in:
parent
1b759c1462
commit
d4c9c7cc23
@ -14,13 +14,43 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Parity. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
use std::collections::BTreeMap;
|
||||
use migration::{Error, Destination, Migration, Config, SimpleMigration};
|
||||
//! Tests for migrations.
|
||||
//! A random temp directory is created. A database
|
||||
|
||||
impl Destination for BTreeMap<Vec<u8>, Vec<u8>> {
|
||||
fn commit(&mut self, batch: &BTreeMap<Vec<u8>, Vec<u8>>) -> Result<(), Error> {
|
||||
self.extend(batch.cloned());
|
||||
Ok(())
|
||||
use common::*;
|
||||
use migration::{Config, SimpleMigration, Manager};
|
||||
use kvdb::{Database, DBTransaction};
|
||||
|
||||
use devtools::RandomTempPath;
|
||||
use std::path::PathBuf;
|
||||
|
||||
fn db_path(path: &Path) -> PathBuf {
|
||||
let mut p = path.to_owned();
|
||||
p.push("db");
|
||||
p
|
||||
}
|
||||
|
||||
// initialize a database at the given directory with the given values.
|
||||
fn make_db(path: &Path, pairs: BTreeMap<Vec<u8>, Vec<u8>>) {
|
||||
let db = Database::open_default(path.to_str().unwrap()).expect("failed to open temp database");
|
||||
{
|
||||
let transaction = DBTransaction::new();
|
||||
for (k, v) in pairs {
|
||||
transaction.put(&k, &v).expect("failed to add pair to transaction");
|
||||
}
|
||||
|
||||
db.write(transaction).expect("failed to write db transaction");
|
||||
}
|
||||
}
|
||||
|
||||
// helper for verifying a a migrated database.
|
||||
fn verify_migration(path: &Path, pairs: BTreeMap<Vec<u8>, Vec<u8>>) {
|
||||
let db = Database::open_default(path.to_str().unwrap()).unwrap();
|
||||
|
||||
for (k, v) in pairs {
|
||||
let x = db.get(&k).unwrap().unwrap();
|
||||
|
||||
assert_eq!(&x[..], &v[..]);
|
||||
}
|
||||
}
|
||||
|
||||
@ -54,68 +84,58 @@ impl SimpleMigration for Migration1 {
|
||||
|
||||
#[test]
|
||||
fn one_simple_migration() {
|
||||
let dir = RandomTempPath::create_dir();
|
||||
let db_path = db_path(dir.as_path());
|
||||
let mut manager = Manager::new(Config::default());
|
||||
let keys = vec![vec![], vec![1u8]];
|
||||
let values = vec![vec![], vec![1u8]];
|
||||
let db = keys.into_iter().zip(values.into_iter());
|
||||
make_db(&db_path, map![vec![] => vec![], vec![1] => vec![1]]);
|
||||
let expected = map![vec![0x11] => vec![0x22], vec![1, 0x11] => vec![1, 0x22]];
|
||||
|
||||
let expected_keys = vec![vec![0x11u8], vec![1, 0x11]];
|
||||
let expected_values = vec![vec![0x22u8], vec![1, 0x22]];
|
||||
let expected_db = expected_keys.into_iter().zip(expected_values.into_iter()).collect::<BTreeMap<_, _>>();
|
||||
|
||||
let mut result = BTreeMap::new();
|
||||
manager.add_migration(Migration0).unwrap();
|
||||
manager.execute(db, 0, &mut result).unwrap();
|
||||
assert_eq!(expected_db, result);
|
||||
let end_path = manager.execute(&db_path, 0).unwrap();
|
||||
|
||||
verify_migration(&end_path, expected);
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[should_panic]
|
||||
fn no_migration_needed() {
|
||||
let dir = RandomTempPath::create_dir();
|
||||
let db_path = db_path(dir.as_path());
|
||||
let mut manager = Manager::new(Config::default());
|
||||
let keys = vec![vec![], vec![1u8]];
|
||||
let values = vec![vec![], vec![1u8]];
|
||||
let db = keys.into_iter().zip(values.into_iter());
|
||||
make_db(&db_path, map![vec![] => vec![], vec![1] => vec![1]]);
|
||||
|
||||
let mut result = BTreeMap::new();
|
||||
manager.add_migration(Migration0).unwrap();
|
||||
manager.execute(db, 1, &mut result).unwrap();
|
||||
manager.execute(&db_path, 1).unwrap();
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn multiple_migrations() {
|
||||
let dir = RandomTempPath::create_dir();
|
||||
let db_path = db_path(dir.as_path());
|
||||
let mut manager = Manager::new(Config::default());
|
||||
let keys = vec![vec![], vec![1u8]];
|
||||
let values = vec![vec![], vec![1u8]];
|
||||
let db = keys.into_iter().zip(values.into_iter());
|
||||
make_db(&db_path, map![vec![] => vec![], vec![1] => vec![1]]);
|
||||
let expected = map![vec![0x11] => vec![], vec![1, 0x11] => vec![]];
|
||||
|
||||
let expected_keys = vec![vec![0x11u8], vec![1, 0x11]];
|
||||
let expected_values = vec![vec![], vec![]];
|
||||
let expected_db = expected_keys.into_iter().zip(expected_values.into_iter()).collect::<BTreeMap<_, _>>();
|
||||
|
||||
let mut result = BTreeMap::new();
|
||||
manager.add_migration(Migration0).unwrap();
|
||||
manager.add_migration(Migration1).unwrap();
|
||||
manager.execute(db, 0, &mut result).unwrap();
|
||||
assert_eq!(expected_db, result);
|
||||
let end_path = manager.execute(&db_path, 0).unwrap();
|
||||
|
||||
verify_migration(&end_path, expected);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn second_migration() {
|
||||
let dir = RandomTempPath::create_dir();
|
||||
let db_path = db_path(dir.as_path());
|
||||
let mut manager = Manager::new(Config::default());
|
||||
let keys = vec![vec![], vec![1u8]];
|
||||
let values = vec![vec![], vec![1u8]];
|
||||
let db = keys.into_iter().zip(values.into_iter());
|
||||
make_db(&db_path, map![vec![] => vec![], vec![1] => vec![1]]);
|
||||
let expected = map![vec![] => vec![], vec![1] => vec![]];
|
||||
|
||||
let expected_keys = vec![vec![], vec![1u8]];
|
||||
let expected_values = vec![vec![], vec![]];
|
||||
let expected_db = expected_keys.into_iter().zip(expected_values.into_iter()).collect::<BTreeMap<_, _>>();
|
||||
|
||||
let mut result = BTreeMap::new();
|
||||
manager.add_migration(Migration0).unwrap();
|
||||
manager.add_migration(Migration1).unwrap();
|
||||
manager.execute(db, 1, &mut result).unwrap();
|
||||
assert_eq!(expected_db, result);
|
||||
let end_path = manager.execute(&db_path, 1).unwrap();
|
||||
|
||||
verify_migration(&end_path, expected);
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
Loading…
Reference in New Issue
Block a user