steamroom-client 0.1.0

High-level Steam depot download orchestration and delta patching
Documentation
use crate::depot_config::DepotConfig;
use steamroom::depot::DepotId;
use steamroom::depot::DepotKey;
use steamroom::depot::ManifestId;

#[test]
fn round_trip_save_load() {
    let dir = tempfile::tempdir().unwrap();
    let depot_id = DepotId(481);
    let manifest_id = ManifestId(123456789);
    let key = DepotKey([0xAB; 32]);

    let mut config = DepotConfig::default();
    config.set_installed(depot_id, manifest_id, &key);
    config.save(dir.path()).unwrap();

    let loaded = DepotConfig::load(dir.path());
    let (loaded_mid, loaded_key) = loaded.get_installed(depot_id).unwrap();
    assert_eq!(loaded_mid, manifest_id);
    assert_eq!(loaded_key.0, key.0);
}

#[test]
fn get_installed_returns_none_for_missing_depot() {
    let config = DepotConfig::default();
    assert!(config.get_installed(DepotId(999)).is_none());
}

#[test]
fn load_returns_default_for_missing_file() {
    let dir = tempfile::tempdir().unwrap();
    let config = DepotConfig::load(dir.path());
    assert!(config.depots.is_empty());
}

#[test]
fn manifest_raw_round_trip() {
    let dir = tempfile::tempdir().unwrap();
    let depot_id = DepotId(481);
    let manifest_id = ManifestId(111);
    let data = b"PK\x03\x04fake-zip-data";

    DepotConfig::save_manifest_raw(dir.path(), depot_id, manifest_id, data).unwrap();

    let path = dir
        .path()
        .join(".depotdownloader")
        .join("manifests")
        .join("481_111.zip");
    assert_eq!(std::fs::read(&path).unwrap(), data);
}

#[test]
fn manifest_decompressed_round_trip() {
    let dir = tempfile::tempdir().unwrap();
    let depot_id = DepotId(481);
    let manifest_id = ManifestId(222);
    let data = b"protobuf-manifest-bytes";

    DepotConfig::save_manifest_decompressed(dir.path(), depot_id, manifest_id, data).unwrap();

    let loaded = DepotConfig::load_manifest_decompressed(dir.path(), depot_id, manifest_id);
    assert_eq!(loaded.unwrap(), data);
}

#[test]
fn load_manifest_decompressed_returns_none_for_missing() {
    let dir = tempfile::tempdir().unwrap();
    assert!(
        DepotConfig::load_manifest_decompressed(dir.path(), DepotId(1), ManifestId(1)).is_none()
    );
}

#[test]
fn multiple_depots() {
    let dir = tempfile::tempdir().unwrap();
    let key_a = DepotKey([0x11; 32]);
    let key_b = DepotKey([0x22; 32]);

    let mut config = DepotConfig::default();
    config.set_installed(DepotId(100), ManifestId(1), &key_a);
    config.set_installed(DepotId(200), ManifestId(2), &key_b);
    config.save(dir.path()).unwrap();

    let loaded = DepotConfig::load(dir.path());
    let (mid_a, k_a) = loaded.get_installed(DepotId(100)).unwrap();
    let (mid_b, k_b) = loaded.get_installed(DepotId(200)).unwrap();
    assert_eq!(mid_a.0, 1);
    assert_eq!(mid_b.0, 2);
    assert_eq!(k_a.0, [0x11; 32]);
    assert_eq!(k_b.0, [0x22; 32]);
}

#[test]
fn overwrite_installed() {
    let dir = tempfile::tempdir().unwrap();
    let mut config = DepotConfig::default();
    config.set_installed(DepotId(1), ManifestId(10), &DepotKey([0xAA; 32]));
    config.set_installed(DepotId(1), ManifestId(20), &DepotKey([0xBB; 32]));
    config.save(dir.path()).unwrap();

    let loaded = DepotConfig::load(dir.path());
    let (mid, key) = loaded.get_installed(DepotId(1)).unwrap();
    assert_eq!(mid.0, 20);
    assert_eq!(key.0, [0xBB; 32]);
}