From 32993e6262007e642bb0ab1e26c2bfeb420fbdb0 Mon Sep 17 00:00:00 2001 From: Caleb Connolly <caleb@postmarketos.org> Date: Mon, 21 Oct 2024 22:34:08 +0200 Subject: [PATCH] test: parse: add test_apkindex Add a test to parse some APKINDEX data. Signed-off-by: Caleb Connolly <caleb@postmarketos.org> --- pmb/parse/test_apkindex.py | 351 +++++++++++++++++++++++++++++++++++++ 1 file changed, 351 insertions(+) create mode 100644 pmb/parse/test_apkindex.py diff --git a/pmb/parse/test_apkindex.py b/pmb/parse/test_apkindex.py new file mode 100644 index 000000000..c3806d006 --- /dev/null +++ b/pmb/parse/test_apkindex.py @@ -0,0 +1,351 @@ +from pmb.core.arch import Arch +import pytest + +from .apkindex import parse as parse_apkindex + +example_apkindex = """ +C:Q1p+nGf5oBAmbU9FQvV4MhfEmWqVE= +P:postmarketos-base-ui-networkmanager +V:29-r1 +A:aarch64 +S:4185 +I:5376 +T:Meta package for minimal postmarketOS UI base +U:https://postmarketos.org +L:GPL-3.0-or-later +o:postmarketos-base-ui +m:Clayton Craft <clayton@craftyguy.net> +t:1729538699 +c:901cb9520450a1e88ded95ac774e83f6b2cfbba3-dirty +D:busctl dnsmasq-dnssec-dbus>=2.90-r1 gojq networkmanager networkmanager-cli networkmanager-tui networkmanager-wifi networkmanager-wwan networkmanager-dnsmasq + +C:Q1j8i5C7tOHbhrd5OTtot1u1ZtteU= +P:postmarketos-base-ui-networkmanager-usb-tethering +V:29-r1 +A:aarch64 +S:3986 +I:5206 +T:Meta package for minimal postmarketOS UI base +U:https://postmarketos.org +L:GPL-3.0-or-later +o:postmarketos-base-ui +m:Clayton Craft <clayton@craftyguy.net> +t:1729538699 +c:901cb9520450a1e88ded95ac774e83f6b2cfbba3-dirty +D:chrony dbus haveged nftables openssh-server-pam pipewire postmarketos-artwork-icons postmarketos-base shadow tzdata util-linux wireless-regdb wireplumber +i:postmarketos-base-ui-networkmanager=29-r1 + +C:Q10FDERw8SRwuk6ITfWNyJ4GbVE2I= +P:postmarketos-base-ui-openrc +V:29-r1 +A:aarch64 +S:1570 +I:1 +T:Meta package for minimal postmarketOS UI base +U:https://postmarketos.org +L:GPL-3.0-or-later +o:postmarketos-base-ui +m:Clayton Craft <clayton@craftyguy.net> +t:1729538699 +c:901cb9520450a1e88ded95ac774e83f6b2cfbba3-dirty +D:chrony-openrc dbus-openrc haveged-openrc util-linux-openrc /bin/sh +i:postmarketos-base-ui=29-r1 openrc + +C:Q1inMHA1+gsS8U50j8odasUNy5TVw= +P:postmarketos-base-ui-openrc-settingsd +V:29-r1 +A:aarch64 +S:1824 +I:103 +T:Meta package for minimal postmarketOS UI base +U:https://postmarketos.org +L:GPL-3.0-or-later +o:postmarketos-base-ui +m:Clayton Craft <clayton@craftyguy.net> +t:1729538699 +c:901cb9520450a1e88ded95ac774e83f6b2cfbba3-dirty +D:chrony dbus haveged nftables openssh-server-pam pipewire postmarketos-artwork-icons postmarketos-base shadow tzdata util-linux wireless-regdb wireplumber /bin/sh +i:postmarketos-base-ui=29-r1 openrc-settingsd-openrc + +C:Q1iB2PiTO0w29T4kRUSjqLOyKcCwY= +P:postmarketos-base-ui-qt-tweaks +V:29-r1 +A:aarch64 +S:1661 +I:47 +T:Meta package for minimal postmarketOS UI base +U:https://postmarketos.org +L:GPL-3.0-or-later +o:postmarketos-base-ui +m:Clayton Craft <clayton@craftyguy.net> +t:1729538699 +c:901cb9520450a1e88ded95ac774e83f6b2cfbba3-dirty +D:chrony dbus haveged nftables openssh-server-pam pipewire postmarketos-artwork-icons postmarketos-base shadow tzdata util-linux wireless-regdb wireplumber + +C:Q1aQ5UEOC902h2atx0fqDhahpkDY8= +P:postmarketos-base-ui-qt-wayland +V:29-r1 +A:aarch64 +S:1687 +I:86 +T:Meta package for minimal postmarketOS UI base +U:https://postmarketos.org +L:GPL-3.0-or-later +o:postmarketos-base-ui +m:Clayton Craft <clayton@craftyguy.net> +t:1729538699 +c:901cb9520450a1e88ded95ac774e83f6b2cfbba3-dirty +D:chrony dbus haveged nftables openssh-server-pam pipewire postmarketos-artwork-icons postmarketos-base shadow tzdata util-linux wireless-regdb wireplumber + +C:Q16q7k1Z5HAJe5qqeXfTIn62QQoBs= +P:postmarketos-base-ui-tinydm +V:29-r1 +A:aarch64 +S:2264 +I:571 +T:Meta package for minimal postmarketOS UI base +U:https://postmarketos.org +L:GPL-3.0-or-later +o:postmarketos-base-ui +m:Clayton Craft <clayton@craftyguy.net> +t:1729538699 +c:901cb9520450a1e88ded95ac774e83f6b2cfbba3-dirty +D:chrony dbus haveged nftables openssh-server-pam pipewire postmarketos-artwork-icons postmarketos-base shadow tzdata util-linux wireless-regdb wireplumber +p:postmarketos-base-tinydm=29-r1 +i:postmarketos-base-ui=29-r1 tinydm-openrc + +C:Q11IrmIOlqZX5BzKhLsce+U+S+N3I= +P:postmarketos-base-ui-wayland +V:29-r1 +A:aarch64 +S:1361 +I:0 +T:Meta package for minimal postmarketOS UI base +U:https://postmarketos.org +L:GPL-3.0-or-later +o:postmarketos-base-ui +m:Clayton Craft <clayton@craftyguy.net> +t:1729538699 +c:901cb9520450a1e88ded95ac774e83f6b2cfbba3-dirty +D:chrony dbus haveged nftables openssh-server-pam pipewire postmarketos-artwork-icons postmarketos-base shadow tzdata util-linux wireless-regdb wireplumber +i:postmarketos-base-ui=29-r1 wayland-server-libs + +C:Q1bDAQG9F9mi7Mi5CT3Csiq4QU52w= +P:postmarketos-base-ui-wifi-iwd +V:29-r1 +A:aarch64 +S:1650 +I:26 +T:Use iwd as the WiFi backend (but may not work with all devices) +U:https://postmarketos.org +L:GPL-3.0-or-later +o:postmarketos-base-ui +m:Clayton Craft <clayton@craftyguy.net> +t:1729538699 +c:901cb9520450a1e88ded95ac774e83f6b2cfbba3-dirty +k:90 +D:iwd +p:postmarketos-base-ui-wifi=29-r1 + +C:Q1s7shLQ3sKNxKABRyQRBQ11RwkuU= +P:postmarketos-base-ui-wifi-iwd-openrc +V:29-r1 +A:aarch64 +S:1405 +I:1 +T:Meta package for minimal postmarketOS UI base +U:https://postmarketos.org +L:GPL-3.0-or-later +o:postmarketos-base-ui +m:Clayton Craft <clayton@craftyguy.net> +t:1729538699 +c:901cb9520450a1e88ded95ac774e83f6b2cfbba3-dirty +D:iwd-openrc openrc /bin/sh +i:postmarketos-base-ui-wifi-iwd=29-r1 openrc + +C:Q1C23f0J5PBrNAuZiAhzCJhVpNe5c= +P:postmarketos-base-ui-wifi-wpa_supplicant +V:29-r1 +A:aarch64 +S:1262 +I:0 +T:Use wpa_supplicant as the WiFi backend. +U:https://postmarketos.org +L:GPL-3.0-or-later +o:postmarketos-base-ui +m:Clayton Craft <clayton@craftyguy.net> +t:1729538699 +c:901cb9520450a1e88ded95ac774e83f6b2cfbba3-dirty +k:100 +D:wpa_supplicant +p:postmarketos-base-ui-wifi=29-r1 + +C:Q1LfWeOxxgIM3UE/QQBczMpJw17hY= +P:postmarketos-base-ui-wifi-wpa_supplicant-openrc +V:29-r1 +A:aarch64 +S:1691 +I:37 +T:Meta package for minimal postmarketOS UI base +U:https://postmarketos.org +L:GPL-3.0-or-later +o:postmarketos-base-ui +m:Clayton Craft <clayton@craftyguy.net> +t:1729538699 +c:901cb9520450a1e88ded95ac774e83f6b2cfbba3-dirty +D:wpa_supplicant-openrc openrc /bin/sh +i:postmarketos-base-ui-wifi-wpa_supplicant=29-r1 openrc + +C:Q1yB3CVUFMOjnLOOEAUIUUpJJV8g0= +P:postmarketos-base-ui-x11 +V:29-r1 +A:aarch64 +S:1587 +I:22 +T:Meta package for minimal postmarketOS UI base +U:https://postmarketos.org +L:GPL-3.0-or-later +o:postmarketos-base-ui +m:Clayton Craft <clayton@craftyguy.net> +t:1729538699 +c:901cb9520450a1e88ded95ac774e83f6b2cfbba3-dirty +D:libinput xf86-input-libinput xf86-video-fbdev +p:postmarketos-base-x11=29-r1 +i:postmarketos-base-ui=29-r1 xorg-server + +C:Q1TgE1jgGt1PUb/Zwbi6rDRt3b8go= +P:postmarketos-initramfs +V:3.3.5-r2 +A:aarch64 +S:16530 +I:143360 +T:Base files for the postmarketOS initramfs / initramfs-extra +U:https://postmarketos.org +L:GPL-2.0-or-later +o:postmarketos-initramfs +m:Caleb Connolly <caleb@postmarketos.org> +t:1728049308 +c:f3a4285732781d5577bad06046b7bbeaf132ce1f-dirty +k:10 +D:blkid btrfs-progs buffyboard busybox-extras bzip2 cryptsetup device-mapper devicepkg-utils>=0.2.0 dosfstools e2fsprogs e2fsprogs-extra f2fs-tools font-terminus iskey kmod libinput-libs lz4 multipath-tools parted postmarketos-fde-unlocker postmarketos-mkinitfs>=2.2 udev unudhcpd util-linux-misc xz +p:postmarketos-ramdisk=3.3.5-r2""" + + +def test_apkindex_parse(tmp_path) -> None: + tmpfile = tmp_path / "APKINDEX.1" + print(tmp_path) + f = open(tmpfile, "w") + f.write(example_apkindex) + f.close() + + blocks = parse_apkindex(tmpfile, True) + for k, v in blocks.items(): + print(f"{k}: {v}") + + # Even though there's only 14 entries, there are some virtual packages + assert len(blocks) == 18 + + # Check that the postmarketos-ramdisk virtual package is handled correctly + # and that it's one provider (postmarketos-initramfs) is declared + assert "postmarketos-ramdisk" in blocks.keys() + assert "postmarketos-initramfs" in blocks["postmarketos-ramdisk"].keys() + assert ( + blocks["postmarketos-ramdisk"]["postmarketos-initramfs"] + == blocks["postmarketos-initramfs"]["postmarketos-initramfs"] + ) + + initramfs = blocks["postmarketos-initramfs"]["postmarketos-initramfs"] + assert initramfs.pkgname == "postmarketos-initramfs" + assert initramfs.provides == ["postmarketos-ramdisk"] + assert initramfs.provider_priority == 10 + assert initramfs.depends == [ + "blkid", + "btrfs-progs", + "buffyboard", + "busybox-extras", + "bzip2", + "cryptsetup", + "device-mapper", + "devicepkg-utils", + "dosfstools", + "e2fsprogs", + "e2fsprogs-extra", + "f2fs-tools", + "font-terminus", + "iskey", + "kmod", + "libinput-libs", + "lz4", + "multipath-tools", + "parted", + "postmarketos-fde-unlocker", + "postmarketos-mkinitfs", + "udev", + "unudhcpd", + "util-linux-misc", + "xz", + ] + + tinydm = blocks["postmarketos-base-ui-tinydm"]["postmarketos-base-ui-tinydm"] + # Without the version! + assert tinydm.provides == ["postmarketos-base-tinydm"] + assert tinydm.version == "29-r1" + assert tinydm.arch == Arch.aarch64 + + wayland = blocks["postmarketos-base-ui-wayland"]["postmarketos-base-ui-wayland"] + # Doesn't provide an explicit version + assert wayland.provides == [] + assert wayland.origin == "postmarketos-base-ui" + + networkmanager = blocks["postmarketos-base-ui-networkmanager"][ + "postmarketos-base-ui-networkmanager" + ] + assert networkmanager.provider_priority is None + + +def test_apkindex_parse_bad_priority(tmp_path) -> None: + tmpfile = tmp_path / "APKINDEX.2" + f = open(tmpfile, "w") + # A snippet of the above example but with the provider_priority + # of postmarketos-initramfs set to a non-integer value + f.write( +""" +C:Q1yB3CVUFMOjnLOOEAUIUUpJJV8g0= +P:postmarketos-base-ui-x11 +V:29-r1 +A:aarch64 +S:1587 +I:22 +T:Meta package for minimal postmarketOS UI base +U:https://postmarketos.org +L:GPL-3.0-or-later +o:postmarketos-base-ui +m:Clayton Craft <clayton@craftyguy.net> +t:1729538699 +c:901cb9520450a1e88ded95ac774e83f6b2cfbba3-dirty +D:libinput xf86-input-libinput xf86-video-fbdev +p:postmarketos-base-x11=29-r1 +i:postmarketos-base-ui=29-r1 xorg-server + +C:Q1TgE1jgGt1PUb/Zwbi6rDRt3b8go= +P:postmarketos-initramfs +V:3.3.5-r2 +A:aarch64 +S:16530 +I:143360 +T:Base files for the postmarketOS initramfs / initramfs-extra +U:https://postmarketos.org +L:GPL-2.0-or-later +o:postmarketos-initramfs +m:Caleb Connolly <caleb@postmarketos.org> +t:1728049308 +c:f3a4285732781d5577bad06046b7bbeaf132ce1f-dirty +k:beep +D:blkid btrfs-progs buffyboard busybox-extras bzip2 cryptsetup device-mapper devicepkg-utils>=0.2.0 dosfstools e2fsprogs e2fsprogs-extra f2fs-tools font-terminus iskey kmod libinput-libs lz4 multipath-tools parted postmarketos-fde-unlocker postmarketos-mkinitfs>=2.2 udev unudhcpd util-linux-misc xz +p:postmarketos-ramdisk=3.3.5-r2""") + f.close() + + # We expect a RuntimeError to be raised when provider_priority is not + # an integer + with pytest.raises(RuntimeError): + parse_apkindex(tmpfile, True) -- GitLab