use super::*;
fn merge_for_test_inner(
cfg: &mut Config,
dirs: &[&Path],
) -> std::result::Result<(Vec<BackendResolutionReceipt>, Vec<String>), String> {
let mut assembly = BackendAssembly::new(std::mem::take(&mut cfg.backends))?;
for dir in dirs {
assembly.merge_dir(dir)?;
}
if assembly.operator_configured() {
cfg.backend_fallback = false;
}
let warnings = assembly.warnings().to_vec();
let (backends, receipts) = assembly.finish();
cfg.backends = backends;
Ok((receipts, warnings))
}
fn merge_for_test(
cfg: &mut Config,
dirs: &[&Path],
) -> std::result::Result<Vec<BackendResolutionReceipt>, String> {
merge_for_test_inner(cfg, dirs).map(|(receipts, _warnings)| receipts)
}
fn merge_for_test_with_warnings(
cfg: &mut Config,
dirs: &[&Path],
) -> std::result::Result<(Vec<BackendResolutionReceipt>, Vec<String>), String> {
merge_for_test_inner(cfg, dirs)
}
fn resolve_for_test_inner(
cfg: &mut Config,
dirs: &[&Path],
over: Option<BackendOverride>,
) -> std::result::Result<(Vec<BackendResolutionReceipt>, Vec<String>), String> {
let mut assembly = BackendAssembly::new(std::mem::take(&mut cfg.backends))?;
for dir in dirs {
assembly.merge_dir(dir)?;
}
let _slot = assembly.apply_request(over, cfg.default_backend.as_deref())?;
let warnings = assembly.warnings().to_vec();
let (backends, receipts) = assembly.finish();
cfg.backends = backends;
Ok((receipts, warnings))
}
fn resolve_for_test(
cfg: &mut Config,
dirs: &[&Path],
over: Option<BackendOverride>,
) -> std::result::Result<Vec<BackendResolutionReceipt>, String> {
resolve_for_test_inner(cfg, dirs, over).map(|(receipts, _warnings)| receipts)
}
fn resolve_for_test_with_warnings(
cfg: &mut Config,
dirs: &[&Path],
over: Option<BackendOverride>,
) -> std::result::Result<(Vec<BackendResolutionReceipt>, Vec<String>), String> {
resolve_for_test_inner(cfg, dirs, over)
}
struct HomeSandbox {
config: Option<std::ffi::OsString>,
config_dir: Option<std::ffi::OsString>,
home: Option<std::ffi::OsString>,
cwd: PathBuf,
}
impl HomeSandbox {
fn enter(dir: &Path) -> Self {
let sandbox = Self {
config: std::env::var_os("NEWT_CONFIG"),
config_dir: std::env::var_os(NEWT_CONFIG_DIR_ENV),
home: std::env::var_os("HOME"),
cwd: std::env::current_dir().unwrap(),
};
unsafe {
std::env::remove_var("NEWT_CONFIG");
std::env::set_var(NEWT_CONFIG_DIR_ENV, dir);
std::env::set_var("HOME", dir);
}
std::env::set_current_dir(dir).unwrap();
sandbox
}
}
impl Drop for HomeSandbox {
fn drop(&mut self) {
let _ = std::env::set_current_dir(&self.cwd);
unsafe {
match self.config.take() {
Some(v) => std::env::set_var("NEWT_CONFIG", v),
None => std::env::remove_var("NEWT_CONFIG"),
}
match self.config_dir.take() {
Some(v) => std::env::set_var(NEWT_CONFIG_DIR_ENV, v),
None => std::env::remove_var(NEWT_CONFIG_DIR_ENV),
}
match self.home.take() {
Some(v) => std::env::set_var("HOME", v),
None => std::env::remove_var("HOME"),
}
}
}
}
struct ConfigDirGuard {
prev: Option<std::ffi::OsString>,
}
impl ConfigDirGuard {
fn set(dir: &Path) -> Self {
let prev = std::env::var_os(NEWT_CONFIG_DIR_ENV);
unsafe { std::env::set_var(NEWT_CONFIG_DIR_ENV, dir) };
Self { prev }
}
}
impl Drop for ConfigDirGuard {
fn drop(&mut self) {
unsafe {
match self.prev.take() {
Some(v) => std::env::set_var(NEWT_CONFIG_DIR_ENV, v),
None => std::env::remove_var(NEWT_CONFIG_DIR_ENV),
}
}
}
}
#[cfg(test)]
#[path = "backend_schema.rs"]
mod backend_schema_tests;
#[cfg(test)]
#[path = "backend_layers.rs"]
mod backend_layers_tests;
#[cfg(test)]
#[path = "backend_requests.rs"]
mod backend_requests_tests;
#[cfg(test)]
#[path = "backend_selection.rs"]
mod backend_selection_tests;
#[cfg(test)]
#[path = "dropin.rs"]
mod dropin_tests;
#[cfg(test)]
#[path = "backend_writers.rs"]
mod backend_writers_tests;
#[cfg(test)]
#[path = "context.rs"]
mod context_tests;
#[cfg(test)]
#[path = "crew.rs"]
mod crew_tests;
#[cfg(test)]
#[path = "discovery.rs"]
mod discovery_tests;
#[cfg(test)]
#[path = "layering.rs"]
mod layering_tests;
#[cfg(test)]
#[path = "loading.rs"]
mod loading_tests;
#[cfg(test)]
#[path = "loadout.rs"]
mod loadout_tests;
#[cfg(test)]
#[path = "mcp.rs"]
mod mcp_tests;
#[cfg(test)]
#[path = "memory.rs"]
mod memory_tests;
#[cfg(test)]
#[path = "permissions.rs"]
mod permissions_tests;
#[cfg(test)]
#[path = "presentation.rs"]
mod presentation_tests;
#[cfg(test)]
#[path = "profile.rs"]
mod profile_tests;
#[cfg(test)]
#[path = "redaction.rs"]
mod redaction_tests;
#[cfg(test)]
#[path = "runtime.rs"]
mod runtime_tests;
#[cfg(test)]
#[path = "semantic.rs"]
mod semantic_tests;
#[cfg(test)]
#[path = "skills.rs"]
mod skills_tests;
#[cfg(test)]
#[path = "summarizer.rs"]
mod summarizer_tests;
#[cfg(test)]
#[path = "tool_exposure.rs"]
mod tool_exposure_tests;
#[cfg(test)]
#[path = "tools.rs"]
mod tools_tests;
#[cfg(test)]
#[path = "reads_do_not_publish.rs"]
mod reads_do_not_publish_tests;