Your browser sucks, JavaScript disabled! Gunnar's console needs JavaScript and WebAssembly. Git over SSH on port 2222 does not.

nordisk/facett

facet-wrapped/examples/browser_bench.rs

//! Run the browser bench harness (`facet_wrapped::browser_bench`) from the command line.
//!
//! ```text
//! cargo run --release -p facet-wrapped --example browser_bench -- \
//!     --dist facet-wrapped/dist --component graphnav --nodes 100000 --power high [--port 8701] [--headless]
//! ```
//!
//! Prints the page's JSON result on stdout; `--out FILE` also appends it as one line.

use std::path::PathBuf;
use std::time::Duration;

use facet_wrapped::browser_bench::{self, BrowserRun, Power};

fn main() {
    let mut args = std::env::args().skip(1);
    let mut dist = PathBuf::from("facet-wrapped/dist");
    let mut component = "graphnav".to_string();
    let mut nodes = 10_000usize;
    let mut power = Power::HighPerformance;
    let mut drag_ms = 3000u32;
    let mut timeout = 300u64;
    let mut out: Option<PathBuf> = None;
    // 0 = not given: take the first free port of 8701..=8719, the bench lane's range on
    // a shared box (loki, the t14s), rather than whatever the OS hands out.
    let mut port = 0u16;
    // Headless Chrome on the GPU render node (a box someone is working on); default is a
    // headful window on the desktop session.
    let mut headless = false;
    while let Some(a) = args.next() {
        let mut val = || args.next().unwrap_or_else(|| panic!("{a} needs a value"));
        match a.as_str() {
            "--dist" => dist = PathBuf::from(val()),
            "--component" => component = val(),
            "--nodes" => nodes = val().parse().expect("--nodes N"),
            "--power" => {
                power = match val().as_str() {
                    "low" | "low-power" => Power::LowPower,
                    _ => Power::HighPerformance,
                }
            }
            "--drag-ms" => drag_ms = val().parse().expect("--drag-ms N"),
            "--timeout-s" => timeout = val().parse().expect("--timeout-s N"),
            "--out" => out = Some(PathBuf::from(val())),
            "--port" => port = val().parse().expect("--port N"),
            "--headless" => headless = true,
            other => panic!("unknown argument {other}"),
        }
    }
    if port == 0 {
        port = (8701..=8719)
            .find(|p| std::net::TcpListener::bind(("127.0.0.1", *p)).is_ok())
            .expect("every port of 8701..=8719 is taken; pass --port");
    }
    let chrome = browser_bench::find_chrome().expect("no Chrome on PATH (set CHROME=)");
    let scratch = std::env::var_os("TMPDIR").map_or_else(std::env::temp_dir, PathBuf::from);
    let run = BrowserRun {
        dist,
        component,
        nodes,
        power,
        drag_ms,
        timeout: Duration::from_secs(timeout),
        chrome,
        scratch,
        port,
        headless,
    };
    match browser_bench::run(&run) {
        Ok(v) => {
            let line = v.to_string();
            println!(
                "{}",
                serde_json::to_string_pretty(&v).unwrap_or(line.clone())
            );
            if let Some(p) = out {
                use std::io::Write;
                let mut f = std::fs::OpenOptions::new()
                    .create(true)
                    .append(true)
                    .open(&p)
                    .expect("open --out");
                writeln!(f, "{line}").expect("write --out");
            }
        }
        Err(e) => {
            eprintln!("browser_bench: {e}");
            std::process::exit(1);
        }
    }
}