Implement pure Rust visual snapshots (#132)
This commit is contained in:
@@ -2,10 +2,14 @@ use std::collections::BTreeSet;
|
||||
use std::fs;
|
||||
use std::path::{Path, PathBuf};
|
||||
|
||||
const ALLOWED_DEPENDENCIES: [&str; 13] = [
|
||||
const ALLOWED_DEPENDENCIES: [&str; 17] = [
|
||||
"base64",
|
||||
"crossterm",
|
||||
"libremetaverse",
|
||||
"libremetaverse-imaging",
|
||||
"libremetaverse-rendering-simple",
|
||||
"metacrate-lsl-tools",
|
||||
"png",
|
||||
"libremetaverse-types",
|
||||
"reqwest",
|
||||
"rustls",
|
||||
@@ -48,10 +52,10 @@ fn package_has_only_reviewed_rust_dependencies_and_no_build_script() {
|
||||
#[test]
|
||||
fn runtime_source_has_no_subprocess_or_native_abi_escape_hatch() {
|
||||
let source = PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("src");
|
||||
let mut files = Vec::with_capacity(34);
|
||||
let mut files = Vec::with_capacity(36);
|
||||
collect_rust_files(&source, &mut files);
|
||||
assert!(
|
||||
files.len() <= 34,
|
||||
files.len() <= 36,
|
||||
"source-file count needs a reviewed bound update"
|
||||
);
|
||||
for path in files {
|
||||
@@ -82,6 +86,27 @@ fn runtime_source_has_no_subprocess_or_native_abi_escape_hatch() {
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn vision_path_selects_only_the_pure_rust_renderer_and_codec() {
|
||||
let root = PathBuf::from(env!("CARGO_MANIFEST_DIR"));
|
||||
let manifest = fs::read_to_string(root.join("Cargo.toml")).expect("agent manifest");
|
||||
assert!(manifest.contains("default-features = false, features = [\"rust-j2k\"]"));
|
||||
for forbidden in ["imaging-skia", "openjpeg", "skia-safe"] {
|
||||
assert!(!manifest.contains(forbidden), "vision enables {forbidden}");
|
||||
}
|
||||
let renderer = fs::read_to_string(root.join("../libremetaverse-rendering-simple/Cargo.toml"))
|
||||
.expect("simple renderer manifest");
|
||||
assert!(!renderer.contains("imaging-skia"));
|
||||
assert!(!renderer.contains("openjpeg"));
|
||||
let vision = fs::read_to_string(root.join("src/vision.rs")).expect("vision source");
|
||||
for forbidden in ["screenshot crate", "gpu adapter", "std::process"] {
|
||||
assert!(
|
||||
!vision.to_ascii_lowercase().contains(forbidden),
|
||||
"vision must remain synthetic and pure Rust: {forbidden}"
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn compatibility_crates_never_depend_on_or_reexport_metacrate_crates() {
|
||||
let workspace = PathBuf::from(env!("CARGO_MANIFEST_DIR"))
|
||||
|
||||
@@ -503,6 +503,45 @@ async fn retry_classification_retry_after_timeout_and_cancellation_are_bounded()
|
||||
assert_eq!(request.await.expect_err("cancelled"), LlmError::Cancelled);
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn multimodal_capability_rejection_is_typed_and_never_retried() {
|
||||
let mut server = fake_server(vec![ResponsePlan::status(415)]).await;
|
||||
let mut retry_limits = limits();
|
||||
retry_limits.max_retries = 2;
|
||||
let image = CompletionMessage {
|
||||
role: MessageRole::Avatar,
|
||||
content: metacrate_grid_agent::BoundedVec::try_from_vec(
|
||||
"message.content",
|
||||
vec![ContentPart::Image {
|
||||
url: metacrate_grid_agent::BoundedText::new(
|
||||
"image.url",
|
||||
"data:image/png;base64,iVBORw0KGgo=",
|
||||
)
|
||||
.unwrap(),
|
||||
detail: ImageDetail::Low,
|
||||
}],
|
||||
)
|
||||
.unwrap(),
|
||||
tool_call_id: None,
|
||||
proposed_calls: metacrate_grid_agent::BoundedVec::new(),
|
||||
};
|
||||
assert_eq!(
|
||||
client(&server.url, retry_limits)
|
||||
.complete(&[image], &[], &CancellationToken::default())
|
||||
.await
|
||||
.expect_err("multimodal rejection"),
|
||||
LlmError::MultimodalUnsupported
|
||||
);
|
||||
server.requests.recv().await.expect("one image request");
|
||||
assert!(
|
||||
!matches!(
|
||||
tokio::time::timeout(Duration::from_millis(100), server.requests.recv()).await,
|
||||
Ok(Some(_))
|
||||
),
|
||||
"capability rejection must not resend the large image"
|
||||
);
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn concurrent_slow_sessions_respect_the_shared_semaphore() {
|
||||
let plans = (0..6)
|
||||
|
||||
Reference in New Issue
Block a user