// Copyright 2022 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

use {
    fidl_fuchsia_debugdata::PublisherMarker, fuchsia_component::client::connect_to_protocol,
    fuchsia_zircon as zx,
};

async fn publish_debug_data(num_vmos: usize, vmo_size: usize) {
    let vmo_contents = "a".repeat(vmo_size);
    let publisher = connect_to_protocol::<PublisherMarker>().unwrap();
    for i in 0..num_vmos {
        let (_vmo_server, vmo_token) = zx::EventPair::create();
        let data = zx::Vmo::create(vmo_size as u64).unwrap();
        data.write(vmo_contents.as_bytes(), 0).expect("write to VMO");
        data.set_content_size(&(vmo_contents.len() as u64)).expect("set VMO content size");
        let name = format!("data_sink_{}", i);
        publisher.publish(&name, data, vmo_token).expect("The connection should not die");
    }
}

#[fuchsia::test]
async fn many_small_vmos() {
    const NUM_VMOS: usize = 3250;
    const VMO_SIZE: usize = 1024 * 4; // 4KiB
    publish_debug_data(NUM_VMOS, VMO_SIZE).await;
}

#[fuchsia::test]
async fn few_large_vmos() {
    const NUM_VMOS: usize = 2;
    const VMO_SIZE: usize = 1024 * 1024 * 400; // 400 MiB
    publish_debug_data(NUM_VMOS, VMO_SIZE).await;
}
