use super::session_environment::{
EnvironmentPolicyKind, GrantAudience, GrantSourceSpec, GrantSpec, SessionEnvironment,
};
use crate::llm::test_env::ScopedEnvVar;
pub(crate) const UNADMITTED: &str = "PROBE_CHILD_UNADMITTED";
pub(crate) const IN_PROCESS: &str = "PROBE_CHILD_IN_PROCESS";
pub(crate) const SESSION: &str = "PROBE_CHILD_SESSION";
pub(crate) const NAMES: [&str; 3] = [UNADMITTED, IN_PROCESS, SESSION];
pub(crate) struct PlantedEngineEnvironment {
_vars: [ScopedEnvVar; 3],
}
pub(crate) fn plant() -> PlantedEngineEnvironment {
PlantedEngineEnvironment {
_vars: [
ScopedEnvVar::set(UNADMITTED, "engine-only"),
ScopedEnvVar::set(IN_PROCESS, "in-process-only"),
ScopedEnvVar::set(SESSION, "session-wide"),
],
}
}
pub(crate) fn granted_session() -> SessionEnvironment {
let grant = |name: &str, var: &str, audience| GrantSpec {
name: name.to_string(),
source: GrantSourceSpec::Env {
var: var.to_string(),
},
expose_as_env: Some(var.to_string()),
for_command: None,
expose_to: audience,
};
SessionEnvironment::launch(
EnvironmentPolicyKind::Granted,
vec![
grant("in_process", IN_PROCESS, GrantAudience::InProcess),
grant("session", SESSION, GrantAudience::Session),
],
&|name| std::env::var(name).ok(),
)
.expect("the probe session launches")
}
pub(crate) fn expected_report(set: &[&str]) -> String {
NAMES
.iter()
.map(|name| {
let state = if set.contains(name) { "set" } else { "unset" };
format!("{name}={state}")
})
.collect::<Vec<_>>()
.join(",")
}
pub(crate) fn report_command() -> (String, Vec<String>) {
(
"python3".to_string(),
vec![
"-c".to_string(),
format!("import os; print({}, end='')", python_report()),
],
)
}
pub(crate) fn python_report() -> String {
let names = NAMES
.iter()
.map(|name| format!("'{name}'"))
.collect::<Vec<_>>()
.join(", ");
format!("','.join(n + '=' + ('set' if n in os.environ else 'unset') for n in [{names}])")
}
pub(crate) struct InstalledSession;
impl InstalledSession {
pub(crate) fn install(environment: Option<SessionEnvironment>) -> Self {
crate::stdlib::process::set_session_environment(environment);
Self
}
}
impl Drop for InstalledSession {
fn drop(&mut self) {
crate::stdlib::process::set_session_environment(None);
}
}