colink 0.3.10

CoLink Rust SDK
Documentation
mod common;
use colink::CoLink;
use common::*;
use rand::Rng;

#[tokio::test]
async fn test_storage_macro_chunk() -> Result<(), Box<dyn std::error::Error + Send + Sync + 'static>>
{
    let (_ir, _is, cl) = set_up_test_env_single_user().await?;

    let key_name = "storage_macro_test_chunk:$chunk";
    test_crud(&cl, key_name).await?;

    Ok(())
}

#[tokio::test]
async fn test_storage_macro_redis() -> Result<(), Box<dyn std::error::Error + Send + Sync + 'static>>
{
    let (_ir, _is, cl) = set_up_test_env_single_user().await?;

    cl.create_entry("storage_macro_test_redis:redis_url", b"redis://127.0.0.1")
        .await?;
    let key_name = "storage_macro_test_redis:$redis:redis_key";
    test_crud(&cl, key_name).await?;

    Ok(())
}

#[tokio::test]
async fn test_storage_macro_fs() -> Result<(), Box<dyn std::error::Error + Send + Sync + 'static>> {
    let (_ir, _is, cl) = set_up_test_env_single_user().await?;

    cl.create_entry("test_storage_macro_fs:path", b"/tmp/colink-sm-fs-test/test")
        .await?;
    let key_name = "test_storage_macro_fs:$fs";
    test_crud(&cl, key_name).await?;

    cl.create_entry(
        "test_storage_macro_fs_dir:path",
        b"/tmp/colink-sm-fs-test/test-dir",
    )
    .await?;
    let key_name = "test_storage_macro_fs_dir:$fs:test-file";
    test_crud(&cl, key_name).await?;
    let key_name = "test_storage_macro_fs_dir:$fs:test-dir:test-file";
    test_crud(&cl, key_name).await?;

    Ok(())
}

async fn test_crud(
    cl: &CoLink,
    key_name: &str,
) -> Result<(), Box<dyn std::error::Error + Send + Sync + 'static>> {
    let payload = rand::thread_rng()
        .sample_iter(&rand::distributions::Standard)
        .take(5e6 as usize)
        .collect::<Vec<u8>>();
    cl.create_entry(key_name, &payload).await?;
    println!("Create");
    assert!(cl.create_entry(key_name, b"").await.is_err());
    let data = cl.read_entry(key_name).await?;
    println!("Read");
    assert_eq!(data, payload);
    let new_payload = rand::thread_rng()
        .sample_iter(&rand::distributions::Standard)
        .take(3e6 as usize)
        .collect::<Vec<u8>>();
    cl.update_entry(key_name, &new_payload).await?;
    println!("Update");
    let data = cl.read_entry(key_name).await?;
    assert_eq!(data, new_payload);
    cl.delete_entry(key_name).await?;
    println!("Delete");
    assert!(cl.read_entry(key_name).await.is_err());
    assert!(cl.delete_entry(key_name).await.is_err());
    Ok(())
}

#[tokio::test]
async fn test_storage_macro_append(
) -> Result<(), Box<dyn std::error::Error + Send + Sync + 'static>> {
    let (_ir, _is, cl) = set_up_test_env_single_user().await?;

    let key_name = "storage_macro_test_append";
    test_append(&cl, key_name, 10 as usize).await?;

    Ok(())
}

async fn test_append(
    cl: &CoLink,
    key_name: &str,
    size: usize,
) -> Result<(), Box<dyn std::error::Error + Send + Sync + 'static>> {
    let payload0 = rand::thread_rng()
        .sample_iter(&rand::distributions::Standard)
        .take(size)
        .collect::<Vec<u8>>();
    let payload1 = rand::thread_rng()
        .sample_iter(&rand::distributions::Standard)
        .take(size)
        .collect::<Vec<u8>>();
    cl.create_entry(key_name, &payload0).await?;
    cl.update_entry(&format!("{}:$append", key_name), &payload1)
        .await?;
    let data = cl.read_entry(key_name).await?;
    assert_eq!(data, [payload0, payload1].concat());
    cl.delete_entry(key_name).await?;
    Ok(())
}

#[tokio::test]
async fn test_storage_macro_redis_keys(
) -> Result<(), Box<dyn std::error::Error + Send + Sync + 'static>> {
    let (_ir, _is, cl) = set_up_test_env_single_user().await?;

    cl.create_entry("storage_macro_test_redis:redis_url", b"redis://127.0.0.1")
        .await?;
    let key_name = "storage_macro_test_redis:$redis:redis_key";
    test_read_keys(&cl, key_name).await?;

    Ok(())
}

#[tokio::test]
async fn test_storage_macro_fs_keys(
) -> Result<(), Box<dyn std::error::Error + Send + Sync + 'static>> {
    let (_ir, _is, cl) = set_up_test_env_single_user().await?;

    cl.create_entry(
        "test_storage_macro_fs_keys:path",
        b"/tmp/colink-sm-fs-test/test-keys",
    )
    .await?;
    let key_name = "test_storage_macro_fs_keys:$fs";
    test_read_keys(&cl, key_name).await?;

    Ok(())
}

async fn test_read_keys(
    cl: &CoLink,
    key_name: &str,
) -> Result<(), Box<dyn std::error::Error + Send + Sync + 'static>> {
    let payload0 = rand::thread_rng()
        .sample_iter(&rand::distributions::Standard)
        .take(10 as usize)
        .collect::<Vec<u8>>();
    let payload1 = rand::thread_rng()
        .sample_iter(&rand::distributions::Standard)
        .take(5 as usize)
        .collect::<Vec<u8>>();
    cl.create_entry(&format!("{}:0", key_name), &payload0)
        .await?;
    cl.create_entry(&format!("{}:1", key_name), &payload1)
        .await?;
    let keys = cl
        .read_keys(&format!("{}::{}", cl.get_user_id()?, key_name), false)
        .await?;
    assert_eq!(keys.len(), 2);
    let data = cl.read_entry(&keys[0].key_path).await?;
    match data.len() {
        10 => assert_eq!(data, payload0),
        5 => assert_eq!(data, payload1),
        _ => assert!(false),
    }
    let data = cl.read_entry(&keys[1].key_path).await?;
    match data.len() {
        10 => assert_eq!(data, payload0),
        5 => assert_eq!(data, payload1),
        _ => assert!(false),
    }
    cl.delete_entry(&format!("{}:0", key_name)).await?;
    cl.delete_entry(&format!("{}:1", key_name)).await?;
    Ok(())
}

#[tokio::test]
async fn test_storage_macro_redis_append(
) -> Result<(), Box<dyn std::error::Error + Send + Sync + 'static>> {
    let (_ir, _is, cl) = set_up_test_env_single_user().await?;

    cl.create_entry(
        "test_storage_macro_redis_append:redis_url",
        b"redis://127.0.0.1",
    )
    .await?;
    let key_name = "test_storage_macro_redis_append:$redis:redis_key";
    test_append(&cl, key_name, 5e6 as usize).await?;

    Ok(())
}

#[tokio::test]
async fn test_storage_macro_chunk_append(
) -> Result<(), Box<dyn std::error::Error + Send + Sync + 'static>> {
    let (_ir, _is, cl) = set_up_test_env_single_user().await?;

    let key_name = "test_storage_macro_chunk_append:$chunk";
    test_append(&cl, key_name, 5e6 as usize).await?;
    test_append(&cl, key_name, 10 as usize).await?;
    test_append(&cl, key_name, 1024 * 1024 as usize).await?;

    Ok(())
}

#[tokio::test]
async fn test_storage_macro_fs_append(
) -> Result<(), Box<dyn std::error::Error + Send + Sync + 'static>> {
    let (_ir, _is, cl) = set_up_test_env_single_user().await?;

    cl.create_entry(
        "test_storage_macro_fs_append:path",
        b"/tmp/colink-sm-fs-test/append-test",
    )
    .await?;
    let key_name = "test_storage_macro_fs_append:$fs";
    test_append(&cl, key_name, 5e6 as usize).await?;

    Ok(())
}

#[tokio::test]
async fn test_storage_macro_redis_chunk(
) -> Result<(), Box<dyn std::error::Error + Send + Sync + 'static>> {
    let (_ir, _is, cl) = set_up_test_env_single_user().await?;

    cl.create_entry(
        "test_storage_macro_redis_chunk:redis_url",
        b"redis://127.0.0.1",
    )
    .await?;
    let key_name = "test_storage_macro_redis_chunk:$redis:redis_chunk:$chunk";
    test_crud(&cl, key_name).await?;

    Ok(())
}

#[tokio::test]
async fn test_storage_macro_redis_chunk_append(
) -> Result<(), Box<dyn std::error::Error + Send + Sync + 'static>> {
    let (_ir, _is, cl) = set_up_test_env_single_user().await?;

    cl.create_entry(
        "test_storage_macro_redis_chunk_append:redis_url",
        b"redis://127.0.0.1",
    )
    .await?;
    let key_name = "test_storage_macro_redis_chunk_append:$redis:redis_chunk:$chunk";
    test_append(&cl, key_name, 5e6 as usize).await?;
    test_append(&cl, key_name, 10 as usize).await?;
    test_append(&cl, key_name, 1024 * 1024 as usize).await?;

    Ok(())
}

#[tokio::test]
async fn test_storage_macro_fs_chunk(
) -> Result<(), Box<dyn std::error::Error + Send + Sync + 'static>> {
    let (_ir, _is, cl) = set_up_test_env_single_user().await?;

    cl.create_entry(
        "test_storage_macro_fs_chunk:path",
        b"/tmp/colink-sm-fs-test/chunk-test",
    )
    .await?;
    let key_name = "test_storage_macro_fs_chunk:$fs:$chunk";
    test_crud(&cl, key_name).await?;
    let key_name = "test_storage_macro_fs_chunk:$fs:test-dir:$chunk";
    test_crud(&cl, key_name).await?;

    Ok(())
}

#[tokio::test]
async fn test_storage_macro_fs_chunk_append(
) -> Result<(), Box<dyn std::error::Error + Send + Sync + 'static>> {
    let (_ir, _is, cl) = set_up_test_env_single_user().await?;

    cl.create_entry(
        "test_storage_macro_fs_chunk_append:path",
        b"/tmp/colink-sm-fs-test/chunk-append-test",
    )
    .await?;
    let key_name = "test_storage_macro_fs_chunk_append:$fs:$chunk";
    test_append(&cl, key_name, 5e6 as usize).await?;
    test_append(&cl, key_name, 10 as usize).await?;
    test_append(&cl, key_name, 1024 * 1024 as usize).await?;

    Ok(())
}