Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package libstorage-ng for openSUSE:Factory checked in at 2026-04-04 19:05:08 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/libstorage-ng (Old) and /work/SRC/openSUSE:Factory/.libstorage-ng.new.21863 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "libstorage-ng" Sat Apr 4 19:05:08 2026 rev:332 rq:1344162 version:4.5.308 Changes: -------- --- /work/SRC/openSUSE:Factory/libstorage-ng/libstorage-ng.changes 2026-03-14 22:21:12.630187534 +0100 +++ /work/SRC/openSUSE:Factory/.libstorage-ng.new.21863/libstorage-ng.changes 2026-04-04 19:06:04.553824917 +0200 @@ -1,0 +2,8 @@ +Wed Apr 1 14:09:25 UTC 2026 - [email protected] + +- merge gh#openSUSE/libstorage-ng#1063 +- use json output of blkid if available +- use consistent class names +- 4.5.308 + +-------------------------------------------------------------------- Old: ---- libstorage-ng-4.5.307.tar.xz New: ---- libstorage-ng-4.5.308.tar.xz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ libstorage-ng.spec ++++++ --- /var/tmp/diff_new_pack.7h1OF7/_old 2026-04-04 19:06:05.261853947 +0200 +++ /var/tmp/diff_new_pack.7h1OF7/_new 2026-04-04 19:06:05.261853947 +0200 @@ -18,7 +18,7 @@ %define libname %{name}1 Name: libstorage-ng -Version: 4.5.307 +Version: 4.5.308 Release: 0 Summary: Library for storage management License: GPL-2.0-only ++++++ libstorage-ng-4.5.307.tar.xz -> libstorage-ng-4.5.308.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libstorage-ng-4.5.307/VERSION new/libstorage-ng-4.5.308/VERSION --- old/libstorage-ng-4.5.307/VERSION 2026-03-13 16:04:18.000000000 +0100 +++ new/libstorage-ng-4.5.308/VERSION 2026-04-01 16:09:25.000000000 +0200 @@ -1 +1 @@ -4.5.307 +4.5.308 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libstorage-ng-4.5.307/storage/SystemInfo/CmdBlkid.cc new/libstorage-ng-4.5.308/storage/SystemInfo/CmdBlkid.cc --- old/libstorage-ng-4.5.307/storage/SystemInfo/CmdBlkid.cc 2026-03-13 16:04:18.000000000 +0100 +++ new/libstorage-ng-4.5.308/storage/SystemInfo/CmdBlkid.cc 2026-04-01 16:09:25.000000000 +0200 @@ -32,6 +32,7 @@ #include "storage/SystemInfo/SystemInfoImpl.h" #include "storage/Filesystems/FilesystemImpl.h" #include "storage/EnvironmentImpl.h" +#include "storage/Utils/JsonFile.h" namespace storage @@ -39,25 +40,27 @@ using namespace std; - Blkid::Blkid(Udevadm& udevadm) - : Blkid(udevadm, std::nullopt) + CmdBlkid::CmdBlkid(Udevadm& udevadm) + : CmdBlkid(udevadm, std::nullopt) { } - Blkid::Blkid(Udevadm& udevadm, const string& device) - : Blkid(udevadm, make_optional(device)) + CmdBlkid::CmdBlkid(Udevadm& udevadm, const string& device) + : CmdBlkid(udevadm, make_optional(device)) { } - Blkid::Blkid(Udevadm& udevadm, const std::optional<string>& device) + CmdBlkid::CmdBlkid(Udevadm& udevadm, const std::optional<string>& device) { const bool json = CmdBlkidVersion::supports_json_option_v2(); udevadm.settle(); SystemCmd::Args cmd_args({ BLKID_BIN, "--cache-file", DEV_NULL_FILE }); + if (json) + cmd_args << "--output" << "json"; if (device) cmd_args << device.value(); @@ -68,12 +71,18 @@ SystemCmd cmd(options); - parse(cmd.stdout()); + if (!json) + parse(cmd.stdout()); + else + parse_json(cmd.stdout()); + + if (device && data.size() > 1) + ST_THROW(Exception("command blkid returned wrong number of devices")); } void - Blkid::parse(const vector<string>& lines) + CmdBlkid::parse(const vector<string>& lines) { data.clear(); @@ -182,7 +191,7 @@ vector<string> - Blkid::split_line(const string& line) + CmdBlkid::split_line(const string& line) { vector<string> result; @@ -236,8 +245,85 @@ } - Blkid::const_iterator - Blkid::find_by_any_name(const string& device, SystemInfo::Impl& system_info) const + void + CmdBlkid::parse_json(const vector<string>& lines) + { + data.clear(); + + JsonFile json_file(lines); + + vector<json_object*> tmp1; + if (!get_child_nodes(json_file.get_root(), "blkid", tmp1)) + ST_THROW(Exception("\"blkid\" not found in json output of 'blkid'")); + + for (json_object* tmp2 : tmp1) + { + string device; + if (!get_child_value(tmp2, "device", device)) + continue; + + string type; + if (!get_child_value(tmp2, "type", type)) + continue; + + Entry entry; + + if (type == "BitLocker" && cryptsetup_for_bitlocker()) + { + entry.is_bitlocker = true; + + // Unfortunately no UUID although BitLocker has one. + } + else if (toValue(type, entry.fs_type, false)) + { + entry.is_fs = true; + + get_child_value(tmp2, "uuid", entry.fs_uuid); + get_child_value(tmp2, "label", entry.fs_label); + get_child_value(tmp2, "ext_journal", entry.fs_journal_uuid); + get_child_value(tmp2, "uuid_sub", entry.fs_sub_uuid); + } + else if (type == "jbd" || type == "xfs_external_log") + { + entry.is_journal = true; + + get_child_value(tmp2, "loguuid", entry.journal_uuid); + } + else if (boost::ends_with(type, "_raid_member")) + { + entry.is_md = true; + + // Does include the UUID but in a different format than reported by mdadm. + } + else if (type == "LVM2_member") + { + entry.is_lvm = true; + } + else if (type == "crypto_LUKS") + { + entry.is_luks = true; + + get_child_value(tmp2, "uuid", entry.luks_uuid); + get_child_value(tmp2, "label", entry.luks_label); + } + else if (type == "bcache") + { + entry.is_bcache = true; + + get_child_value(tmp2, "uuid", entry.bcache_uuid); + } + + if (entry.is_fs || entry.is_journal || entry.is_md || entry.is_lvm || entry.is_luks || + entry.is_bitlocker || entry.is_bcache) + data[device] = entry; + } + + y2mil(*this); + } + + + CmdBlkid::const_iterator + CmdBlkid::find_by_any_name(const string& device, SystemInfo::Impl& system_info) const { const_iterator it = data.find(device); if (it != end()) @@ -250,8 +336,8 @@ } - Blkid::const_iterator - Blkid::find_by_journal_uuid(const string& journal_uuid) const + CmdBlkid::const_iterator + CmdBlkid::find_by_journal_uuid(const string& journal_uuid) const { return find_if(begin(), end(), [&journal_uuid](const value_type& tmp) { return tmp.second.is_journal && tmp.second.journal_uuid == journal_uuid; @@ -259,50 +345,50 @@ } - Blkid::const_iterator - Blkid::get_sole_entry() const + CmdBlkid::const_iterator + CmdBlkid::get_sole_entry() const { return data.size() == 1 ? begin() : end(); } bool - Blkid::any_md() const + CmdBlkid::any_md() const { return std::any_of(data.begin(), data.end(), [](const value_type& value) { return value.second.is_md; }); } bool - Blkid::any_lvm() const + CmdBlkid::any_lvm() const { return std::any_of(data.begin(), data.end(), [](const value_type& value) { return value.second.is_lvm; }); } bool - Blkid::any_luks() const + CmdBlkid::any_luks() const { return std::any_of(data.begin(), data.end(), [](const value_type& value) { return value.second.is_luks; }); } bool - Blkid::any_bitlocker() const + CmdBlkid::any_bitlocker() const { return std::any_of(data.begin(), data.end(), [](const value_type& value) { return value.second.is_bitlocker; }); } bool - Blkid::any_bcache() const + CmdBlkid::any_bcache() const { return std::any_of(data.begin(), data.end(), [](const value_type& value) { return value.second.is_bcache; }); } bool - Blkid::any_btrfs() const + CmdBlkid::any_btrfs() const { return std::any_of(data.begin(), data.end(), [](const value_type& value) { return value.second.is_fs && value.second.fs_type == FsType::BTRFS; @@ -311,17 +397,17 @@ std::ostream& - operator<<(std::ostream& s, const Blkid& blkid) + operator<<(std::ostream& s, const CmdBlkid& cmd_blkid) { - for (Blkid::const_iterator it = blkid.data.begin(); it != blkid.data.end(); ++it) - s << "data[" << it->first << "] -> " << it->second << '\n'; + for (const map<string, CmdBlkid::Entry>::value_type& value : cmd_blkid) + s << "data[" << value.first << "] -> " << value.second << '\n'; return s; } std::ostream& - operator<<(std::ostream& s, const Blkid::Entry& entry) + operator<<(std::ostream& s, const CmdBlkid::Entry& entry) { if (entry.is_fs) { @@ -396,7 +482,7 @@ void CmdBlkidVersion::parse_version(const string& version) { - // example versions: "2.41.3" + // example versions: "2.41.3", "2.42-start-1440-edadb", "2.42-rc1", "2.42", "2.43.devel" const regex version_rx("blkid from util-linux ([0-9]+)\\.([0-9]+)(\\.([0-9]+))?.*", regex::extended); @@ -420,9 +506,10 @@ { query_version(); - // Format of JSON output is supposed to change. Thus this function is called _v2. + // Format of JSON output changed with version 2.42. Thus this function is called + // _v2. - return false; + return major >= 3 || (major == 2 && minor >= 42); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libstorage-ng-4.5.307/storage/SystemInfo/CmdBlkid.h new/libstorage-ng-4.5.308/storage/SystemInfo/CmdBlkid.h --- old/libstorage-ng-4.5.307/storage/SystemInfo/CmdBlkid.h 2026-03-13 16:04:18.000000000 +0100 +++ new/libstorage-ng-4.5.308/storage/SystemInfo/CmdBlkid.h 2026-04-01 16:09:25.000000000 +0200 @@ -45,12 +45,12 @@ /** * Run and parse the "blkid" command. */ - class Blkid + class CmdBlkid { public: - Blkid(Udevadm& udevadm); - Blkid(Udevadm& udevadm, const string& device); + CmdBlkid(Udevadm& udevadm); + CmdBlkid(Udevadm& udevadm, const string& device); struct Entry { @@ -84,7 +84,7 @@ const_iterator begin() const { return data.begin(); } const_iterator end() const { return data.end(); } - friend std::ostream& operator<<(std::ostream& s, const Blkid& blkid); + friend std::ostream& operator<<(std::ostream& s, const CmdBlkid& cmd_blkid); friend std::ostream& operator<<(std::ostream& s, const Entry& entry); /** @@ -113,15 +113,19 @@ private: - Blkid(Udevadm& udevadm, const std::optional<string>& device); + CmdBlkid(Udevadm& udevadm, const std::optional<string>& device); void parse(const vector<string>& lines); + void parse_json(const vector<string>& lines); map<string, Entry> data; }; + using Blkid = CmdBlkid; + + class CmdBlkidVersion { public: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libstorage-ng-4.5.307/storage/SystemInfo/CmdDasdview.cc new/libstorage-ng-4.5.308/storage/SystemInfo/CmdDasdview.cc --- old/libstorage-ng-4.5.307/storage/SystemInfo/CmdDasdview.cc 2026-03-13 16:04:18.000000000 +0100 +++ new/libstorage-ng-4.5.308/storage/SystemInfo/CmdDasdview.cc 2026-04-01 16:09:25.000000000 +0200 @@ -31,7 +31,7 @@ namespace storage { - Dasdview::Dasdview(const string& device) + CmdDasdview::CmdDasdview(const string& device) : device(device) { SystemCmd cmd({ DASDVIEW_BIN, "--extended", device }, SystemCmd::DoThrow); @@ -41,7 +41,7 @@ void - Dasdview::parse(const vector<string>& lines) + CmdDasdview::parse(const vector<string>& lines) { vector<string>::const_iterator pos; @@ -82,10 +82,10 @@ std::ostream& - operator<<(std::ostream& s, const Dasdview& dasdview) + operator<<(std::ostream& s, const CmdDasdview& cmd_dasdview) { - s << "device:" << dasdview.device << " bus-id:" << dasdview.bus_id << " type:" - << toString(dasdview.type) << " format:" << toString(dasdview.format); + s << "device:" << cmd_dasdview.device << " bus-id:" << cmd_dasdview.bus_id << " type:" + << toString(cmd_dasdview.type) << " format:" << toString(cmd_dasdview.format); return s; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libstorage-ng-4.5.307/storage/SystemInfo/CmdDasdview.h new/libstorage-ng-4.5.308/storage/SystemInfo/CmdDasdview.h --- old/libstorage-ng-4.5.307/storage/SystemInfo/CmdDasdview.h 2026-03-13 16:04:18.000000000 +0100 +++ new/libstorage-ng-4.5.308/storage/SystemInfo/CmdDasdview.h 2026-04-01 16:09:25.000000000 +0200 @@ -33,14 +33,14 @@ using std::string; - class Dasdview + class CmdDasdview { public: - Dasdview(const string& device); + CmdDasdview(const string& device); - friend std::ostream& operator<<(std::ostream& s, const Dasdview& dasdview); + friend std::ostream& operator<<(std::ostream& s, const CmdDasdview& cmd_dasdview); string get_bus_id() const { return bus_id; } @@ -60,6 +60,9 @@ }; + + using Dasdview = CmdDasdview; + } #endif diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libstorage-ng-4.5.307/storage/SystemInfo/CmdParted.cc new/libstorage-ng-4.5.308/storage/SystemInfo/CmdParted.cc --- old/libstorage-ng-4.5.307/storage/SystemInfo/CmdParted.cc 2026-03-13 16:04:18.000000000 +0100 +++ new/libstorage-ng-4.5.308/storage/SystemInfo/CmdParted.cc 2026-04-01 16:09:25.000000000 +0200 @@ -42,7 +42,7 @@ using namespace std; - Parted::Parted(Udevadm& udevadm, const string& device) + CmdParted::CmdParted(Udevadm& udevadm, const string& device) : device(device) { const bool json = CmdPartedVersion::supports_json_option(); @@ -88,7 +88,7 @@ void - Parted::parse(const vector<string>& stdout, const vector<string>& stderr) + CmdParted::parse(const vector<string>& stdout, const vector<string>& stderr) { primary_slots = -1; implicit = false; @@ -147,7 +147,7 @@ void - Parted::scan_device(json_object* node) + CmdParted::scan_device(json_object* node) { string tmp; @@ -171,7 +171,7 @@ void - Parted::scan_device_flags(json_object* node) + CmdParted::scan_device_flags(json_object* node) { vector<json_object*> nodes; if (!get_child_nodes(node, "flags", nodes)) @@ -193,7 +193,7 @@ void - Parted::scan_entry(json_object* node) + CmdParted::scan_entry(json_object* node) { Entry entry; @@ -262,7 +262,7 @@ void - Parted::scan_entry_flags(json_object* node, Entry& entry) const + CmdParted::scan_entry_flags(json_object* node, Entry& entry) const { entry.id = ID_LINUX; entry.boot = false; @@ -311,7 +311,7 @@ void - Parted::scan_device_line(const string& line) + CmdParted::scan_device_line(const string& line) { vector<string> tmp = tokenize(line); @@ -335,7 +335,7 @@ void - Parted::scan_device_flags(const string& s) + CmdParted::scan_device_flags(const string& s) { implicit = boost::contains(s, "implicit_partition_table"); @@ -344,7 +344,7 @@ PtType - Parted::scan_partition_table_type(const string& s) const + CmdParted::scan_partition_table_type(const string& s) const { for (map<const char*, PtType>::value_type tmp : name_to_pt_type) { @@ -357,7 +357,7 @@ void - Parted::scan_entry_line(const string& line) + CmdParted::scan_entry_line(const string& line) { vector<string> tmp = tokenize(line); @@ -385,7 +385,7 @@ void - Parted::scan_entry_flags(const string& s, Entry& entry) const + CmdParted::scan_entry_flags(const string& s, Entry& entry) const { entry.type = PartitionType::PRIMARY; @@ -445,7 +445,7 @@ unsigned long long - Parted::scan_sectors(const string& s) const + CmdParted::scan_sectors(const string& s) const { if (s.empty() || s.back() != 's') ST_THROW(ParseException("bad sector value", s, "1024s")); @@ -461,7 +461,7 @@ void - Parted::scan_stderr(const vector<string>& stderr) + CmdParted::scan_stderr(const vector<string>& stderr) { gpt_undersized = contains_if(stderr, string_contains("fix the GPT to use all")); @@ -471,7 +471,7 @@ void - Parted::fix_dasd_sector_size() + CmdParted::fix_dasd_sector_size() { // see do_resize() and do_create() in PartitionImpl.cc if (label == PtType::DASD && logical_sector_size == 512 && @@ -496,7 +496,7 @@ bool - Parted::get_entry(unsigned number, Entry& entry) const + CmdParted::get_entry(unsigned number, Entry& entry) const { for (const_iterator it = entries.begin(); it != entries.end(); ++it) { @@ -512,7 +512,7 @@ vector<string> - Parted::tokenize(const string& line) const + CmdParted::tokenize(const string& line) const { if (!boost::ends_with(line, ";")) ST_THROW(ParseException("missing semicolon", "", ";")); @@ -557,29 +557,29 @@ std::ostream& - operator<<(std::ostream& s, const Parted& parted) + operator<<(std::ostream& s, const CmdParted& cmd_parted) { - s << "device:" << parted.device << " label:" << get_pt_type_name(parted.label) - << " region:" << parted.region; + s << "device:" << cmd_parted.device << " label:" << get_pt_type_name(cmd_parted.label) + << " region:" << cmd_parted.region; - if (parted.primary_slots >= 0) - s << " primary-slots:" << parted.primary_slots; + if (cmd_parted.primary_slots >= 0) + s << " primary-slots:" << cmd_parted.primary_slots; - if (parted.implicit) + if (cmd_parted.implicit) s << " implicit"; - if (parted.gpt_undersized) + if (cmd_parted.gpt_undersized) s << " gpt-undersized"; - if (parted.gpt_backup_broken) + if (cmd_parted.gpt_backup_broken) s << " gpt-backup-broken"; - if (parted.gpt_pmbr_boot) + if (cmd_parted.gpt_pmbr_boot) s << " gpt-pmbr-boot"; s << '\n'; - for (const Parted::Entry& entry : parted.entries) + for (const CmdParted::Entry& entry : cmd_parted.entries) s << entry << '\n'; return s; @@ -587,7 +587,7 @@ std::ostream& - operator<<(std::ostream& s, const Parted::Entry& entry) + operator<<(std::ostream& s, const CmdParted::Entry& entry) { s << "number:" << entry.number << " region:" << entry.region << " type:" << get_partition_type_name(entry.type) << " id:" << sformat("0x%02x", entry.id); @@ -608,7 +608,7 @@ } - const map<unsigned int, const char*> Parted::id_to_name = { + const map<unsigned int, const char*> CmdParted::id_to_name = { { ID_BIOS_BOOT, "bios_grub" }, { ID_DIAG, "diag" }, { ID_ESP, "esp" }, @@ -623,7 +623,7 @@ }; - const map<unsigned int, const char*> Parted::id_to_uuid = { + const map<unsigned int, const char*> CmdParted::id_to_uuid = { { ID_LINUX, "0fc63daf-8483-4772-8e79-3d69d8477de4" }, { ID_LINUX_ROOT_ARM, "69dad710-2ce4-4e3c-b16c-21a1d49abed3" }, { ID_LINUX_ROOT_AARCH64, "b921b045-1df0-41c3-af44-4c6f280d3fae" }, @@ -652,7 +652,7 @@ }; - const map<const char*, PtType> Parted::name_to_pt_type = { + const map<const char*, PtType> CmdParted::name_to_pt_type = { { "aix", PtType::AIX }, { "amiga", PtType::AMIGA }, { "atari", PtType::ATARI }, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libstorage-ng-4.5.307/storage/SystemInfo/CmdParted.h new/libstorage-ng-4.5.308/storage/SystemInfo/CmdParted.h --- old/libstorage-ng-4.5.307/storage/SystemInfo/CmdParted.h 2026-03-13 16:04:18.000000000 +0100 +++ new/libstorage-ng-4.5.308/storage/SystemInfo/CmdParted.h 2026-04-01 16:09:25.000000000 +0200 @@ -41,7 +41,7 @@ /** * Class for probing for partitions with the 'parted' command. */ - class Parted + class CmdParted { public: @@ -51,7 +51,7 @@ * with the 'parted' command and parse its output. * This may throw a SystemCmdException or a ParseException. */ - Parted(Udevadm& udevadm, const string& device); + CmdParted(Udevadm& udevadm, const string& device); /** * Entry for one partition. @@ -83,7 +83,7 @@ string name; }; - friend std::ostream& operator<<(std::ostream& s, const Parted& parted); + friend std::ostream& operator<<(std::ostream& s, const CmdParted& cmd_parted); friend std::ostream& operator<<(std::ostream& s, const Entry& entry); /** @@ -218,6 +218,9 @@ }; + using Parted = CmdParted; + + class CmdPartedVersion { public: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libstorage-ng-4.5.307/testsuite/SystemInfo/Makefile.am new/libstorage-ng-4.5.308/testsuite/SystemInfo/Makefile.am --- old/libstorage-ng-4.5.307/testsuite/SystemInfo/Makefile.am 2026-03-13 16:04:18.000000000 +0100 +++ new/libstorage-ng-4.5.308/testsuite/SystemInfo/Makefile.am 2026-04-01 16:09:25.000000000 +0200 @@ -7,8 +7,8 @@ LDADD = ../../storage/libstorage-ng.la -lboost_unit_test_framework check_PROGRAMS = \ - blkid.test btrfs-filesystem-df-60.test btrfs-filesystem-df-61.test \ - btrfs-filesystem-show.test \ + blkid-241.test blkid-242.test btrfs-filesystem-df-60.test \ + btrfs-filesystem-df-61.test btrfs-filesystem-show.test \ btrfs-subvolume-get-default.test btrfs-subvolume-list.test \ btrfs-subvolume-show.test btrfs-qgroup-show-60.test \ btrfs-qgroup-show-602.test btrfs-qgroup-show-62.test \ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libstorage-ng-4.5.307/testsuite/SystemInfo/blkid-241.cc new/libstorage-ng-4.5.308/testsuite/SystemInfo/blkid-241.cc --- old/libstorage-ng-4.5.307/testsuite/SystemInfo/blkid-241.cc 1970-01-01 01:00:00.000000000 +0100 +++ new/libstorage-ng-4.5.308/testsuite/SystemInfo/blkid-241.cc 2026-04-01 16:09:25.000000000 +0200 @@ -0,0 +1,333 @@ + +#define BOOST_TEST_DYN_LINK +#define BOOST_TEST_MODULE libstorage + +#include <boost/test/unit_test.hpp> +#include <boost/algorithm/string.hpp> + +#include "storage/SystemInfo/CmdBlkid.h" +#include "storage/Utils/Mockup.h" +#include "storage/Utils/StorageDefines.h" + + +using namespace std; +using namespace storage; + + +void +check(const vector<string>& input, const vector<string>& output) +{ + Mockup::set_mode(Mockup::Mode::PLAYBACK); + Mockup::set_command(BLKID_BIN " --version", + RemoteCommand({ "blkid from util-linux 2.41.3 (libblkid 2.41.3, 15-Dec-2025)" }, {}, 0)); + Mockup::set_command(BLKID_BIN " --cache-file /dev/null", input); + Mockup::set_command({ UDEVADM_BIN_SETTLE }, {}); + + Udevadm udevadm; + + CmdBlkid cmd_blkid(udevadm); + + ostringstream parsed; + parsed.setf(std::ios::boolalpha); + parsed << cmd_blkid; + + string lhs = parsed.str(); + string rhs = boost::join(output, "\n") + "\n"; + + BOOST_CHECK_EQUAL(lhs, rhs); +} + + +void +check(const string& device, const vector<string>& input, const vector<string>& output) +{ + Mockup::set_mode(Mockup::Mode::PLAYBACK); + Mockup::set_command(BLKID_BIN " --version", + RemoteCommand({ "blkid from util-linux 2.41.3 (libblkid 2.41.3, 15-Dec-2025)" }, {}, 0)); + Mockup::set_command(BLKID_BIN " --cache-file /dev/null " + device, input); + Mockup::set_command({ UDEVADM_BIN_SETTLE }, {}); + + Udevadm udevadm; + + CmdBlkid cmd_blkid(udevadm, device); + + ostringstream parsed; + parsed.setf(std::ios::boolalpha); + parsed << cmd_blkid; + + string lhs = parsed.str(); + string rhs = boost::join(output, "\n") + "\n"; + + BOOST_CHECK_EQUAL(lhs, rhs); +} + + +void +check_split_line( const string & input, const string & output ) +{ + string result = boost::join(CmdBlkid::split_line(input), "|"); + + BOOST_CHECK_EQUAL( result, output ); +} + + +BOOST_AUTO_TEST_CASE(split_line) +{ + check_split_line( "aaa bbb ccc", "aaa|bbb|ccc" ); + check_split_line( " aaa bbb ccc ", "aaa|bbb|ccc" ); + check_split_line( "", "" ); + check_split_line( "aa=\"xxx\" bb=\"yyy\" cc=\"zzz\"", "aa=\"xxx\"|bb=\"yyy\"|cc=\"zzz\"" ); + check_split_line( " aa=\"xxx\" bb=\"yyy\" cc=\"zzz\" ", "aa=\"xxx\"|bb=\"yyy\"|cc=\"zzz\"" ); + + // Whitespace in quoted strings + check_split_line( "aa=\"x x x\" bb=\"yy y\" cc=\"zzz\"", "aa=\"x x x\"|bb=\"yy y\"|cc=\"zzz\"" ); + check_split_line( "aa=\"x x x\" bb=\"yy y", "aa=\"x x x\"|bb=\"yy y" ); + + // Escaped quote in string + check_split_line( "aa=\"x\\\"xx\" bb=\"yyy\"", "aa=\"x\\\"xx\"|bb=\"yyy\""); + + // Escaped quote in string and at the end and not properly terminated + check_split_line( "aa=\"x\\\"xx\" bb=\"yyy\\\"", "aa=\"x\\\"xx\"|bb=\"yyy\\\""); +} + + +BOOST_AUTO_TEST_CASE(parse1) +{ + vector<string> input = { + "/dev/sda1: LABEL=\"BOOT\" UUID=\"14875716-b8e3-4c83-ac86-48c20682b63a\" TYPE=\"ext3\" PTTYPE=\"dos\" ", + "/dev/sda2: UUID=\"qquP1O-WWoh-Ofas-Rbx0-y72T-0sNe-Wnyc33\" TYPE=\"LVM2_member\" ", + "/dev/mapper/system-abuild: LABEL=\"ABUILD\" UUID=\"16337c60-fc2a-4b87-8199-4f511fa06c65\" TYPE=\"ext4\" ", + "/dev/mapper/system-btrfs: LABEL=\"BTRFS\" UUID=\"946de1e3-ab5a-49d2-8c9d-057f1613d395\" UUID_SUB=\"8fd5c226-d060-4049-90e6-1df5c865fdf4\" TYPE=\"btrfs\" ", + "/dev/mapper/system-giant: LABEL=\"GIANT\" UUID=\"0857a01f-c58e-464a-b74b-cd46992873e7\" TYPE=\"xfs\" ", + "/dev/mapper/system-root: LABEL=\"ROOT\" UUID=\"31e381c9-5b35-4045-8d01-9274a30e1298\" TYPE=\"ext3\" ", + "/dev/mapper/system-swap: LABEL=\"SWAP\" UUID=\"fd39c3f9-2990-435d-8eed-e56b6dc2e592\" TYPE=\"swap\" ", + "/dev/mapper/docker-254:3-266193-pool: UUID=\"b8965f68-1e7c-4fac-982b-5859dca91de5\" TYPE=\"ext4\" " + }; + + vector<string> output = { + "data[/dev/mapper/docker-254:3-266193-pool] -> is-fs:true fs-type:ext4 fs-uuid:b8965f68-1e7c-4fac-982b-5859dca91de5", + "data[/dev/mapper/system-abuild] -> is-fs:true fs-type:ext4 fs-uuid:16337c60-fc2a-4b87-8199-4f511fa06c65 fs-label:ABUILD", + "data[/dev/mapper/system-btrfs] -> is-fs:true fs-type:btrfs fs-uuid:946de1e3-ab5a-49d2-8c9d-057f1613d395 fs-label:BTRFS fs-sub-uuid:8fd5c226-d060-4049-90e6-1df5c865fdf4", + "data[/dev/mapper/system-giant] -> is-fs:true fs-type:xfs fs-uuid:0857a01f-c58e-464a-b74b-cd46992873e7 fs-label:GIANT", + "data[/dev/mapper/system-root] -> is-fs:true fs-type:ext3 fs-uuid:31e381c9-5b35-4045-8d01-9274a30e1298 fs-label:ROOT", + "data[/dev/mapper/system-swap] -> is-fs:true fs-type:swap fs-uuid:fd39c3f9-2990-435d-8eed-e56b6dc2e592 fs-label:SWAP", + "data[/dev/sda1] -> is-fs:true fs-type:ext3 fs-uuid:14875716-b8e3-4c83-ac86-48c20682b63a fs-label:BOOT", + "data[/dev/sda2] -> is-lvm:true" + }; + + check(input, output); +} + + +BOOST_AUTO_TEST_CASE(parse2) +{ + vector<string> input = { + "/dev/sda1: UUID=\"fc5985ee-e069-4bb4-a36c-24d8f6022f7a\" TYPE=\"ext4\" ", + "/dev/sda2: UUID=\"f98def5a-6553-49a1-940d-df55a77d7d28\" TYPE=\"crypto_LUKS\" ", + "/dev/mapper/tmp: UUID=\"wunWKW-nDeG-SUnC-CxDO-5UNt-BA4Y-Se7xVC\" TYPE=\"LVM2_member\" ", + "/dev/mapper/system-home: UUID=\"7e9e18c3-b743-47d8-9f33-464f466fc517\" UUID_SUB=\"4f40002c-125e-43c1-8a38-b5bf29f5319c\" TYPE=\"btrfs\" ", + "/dev/mapper/system-root: UUID=\"9fca85ff-4278-4f49-932e-4060726cf0d6\" UUID_SUB=\"ab28e20a-9c11-4ea6-a46d-0fe412fe0e19\" TYPE=\"btrfs\" ", + "/dev/mapper/system-swap: UUID=\"d0f020a1-9847-4ee5-a22e-fe0cdd4aa905\" TYPE=\"swap\" " + }; + + vector<string> output = { + "data[/dev/mapper/system-home] -> is-fs:true fs-type:btrfs fs-uuid:7e9e18c3-b743-47d8-9f33-464f466fc517 fs-sub-uuid:4f40002c-125e-43c1-8a38-b5bf29f5319c", + "data[/dev/mapper/system-root] -> is-fs:true fs-type:btrfs fs-uuid:9fca85ff-4278-4f49-932e-4060726cf0d6 fs-sub-uuid:ab28e20a-9c11-4ea6-a46d-0fe412fe0e19", + "data[/dev/mapper/system-swap] -> is-fs:true fs-type:swap fs-uuid:d0f020a1-9847-4ee5-a22e-fe0cdd4aa905", + "data[/dev/mapper/tmp] -> is-lvm:true", + "data[/dev/sda1] -> is-fs:true fs-type:ext4 fs-uuid:fc5985ee-e069-4bb4-a36c-24d8f6022f7a", + "data[/dev/sda2] -> is-luks:true luks-uuid:f98def5a-6553-49a1-940d-df55a77d7d28" + }; + + check(input, output); +} + + +BOOST_AUTO_TEST_CASE(parse3) +{ + vector<string> input = { + "/dev/dasda1: UUID=\"ab43b144-37e2-4e9c-8369-6df220f055b0\" SEC_TYPE=\"ext2\" TYPE=\"ext4\" " + }; + + vector<string> output = { + "data[/dev/dasda1] -> is-fs:true fs-type:ext4 fs-uuid:ab43b144-37e2-4e9c-8369-6df220f055b0" + }; + + check(input, output); +} + + +BOOST_AUTO_TEST_CASE(parse4) +{ + vector<string> input = { + "/dev/sdb: UUID=\"2013-06-14-19-02-28-00\" LABEL=\"SLES-11-SP3-MINI-ISO-x86_640703\" TYPE=\"iso9660\" ", + "/dev/sdc1: SEC_TYPE=\"msdos\" LABEL=\"BOOT\" UUID=\"65CB-FEB0\" TYPE=\"vfat\" PARTUUID=\"a893698d-01\" ", + "/dev/sdc2: UUID=\"2013-11-06-15-55-09-00\" LABEL=\"openSUSE 13.1 KDE Live\" TYPE=\"udf\" PARTUUID=\"a893698d-02\" " + }; + + vector<string> output = { + "data[/dev/sdb] -> is-fs:true fs-type:iso9660 fs-uuid:2013-06-14-19-02-28-00 fs-label:SLES-11-SP3-MINI-ISO-x86_640703", + "data[/dev/sdc1] -> is-fs:true fs-type:vfat fs-uuid:65CB-FEB0 fs-label:BOOT", + "data[/dev/sdc2] -> is-fs:true fs-type:udf fs-uuid:2013-11-06-15-55-09-00 fs-label:openSUSE 13.1 KDE Live" + }; + + check(input, output); +} + + +BOOST_AUTO_TEST_CASE(parse5) +{ + vector<string> input = { + "/dev/sdb1: UUID=\"db2702b8-7ae4-6bea-1849-341d8ecd7367\" UUID_SUB=\"5b8ceee8-7757-7ce9-d003-a50c09c88b02\" LABEL=\"thalassa:0\" TYPE=\"linux_raid_member\" PARTUUID=\"995ef2e3-cae4-4515-adf0-525729463b0e\"", + "/dev/sdb2: UUID=\"db2702b8-7ae4-6bea-1849-341d8ecd7367\" UUID_SUB=\"e1385e7d-40c2-6ec7-f610-ab5bbfb5df8d\" LABEL=\"thalassa:0\" TYPE=\"linux_raid_member\" PARTUUID=\"460714f6-8eed-4ffe-9de0-8dfa2c6fff40\"" + }; + + vector<string> output = { + "data[/dev/sdb1] -> is-md:true", + "data[/dev/sdb2] -> is-md:true" + }; + + check(input, output); +} + + +BOOST_AUTO_TEST_CASE(parse6) +{ + vector<string> input = { + "/dev/sdb: UUID=\"86fa0e25-c962-4410-9113-cd23bfad08a6\" TYPE=\"bcache\"", + "/dev/sdc: UUID=\"5f5da36e-b312-45e5-b86c-059275cfe1de\" TYPE=\"bcache\"", + "/dev/bcache0: UUID=\"38986ecf-78d1-450b-8ad4-f071a33a7984\" TYPE=\"xfs\"", + }; + + vector<string> output = { + "data[/dev/bcache0] -> is-fs:true fs-type:xfs fs-uuid:38986ecf-78d1-450b-8ad4-f071a33a7984", + "data[/dev/sdb] -> is-bcache:true bcache-uuid:86fa0e25-c962-4410-9113-cd23bfad08a6", + "data[/dev/sdc] -> is-bcache:true bcache-uuid:5f5da36e-b312-45e5-b86c-059275cfe1de" + }; + + check(input, output); +} + + +BOOST_AUTO_TEST_CASE(parse7) +{ + vector<string> input = { + "/dev/sda1: LABEL=\"BOOT\" UUID=\"14875716-b8e3-4c83-ac86-48c20682b63a\" TYPE=\"ext3\" PTTYPE=\"dos\" " + }; + + vector<string> output = { + "data[/dev/sda1] -> is-fs:true fs-type:ext3 fs-uuid:14875716-b8e3-4c83-ac86-48c20682b63a fs-label:BOOT" + }; + + check("/dev/sda1", input, output); +} + + +BOOST_AUTO_TEST_CASE(parse_external_journal) +{ + vector<string> input = { + "/dev/sdc1: UUID=\"6ed5af86-99f7-4ffc-aeef-1e9da94c8f10\" EXT_JOURNAL=\"d1cdcace-86b4-4f36-aaf3-38897c95108d\" TYPE=\"ext4\"", + "/dev/sdc2: UUID=\"d1cdcace-86b4-4f36-aaf3-38897c95108d\" LOGUUID=\"d1cdcace-86b4-4f36-aaf3-38897c95108d\" TYPE=\"jbd\"", + "/dev/sdc3: UUID=\"3937b487-0ea8-4605-a2b1-69504a79ad02\" TYPE=\"xfs\"", + "/dev/sdc4: LOGUUID=\"3937b487-0ea8-4605-a2b1-69504a79ad02\" TYPE=\"xfs_external_log\"" + }; + + vector<string> output = { + "data[/dev/sdc1] -> is-fs:true fs-type:ext4 fs-uuid:6ed5af86-99f7-4ffc-aeef-1e9da94c8f10 fs-journal-uuid:d1cdcace-86b4-4f36-aaf3-38897c95108d", + "data[/dev/sdc2] -> is-journal:true journal-uuid:d1cdcace-86b4-4f36-aaf3-38897c95108d", + "data[/dev/sdc3] -> is-fs:true fs-type:xfs fs-uuid:3937b487-0ea8-4605-a2b1-69504a79ad02", + "data[/dev/sdc4] -> is-journal:true journal-uuid:3937b487-0ea8-4605-a2b1-69504a79ad02" + }; + + check(input, output); +} + + +BOOST_AUTO_TEST_CASE(parse_isw) +{ + vector<string> input = { + "/dev/sdb: TYPE=\"isw_raid_member\"", + "/dev/sdc: TYPE=\"isw_raid_member\"", + "/dev/sdd: TYPE=\"isw_raid_member\"", + "/dev/md126: UUID=\"aa211544-31d9-491a-b770-2295381acb3b\" TYPE=\"ext4\"" + }; + + vector<string> output = { + "data[/dev/md126] -> is-fs:true fs-type:ext4 fs-uuid:aa211544-31d9-491a-b770-2295381acb3b", + "data[/dev/sdb] -> is-md:true", + "data[/dev/sdc] -> is-md:true", + "data[/dev/sdd] -> is-md:true" + }; + + check(input, output); +} + + +BOOST_AUTO_TEST_CASE(parse_ddf) +{ + vector<string> input = { + "/dev/sdb: UUID=\"Linux-MDM-^M--M->M-o\" TYPE=\"ddf_raid_member\"", + "/dev/sdc: UUID=\"Linux-MDM-^M--M->M-o\" TYPE=\"ddf_raid_member\"", + "/dev/sdd: UUID=\"Linux-MDM-^M--M->M-o\" TYPE=\"ddf_raid_member\"", + "/dev/md126: UUID=\"b6da62bd-6057-4315-a58c-b7b4a9a5e693\" TYPE=\"ext4\"" + }; + + vector<string> output = { + "data[/dev/md126] -> is-fs:true fs-type:ext4 fs-uuid:b6da62bd-6057-4315-a58c-b7b4a9a5e693", + "data[/dev/sdb] -> is-md:true", + "data[/dev/sdc] -> is-md:true", + "data[/dev/sdd] -> is-md:true" + }; + + check(input, output); +} + + +BOOST_AUTO_TEST_CASE(parse_luks) +{ + vector<string> input = { + "/dev/sdb1: UUID=\"b329b40b-e5f0-4f8e-814d-b6afb7f0ce64\" TYPE=\"crypto_LUKS\" PARTUUID=\"02cabc90-ca73-4302-928e-a924cda495bc\"", + "/dev/sdb2: UUID=\"332cd185-9d1b-479c-ade6-a9fb6e4e536d\" LABEL=\"master-plan\" TYPE=\"crypto_LUKS\" PARTUUID=\"20e9945b-1b57-4f46-89d8-b6321be05df3\"" + }; + + vector<string> output = { + "data[/dev/sdb1] -> is-luks:true luks-uuid:b329b40b-e5f0-4f8e-814d-b6afb7f0ce64", + "data[/dev/sdb2] -> is-luks:true luks-uuid:332cd185-9d1b-479c-ade6-a9fb6e4e536d luks-label:master-plan" + }; + + check(input, output); +} + + +BOOST_AUTO_TEST_CASE(split_weird_uuid_line) +{ + // bsc#1102572 + string input = "/dev/sdb: UUID=\"LSI M-^@M-^FM-!^F^W4^R\\\"HM-^@M- ^XM-.kwM-T\" TYPE=\"ddf_raid_member\""; + string output = "/dev/sdb:|UUID=\"LSI M-^@M-^FM-!^F^W4^R\\\"HM-^@M- ^XM-.kwM-T\"|TYPE=\"ddf_raid_member\""; + + check_split_line( input, output ); +} + + +BOOST_AUTO_TEST_CASE(weird_uuid) +{ + // bsc#1102572 + vector<string> input = { + "/dev/sdb: UUID=\"LSI M-^@M-^FM-!^F^W4^R\\\"HM-^@M- ^XM-.kwM-T\" TYPE=\"ddf_raid_member\"", + "/dev/sda: UUID=\"LSI M-^@M-^FM-!^F^W4^R\\\"HM-^@M- ^XM-.kwM-T\" TYPE=\"ddf_raid_member\"", + "/dev/md126: PTUUID=\"361b9912\" PTTYPE=\"dos\"", + "/dev/md126p1: LABEL=\"LINSERV\" UUID=\"88B5-20E8\" TYPE=\"vfat\" PARTUUID=\"361b9912-01\"", + "/dev/md126p2: LABEL=\"RAID1\" UUID=\"BAE2-F35E\" TYPE=\"vfat\" PARTUUID=\"361b9912-02\"" + }; + + vector<string> output = { + // Alpha-sorted by map key, thus the different order than in the input + "data[/dev/md126p1] -> is-fs:true fs-type:vfat fs-uuid:88B5-20E8 fs-label:LINSERV", + "data[/dev/md126p2] -> is-fs:true fs-type:vfat fs-uuid:BAE2-F35E fs-label:RAID1", + // No output for /dev/md126 because it's irrelevant (partitionable device, nothing else) + "data[/dev/sda] -> is-md:true", + "data[/dev/sdb] -> is-md:true" + }; + + check(input, output); +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libstorage-ng-4.5.307/testsuite/SystemInfo/blkid-242.cc new/libstorage-ng-4.5.308/testsuite/SystemInfo/blkid-242.cc --- old/libstorage-ng-4.5.307/testsuite/SystemInfo/blkid-242.cc 1970-01-01 01:00:00.000000000 +0100 +++ new/libstorage-ng-4.5.308/testsuite/SystemInfo/blkid-242.cc 2026-04-01 16:09:25.000000000 +0200 @@ -0,0 +1,118 @@ + +#define BOOST_TEST_DYN_LINK +#define BOOST_TEST_MODULE libstorage + +#include <boost/test/unit_test.hpp> +#include <boost/algorithm/string.hpp> + +#include "storage/SystemInfo/CmdBlkid.h" +#include "storage/Utils/Mockup.h" +#include "storage/Utils/StorageDefines.h" + + +using namespace std; +using namespace storage; + + +void +check(const vector<string>& input, const vector<string>& output) +{ + Mockup::set_mode(Mockup::Mode::PLAYBACK); + Mockup::set_command(BLKID_BIN " --version", + RemoteCommand({ "blkid from util-linux 2.42 (libblkid 2.42, 01-Apr-2026)" }, {}, 0)); + Mockup::set_command(BLKID_BIN " --cache-file /dev/null --output json", input); + Mockup::set_command({ UDEVADM_BIN_SETTLE }, {}); + + Udevadm udevadm; + + CmdBlkid cmd_blkid(udevadm); + + ostringstream parsed; + parsed.setf(std::ios::boolalpha); + parsed << cmd_blkid; + + string lhs = parsed.str(); + string rhs = boost::join(output, "\n") + "\n"; + + BOOST_CHECK_EQUAL(lhs, rhs); +} + + +void +check(const string& device, const vector<string>& input, const vector<string>& output) +{ + Mockup::set_mode(Mockup::Mode::PLAYBACK); + Mockup::set_command(BLKID_BIN " --version", + RemoteCommand({ "blkid from util-linux 2.42 (libblkid 2.42, 01-Apr-2026)" }, {}, 0)); + Mockup::set_command(BLKID_BIN " --cache-file /dev/null --output json " + device, input); + Mockup::set_command({ UDEVADM_BIN_SETTLE }, {}); + + Udevadm udevadm; + + CmdBlkid cmd_blkid(udevadm, device); + + ostringstream parsed; + parsed.setf(std::ios::boolalpha); + parsed << cmd_blkid; + + string lhs = parsed.str(); + string rhs = boost::join(output, "\n") + "\n"; + + BOOST_CHECK_EQUAL(lhs, rhs); +} + + +BOOST_AUTO_TEST_CASE(parse1) +{ + vector<string> input = { + "{", + " \"blkid\": [", + " {", + " \"device\": \"/dev/mapper/system-root\",", + " \"uuid\": \"72e2918a-b8a8-494c-abd7-2090ebf34e64\",", + " \"block_size\": \"4096\",", + " \"type\": \"ext4\"", + " },{", + " \"device\": \"/dev/sda2\",", + " \"uuid\": \"Ni5zl4-XUxV-0DxM-aUe1-eQpN-JHId-RDj9fa\",", + " \"type\": \"LVM2_member\",", + " \"partuuid\": \"65867d0b-0150-4af6-966c-fe82cdb180cd\"", + " },{", + " \"device\": \"/dev/sda1\",", + " \"partuuid\": \"54b83199-0935-41b7-b982-08c11a7cc47a\"", + " }", + " ]", + "}" + }; + + vector<string> output = { + "data[/dev/mapper/system-root] -> is-fs:true fs-type:ext4 fs-uuid:72e2918a-b8a8-494c-abd7-2090ebf34e64", + "data[/dev/sda2] -> is-lvm:true" + }; + + check(input, output); +} + + +BOOST_AUTO_TEST_CASE(parse2) +{ + vector<string> input = { + "{", + " \"blkid\": [", + " {", + " \"device\": \"/dev/sdc1\",", + " \"uuid\": \"43653208-6196-4d1d-8823-fb735b2c66e9\",", + " \"block_size\": \"4096\",", + " \"type\": \"ext4\",", + " \"partuuid\": \"dc2fd0b9-7957-4183-b357-f9d482d43b7d\"", + " }", + " ]", + "}" + }; + + vector<string> output = { + "data[/dev/sdc1] -> is-fs:true fs-type:ext4 fs-uuid:43653208-6196-4d1d-8823-fb735b2c66e9" + }; + + check("/dev/sdc1", input, output); +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libstorage-ng-4.5.307/testsuite/SystemInfo/blkid.cc new/libstorage-ng-4.5.308/testsuite/SystemInfo/blkid.cc --- old/libstorage-ng-4.5.307/testsuite/SystemInfo/blkid.cc 2026-03-13 16:04:18.000000000 +0100 +++ new/libstorage-ng-4.5.308/testsuite/SystemInfo/blkid.cc 1970-01-01 01:00:00.000000000 +0100 @@ -1,333 +0,0 @@ - -#define BOOST_TEST_DYN_LINK -#define BOOST_TEST_MODULE libstorage - -#include <boost/test/unit_test.hpp> -#include <boost/algorithm/string.hpp> - -#include "storage/SystemInfo/CmdBlkid.h" -#include "storage/Utils/Mockup.h" -#include "storage/Utils/StorageDefines.h" - - -using namespace std; -using namespace storage; - - -void -check(const vector<string>& input, const vector<string>& output) -{ - Mockup::set_mode(Mockup::Mode::PLAYBACK); - Mockup::set_command(BLKID_BIN " --version", - RemoteCommand({ "blkid from util-linux 2.41.3 (libblkid 2.41.3, 15-Dec-2025)" }, {}, 0)); - Mockup::set_command(BLKID_BIN " --cache-file /dev/null", input); - Mockup::set_command({ UDEVADM_BIN_SETTLE }, {}); - - Udevadm udevadm; - - Blkid blkid(udevadm); - - ostringstream parsed; - parsed.setf(std::ios::boolalpha); - parsed << blkid; - - string lhs = parsed.str(); - string rhs = boost::join(output, "\n") + "\n"; - - BOOST_CHECK_EQUAL(lhs, rhs); -} - - -void -check(const string& device, const vector<string>& input, const vector<string>& output) -{ - Mockup::set_mode(Mockup::Mode::PLAYBACK); - Mockup::set_command(BLKID_BIN " --version", - RemoteCommand({ "blkid from util-linux 2.41.3 (libblkid 2.41.3, 15-Dec-2025)" }, {}, 0)); - Mockup::set_command(BLKID_BIN " --cache-file /dev/null " + device, input); - Mockup::set_command({ UDEVADM_BIN_SETTLE }, {}); - - Udevadm udevadm; - - Blkid blkid(udevadm, device); - - ostringstream parsed; - parsed.setf(std::ios::boolalpha); - parsed << blkid; - - string lhs = parsed.str(); - string rhs = boost::join(output, "\n") + "\n"; - - BOOST_CHECK_EQUAL(lhs, rhs); -} - - -void -check_split_line( const string & input, const string & output ) -{ - string result = boost::join( Blkid::split_line( input ), "|" ); - - BOOST_CHECK_EQUAL( result, output ); -} - - -BOOST_AUTO_TEST_CASE(split_line) -{ - check_split_line( "aaa bbb ccc", "aaa|bbb|ccc" ); - check_split_line( " aaa bbb ccc ", "aaa|bbb|ccc" ); - check_split_line( "", "" ); - check_split_line( "aa=\"xxx\" bb=\"yyy\" cc=\"zzz\"", "aa=\"xxx\"|bb=\"yyy\"|cc=\"zzz\"" ); - check_split_line( " aa=\"xxx\" bb=\"yyy\" cc=\"zzz\" ", "aa=\"xxx\"|bb=\"yyy\"|cc=\"zzz\"" ); - - // Whitespace in quoted strings - check_split_line( "aa=\"x x x\" bb=\"yy y\" cc=\"zzz\"", "aa=\"x x x\"|bb=\"yy y\"|cc=\"zzz\"" ); - check_split_line( "aa=\"x x x\" bb=\"yy y", "aa=\"x x x\"|bb=\"yy y" ); - - // Escaped quote in string - check_split_line( "aa=\"x\\\"xx\" bb=\"yyy\"", "aa=\"x\\\"xx\"|bb=\"yyy\""); - - // Escaped quote in string and at the end and not properly terminated - check_split_line( "aa=\"x\\\"xx\" bb=\"yyy\\\"", "aa=\"x\\\"xx\"|bb=\"yyy\\\""); -} - - -BOOST_AUTO_TEST_CASE(parse1) -{ - vector<string> input = { - "/dev/sda1: LABEL=\"BOOT\" UUID=\"14875716-b8e3-4c83-ac86-48c20682b63a\" TYPE=\"ext3\" PTTYPE=\"dos\" ", - "/dev/sda2: UUID=\"qquP1O-WWoh-Ofas-Rbx0-y72T-0sNe-Wnyc33\" TYPE=\"LVM2_member\" ", - "/dev/mapper/system-abuild: LABEL=\"ABUILD\" UUID=\"16337c60-fc2a-4b87-8199-4f511fa06c65\" TYPE=\"ext4\" ", - "/dev/mapper/system-btrfs: LABEL=\"BTRFS\" UUID=\"946de1e3-ab5a-49d2-8c9d-057f1613d395\" UUID_SUB=\"8fd5c226-d060-4049-90e6-1df5c865fdf4\" TYPE=\"btrfs\" ", - "/dev/mapper/system-giant: LABEL=\"GIANT\" UUID=\"0857a01f-c58e-464a-b74b-cd46992873e7\" TYPE=\"xfs\" ", - "/dev/mapper/system-root: LABEL=\"ROOT\" UUID=\"31e381c9-5b35-4045-8d01-9274a30e1298\" TYPE=\"ext3\" ", - "/dev/mapper/system-swap: LABEL=\"SWAP\" UUID=\"fd39c3f9-2990-435d-8eed-e56b6dc2e592\" TYPE=\"swap\" ", - "/dev/mapper/docker-254:3-266193-pool: UUID=\"b8965f68-1e7c-4fac-982b-5859dca91de5\" TYPE=\"ext4\" " - }; - - vector<string> output = { - "data[/dev/mapper/docker-254:3-266193-pool] -> is-fs:true fs-type:ext4 fs-uuid:b8965f68-1e7c-4fac-982b-5859dca91de5", - "data[/dev/mapper/system-abuild] -> is-fs:true fs-type:ext4 fs-uuid:16337c60-fc2a-4b87-8199-4f511fa06c65 fs-label:ABUILD", - "data[/dev/mapper/system-btrfs] -> is-fs:true fs-type:btrfs fs-uuid:946de1e3-ab5a-49d2-8c9d-057f1613d395 fs-label:BTRFS fs-sub-uuid:8fd5c226-d060-4049-90e6-1df5c865fdf4", - "data[/dev/mapper/system-giant] -> is-fs:true fs-type:xfs fs-uuid:0857a01f-c58e-464a-b74b-cd46992873e7 fs-label:GIANT", - "data[/dev/mapper/system-root] -> is-fs:true fs-type:ext3 fs-uuid:31e381c9-5b35-4045-8d01-9274a30e1298 fs-label:ROOT", - "data[/dev/mapper/system-swap] -> is-fs:true fs-type:swap fs-uuid:fd39c3f9-2990-435d-8eed-e56b6dc2e592 fs-label:SWAP", - "data[/dev/sda1] -> is-fs:true fs-type:ext3 fs-uuid:14875716-b8e3-4c83-ac86-48c20682b63a fs-label:BOOT", - "data[/dev/sda2] -> is-lvm:true" - }; - - check(input, output); -} - - -BOOST_AUTO_TEST_CASE(parse2) -{ - vector<string> input = { - "/dev/sda1: UUID=\"fc5985ee-e069-4bb4-a36c-24d8f6022f7a\" TYPE=\"ext4\" ", - "/dev/sda2: UUID=\"f98def5a-6553-49a1-940d-df55a77d7d28\" TYPE=\"crypto_LUKS\" ", - "/dev/mapper/tmp: UUID=\"wunWKW-nDeG-SUnC-CxDO-5UNt-BA4Y-Se7xVC\" TYPE=\"LVM2_member\" ", - "/dev/mapper/system-home: UUID=\"7e9e18c3-b743-47d8-9f33-464f466fc517\" UUID_SUB=\"4f40002c-125e-43c1-8a38-b5bf29f5319c\" TYPE=\"btrfs\" ", - "/dev/mapper/system-root: UUID=\"9fca85ff-4278-4f49-932e-4060726cf0d6\" UUID_SUB=\"ab28e20a-9c11-4ea6-a46d-0fe412fe0e19\" TYPE=\"btrfs\" ", - "/dev/mapper/system-swap: UUID=\"d0f020a1-9847-4ee5-a22e-fe0cdd4aa905\" TYPE=\"swap\" " - }; - - vector<string> output = { - "data[/dev/mapper/system-home] -> is-fs:true fs-type:btrfs fs-uuid:7e9e18c3-b743-47d8-9f33-464f466fc517 fs-sub-uuid:4f40002c-125e-43c1-8a38-b5bf29f5319c", - "data[/dev/mapper/system-root] -> is-fs:true fs-type:btrfs fs-uuid:9fca85ff-4278-4f49-932e-4060726cf0d6 fs-sub-uuid:ab28e20a-9c11-4ea6-a46d-0fe412fe0e19", - "data[/dev/mapper/system-swap] -> is-fs:true fs-type:swap fs-uuid:d0f020a1-9847-4ee5-a22e-fe0cdd4aa905", - "data[/dev/mapper/tmp] -> is-lvm:true", - "data[/dev/sda1] -> is-fs:true fs-type:ext4 fs-uuid:fc5985ee-e069-4bb4-a36c-24d8f6022f7a", - "data[/dev/sda2] -> is-luks:true luks-uuid:f98def5a-6553-49a1-940d-df55a77d7d28" - }; - - check(input, output); -} - - -BOOST_AUTO_TEST_CASE(parse3) -{ - vector<string> input = { - "/dev/dasda1: UUID=\"ab43b144-37e2-4e9c-8369-6df220f055b0\" SEC_TYPE=\"ext2\" TYPE=\"ext4\" " - }; - - vector<string> output = { - "data[/dev/dasda1] -> is-fs:true fs-type:ext4 fs-uuid:ab43b144-37e2-4e9c-8369-6df220f055b0" - }; - - check(input, output); -} - - -BOOST_AUTO_TEST_CASE(parse4) -{ - vector<string> input = { - "/dev/sdb: UUID=\"2013-06-14-19-02-28-00\" LABEL=\"SLES-11-SP3-MINI-ISO-x86_640703\" TYPE=\"iso9660\" ", - "/dev/sdc1: SEC_TYPE=\"msdos\" LABEL=\"BOOT\" UUID=\"65CB-FEB0\" TYPE=\"vfat\" PARTUUID=\"a893698d-01\" ", - "/dev/sdc2: UUID=\"2013-11-06-15-55-09-00\" LABEL=\"openSUSE 13.1 KDE Live\" TYPE=\"udf\" PARTUUID=\"a893698d-02\" " - }; - - vector<string> output = { - "data[/dev/sdb] -> is-fs:true fs-type:iso9660 fs-uuid:2013-06-14-19-02-28-00 fs-label:SLES-11-SP3-MINI-ISO-x86_640703", - "data[/dev/sdc1] -> is-fs:true fs-type:vfat fs-uuid:65CB-FEB0 fs-label:BOOT", - "data[/dev/sdc2] -> is-fs:true fs-type:udf fs-uuid:2013-11-06-15-55-09-00 fs-label:openSUSE 13.1 KDE Live" - }; - - check(input, output); -} - - -BOOST_AUTO_TEST_CASE(parse5) -{ - vector<string> input = { - "/dev/sdb1: UUID=\"db2702b8-7ae4-6bea-1849-341d8ecd7367\" UUID_SUB=\"5b8ceee8-7757-7ce9-d003-a50c09c88b02\" LABEL=\"thalassa:0\" TYPE=\"linux_raid_member\" PARTUUID=\"995ef2e3-cae4-4515-adf0-525729463b0e\"", - "/dev/sdb2: UUID=\"db2702b8-7ae4-6bea-1849-341d8ecd7367\" UUID_SUB=\"e1385e7d-40c2-6ec7-f610-ab5bbfb5df8d\" LABEL=\"thalassa:0\" TYPE=\"linux_raid_member\" PARTUUID=\"460714f6-8eed-4ffe-9de0-8dfa2c6fff40\"" - }; - - vector<string> output = { - "data[/dev/sdb1] -> is-md:true", - "data[/dev/sdb2] -> is-md:true" - }; - - check(input, output); -} - - -BOOST_AUTO_TEST_CASE(parse6) -{ - vector<string> input = { - "/dev/sdb: UUID=\"86fa0e25-c962-4410-9113-cd23bfad08a6\" TYPE=\"bcache\"", - "/dev/sdc: UUID=\"5f5da36e-b312-45e5-b86c-059275cfe1de\" TYPE=\"bcache\"", - "/dev/bcache0: UUID=\"38986ecf-78d1-450b-8ad4-f071a33a7984\" TYPE=\"xfs\"", - }; - - vector<string> output = { - "data[/dev/bcache0] -> is-fs:true fs-type:xfs fs-uuid:38986ecf-78d1-450b-8ad4-f071a33a7984", - "data[/dev/sdb] -> is-bcache:true bcache-uuid:86fa0e25-c962-4410-9113-cd23bfad08a6", - "data[/dev/sdc] -> is-bcache:true bcache-uuid:5f5da36e-b312-45e5-b86c-059275cfe1de" - }; - - check(input, output); -} - - -BOOST_AUTO_TEST_CASE(parse7) -{ - vector<string> input = { - "/dev/sda1: LABEL=\"BOOT\" UUID=\"14875716-b8e3-4c83-ac86-48c20682b63a\" TYPE=\"ext3\" PTTYPE=\"dos\" " - }; - - vector<string> output = { - "data[/dev/sda1] -> is-fs:true fs-type:ext3 fs-uuid:14875716-b8e3-4c83-ac86-48c20682b63a fs-label:BOOT" - }; - - check("/dev/sda1", input, output); -} - - -BOOST_AUTO_TEST_CASE(parse_external_journal) -{ - vector<string> input = { - "/dev/sdc1: UUID=\"6ed5af86-99f7-4ffc-aeef-1e9da94c8f10\" EXT_JOURNAL=\"d1cdcace-86b4-4f36-aaf3-38897c95108d\" TYPE=\"ext4\"", - "/dev/sdc2: UUID=\"d1cdcace-86b4-4f36-aaf3-38897c95108d\" LOGUUID=\"d1cdcace-86b4-4f36-aaf3-38897c95108d\" TYPE=\"jbd\"", - "/dev/sdc3: UUID=\"3937b487-0ea8-4605-a2b1-69504a79ad02\" TYPE=\"xfs\"", - "/dev/sdc4: LOGUUID=\"3937b487-0ea8-4605-a2b1-69504a79ad02\" TYPE=\"xfs_external_log\"" - }; - - vector<string> output = { - "data[/dev/sdc1] -> is-fs:true fs-type:ext4 fs-uuid:6ed5af86-99f7-4ffc-aeef-1e9da94c8f10 fs-journal-uuid:d1cdcace-86b4-4f36-aaf3-38897c95108d", - "data[/dev/sdc2] -> is-journal:true journal-uuid:d1cdcace-86b4-4f36-aaf3-38897c95108d", - "data[/dev/sdc3] -> is-fs:true fs-type:xfs fs-uuid:3937b487-0ea8-4605-a2b1-69504a79ad02", - "data[/dev/sdc4] -> is-journal:true journal-uuid:3937b487-0ea8-4605-a2b1-69504a79ad02" - }; - - check(input, output); -} - - -BOOST_AUTO_TEST_CASE(parse_isw) -{ - vector<string> input = { - "/dev/sdb: TYPE=\"isw_raid_member\"", - "/dev/sdc: TYPE=\"isw_raid_member\"", - "/dev/sdd: TYPE=\"isw_raid_member\"", - "/dev/md126: UUID=\"aa211544-31d9-491a-b770-2295381acb3b\" TYPE=\"ext4\"" - }; - - vector<string> output = { - "data[/dev/md126] -> is-fs:true fs-type:ext4 fs-uuid:aa211544-31d9-491a-b770-2295381acb3b", - "data[/dev/sdb] -> is-md:true", - "data[/dev/sdc] -> is-md:true", - "data[/dev/sdd] -> is-md:true" - }; - - check(input, output); -} - - -BOOST_AUTO_TEST_CASE(parse_ddf) -{ - vector<string> input = { - "/dev/sdb: UUID=\"Linux-MDM-^M--M->M-o\" TYPE=\"ddf_raid_member\"", - "/dev/sdc: UUID=\"Linux-MDM-^M--M->M-o\" TYPE=\"ddf_raid_member\"", - "/dev/sdd: UUID=\"Linux-MDM-^M--M->M-o\" TYPE=\"ddf_raid_member\"", - "/dev/md126: UUID=\"b6da62bd-6057-4315-a58c-b7b4a9a5e693\" TYPE=\"ext4\"" - }; - - vector<string> output = { - "data[/dev/md126] -> is-fs:true fs-type:ext4 fs-uuid:b6da62bd-6057-4315-a58c-b7b4a9a5e693", - "data[/dev/sdb] -> is-md:true", - "data[/dev/sdc] -> is-md:true", - "data[/dev/sdd] -> is-md:true" - }; - - check(input, output); -} - - -BOOST_AUTO_TEST_CASE(parse_luks) -{ - vector<string> input = { - "/dev/sdb1: UUID=\"b329b40b-e5f0-4f8e-814d-b6afb7f0ce64\" TYPE=\"crypto_LUKS\" PARTUUID=\"02cabc90-ca73-4302-928e-a924cda495bc\"", - "/dev/sdb2: UUID=\"332cd185-9d1b-479c-ade6-a9fb6e4e536d\" LABEL=\"master-plan\" TYPE=\"crypto_LUKS\" PARTUUID=\"20e9945b-1b57-4f46-89d8-b6321be05df3\"" - }; - - vector<string> output = { - "data[/dev/sdb1] -> is-luks:true luks-uuid:b329b40b-e5f0-4f8e-814d-b6afb7f0ce64", - "data[/dev/sdb2] -> is-luks:true luks-uuid:332cd185-9d1b-479c-ade6-a9fb6e4e536d luks-label:master-plan" - }; - - check(input, output); -} - - -BOOST_AUTO_TEST_CASE(split_weird_uuid_line) -{ - // bsc#1102572 - string input = "/dev/sdb: UUID=\"LSI M-^@M-^FM-!^F^W4^R\\\"HM-^@M- ^XM-.kwM-T\" TYPE=\"ddf_raid_member\""; - string output = "/dev/sdb:|UUID=\"LSI M-^@M-^FM-!^F^W4^R\\\"HM-^@M- ^XM-.kwM-T\"|TYPE=\"ddf_raid_member\""; - - check_split_line( input, output ); -} - - -BOOST_AUTO_TEST_CASE(weird_uuid) -{ - // bsc#1102572 - vector<string> input = { - "/dev/sdb: UUID=\"LSI M-^@M-^FM-!^F^W4^R\\\"HM-^@M- ^XM-.kwM-T\" TYPE=\"ddf_raid_member\"", - "/dev/sda: UUID=\"LSI M-^@M-^FM-!^F^W4^R\\\"HM-^@M- ^XM-.kwM-T\" TYPE=\"ddf_raid_member\"", - "/dev/md126: PTUUID=\"361b9912\" PTTYPE=\"dos\"", - "/dev/md126p1: LABEL=\"LINSERV\" UUID=\"88B5-20E8\" TYPE=\"vfat\" PARTUUID=\"361b9912-01\"", - "/dev/md126p2: LABEL=\"RAID1\" UUID=\"BAE2-F35E\" TYPE=\"vfat\" PARTUUID=\"361b9912-02\"" - }; - - vector<string> output = { - // Alpha-sorted by map key, thus the different order than in the input - "data[/dev/md126p1] -> is-fs:true fs-type:vfat fs-uuid:88B5-20E8 fs-label:LINSERV", - "data[/dev/md126p2] -> is-fs:true fs-type:vfat fs-uuid:BAE2-F35E fs-label:RAID1", - // No output for /dev/md126 because it's irrelevant (partitionable device, nothing else) - "data[/dev/sda] -> is-md:true", - "data[/dev/sdb] -> is-md:true" - }; - - check(input, output); -} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libstorage-ng-4.5.307/testsuite/SystemInfo/dasdview.cc new/libstorage-ng-4.5.308/testsuite/SystemInfo/dasdview.cc --- old/libstorage-ng-4.5.307/testsuite/SystemInfo/dasdview.cc 2026-03-13 16:04:18.000000000 +0100 +++ new/libstorage-ng-4.5.308/testsuite/SystemInfo/dasdview.cc 2026-04-01 16:09:25.000000000 +0200 @@ -21,11 +21,11 @@ Mockup::set_mode(Mockup::Mode::PLAYBACK); Mockup::set_command({ DASDVIEW_BIN, "--extended", device }, input); - Dasdview dasdview(device); + CmdDasdview cmd_dasdview(device); ostringstream parsed; parsed.setf(std::ios::boolalpha); - parsed << dasdview; + parsed << cmd_dasdview; string lhs = parsed.str(); string rhs = boost::join(output, "\n"); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libstorage-ng-4.5.307/testsuite/SystemInfo/parted-34.cc new/libstorage-ng-4.5.308/testsuite/SystemInfo/parted-34.cc --- old/libstorage-ng-4.5.307/testsuite/SystemInfo/parted-34.cc 2026-03-13 16:04:18.000000000 +0100 +++ new/libstorage-ng-4.5.308/testsuite/SystemInfo/parted-34.cc 2026-04-01 16:09:25.000000000 +0200 @@ -28,11 +28,11 @@ Udevadm udevadm; - Parted parted(udevadm, device); + CmdParted cmd_parted(udevadm, device); ostringstream parsed; parsed.setf(std::ios::boolalpha); - parsed << parted; + parsed << cmd_parted; string lhs = parsed.str(); string rhs = boost::join(result, "\n") + "\n"; @@ -57,7 +57,7 @@ Udevadm udevadm; - BOOST_CHECK_THROW({ Parted parted(udevadm, device); }, ParseException); + BOOST_CHECK_THROW({ CmdParted cmd_parted(udevadm, device); }, ParseException); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libstorage-ng-4.5.307/testsuite/SystemInfo/parted-35.cc new/libstorage-ng-4.5.308/testsuite/SystemInfo/parted-35.cc --- old/libstorage-ng-4.5.307/testsuite/SystemInfo/parted-35.cc 2026-03-13 16:04:18.000000000 +0100 +++ new/libstorage-ng-4.5.308/testsuite/SystemInfo/parted-35.cc 2026-04-01 16:09:25.000000000 +0200 @@ -28,11 +28,11 @@ Udevadm udevadm; - Parted parted(udevadm, device); + CmdParted cmd_parted(udevadm, device); ostringstream parsed; parsed.setf(std::ios::boolalpha); - parsed << parted; + parsed << cmd_parted; string lhs = parsed.str(); string rhs = boost::join(result, "\n") + "\n"; @@ -57,7 +57,7 @@ Udevadm udevadm; - BOOST_CHECK_THROW({ Parted parted(udevadm, device); }, Exception); + BOOST_CHECK_THROW({ CmdParted cmd_parted(udevadm, device); }, Exception); }
