mirror of
https://github.com/storytold/lightcraft.git
synced 2026-10-27 11:37:13 -06:00
* CI: dev profile keeps line tables for workspace crates and no debug info for dependencies * Control server tests: persistent_requests_and_slow_replies_outlive_the_idle_read_timeout no longer races the idle timeout Each request (and the closing half-shutdown) reaches the socket before the worker reads, so on a slow machine only the reply waits outlast the 100 ms idle timeout, as the test intends. The idle test sends its input the same way, and the no-frames test allows 5 s instead of 2 s to give up. * CI: one integration-test binary per crate Each crate's tests/*.rs become modules of tests/it/main.rs (51 test files into 13 binaries, plus 6 that stay their own). Inner #![cfg] attributes move to the mod lines. Files that change state for the whole process keep a binary of their own: codecs jxl_tail_heap and raw sr2_heap (dhat global allocator), gpu shutdown, shutdown_first and memory, ui-egui shutdown. Docs, comments and the GPU probe name the new paths and targets (--test it <module>::); the CI report names an it binary's skips after the crate. * CI: tests under nextest, doctests apart, one wasm check xtask ci runs the tests with cargo nextest run --lib --bins --tests when cargo-nextest is installed, else cargo test with the same targets and a one-line notice; doctests run after them with cargo test --workspace --doc. The heif and hardware GPU steps use the same runner. Examples stay out of the test build (clippy --all-targets still checks them). Concurrent tests under nextest follow the RUST_TEST_THREADS cap (NEXTEST_TEST_THREADS). The wasm check is one cargo check --keep-going over the same crates, and clippy runs with --keep-going. * CI: tests run under cargo test by default, nextest with LIGHTCRAFT_NEXTEST=1 (per-process scene cache)
22 lines
1.1 KiB
Rust
22 lines
1.1 KiB
Rust
use lightcraft_segment::remote::{Operation, Request, read_frame};
|
|
use std::io::Cursor;
|
|
|
|
#[test]
|
|
fn rejects_unbounded_and_truncated_frames() {
|
|
assert!(read_frame(&mut Cursor::new(u32::MAX.to_be_bytes()), 1024).is_err());
|
|
assert!(read_frame(&mut Cursor::new([0, 0, 0, 3, 1]), 1024).is_err());
|
|
}
|
|
|
|
#[test]
|
|
fn validates_images_and_prompt_boundaries() {
|
|
let request = |width, height, operation| Request { width, height, temporary: false, operation };
|
|
assert!(request(1009, 1, Operation::Prepare).validate().is_err());
|
|
assert!(request(0, 1, Operation::Prepare).validate().is_err());
|
|
assert!(request(0, 0, Operation::Text("dog".into())).validate().is_ok());
|
|
assert!(request(4, 3, Operation::Clicks(vec![[0.5, 0.5, 1.0]])).validate().is_ok());
|
|
assert!(request(4, 3, Operation::Clicks(vec![[1.5, 0.5, 1.0]])).validate().is_err());
|
|
assert!(request(4, 3, Operation::Clicks(vec![[0.5, f32::NAN, 1.0]])).validate().is_err());
|
|
assert!(request(4, 3, Operation::Clicks(vec![[0.5, 0.5, 0.0]])).validate().is_err());
|
|
assert!(request(4, 3, Operation::Text(" ".into())).validate().is_err());
|
|
}
|