makepad/libs/flow/tests/engine_gen_e2e.rs
Admin 2b98a1f048 flow: the run engine — instances with an inputs table, one VM per run with live Fn closures, a dataflow scheduler, five executors (chat over the hub session, gen over the fleet, fn, http under an egress policy, ask that parks a run), content-addressed values with a RAM budget and spill
Real adapters by default (HubChat, FleetGen, HubHttp); seams for tests; the
gen path is proven end to end against the in-process testpattern hub service.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-03 17:01:53 +02:00

89 lines
3.2 KiB
Rust

mod support;
use makepad_ai_hub::discovery::DEFAULT_FLEET;
use makepad_ai_hub::download::Downloader;
use makepad_ai_hub::peer_serve::PeerOptions;
use makepad_ai_hub::registry::{Domain, ModelSpec, Registry};
use makepad_ai_hub::server::{start_service, ServiceConfig};
use makepad_flow::engine::FixedGen;
use std::sync::Arc;
use std::time::SystemTime;
use support::{output, FakeChat, FakeHttp};
#[test]
fn fixed_gen_runs_real_testpattern_service_and_is_deterministic() {
let cache_dir = std::env::temp_dir().join(format!(
"makepad-flow-gen-e2e-{}-{}",
std::process::id(),
SystemTime::now()
.duration_since(SystemTime::UNIX_EPOCH)
.unwrap()
.as_nanos()
));
std::fs::create_dir_all(&cache_dir).unwrap();
let service = start_service(ServiceConfig {
host: "127.0.0.1".to_string(),
port: 0,
cache_dir: cache_dir.clone(),
registry: Registry {
models: vec![ModelSpec {
id: "testpattern".to_string(),
domain: Domain::Image,
backend: "testpattern".to_string(),
available: true,
gated: false,
vram_gb: Some(0.0),
min_vram_gb: None,
min_compute_cap: None,
note: None,
license: None,
files: Vec::new(),
}],
},
downloader: Downloader::new("http://127.0.0.1:1", None).unwrap(),
peer: PeerOptions {
serve: Some(false),
sources: Some(Vec::new()),
..Default::default()
},
fleet: DEFAULT_FLEET.to_string(),
});
let handle = match service {
Ok(handle) => handle,
Err(error) if error.to_string().contains("Operation not permitted") => {
let _ = std::fs::remove_dir_all(&cache_dir);
eprintln!("skipping real hub service: loopback bind is forbidden by this sandbox");
return;
}
Err(error) => panic!("start real hub service: {error}"),
};
let base_url = format!("http://{}", handle.addr);
// The service has no stop message; the integration-test process owns all
// of its threads and drops them together at process exit.
std::mem::forget(handle);
let source = r#"use mod.flow.*
let prompt = Input{default: "same prompt"}
let image = Image{prompt: prompt.text() width: 64 height: 48 steps: 4 seed: 42 model: "testpattern"}
let picture = Output{type: @image value: image.image()}
Flow{prompt, image, picture}
"#;
let run_once = || {
support::run(
source,
makepad_flow::engine::Seams {
chat: Arc::new(FakeChat::done("unused")),
gen: Arc::new(FixedGen(base_url.clone())),
http: Arc::new(FakeHttp::json(200, "{}")),
},
None,
)
};
let first = run_once();
let second = run_once();
let first = output(&first, "picture");
let second = output(&second, "picture");
assert_eq!(first.content_type, "image/png");
assert_eq!(&first.bytes[..8], &[0x89, b'P', b'N', b'G', b'\r', b'\n', 0x1a, b'\n']);
assert_eq!(first.digest, second.digest);
}