From 9d464eb9085e84ebfcd95955d307af74e98dcbc5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Fri, 12 Jul 2024 14:47:01 +0200 Subject: [PATCH] tests: Add a snapshot of a SQLite database to perform regression tests The test database was created using a slightly modified `oidc-cli` example, to turn of the database encryption, on commit d6dca91df86413b0cbf193a4be191835dd81862e --- Cargo.lock | 1 + Cargo.toml | 3 + crates/matrix-sdk-sqlite/Cargo.toml | 1 + crates/matrix-sdk-sqlite/src/crypto_store.rs | 100 +++++++++++++++++- .../data/storage/matrix-sdk-crypto.sqlite3 | Bin 0 -> 122880 bytes 5 files changed, 104 insertions(+), 1 deletion(-) create mode 100644 testing/data/storage/matrix-sdk-crypto.sqlite3 diff --git a/Cargo.lock b/Cargo.lock index 88786c928..7ed150cb4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3510,6 +3510,7 @@ dependencies = [ "rusqlite", "serde", "serde_json", + "similar-asserts", "tempfile", "thiserror", "tokio", diff --git a/Cargo.toml b/Cargo.toml index e481a4ea1..fd50365c1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,6 +10,9 @@ members = [ "uniffi-bindgen", "xtask", ] +exclude = [ + "testing/data", +] # xtask, testing and the bindings should only be built when invoked explicitly. default-members = ["benchmarks", "crates/*", "labs/*"] resolver = "2" diff --git a/crates/matrix-sdk-sqlite/Cargo.toml b/crates/matrix-sdk-sqlite/Cargo.toml index b38e92e6d..8e4f9045a 100644 --- a/crates/matrix-sdk-sqlite/Cargo.toml +++ b/crates/matrix-sdk-sqlite/Cargo.toml @@ -39,6 +39,7 @@ matrix-sdk-base = { workspace = true, features = ["testing"] } matrix-sdk-crypto = { workspace = true, features = ["testing"] } matrix-sdk-test = { workspace = true } once_cell = { workspace = true } +similar-asserts = { workspace = true } tempfile = "3.3.0" tokio = { workspace = true, features = ["rt-multi-thread", "macros"] } diff --git a/crates/matrix-sdk-sqlite/src/crypto_store.rs b/crates/matrix-sdk-sqlite/src/crypto_store.rs index 83696f5c9..6c1cdf012 100644 --- a/crates/matrix-sdk-sqlite/src/crypto_store.rs +++ b/crates/matrix-sdk-sqlite/src/crypto_store.rs @@ -1323,8 +1323,14 @@ impl CryptoStore for SqliteCryptoStore { #[cfg(test)] mod tests { - use matrix_sdk_crypto::{cryptostore_integration_tests, cryptostore_integration_tests_time}; + use std::path::PathBuf; + + use matrix_sdk_crypto::{ + cryptostore_integration_tests, cryptostore_integration_tests_time, store::CryptoStore, + }; + use matrix_sdk_test::async_test; use once_cell::sync::Lazy; + use similar_asserts::assert_eq; use tempfile::{tempdir, TempDir}; use tokio::fs; @@ -1332,6 +1338,98 @@ mod tests { static TMP_DIR: Lazy = Lazy::new(|| tempdir().unwrap()); + struct TestDb { + // Needs to be kept alive because the Drop implementation for TempDir deletes the + // directory. + #[allow(dead_code)] + dir: TempDir, + database: SqliteCryptoStore, + } + + async fn get_test_db() -> TestDb { + let db_name = "matrix-sdk-crypto.sqlite3"; + + let manifest_path = PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("../.."); + let database_path = manifest_path.join("testing/data/storage").join(db_name); + + let tmpdir = tempdir().unwrap(); + let destination = tmpdir.path().join(db_name); + + // Copy the test database to the tempdir so our test runs are idempotent. + std::fs::copy(&database_path, destination).unwrap(); + + let database = + SqliteCryptoStore::open(tmpdir.path(), None).await.expect("Can't open the test store"); + + TestDb { dir: tmpdir, database } + } + + /// Test that we didn't regress in our storage layer by loading data from a + /// pre-filled database, or in other words use a test vector for this. + #[async_test] + async fn open_test_vector_store() { + let TestDb { dir: _, database } = get_test_db().await; + + let account = database + .load_account() + .await + .unwrap() + .expect("The test database is prefilled with data, we should find an account"); + + let user_id = account.user_id(); + let device_id = account.device_id(); + + assert_eq!( + user_id.as_str(), + "@pjtest:synapse-oidc.element.dev", + "The user ID should match to the one we expect." + ); + + assert_eq!( + device_id.as_str(), + "v4TqgcuIH6", + "The device ID should match to the one we expect." + ); + + let device = database + .get_device(user_id, device_id) + .await + .unwrap() + .expect("Our own device should be found in the store."); + + assert_eq!(device.device_id(), device_id); + assert_eq!(device.user_id(), user_id); + + assert_eq!( + device.ed25519_key().expect("The device should have a Ed25519 key.").to_base64(), + "+cxl1Gl3du5i7UJwfWnoRDdnafFF+xYdAiTYYhYLr8s" + ); + + assert_eq!( + device.curve25519_key().expect("The device should have a Curve25519 key.").to_base64(), + "4SL9eEUlpyWSUvjljC5oMjknHQQJY7WZKo5S1KL/5VU" + ); + + let identity = database + .get_user_identity(user_id) + .await + .unwrap() + .expect("The store should contain an identity."); + + assert_eq!(identity.user_id(), user_id); + + let identity = identity + .own() + .expect("The identity should be of the correct type, it should be our own identity."); + + let master_key = identity + .master_key() + .get_first_key() + .expect("Our own identity should have a master key"); + + assert_eq!(master_key.to_base64(), "iCUEtB1RwANeqRa5epDrblLk4mer/36sylwQ5hYY3oE"); + } + async fn get_store( name: &str, passphrase: Option<&str>, diff --git a/testing/data/storage/matrix-sdk-crypto.sqlite3 b/testing/data/storage/matrix-sdk-crypto.sqlite3 new file mode 100644 index 0000000000000000000000000000000000000000..8795136ed64b1bc3605c4e2444c0505aa6ae9b15 GIT binary patch literal 122880 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 LHeR33;okFKoR24+ literal 0 HcmV?d00001