asar-rust 0.1.0

Rust port of @electron/asar — create and extract Electron ASAR archives
Documentation
use asar_rust::asar::*;
use std::fs;

#[test]
fn test_roundtrip_empty_archive() {
    let dir = std::env::temp_dir().join("asar-rt-empty");
    let _ = fs::remove_dir_all(&dir);
    fs::create_dir_all(&dir).unwrap();

    let src = dir.join("src");
    fs::create_dir_all(&src).unwrap();

    let asar_path = dir.join("test.asar");
    create_package(&src, &asar_path).unwrap();

    let files = list_package(&asar_path, None).unwrap();
    assert!(files.is_empty());

    let _ = fs::remove_dir_all(&dir);
}

#[test]
fn test_roundtrip_nested_directories() {
    let dir = std::env::temp_dir().join("asar-rt-nested");
    let _ = fs::remove_dir_all(&dir);
    fs::create_dir_all(&dir).unwrap();

    let src = dir.join("src");
    fs::create_dir_all(src.join("a")).unwrap();
    fs::create_dir_all(src.join("a/b")).unwrap();
    fs::create_dir_all(src.join("a/b/c")).unwrap();
    fs::write(src.join("root.txt"), b"root").unwrap();
    fs::write(src.join("a/b/nested.txt"), b"nested").unwrap();

    let asar_path = dir.join("nested.asar");
    create_package(&src, &asar_path).unwrap();

    let files = list_package(&asar_path, None).unwrap();
    assert!(files.contains(&"/a".to_string()));
    assert!(files.contains(&"/a/b".to_string()));
    assert!(files.contains(&"/a/b/c".to_string()));
    assert!(files.contains(&"/a/b/nested.txt".to_string()));
    assert!(files.contains(&"/root.txt".to_string()));

    let out = dir.join("out");
    extract_all(&asar_path, &out).unwrap();
    assert_eq!(
        fs::read_to_string(out.join("root.txt")).unwrap(),
        "root"
    );
    assert!(out.join("a/b").exists());

    let _ = fs::remove_dir_all(&dir);
}

#[test]
fn test_roundtrip_large_file() {
    let dir = std::env::temp_dir().join("asar-rt-large");
    let _ = fs::remove_dir_all(&dir);
    fs::create_dir_all(&dir).unwrap();

    let src = dir.join("src");
    fs::create_dir_all(&src).unwrap();

    let size = 5 * 1024 * 1024;
    let data = vec![0x41u8; size];
    fs::write(src.join("large.bin"), &data).unwrap();

    let asar_path = dir.join("large.asar");
    create_package(&src, &asar_path).unwrap();

    let files = list_package(&asar_path, None).unwrap();
    assert_eq!(files.len(), 1);

    let out = dir.join("out");
    extract_all(&asar_path, &out).unwrap();
    let extracted = fs::read(out.join("large.bin")).unwrap();
    assert_eq!(extracted.len(), size);
    assert_eq!(extracted, data);

    let _ = fs::remove_dir_all(&dir);
}