alpkit 0.1.0-pre.2

A library for reading metadata from the APKv2 package format and APKBUILD.
Documentation
use std::fs::File;
use std::io::BufReader;
use std::path::PathBuf;

use super::*;
use crate::internal::test_utils::{assert, assert_let, dependency, S};
use fileinfo::FileType;

#[test]
fn signature_info_from_filename() {
    let input = PathBuf::from(".SIGN.RSA.alpine-devel@lists.alpinelinux.org-6165ee59.rsa.pub");
    let expected = SignatureInfo {
        alg: S!("RSA"),
        keyname: S!("alpine-devel@lists.alpinelinux.org-6165ee59.rsa.pub"),
    };
    assert!(SignatureInfo::from_filename(&input).unwrap() == expected);

    let input = PathBuf::from(".SIGNA.RSA.alpine-devel@lists.alpinelinux.org-6165ee59.rsa.pub");
    assert!(SignatureInfo::from_filename(&input) == None);
}

#[test]
fn package_load() {
    let signature = SignatureInfo {
        alg: S!("RSA"),
        keyname: S!("alpine-devel@lists.alpinelinux.org-6165ee59.rsa.pub"),
    };
    let pkginfo = PkgInfo {
        maintainer: Some(S!("Jakub Jirutka <jakub@jirutka.cz>")),
        pkgname: S!("rssh"),
        pkgver: S!("2.3.4-r3"),
        pkgdesc: S!("Restricted shell for use with OpenSSH, allowing only scp, sftp, and/or rsync"),
        url: S!("http://www.pizzashack.org/rssh/"),
        arch: S!("x86_64"),
        license: S!("BSD-2-Clause"),
        depends: vec![
            dependency("openssh"),
            dependency("/bin/sh"),
            dependency("so:libc.musl-x86_64.so.1"),
        ],
        conflicts: vec![],
        install_if: vec![],
        provides: vec![dependency("cmd:rssh=2.3.4-r3")],
        provider_priority: None,
        replaces: vec![],
        replaces_priority: None,
        triggers: vec![],
        origin: S!("rssh"),
        commit: Some(S!("c57128b0e49d551220aff88af0f1487d80cdccf8")),
        builddate: 1666619671,
        packager: S!("Buildozer <alpine-devel@lists.alpinelinux.org>"),
        size: 86016,
        datahash: S!("db62becd32465838640f39bd35854bd03e9b5e56b1ea8574e9188c3910121477"),
    };
    let scripts = vec![&PkgScript::PostInstall, &PkgScript::PostDeinstall];

    let files = vec![
        dir("/etc", 0o755),
        file(
            "/etc/rssh.conf.default",
            0o644,
            1791,
            "d371f2e400ee8b8c2f186801514b146668373666",
        ),
        dir("/usr/", 0o755),
        dir("/usr/bin/", 0o755),
        file(
            "/usr/bin/rssh",
            0o755,
            26584,
            "b0b8f3afe3ced5ed9bf9acef9eeaf760dcfccf6d",
        ),
        dir("/usr/lib/", 0o755),
        dir("/usr/lib/rssh/", 0o755),
        file(
            "/usr/lib/rssh/rssh_chroot_helper",
            0o4755,
            26560,
            "509736459697e360eb4bdc63d25c15c7f3903cd2",
        ),
    ];
    let files = files.iter().collect::<Vec<_>>();

    let reader = read_fixture("../fixtures/apk/rssh-2.3.4-r3.apk");

    assert_let!(Ok(pkg) = Package::load(reader));
    assert!(pkg.signatures().collect::<Vec<_>>() == vec![&signature]);
    assert!(pkg.scripts().collect::<Vec<_>>() == scripts);
    assert!(pkg.pkginfo() == &pkginfo);
    assert!(pkg.files_metadata().collect::<Vec<_>>() == files);
}

fn read_fixture(path: &str) -> BufReader<File> {
    let file = File::open(path).unwrap_or_else(|_| panic!("Fixture file `{}` not found", &path));
    BufReader::new(file)
}

fn dir(path: &str, mode: u32) -> FileInfo {
    FileInfo {
        path: PathBuf::from(path),
        file_type: FileType::Directory,
        mode,
        ..Default::default()
    }
}

fn file(path: &str, mode: u32, size: u64, digest: &str) -> FileInfo {
    FileInfo {
        path: PathBuf::from(path),
        file_type: FileType::Regular,
        size: Some(size),
        mode,
        digest: Some(digest.to_owned()),
        ..Default::default()
    }
}