yocalhost

Crates.ioyocalhost
lib.rsyocalhost
version0.5.0
sourcesrc
created_at2023-09-04 22:36:19.40332
updated_at2024-08-10 02:44:08.812666
descriptionan http development server that simulates latency and bandwidth limitations
homepage
repositoryhttps://github.com/michaelkirk/yocalhost
max_upload_size
id963703
size63,061
Michael Kirk (michaelkirk)

documentation

README

localhost too fast? try yocalhost.

yocalhost is an http development server that simulates latency and bandwidth limitations.

It supports Range requests, and will throttle bandwidth across all concurrent connections.

Motivation

Evaluating against a naive localhost server, where latency and bandwidth are unrealistitcally fast, does little to tell you how your network access will perform in the real world.

Evaluating a network client against a remote host is subject to the whim of the rest of the internet. Especially if your client involves many requests, it can be hard to get consistent measurements.

With yocalhost, you run a local http server, but specify artificial bandwidth and latency limitations. This allows you to measure realistic(ish) implications of latency and bandwidth on your code in a reproducible way.

Installing the yocalhost development server CLI

Assuming you have rust and cargo installed, you can install yocalhost with:

cargo install yocahost

Then start with:

cd your_web_root

yocalhost

# Start on port 8888, simulating a 100 megabit connection with 50ms latency
yocalhost -p 8888 -b "100Mbit" -l 50

# See other options
yocalhost --help

Using yocalhost's ThrottledServer in your automated rust benchmarks

// e.g. in a criterion benchmark

use yocalhost::ThrottledServer;

let port = 8888;
let latency_ms = 50;
let bytes_per_second = 100_000_000 / 8;
let web_root = "../../test/data";

let server = ThrottledServer::new(port, latency_ms, bytes_per_second, web_root);
    
let runtime = tokio::runtime::Runtime::new().unwrap(); : Runtime    
runtime.spawn(async move {
    server.serve().await;
});

c.bench_function("my network test", |b| {
    b.to_async(runtime).iter(|| {
        do_some_work(format!("http://localhost:{port}")
    })
})

Commit count: 21

cargo fmt