#[macro_use]
extern crate criterion;
use criterion::Criterion;
use tempfile::tempdir;
use wasmer_runtime::{
    cache::{Cache, FileSystemCache, WasmHash},
    compile, validate,
};

static NGINX_WASM: &'static [u8] = include_bytes!("../../../examples/nginx/nginx.wasm");

fn compile_module() {
    compile(NGINX_WASM).unwrap();
}

fn load_module(hash: WasmHash, cache: &impl Cache) {
    cache.load(hash).expect("could not load module");
}

fn hashing_benchmark(c: &mut Criterion) {
    c.bench_function("nginx HASH", |b| b.iter(|| WasmHash::generate(NGINX_WASM)));
}

fn validate_benchmark(c: &mut Criterion) {
    c.bench_function("nginx validate", |b| b.iter(|| validate(NGINX_WASM)));
}

fn compile_benchmark(c: &mut Criterion) {
    c.bench_function("nginx compile", |b| b.iter(|| compile_module()));
}

fn load_benchmark(c: &mut Criterion) {
    c.bench_function("nginx load", |b| {
        let tempdir = tempdir().unwrap();
        let mut cache = unsafe {
            FileSystemCache::new(tempdir.path()).expect("unable to create file system cache")
        };
        let module = compile(NGINX_WASM).unwrap();
        let wasm_hash = WasmHash::generate(NGINX_WASM);
        cache
            .store(wasm_hash, module)
            .expect("unable to store into cache");

        b.iter(|| load_module(wasm_hash, &cache))
    });
}

criterion_group! {
    name = benches;
    config = Criterion::default().sample_size(10);
    targets = validate_benchmark, hashing_benchmark, compile_benchmark, load_benchmark
}
criterion_main!(benches);