use impeccable::asset_capture::CdpAssetRenderer; use impeccable_comp::{png_io, raster}; use impeccable_comp_verbs::asset_capture::{AssetCaptureRequest, AssetRenderer, CaptureBox}; use std::{ io::{Read, Write}, net::TcpListener, time::Duration, }; #[test] fn native_capture_distinguishes_paint_from_file_presence() { let env = std::env::vars().collect(); if impeccable_browser::discovery::find_browser(&env).is_err() { eprintln!("skip: no browser installed"); return; } let image = png_io::encode_png(&raster::create_image(32, 32, [231, 60, 30, 255]), &[]).unwrap(); let wrong = png_io::encode_png(&raster::create_image(32, 32, [20, 50, 200, 255]), &[]).unwrap(); let transparent = png_io::encode_png(&raster::create_image(32, 32, [0, 0, 0, 0]), &[]).unwrap(); let transparent_response = transparent.clone(); let listener = TcpListener::bind("127.0.0.1:0").unwrap(); let origin = format!("http://127.0.0.1:{}", listener.local_addr().unwrap().port()); let asset = image.clone(); std::thread::spawn(move || { for mut stream in listener.incoming().flatten() { stream .set_read_timeout(Some(Duration::from_secs(2))) .unwrap(); let mut bytes = [0u8; 4096]; let n = stream.read(&mut bytes).unwrap_or(0); let line = String::from_utf8_lossy(&bytes[..n]); let path = line.split_whitespace().nth(1).unwrap_or("/"); let (mime, body) = if path == "/transparent.png" { ("image/png", transparent_response.clone()) } else if path == "/art.png" || path == "/lazy.png" { ("image/png", asset.clone()) } else if path == "/collision/art.png" { ("image/png", wrong.clone()) } else { let mode = path.trim_start_matches('/'); let parent = match mode { "hidden" => "visibility:hidden", "opacity" | "pseudo-hidden" => "opacity:0", "clip" => "clip-path:inset(100%)", _ => "", }; let position = match mode { "shift" => "left:70px", "footer" => "top:500px", _ => "", }; let img = if mode == "pseudo-url-only" { "
" } else if mode.starts_with("pseudo-") && mode != "pseudo-neighbor" { "
" } else if mode == "layered-duplicate" { "
" } else if mode == "decoration" { "" } else if mode == "background" { "
" } else if mode == "wrong" || mode == "footer-trap" { "" } else { "" }; let cover = if mode == "duplicate" { "" } else if mode == "covered" || mode == "pseudo-covered" { "
" } else { "" }; let extra = match mode { "many-text-pseudos" => "
", "pseudo-specificity" => "", "pseudo-mutating" => "", "pseudo-neighbor" => { "
" } "canvas-cover" => { "" } "canvas-only" => { "" } "tiny-token" => "", "many" => { "" } "closed-shadow" => { "
" } "poison" => { "" } "state-probe" => { "" } "lazy" => { "" } "canvas" => { "" } "footer-trap" => { "" } "mutating" => { "" } "ambiguous" => { "" } "rotated-overlap" => "", "transition" => "", "animated" => { "" } _ => "", }; let html = format!( "
{img}{cover}
{extra}" ); ("text/html", html.into_bytes()) }; let _ = write!( stream, "HTTP/1.1 200 OK\r\nContent-Type: {mime}\r\nContent-Length: {}\r\nCache-Control: no-store\r\nConnection: close\r\n\r\n", body.len() ); let _ = stream.write_all(&body); } }); let mut renderer = CdpAssetRenderer::from_process_env(); for mode in [ "many", "many-text-pseudos", "closed-shadow", "poison", "state-probe", "duplicate", "decoration", "lazy", "baseline", "transition", "rotated-overlap", "hidden", "opacity", "clip", "covered", "shift", "footer", "wrong", "background", "footer-trap", "canvas", "pseudo-neighbor", "pseudo-background", "pseudo-url-only", "pseudo-hidden", "pseudo-covered", "pseudo-specificity", "pseudo-mutating", "layered-duplicate", "canvas-cover", "canvas-only", "tiny-token", "mutating", "ambiguous", "animated", ] { let captured = renderer .capture(&AssetCaptureRequest { url: format!("{origin}/{mode}"), viewport: [240, 180], reduced_motion: true, reference_bytes: image.clone(), asset_bytes: if mode == "decoration" { transparent.clone() } else { image.clone() }, expected_box: CaptureBox { x: 20., y: 20., w: 80., h: 80., }, }) .unwrap(); if let Ok(root) = std::env::var("IMPECCABLE_CAPTURE_TEST_OUTPUT") { let out = std::path::Path::new(&root).join(mode); std::fs::create_dir_all(&out).unwrap(); std::fs::write( out.join("receipt.json"), serde_json::to_vec_pretty(&captured.receipt).unwrap(), ) .unwrap(); for image in &captured.images { std::fs::write(out.join(&image.name), &image.png).unwrap(); } } let r = &captured.receipt; assert!(r["browser"]["product"].as_str().unwrap().contains("Chrome")); if ["canvas", "pseudo-neighbor", "canvas-cover", "canvas-only"].contains(&mode) { assert_eq!(r["status"], "unavailable", "{mode}: {r}"); assert_eq!(r["stableCapture"], true, "{mode}: {r}"); assert_eq!(r["surfaceCoverage"]["status"], "partial", "{mode}: {r}"); assert_eq!(r["adequateVisibility"], "not-assessed", "{mode}: {r}"); let paint = &r["combinedContribution"]["changedPixelsInRegion"]; match mode { "canvas" => assert_eq!(paint, 6400), "canvas-cover" => assert_eq!(paint, 0), "pseudo-neighbor" => { assert!(paint.as_u64().unwrap() > 0 && paint.as_u64().unwrap() < 6400) } "canvas-only" => assert_eq!( r["combinedContribution"]["status"], "no-matching-supported-instance" ), _ => unreachable!(), } continue; } if mode == "tiny-token" { assert_eq!(r["combinedContribution"]["changedPixelsInRegion"], 1); assert_eq!(r["adequateVisibility"], "not-assessed"); assert_eq!(r["instances"][0]["boxDelta"]["w"], -79.); continue; } if [ "many", "closed-shadow", "canvas", "mutating", "pseudo-specificity", "pseudo-mutating", "ambiguous", "animated", ] .contains(&mode) { assert_eq!(r["status"], "unavailable", "{mode}: {r}"); continue; } assert_eq!(r["status"], "captured", "{mode}: {r}"); let instances = r["instances"].as_array().unwrap(); if mode == "rotated-overlap" { assert_eq!(instances.len(), 2); assert!(instances.iter().all(|i| i["restorationVerified"] == true)); assert!(r["combinedContribution"]["changedPixelsInRegion"].as_u64().unwrap() > 0); continue; } if mode == "wrong" { assert!(instances.is_empty()); continue; } if mode == "duplicate" || mode == "layered-duplicate" { assert_eq!(instances.len(), 2); assert!(instances.iter().all(|i| i["changedPixelsInRegion"] == 0)); assert_eq!(r["combinedContribution"]["changedPixelsInRegion"], 6400); continue; } assert_eq!(instances.len(), 1, "{mode}: {r}"); let i = &instances[0]; if mode == "footer" || mode == "footer-trap" { assert_eq!(i["status"], "outside-required-region"); continue; } assert_eq!(i["status"], "measured", "{mode}: {r}"); let pixels = i["changedPixelsInRegion"].as_u64().unwrap(); if ["decoration", "hidden", "opacity", "clip", "covered", "pseudo-hidden", "pseudo-covered"].contains(&mode) { assert_eq!(pixels, 0, "{mode}"); } else { assert!(pixels > 0, "{mode}"); } if mode == "shift" { assert_eq!(i["boxDelta"]["x"], 50.); assert!(pixels < 6400); } if mode == "poison" { assert_eq!(i["boxDelta"]["x"], 0.); } if mode == "baseline" { assert_eq!(pixels, 6400); } } }