diff options
| author | David Lönnhager <david.l@mullvad.net> | 2025-02-12 21:50:46 +0100 |
|---|---|---|
| committer | David Lönnhager <david.l@mullvad.net> | 2025-03-05 23:32:01 +0100 |
| commit | 0d789aa30a2f21217d5f0894c3056f2c9923b5c1 (patch) | |
| tree | 5538f4bffbcb8a0a9c9ef30d7e2c57e19ef2d6ec | |
| parent | b2f54826a9b2951ecf56c7794f341124b0220762 (diff) | |
| download | mullvadvpn-0d789aa30a2f21217d5f0894c3056f2c9923b5c1.tar.xz mullvadvpn-0d789aa30a2f21217d5f0894c3056f2c9923b5c1.zip | |
Add improved API response parse tests
| -rw-r--r-- | Cargo.lock | 1 | ||||
| -rw-r--r-- | Cargo.toml | 1 | ||||
| -rw-r--r-- | installer-downloader/Cargo.toml | 2 | ||||
| -rw-r--r-- | mullvad-update/Cargo.toml | 1 | ||||
| -rw-r--r-- | mullvad-update/src/api.rs | 37 | ||||
| -rw-r--r-- | mullvad-update/src/format/mod.rs | 2 | ||||
| -rw-r--r-- | mullvad-update/src/snapshots/mullvad_update__api__test__api_version_info_provider_parser_arm64.snap | 45 | ||||
| -rw-r--r-- | mullvad-update/src/snapshots/mullvad_update__api__test__api_version_info_provider_parser_x86.snap | 83 | ||||
| -rw-r--r-- | mullvad-update/test-version-response.json | 25 |
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(¶ms, response)?; + // Expect: The available latest versions for X86, where the rollout is 1. + let info = VersionInfo::try_from_response(¶ms, 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(¶ms, 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 } ] } |
