summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorDavid Lönnhager <david.l@mullvad.net>2025-02-12 21:50:46 +0100
committerDavid Lönnhager <david.l@mullvad.net>2025-03-05 23:32:01 +0100
commit0d789aa30a2f21217d5f0894c3056f2c9923b5c1 (patch)
tree5538f4bffbcb8a0a9c9ef30d7e2c57e19ef2d6ec
parentb2f54826a9b2951ecf56c7794f341124b0220762 (diff)
downloadmullvadvpn-0d789aa30a2f21217d5f0894c3056f2c9923b5c1.tar.xz
mullvadvpn-0d789aa30a2f21217d5f0894c3056f2c9923b5c1.zip
Add improved API response parse tests
-rw-r--r--Cargo.lock1
-rw-r--r--Cargo.toml1
-rw-r--r--installer-downloader/Cargo.toml2
-rw-r--r--mullvad-update/Cargo.toml1
-rw-r--r--mullvad-update/src/api.rs37
-rw-r--r--mullvad-update/src/format/mod.rs2
-rw-r--r--mullvad-update/src/snapshots/mullvad_update__api__test__api_version_info_provider_parser_arm64.snap45
-rw-r--r--mullvad-update/src/snapshots/mullvad_update__api__test__api_version_info_provider_parser_x86.snap83
-rw-r--r--mullvad-update/test-version-response.json25
9 files changed, 192 insertions, 5 deletions
diff --git a/Cargo.lock b/Cargo.lock
index e7416e7779..81108146fb 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -2993,6 +2993,7 @@ dependencies = [
"clap",
"ed25519-dalek",
"hex",
+ "insta",
"json-canon",
"mockito",
"mullvad-version",
diff --git a/Cargo.toml b/Cargo.toml
index 17e3920961..b85092b027 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -122,6 +122,7 @@ socket2 = "0.5.7"
# Test dependencies
proptest = "1.4"
+insta = { version = "1.42", features = ["yaml"] }
[profile.release]
opt-level = "s"
diff --git a/installer-downloader/Cargo.toml b/installer-downloader/Cargo.toml
index 25799200d3..be2c830c2d 100644
--- a/installer-downloader/Cargo.toml
+++ b/installer-downloader/Cargo.toml
@@ -34,7 +34,7 @@ objc_id = "0.1"
[target.'cfg(any(target_os = "windows", target_os = "macos"))'.dev-dependencies]
serde = { workspace = true, features = ["derive"] }
tokio = { workspace = true, features = ["test-util"] }
-insta = { version = "1.42", features = ["yaml"] }
+insta = { workspace = true, features = ["yaml"] }
[package.metadata.winres]
LegalCopyright = "(c) 2025 Mullvad VPN AB"
diff --git a/mullvad-update/Cargo.toml b/mullvad-update/Cargo.toml
index 9ad66787d4..20b561776a 100644
--- a/mullvad-update/Cargo.toml
+++ b/mullvad-update/Cargo.toml
@@ -35,6 +35,7 @@ rand = { version = "0.8.5", optional = true }
[dev-dependencies]
async-tempfile = "0.6"
+insta = { workspace = true }
mockito = "1.6.1"
rand = "0.8.5"
diff --git a/mullvad-update/src/api.rs b/mullvad-update/src/api.rs
index 253c4fc922..bcb5dd951a 100644
--- a/mullvad-update/src/api.rs
+++ b/mullvad-update/src/api.rs
@@ -25,6 +25,7 @@ pub trait VersionInfoProvider {
/// Contains information about all versions
#[derive(Debug, Clone)]
+#[cfg_attr(test, derive(serde::Serialize))]
pub struct VersionInfo {
/// Stable version info
pub stable: Version,
@@ -35,6 +36,7 @@ pub struct VersionInfo {
/// Contains information about a version for the current target
#[derive(Debug, Clone)]
+#[cfg_attr(test, derive(serde::Serialize))]
pub struct Version {
/// Version
pub version: mullvad_version::Version,
@@ -179,11 +181,17 @@ impl TryFrom<IntermediateVersion> for Version {
#[cfg(test)]
mod test {
+ use insta::assert_yaml_snapshot;
+
use super::*;
- /// Test API version responses can be parsed
+ // These tests rely on `insta` for snapshot testing. If they fail due to snapshot assertions,
+ // then most likely the snapshots need to be updated. The most convenient way to review
+ // changes to, and update, snapshots are by running `cargo insta review`.
+
+ /// Test parsing of API responses (rollout 1, x86)
#[test]
- fn test_api_version_info_provider_parser() -> anyhow::Result<()> {
+ fn test_api_version_info_provider_parser_x86() -> anyhow::Result<()> {
let response = format::SignedResponse::deserialize_and_verify_insecure(include_bytes!(
"../test-version-response.json"
))?;
@@ -193,7 +201,30 @@ mod test {
rollout: 1.,
};
- VersionInfo::try_from_signed_response(&params, response)?;
+ // Expect: The available latest versions for X86, where the rollout is 1.
+ let info = VersionInfo::try_from_response(&params, response.signed.clone())?;
+
+ assert_yaml_snapshot!(info);
+
+ Ok(())
+ }
+
+ /// Test parsing of API responses (rollout 0.01, arm64)
+ #[test]
+ fn test_api_version_info_provider_parser_arm64() -> anyhow::Result<()> {
+ let response = format::SignedResponse::deserialize_and_verify_insecure(include_bytes!(
+ "../test-version-response.json"
+ ))?;
+
+ let params = VersionParameters {
+ architecture: VersionArchitecture::Arm64,
+ rollout: 0.01,
+ };
+
+ let info = VersionInfo::try_from_response(&params, response.signed)?;
+
+ // Expect: The available latest versions for arm64, where the rollout is .01.
+ assert_yaml_snapshot!(info);
Ok(())
}
diff --git a/mullvad-update/src/format/mod.rs b/mullvad-update/src/format/mod.rs
index 01e4618ddf..61fac6a8c2 100644
--- a/mullvad-update/src/format/mod.rs
+++ b/mullvad-update/src/format/mod.rs
@@ -42,6 +42,7 @@ struct PartialSignedResponse {
/// Signed JSON response, not including the signature
#[derive(Debug, Deserialize, Serialize)]
#[serde(deny_unknown_fields)]
+#[cfg_attr(test, derive(Clone))]
pub struct Response {
/// When the signature expires
pub expires: chrono::DateTime<chrono::Utc>,
@@ -51,6 +52,7 @@ pub struct Response {
/// App release
#[derive(Debug, Deserialize, Serialize)]
+#[cfg_attr(test, derive(Clone))]
pub struct Release {
/// Mullvad app version
pub version: mullvad_version::Version,
diff --git a/mullvad-update/src/snapshots/mullvad_update__api__test__api_version_info_provider_parser_arm64.snap b/mullvad-update/src/snapshots/mullvad_update__api__test__api_version_info_provider_parser_arm64.snap
new file mode 100644
index 0000000000..91e6e90389
--- /dev/null
+++ b/mullvad-update/src/snapshots/mullvad_update__api__test__api_version_info_provider_parser_arm64.snap
@@ -0,0 +1,45 @@
+---
+source: mullvad-update/src/api.rs
+expression: info
+snapshot_kind: text
+---
+stable:
+ version: "2025.3"
+ urls:
+ - "https://releases.mullvad.net/desktop/releases/2025.2/MullvadVPN-2025.2_arm64.exe"
+ size: 104146312
+ changelog: "[macos] Adding support for quicfuscator\n[windows] Less bugs"
+ sha256:
+ - 175
+ - 216
+ - 9
+ - 138
+ - 31
+ - 248
+ - 157
+ - 105
+ - 162
+ - 67
+ - 236
+ - 78
+ - 46
+ - 148
+ - 108
+ - 245
+ - 251
+ - 248
+ - 209
+ - 193
+ - 9
+ - 152
+ - 35
+ - 13
+ - 108
+ - 143
+ - 192
+ - 165
+ - 201
+ - 195
+ - 149
+ - 65
+beta: ~
diff --git a/mullvad-update/src/snapshots/mullvad_update__api__test__api_version_info_provider_parser_x86.snap b/mullvad-update/src/snapshots/mullvad_update__api__test__api_version_info_provider_parser_x86.snap
new file mode 100644
index 0000000000..1cb23ff5e5
--- /dev/null
+++ b/mullvad-update/src/snapshots/mullvad_update__api__test__api_version_info_provider_parser_x86.snap
@@ -0,0 +1,83 @@
+---
+source: mullvad-update/src/api.rs
+expression: info
+snapshot_kind: text
+---
+stable:
+ version: "2025.2"
+ urls:
+ - "https://releases.mullvad.net/desktop/releases/2025.2/MullvadVPN-2025.2.exe"
+ size: 101384672
+ changelog: "[macos] Adding support for quicfuscator\n[windows] Less bugs"
+ sha256:
+ - 244
+ - 178
+ - 87
+ - 19
+ - 209
+ - 63
+ - 40
+ - 25
+ - 163
+ - 0
+ - 242
+ - 255
+ - 169
+ - 77
+ - 150
+ - 116
+ - 99
+ - 170
+ - 238
+ - 160
+ - 211
+ - 87
+ - 251
+ - 215
+ - 71
+ - 154
+ - 40
+ - 17
+ - 84
+ - 186
+ - 4
+ - 96
+beta:
+ version: 2025.3-beta1
+ urls:
+ - "https://releases.mullvad.net/desktop/releases/2025.3-beta1/MullvadVPN-2025.3-beta1_x64.exe"
+ size: 106297504
+ changelog: "[macos] Adding support for quicfuscator\n[windows] Less bugs"
+ sha256:
+ - 12
+ - 86
+ - 154
+ - 160
+ - 145
+ - 46
+ - 185
+ - 54
+ - 5
+ - 168
+ - 80
+ - 115
+ - 68
+ - 125
+ - 66
+ - 186
+ - 12
+ - 166
+ - 18
+ - 54
+ - 27
+ - 239
+ - 120
+ - 239
+ - 4
+ - 239
+ - 3
+ - 142
+ - 128
+ - 177
+ - 84
+ - 3
diff --git a/mullvad-update/test-version-response.json b/mullvad-update/test-version-response.json
index bc5a89adc1..0484159d5b 100644
--- a/mullvad-update/test-version-response.json
+++ b/mullvad-update/test-version-response.json
@@ -1,7 +1,7 @@
{
"signature": {
"keyid": "4d35f5376f1f58c41b2a0ee4600ae7811eace354f100227e853994deef38942d",
- "sig": "0537b9fc1f458592a3330e369ef521b2e29dacad2a422cbae37ff7ddd400a5381b063c5f3056e9e3db6235d128128d95b7c54bf305eb2f3bd250d722baa2a504"
+ "sig": "7dc4f2d491b972d98ead6a252022dd5cbe2d3829ae28f174129ee94bcd3d1329d19db90d46251c81d75e04e49db29ae950899bcb4e6cf7f64c3fedec3ee0ee08"
},
"signed": {
"expires": "2025-07-02T15:33:00Z",
@@ -74,6 +74,29 @@
}
],
"rollout": 1.0
+ },
+ {
+ "version": "2025.3-beta1",
+ "changelog": "[macos] Adding support for quicfuscator\n[windows] Less bugs",
+ "installers": [
+ {
+ "architecture": "x86",
+ "urls": [
+ "https://releases.mullvad.net/desktop/releases/2025.3-beta1/MullvadVPN-2025.3-beta1_x64.exe"
+ ],
+ "size": 106297504,
+ "sha256": "0c569aa0912eb93605a85073447d42ba0ca612361bef78ef04ef038e80b15403"
+ },
+ {
+ "architecture": "arm64",
+ "urls": [
+ "https://releases.mullvad.net/desktop/releases/2025.3-beta1/MullvadVPN-2025.3-beta1_arm64.exe"
+ ],
+ "size": 111488248,
+ "sha256": "82948D3DB5B869EE5F0D246DB557A81B72B68DFDDD2267872B7B8A5B19A05444"
+ }
+ ],
+ "rollout": 1.0
}
]
}