From 6dc8ebcb905dc3b24a1c438c61ee36b68aeae6e8 Mon Sep 17 00:00:00 2001 From: konsti Date: Mon, 4 Dec 2023 11:03:43 +0100 Subject: [PATCH] Test interpreter cache invalidation (#540) Add missing test for #529/#508. --- Cargo.lock | 2 + crates/puffin-interpreter/Cargo.toml | 4 ++ crates/puffin-interpreter/src/interpreter.rs | 75 ++++++++++++++++++++ 3 files changed, 81 insertions(+) diff --git a/Cargo.lock b/Cargo.lock index 0a0d7dfda..c972ccdcf 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2532,12 +2532,14 @@ name = "puffin-interpreter" version = "0.0.1" dependencies = [ "fs-err", + "indoc", "pep440_rs 0.3.12", "pep508_rs", "platform-host", "puffin-cache", "serde", "serde_json", + "tempfile", "thiserror", "tokio", "tracing", diff --git a/crates/puffin-interpreter/Cargo.toml b/crates/puffin-interpreter/Cargo.toml index a0e7d98cd..be55a3374 100644 --- a/crates/puffin-interpreter/Cargo.toml +++ b/crates/puffin-interpreter/Cargo.toml @@ -24,3 +24,7 @@ thiserror = { workspace = true } tokio = { workspace = true } tracing = { workspace = true } serde = { workspace = true, features = ["derive"] } + +[dev-dependencies] +indoc = { version = "2.0.4" } +tempfile = { worspace = true } diff --git a/crates/puffin-interpreter/src/interpreter.rs b/crates/puffin-interpreter/src/interpreter.rs index 0a34839ef..734f261cd 100644 --- a/crates/puffin-interpreter/src/interpreter.rs +++ b/crates/puffin-interpreter/src/interpreter.rs @@ -208,3 +208,78 @@ impl InterpreterQueryResult { Ok(info) } } + +#[cfg(test)] +mod tests { + use crate::Interpreter; + use fs_err as fs; + use indoc::{formatdoc, indoc}; + use pep440_rs::Version; + use platform_host::Platform; + use puffin_cache::Cache; + use std::str::FromStr; + use tempfile::tempdir; + + #[test] + #[cfg(unix)] + fn test_cache_invalidation() { + let mock_dir = tempdir().unwrap(); + let mocked_interpreter = mock_dir.path().join("python"); + let json = indoc! {r##" + { + "markers": { + "implementation_name": "cpython", + "implementation_version": "3.12.0", + "os_name": "posix", + "platform_machine": "x86_64", + "platform_python_implementation": "CPython", + "platform_release": "6.5.0-13-generic", + "platform_system": "Linux", + "platform_version": "#13-Ubuntu SMP PREEMPT_DYNAMIC Fri Nov 3 12:16:05 UTC 2023", + "python_full_version": "3.12.0", + "python_version": "3.12", + "sys_platform": "linux" + }, + "base_exec_prefix": "/home/ferris/.pyenv/versions/3.12.0", + "base_prefix": "/home/ferris/.pyenv/versions/3.12.0", + "sys_executable": "/home/ferris/projects/puffin/.venv/bin/python" + } + "##}; + + let cache = Cache::temp().unwrap(); + let platform = Platform::current().unwrap(); + + fs::write( + &mocked_interpreter, + formatdoc! {r##" + #!/bin/bash + echo '{json}' + "##}, + ) + .unwrap(); + fs::set_permissions( + &mocked_interpreter, + std::os::unix::fs::PermissionsExt::from_mode(0o770), + ) + .unwrap(); + let interpreter = + Interpreter::query(&mocked_interpreter, platform.clone(), &cache).unwrap(); + assert_eq!( + interpreter.markers.python_version.version, + Version::from_str("3.12").unwrap() + ); + fs::write( + &mocked_interpreter, + formatdoc! {r##" + #!/bin/bash + echo '{}' + "##, json.replace("3.12", "3.13")}, + ) + .unwrap(); + let interpreter = Interpreter::query(&mocked_interpreter, platform, &cache).unwrap(); + assert_eq!( + interpreter.markers.python_version.version, + Version::from_str("3.13").unwrap() + ); + } +}