You are an expert in writing code in many different languages. Your goal is to perform code completion for the following code, keeping in mind the rest of the code and the file meta data.
    Metadata details:
    filename: main.rs
    path of file: ./repos/diem/crates/diem-rate-limiter/src
    
    the code of the file until where you have to start completion: // Copyright (c) The Diem Core Contributors
// SPDX-License-Identifier: Apache-2.0

use diem_infallible::Mutex;
use diem_rate_limiter::{
    async_lib::AsyncRateLimiter,
    rate_limit::{Bucket, SharedBucket},
};
use futures::{
    channel::mpsc::channel,
    executor::block_on,
    io::{AsyncRead, AsyncReadExt, AsyncWrite, AsyncWriteExt},
    Future, SinkExt, StreamExt,
};

use std::{
    sync::Arc,
    time::{Duration, Instant},
};
use tokio::{
    net::{TcpListener, TcpStream},
    runtime::Runtime,
};
use tokio_util::compat::*;

// Parameters for running the tests, change the port if there's a conflict
/// Where to run the test read/write
const ADDRESS: &str = "localhost:7777";
/// Total # of bytes to transfer.  May transfer more, but won't transfer less
const BYTES_TO_TRANSFER: usize = 100_000_000;
/// Expected throughput to be
    
fn main() {
    diem_logger::DiemLogger::init_for_testing();
    println!("Starting experiments");
    println!(
        "Bytes to test: {}, Expected Throughput(actions/s): {}, Expected Throughput(bytes/s): {}",
        BYTES_TO_TRANSFER,
        ALLOWED_BYTES_PER_SEC as f64 / CHUNK_SIZE as f64,
        ALLOWED_BYTES_PER_SEC
    );

    let runtime = Runtime::new().unwrap();

    run_experiment(
        "No Read or Write Limiting",
        &runtime,
        test_no_rate_limit(BYTES_TO_TRANSFER),
    );
    run_experiment(
        "Read Limited",
        &runtime,
        test_rate_limit_read(BYTES_TO_TRANSFER, ALLOWED_BYTES_PER_SEC),
    );
    run_experiment(
        "Write Limited",
        &runtime,
        test_rate_limit_write(BYTES_TO_TRANSFER, ALLOWED_BYTES_PER_SEC),
    );
    run_experiment(
        "Read & Write Limited",
        &runtime,
        test_rate_limit_read_write(
            BYTES_TO_TRANSFER,
            ALLOWED_BYTES_PER_SEC,
            ALLOWED_BYTES_PER_SEC,
        ),
    );
    run_experiment(
        "Write 2x Read Limited",
        &runtime,
        test_rate_limit_read_write(
            BYTES_TO_TRANSFER,
            ALLOWED_BYTES_PER_SEC,
            ALLOWED_BYTES_PER_SEC.saturating_mul(2),
        ),
    );
    run_experiment(
        "Read 2x Write Limited",
        &runtime,
        test_rate_limit_read_write(
            BYTES_TO_TRANSFER,
            ALLOWED_BYTES_PER_SEC.saturating_mul(2),
            ALLOWED_BYTES_PER_SEC,
        ),
    );
}